Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8051e89
docs(plan): Command Center dashboard + SDLC gap-fill plan
gsxdsm Jun 16, 2026
ab9fdc4
feat(telemetry): U1 — queryable usage_events table + emitUsageEvent c…
gsxdsm Jun 16, 2026
90cfbfb
feat(dashboard): U4 — Command Center view shell, nav, and chart primi…
gsxdsm Jun 16, 2026
951c6ef
feat(signals): U11 — external signal ingestion (Sentry/Datadog/PagerD…
gsxdsm Jun 16, 2026
53bb1d8
feat(analytics): U2 — core date-range aggregators (tokens/tools/activ…
gsxdsm Jun 16, 2026
4519732
feat(analytics): U3 — model pricing map + cost derivation
gsxdsm Jun 16, 2026
113263f
feat(command-center): U9+U6a — analytics API endpoints + live snapsho…
gsxdsm Jun 16, 2026
e617ce6
feat(pr): U18 — surface + gate auto-resolution of PR review comments
gsxdsm Jun 16, 2026
cf46859
feat(router): U17 — Fusion Model Router (session-level selection layer)
gsxdsm Jun 16, 2026
ed3c572
feat(command-center): U5 — historical analytics areas + date-range fi…
gsxdsm Jun 16, 2026
070ed98
feat(command-center): U6b — live Mission-Control panel
gsxdsm Jun 16, 2026
29acf14
feat(command-center): U8 — CSV export for analytics endpoints
gsxdsm Jun 16, 2026
f45dde2
feat(triage): U12 — triage trait for issues and pull requests
gsxdsm Jun 16, 2026
5bc8901
feat(command-center): U7 — SDLC funnel + throughput
gsxdsm Jun 16, 2026
168dc2f
feat(command-center): U10 — OpenTelemetry (OTLP) metrics export
gsxdsm Jun 16, 2026
0a87890
feat(knowledge): U14 — persistent knowledge index
gsxdsm Jun 16, 2026
f5bd862
feat(monitor): U13 — monitor stage (deployments, incidents, MTTR) clo…
gsxdsm Jun 16, 2026
c1b581e
fix(review): apply autofix feedback
gsxdsm Jun 16, 2026
4119dc4
fix(ci): remove unused isWithinReplayWindow import in pagerduty signa…
gsxdsm Jun 16, 2026
61f389e
Address PR review feedback (#1683)
gsxdsm Jun 16, 2026
0d85426
Address PR review feedback round 2 (#1683)
gsxdsm Jun 16, 2026
8037ef1
Merge main into feature/factory-view: reconcile lazy-view inventory t…
gsxdsm Jun 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/command-center-dashboard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@runfusion/fusion": minor
---

Add the **Command Center** dashboard — a combined analytics/observability and live Mission-Control view (`?view=command-center`).

- **Telemetry** — a queryable `usage_events` SQLite table populated via a dedicated `emitUsageEvent` capture seam (tool calls, messages, session lifecycle), feeding date-range aggregators for tokens, tool usage + autonomy ratio, activity (sessions/messages/active-nodes/stickiness), productivity (files/commits/PRs/LOC), and ecosystem breadth — all in `packages/core` and reusable by CLI/engine.
- **Cost** — derived from token counts via a hand-maintained `model-pricing` map carrying `pricingAsOf` + a staleness flag; unknown models report unavailable rather than guessing.
- **View** — a new lazy-loaded, ARIA-tabbed Command Center with hand-rolled CSS-bar chart primitives, a date-range picker, per-area panels, a live Mission-Control panel (SSE push + idle-aware polling), and an SDLC funnel.
- **API** — `GET /api/command-center/{tokens,tools,activity,productivity,live}` (agent-usable), each under session auth and project scoping, with `?format=csv` export and an opt-in OpenTelemetry (OTLP) metrics exporter.
10 changes: 10 additions & 0 deletions .changeset/monitor-stage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@runfusion/fusion": minor
---

Add the **Monitor stage** (U13) — deployment and incident tracking that closes the SDLC loop.

- **Schema** — new `deployments` and `incidents` SQLite tables (`packages/core/src/db.ts`, `SCHEMA_VERSION` 119 → 120, migration added in the same change; fingerprint auto-covers SCHEMA_SQL tables).
- **Metrics** — real MTTR (incident-open → resolved) plus deploy/incident counts in `activity-analytics`, replacing the prior unavailable seam.
- **Ingestion** — `POST /api/monitor/{deployments,incidents}` self-authenticate via a shared ingest secret (constant-time bearer check, fail-closed) with SSRF-untrusted payload links; `GET /api/monitor/metrics` exposes the aggregates.
- **Loop closure** — a `monitor` workflow trait can auto-open a single fix task on a regression signal, guarded by `groupingKey` grouping, a threshold/sustained gate, cooldown absorption, a per-window circuit breaker, and a self-loop guard.
14 changes: 14 additions & 0 deletions .changeset/u10-otel-export.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@runfusion/fusion": minor
---

Export Command Center analytics over OpenTelemetry (OTLP) so teams can ship token / cost / activity metrics to Datadog / Grafana / etc. **Disabled by default** (U10, R4).

- New pure mapping `mapAnalyticsToOtlp` in `@fusion/core` (`otel-metrics.ts`) turns the token/cost/activity aggregator outputs into the OTLP/HTTP JSON wire shape (`resourceMetrics`) — counters for token/cost, gauges for activity — with `model` / `provider` / `node.id` / `agent.id` attributes per data point. Fully testable without a live collector; no SDK dependency in core.
- Dashboard exporter (`otel-exporter.ts`) periodically maps current analytics and POSTs them to a configured collector, wired into `server.ts` startup/shutdown.

**SDK choice:** ships a **minimal OTLP/HTTP JSON exporter rather than the official `@opentelemetry/*` SDK** — and therefore adds **no new runtime dependency**. The OTLP/HTTP JSON protocol is a single, stable `POST /v1/metrics` of a well-defined JSON envelope (built in core), so for a default-disabled feature we avoid pulling the multi-package SDK (sdk-metrics + exporter-metrics-otlp-http + resources + api). The wire shape is collector-compatible; swapping in the official SDK later is mechanical. (If maintainers prefer the real SDK, that is a follow-up changeset + dependency add.)

**Enabled only via env** (none set ⇒ nothing starts): `FUSION_OTEL_METRICS_ENDPOINT` (full `/v1/metrics` URL, required to enable), `FUSION_OTEL_METRICS_HEADERS` (`k=v,k2=v2` auth headers), `FUSION_OTEL_METRICS_INTERVAL_MS`, `FUSION_OTEL_METRICS_TIMEOUT_MS`, `FUSION_OTEL_RESOURCE_ATTRIBUTES`.

**Security:** endpoint validated on write — `http://` is rejected in production (exporter does not start) and warns loudly otherwise; auth header (Datadog/Grafana token) VALUES are never logged and are masked in diagnostics; a collector-unreachable failure logs (redacted) and backs off exponentially without crashing the server or blocking requests.
9 changes: 9 additions & 0 deletions .changeset/u11-external-signal-ingestion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@runfusion/fusion": minor
---

Ingest external signals (Sentry / Datadog / PagerDuty / generic webhook) into triage tasks via a common `SignalSource` adapter seam (U11, KTD8).

- New `POST /api/signals/:provider` endpoints, mirroring the GitHub ingestion path. Verified, normalized signals create a task in the `triage` column via the existing task store.
- Generic webhook is the must-work path; Sentry/Datadog/PagerDuty are thin adapters with provider-specific HMAC verification + payload normalization. Each normalized `Signal` carries a `groupingKey` (Sentry `issue.id`, PagerDuty `incident.id`, Datadog monitor key; the generic webhook requires a caller-supplied key or falls back to `source + normalized-title`) for the downstream storm guard.
- Security (mandatory): per-provider HMAC against an env-sourced secret (never source-controlled) with 401 on missing/invalid secret or signature — the generic webhook is never an unauthenticated task-creation endpoint; ±5 min replay window + delivery-id nonce dedup; persistent external-id dedup; ~1 MB body cap; per-source rate limit; field-length + meta-byte caps; SSRF-untrusted handling of payload URLs; `meta` stored as data, never rendered as raw HTML.
10 changes: 10 additions & 0 deletions .changeset/u14-knowledge-index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@runfusion/fusion": minor
---

Add a persistent, incrementally-refreshed knowledge index (U14) downstream agents can query.

- **Schema** — new `knowledge_pages` SQLite table (`packages/core/src/db.ts`) with `SCHEMA_VERSION` bumped 118 → 119 (added in the same change as the migration; the fingerprint auto-covers SCHEMA_SQL tables). Keyword search uses a denormalized lowercased `searchText` column with AND-of-terms `LIKE` matching, deliberately avoiding SQLite FTS5 (not available on every build) and any external embedding API.
- **Index module** (`packages/dashboard/src/knowledge-index.ts`) — upsert-by-source-key pages, a model-free keyword query API, and `refreshKnowledgeForTask` that re-indexes a single completed task (one upsert, never a full re-index, so unaffected pages keep their timestamps). This is the delta over the existing `insights`/`memoryView` surfaces, which are LLM-extracted learnings, not a deterministic searchable index of concrete task/PR history.
- **Refresh hook** — `KnowledgeIndexRefreshService` listens for `task:moved → done` (mirroring `GitHubSourceIssueCloseService`) and is wired alongside the other completion listeners; fail-soft so it can never disrupt task completion.
- **Query API** (`register-knowledge-routes.ts`) — `GET /api/knowledge/query` and `POST /api/knowledge/refresh`, registered as an `ApiRouteRegistrar` so they inherit the dashboard's standard session/auth middleware (401 when unauthenticated) and apply `getScopedStore(req)` (no cross-project reads), exactly like U9.
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ Scoped exception (FN-5819): shared-branch-group members (`branchContext.assignme

### Lazy-Loaded Heavy Views

These 22 views are lazy-loaded via `React.lazy()` with `<Suspense fallback={null}>`.
These 23 views are lazy-loaded via `React.lazy()` with `<Suspense fallback={null}>`.
Keep this AGENTS inventory in sync with App lazy imports, AppModals lazy modal imports (`SettingsModal`, `WorkflowNodeEditor`, `SetupWizardModal`), and `packages/dashboard/app/__tests__/lazy-loaded-views-docs.test.ts`.

- `AgentsView`
Expand All @@ -229,6 +229,7 @@ Keep this AGENTS inventory in sync with App lazy imports, AppModals lazy modal i
- `SkillsView`
- `ResearchView`
- `ReliabilityView`
- `CommandCenter`
- `EvalsView`
- `TodoView`
- `GoalsView`
Expand Down
Loading
Loading