@blackbelt-technology/pi-agent-dashboard 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -30
- package/README.md +69 -1
- package/docs/architecture.md +89 -165
- package/package.json +10 -7
- package/packages/extension/package.json +2 -2
- package/packages/extension/src/__tests__/bridge-default-model-gate.test.ts +47 -0
- package/packages/extension/src/__tests__/bridge-followup-chat-order.test.ts +215 -0
- package/packages/extension/src/__tests__/bridge-followup-multi-entry.test.ts +202 -0
- package/packages/extension/src/__tests__/bridge-queue-update-forward.test.ts +77 -0
- package/packages/extension/src/__tests__/bridge-retry-ordering.test.ts +148 -0
- package/packages/extension/src/__tests__/bridge-shadow-queue-drain.test.ts +221 -0
- package/packages/extension/src/__tests__/bridge-shadow-queue-gate.test.ts +299 -0
- package/packages/extension/src/__tests__/bridge-shutdown-reset.test.ts +238 -0
- package/packages/extension/src/__tests__/bridge-slash-command-routing.test.ts +127 -31
- package/packages/extension/src/__tests__/command-handler.test.ts +105 -3
- package/packages/extension/src/__tests__/fixtures/usage-limit-error-strings.ts +127 -0
- package/packages/extension/src/__tests__/source-detector.test.ts +15 -0
- package/packages/extension/src/__tests__/usage-limit-orderer.test.ts +12 -0
- package/packages/extension/src/bridge-default-model-gate.ts +32 -0
- package/packages/extension/src/bridge.ts +299 -20
- package/packages/extension/src/command-handler.ts +53 -7
- package/packages/extension/src/dashboard-default-adapter.ts +5 -0
- package/packages/extension/src/prompt-bus.ts +15 -0
- package/packages/extension/src/slash-dispatch.ts +30 -15
- package/packages/extension/src/source-detector.ts +13 -5
- package/packages/extension/src/usage-limit-orderer.ts +18 -1
- package/packages/server/bin/pi-dashboard.mjs +62 -14
- package/packages/server/package.json +9 -5
- package/packages/server/src/__tests__/browser-gateway-register-handler.test.ts +69 -0
- package/packages/server/src/__tests__/cli-env-no-clobber.test.ts +46 -0
- package/packages/server/src/__tests__/cli-no-bootstrap-references.test.ts +69 -0
- package/packages/server/src/__tests__/cli-parse.test.ts +9 -10
- package/packages/server/src/__tests__/cli-version.test.ts +151 -0
- package/packages/server/src/__tests__/directory-service-openspec-enabled.test.ts +9 -0
- package/packages/server/src/__tests__/directory-service-refresh-force.test.ts +9 -0
- package/packages/server/src/__tests__/directory-service-specs-mtime.test.ts +9 -0
- package/packages/server/src/__tests__/directory-service-toctou.test.ts +9 -0
- package/packages/server/src/__tests__/directory-service.test.ts +9 -0
- package/packages/server/src/__tests__/doctor-route.test.ts +53 -0
- package/packages/server/src/__tests__/event-wiring-queue-state.test.ts +156 -0
- package/packages/server/src/__tests__/event-wiring-resume-clear.test.ts +105 -0
- package/packages/server/src/__tests__/health-shape.test.ts +35 -12
- package/packages/server/src/__tests__/installed-package-enricher.test.ts +12 -12
- package/packages/server/src/__tests__/is-activity-event.test.ts +4 -7
- package/packages/server/src/__tests__/package-routes.test.ts +6 -2
- package/packages/server/src/__tests__/pi-changelog-routes.test.ts +10 -13
- package/packages/server/src/__tests__/pi-core-checker.test.ts +2 -2
- package/packages/server/src/__tests__/pi-version-skew.test.ts +3 -2
- package/packages/server/src/__tests__/plugin-activation-routes.test.ts +267 -0
- package/packages/server/src/__tests__/plugin-intent-cache.test.ts +75 -0
- package/packages/server/src/__tests__/preferences-store.test.ts +196 -0
- package/packages/server/src/__tests__/reattach-placement.test.ts +9 -0
- package/packages/server/src/__tests__/recommended-routes.test.ts +2 -2
- package/packages/server/src/__tests__/recovery-server.test.ts +203 -0
- package/packages/server/src/__tests__/session-action-handler-clear-queue.test.ts +153 -0
- package/packages/server/src/__tests__/session-action-handler-headless-reload.test.ts +43 -0
- package/packages/server/src/__tests__/session-order-manager.test.ts +9 -0
- package/packages/server/src/__tests__/session-order-reboot.test.ts +9 -0
- package/packages/server/src/__tests__/session-ordering-integration.test.ts +9 -0
- package/packages/server/src/browser-gateway.ts +83 -5
- package/packages/server/src/browser-handlers/directory-handler.ts +69 -0
- package/packages/server/src/browser-handlers/session-action-handler.ts +89 -0
- package/packages/server/src/browser-handlers/subscription-handler.ts +23 -0
- package/packages/server/src/changelog-parser.ts +1 -1
- package/packages/server/src/cli.ts +68 -250
- package/packages/server/src/event-status-extraction.ts +14 -62
- package/packages/server/src/event-wiring.ts +23 -10
- package/packages/server/src/memory-session-manager.ts +4 -0
- package/packages/server/src/pi-core-checker.ts +1 -1
- package/packages/server/src/pi-dev-version-check.ts +1 -1
- package/packages/server/src/pi-version-skew.ts +24 -46
- package/packages/server/src/plugin-intent-cache.ts +67 -0
- package/packages/server/src/preferences-store.ts +199 -13
- package/packages/server/src/recovery-server.ts +366 -0
- package/packages/server/src/routes/__tests__/manifest-route.test.ts +138 -0
- package/packages/server/src/routes/doctor-routes.ts +26 -21
- package/packages/server/src/routes/manifest-route.ts +162 -0
- package/packages/server/src/routes/openspec-routes.ts +4 -25
- package/packages/server/src/routes/pi-changelog-routes.ts +5 -24
- package/packages/server/src/routes/pi-core-routes.ts +3 -23
- package/packages/server/src/routes/plugin-activation-routes.ts +193 -0
- package/packages/server/src/routes/recommended-routes.ts +21 -0
- package/packages/server/src/routes/system-routes.ts +73 -11
- package/packages/server/src/server.ts +105 -307
- package/packages/server/src/session-api.ts +5 -63
- package/packages/shared/package.json +1 -1
- package/packages/shared/src/__tests__/binary-lookup-resolveJiti.test.ts +28 -0
- package/packages/shared/src/__tests__/binary-lookup-spawn-env.test.ts +61 -0
- package/packages/shared/src/__tests__/binary-lookup.test.ts +16 -0
- package/packages/shared/src/__tests__/bridge-register.test.ts +67 -0
- package/packages/shared/src/__tests__/ci-electron-no-side-effects.test.ts +129 -0
- package/packages/shared/src/__tests__/config.test.ts +40 -0
- package/packages/shared/src/__tests__/dashboard-paths.test.ts +81 -0
- package/packages/shared/src/__tests__/ensure-windows-path.test.ts +112 -0
- package/packages/shared/src/__tests__/intent-types.test.ts +120 -0
- package/packages/shared/src/__tests__/jiti-packages-parity.test.ts +85 -0
- package/packages/shared/src/__tests__/legacy-managed-dir.test.ts +59 -0
- package/packages/shared/src/__tests__/no-direct-child-process.test.ts +12 -0
- package/packages/shared/src/__tests__/no-electron-execpath-spawn.test.ts +149 -0
- package/packages/shared/src/__tests__/no-flow-command-route-claims.test.ts +71 -0
- package/packages/shared/src/__tests__/no-flow-references-in-shell.test.ts +221 -0
- package/packages/shared/src/__tests__/no-managed-dir-reference.test.ts +134 -0
- package/packages/shared/src/__tests__/no-pi-dashboard-version-jiti-gate.test.ts +41 -0
- package/packages/shared/src/__tests__/no-primitive-direct-import.test.ts +235 -0
- package/packages/shared/src/__tests__/no-server-imports-in-resolver.test.ts +53 -0
- package/packages/shared/src/__tests__/node-spawn-jiti-contract.test.ts +54 -101
- package/packages/shared/src/__tests__/node-spawn.test.ts +29 -13
- package/packages/shared/src/__tests__/pi-package-resolver.test.ts +300 -0
- package/packages/shared/src/__tests__/plugin-activation-contracts.test.ts +74 -0
- package/packages/shared/src/__tests__/plugin-bridge-classify-source.test.ts +73 -0
- package/packages/shared/src/__tests__/plugin-bridge-register-extended.test.ts +17 -5
- package/packages/shared/src/__tests__/plugin-bridge-register-packages.test.ts +233 -0
- package/packages/shared/src/__tests__/plugin-bridge-register.test.ts +19 -9
- package/packages/shared/src/__tests__/publish-workflow-contract.test.ts +154 -15
- package/packages/shared/src/__tests__/recommended-extensions.test.ts +28 -10
- package/packages/shared/src/__tests__/resolver-parity-with-scanner.test.ts +76 -0
- package/packages/shared/src/__tests__/server-identity.test.ts +127 -0
- package/packages/shared/src/__tests__/server-launcher.test.ts +35 -0
- package/packages/shared/src/__tests__/source-matching.test.ts +5 -5
- package/packages/shared/src/__tests__/sync-versions-spec.test.ts +76 -0
- package/packages/shared/src/__tests__/tool-registry-definitions.test.ts +50 -2
- package/packages/shared/src/bridge-register.ts +35 -2
- package/packages/shared/src/browser-protocol.ts +176 -2
- package/packages/shared/src/config.ts +12 -0
- package/packages/shared/src/dashboard-paths.ts +69 -0
- package/packages/shared/src/dashboard-plugin/index.ts +2 -0
- package/packages/shared/src/dashboard-plugin/intent-types.ts +93 -0
- package/packages/shared/src/dashboard-plugin/manifest-types.ts +55 -1
- package/packages/shared/src/dashboard-plugin/plugin-status.ts +82 -0
- package/packages/shared/src/dashboard-plugin/slot-props.ts +11 -0
- package/packages/shared/src/dashboard-plugin/slot-types.ts +16 -2
- package/packages/shared/src/dashboard-plugin/ui-primitives.ts +287 -0
- package/packages/shared/src/dashboard-starter.ts +22 -0
- package/packages/shared/src/doctor-core.ts +49 -27
- package/packages/shared/src/launch-source-types.ts +9 -9
- package/packages/shared/src/legacy-managed-dir.ts +97 -0
- package/packages/shared/src/mdns-discovery.ts +4 -1
- package/packages/shared/src/pi-package-resolver.ts +388 -0
- package/packages/shared/src/platform/binary-lookup.ts +27 -3
- package/packages/shared/src/platform/ensure-windows-path.ts +95 -0
- package/packages/shared/src/platform/exec.ts +22 -0
- package/packages/shared/src/platform/node-spawn.ts +42 -41
- package/packages/shared/src/plugin-bridge-register.ts +275 -18
- package/packages/shared/src/protocol.ts +94 -2
- package/packages/shared/src/recommended-extensions.ts +34 -10
- package/packages/shared/src/server-identity.ts +74 -5
- package/packages/shared/src/server-launcher.ts +20 -0
- package/packages/shared/src/source-matching.ts +1 -1
- package/packages/shared/src/tool-registry/__tests__/node-script-toargv-fallback.test.ts +84 -0
- package/packages/shared/src/tool-registry/definitions.ts +91 -7
- package/packages/shared/src/types.ts +12 -8
- package/scripts/maybe-patch-package.cjs +44 -0
- package/packages/server/src/__tests__/bootstrap-install-from-list.test.ts +0 -263
- package/packages/server/src/__tests__/bootstrap-queue.test.ts +0 -120
- package/packages/server/src/__tests__/bootstrap-routes.test.ts +0 -125
- package/packages/server/src/__tests__/bootstrap-state.test.ts +0 -119
- package/packages/server/src/__tests__/cli-bootstrap.test.ts +0 -36
- package/packages/server/src/__tests__/event-status-extraction-flow.test.ts +0 -55
- package/packages/server/src/__tests__/legacy-pi-cleanup.test.ts +0 -149
- package/packages/server/src/__tests__/post-install-openspec-refresh.test.ts +0 -180
- package/packages/server/src/__tests__/post-install-rescan.test.ts +0 -134
- package/packages/server/src/__tests__/system-routes-reextract.test.ts +0 -91
- package/packages/server/src/bootstrap-install-from-list.ts +0 -232
- package/packages/server/src/bootstrap-queue.ts +0 -130
- package/packages/server/src/bootstrap-state.ts +0 -159
- package/packages/server/src/legacy-pi-cleanup.ts +0 -151
- package/packages/server/src/routes/bootstrap-routes.ts +0 -125
- package/packages/shared/src/__tests__/bootstrap/README.md +0 -133
- package/packages/shared/src/__tests__/bootstrap/__snapshots__/cube.test.ts.snap +0 -378
- package/packages/shared/src/__tests__/bootstrap/assertions.ts +0 -136
- package/packages/shared/src/__tests__/bootstrap/cube.test.ts +0 -47
- package/packages/shared/src/__tests__/bootstrap/cube.ts +0 -66
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/a-electron.test.ts.snap +0 -84
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/b-npm-global.test.ts.snap +0 -90
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/c-dev-monorepo.test.ts.snap +0 -34
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/d-overrides.test.ts.snap +0 -20
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/e-stale-partial.test.ts.snap +0 -62
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/f-cwd-variants.test.ts.snap +0 -34
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/g-windows-specifics.test.ts.snap +0 -49
- package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/j-path-gui-minimal.test.ts.snap +0 -12
- package/packages/shared/src/__tests__/bootstrap/families/a-electron.test.ts +0 -156
- package/packages/shared/src/__tests__/bootstrap/families/b-npm-global.test.ts +0 -157
- package/packages/shared/src/__tests__/bootstrap/families/c-dev-monorepo.test.ts +0 -102
- package/packages/shared/src/__tests__/bootstrap/families/d-overrides.test.ts +0 -76
- package/packages/shared/src/__tests__/bootstrap/families/e-stale-partial.test.ts +0 -94
- package/packages/shared/src/__tests__/bootstrap/families/f-cwd-variants.test.ts +0 -87
- package/packages/shared/src/__tests__/bootstrap/families/g-windows-specifics.test.ts +0 -143
- package/packages/shared/src/__tests__/bootstrap/families/h-home-drift.test.ts +0 -64
- package/packages/shared/src/__tests__/bootstrap/families/i-malformed-settings.test.ts +0 -77
- package/packages/shared/src/__tests__/bootstrap/families/index.ts +0 -19
- package/packages/shared/src/__tests__/bootstrap/families/j-path-gui-minimal.test.ts +0 -61
- package/packages/shared/src/__tests__/bootstrap/families/k-dashboard-absent.test.ts +0 -50
- package/packages/shared/src/__tests__/bootstrap/families/l-instance-coordination.test.ts +0 -272
- package/packages/shared/src/__tests__/bootstrap/fixtures/dev-monorepo.ts +0 -58
- package/packages/shared/src/__tests__/bootstrap/fixtures/electron-layout.ts +0 -84
- package/packages/shared/src/__tests__/bootstrap/fixtures/index.ts +0 -9
- package/packages/shared/src/__tests__/bootstrap/fixtures/managed-install.ts +0 -85
- package/packages/shared/src/__tests__/bootstrap/fixtures/npm-global-layout.ts +0 -122
- package/packages/shared/src/__tests__/bootstrap/fixtures/pi-versions.ts +0 -36
- package/packages/shared/src/__tests__/bootstrap/fixtures/settings-json.ts +0 -39
- package/packages/shared/src/__tests__/bootstrap/harness.smoke.test.ts +0 -220
- package/packages/shared/src/__tests__/bootstrap/harness.ts +0 -413
- package/packages/shared/src/__tests__/bootstrap/scenarios-skipped.ts +0 -125
- package/packages/shared/src/__tests__/bootstrap/scenarios.ts +0 -132
- package/packages/shared/src/__tests__/bootstrap-install-resolve-npm.test.ts +0 -72
- package/packages/shared/src/__tests__/install-managed-node-bootstrap-order.test.ts +0 -68
- package/packages/shared/src/__tests__/install-managed-node.test.ts +0 -192
- package/packages/shared/src/__tests__/installable-list.test.ts +0 -130
- package/packages/shared/src/__tests__/no-installable-list-in-bridge.test.ts +0 -52
- package/packages/shared/src/bootstrap-install.ts +0 -406
- package/packages/shared/src/installable-list.ts +0 -152
- package/packages/shared/src/launch-source-flag.ts +0 -14
package/AGENTS.md
CHANGED
|
@@ -145,8 +145,6 @@ See [docs/architecture.md](docs/architecture.md) for full details.
|
|
|
145
145
|
npm install # Install dependencies
|
|
146
146
|
npm test # Run all tests (vitest)
|
|
147
147
|
npm run test:watch # Watch mode
|
|
148
|
-
npm run test:bootstrap # Run the bootstrap resolution harness only
|
|
149
|
-
npm run test:bootstrap:watch # Bootstrap harness in watch mode
|
|
150
148
|
npm run build # Build web client (Vite)
|
|
151
149
|
npm run dev # Start Vite dev server
|
|
152
150
|
npm run reload # Reload all connected pi sessions
|
|
@@ -278,6 +276,9 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
278
276
|
| `.pi/skills/openspec-shared/scripts/effective-status.sh` | Bash wrapper around `openspec status` applying R1/R2/R3 promotion |
|
|
279
277
|
| `src/shared/state-replay.ts` | Synthesizes events from pi entries (shared, used by server + bridge) |
|
|
280
278
|
| `src/shared/dashboard-plugin/slot-types.ts` | Frozen slot taxonomy: `SlotId`, `Multiplicity`, `PayloadTier`, `SLOT_DEFINITIONS` |
|
|
279
|
+
| `src/shared/dashboard-plugin/ui-primitives.ts` | UI primitive registry contracts: `UI_PRIMITIVE_KEYS`, `UiPrimitiveMap`, per-primitive prop interfaces. See `docs/plugin-ui-primitives.md`. |
|
|
280
|
+
| `packages/dashboard-plugin-runtime/src/ui-primitive-{registry,context}.tsx` | Registry runtime: `createUiPrimitiveRegistry`, `registerUiPrimitive`, `<UiPrimitiveProvider>`, `useUiPrimitive` (strict), `useUiPrimitiveOrNull` (soft). |
|
|
281
|
+
| `packages/dashboard-plugin-runtime/src/test-support/withUiPrimitiveProvider.tsx` | Test helper that wraps a render in a UiPrimitiveProvider populated with mock impls. |
|
|
281
282
|
| `src/shared/dashboard-plugin/manifest-types.ts` | `PluginManifest` and `PluginClaim` interfaces |
|
|
282
283
|
| `src/shared/dashboard-plugin/slot-props.ts` | `SlotPropsMap` and `SlotProps<SlotId>` typed prop contracts per slot id |
|
|
283
284
|
| `src/shared/dashboard-plugin/plugin-status.ts` | `PluginStatus` (for `/api/health`) and `PluginConfigUpdate` (WS payload) |
|
|
@@ -292,6 +293,8 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
292
293
|
| `packages/dashboard-plugin-runtime/src/server/server-context.ts` | `createServerPluginContext` — per-plugin scoped logger + config |
|
|
293
294
|
| `packages/dashboard-plugin-runtime/src/server/config-validator.ts` | Ajv JSON-Schema 7 validation for plugin config writes |
|
|
294
295
|
| `packages/dashboard-plugin-runtime/src/server/plugin-status-store.ts` | In-memory `PluginStatusStore` for `/api/health.plugins[]` |
|
|
296
|
+
| `packages/dashboard-plugin-runtime/src/server/requirement-probes.ts` | Declarative requirement probes (piExtensions/binaries/services); 30s cache. See change: add-plugin-activation-ui. |
|
|
297
|
+
| `src/server/routes/plugin-activation-routes.ts` | REST routes: GET /api/plugins, POST /api/plugins/:id/toggle. See change: add-plugin-activation-ui. |
|
|
295
298
|
| `src/server/routes/plugin-config-routes.ts` | `POST /api/config/plugins/:id` — validates and merges plugin config (auth-gated) |
|
|
296
299
|
| `packages/demo-plugin/` | Private fixture plugin exercising settings-section + tool-renderer slots |
|
|
297
300
|
| `packages/dashboard-plugin-skill/` | Pi skill `dashboard-plugin-scaffold`. Modes: `new` (scaffold packages/<id>-plugin/), `augment` (inject manifest + src/dashboard/ into pi-extension at cwd). |
|
|
@@ -301,6 +304,7 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
301
304
|
| `src/server/routes/session-routes.ts` | REST routes: sessions, events, session-diff |
|
|
302
305
|
| `src/server/routes/git-routes.ts` | REST routes: git branches, checkout, init, stash-pop |
|
|
303
306
|
| `src/server/routes/file-routes.ts` | REST routes: file read, browse, browse-flags, browse-mkdir, readme, pinned-dirs |
|
|
307
|
+
| `packages/server/src/routes/manifest-route.ts` | Dynamic `/manifest.json` route. Pure `stripPort` + `resolveManifestSource` + `buildManifestBody`; registered before fastify-static. |
|
|
304
308
|
| `src/server/routes/openspec-routes.ts` | REST routes: openspec-archive, pi-resources, pi-resource-file |
|
|
305
309
|
| `src/server/routes/system-routes.ts` | REST routes: config, health, shutdown, tunnel, editors |
|
|
306
310
|
| `src/server/event-wiring.ts` | Pi gateway → browser gateway event forwarding; UI cache + activity stamping + unread trigger |
|
|
@@ -346,13 +350,8 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
346
350
|
| `src/shared/tool-registry/types.ts` | `ToolDefinition`, `Strategy`, `Resolution`, error classes |
|
|
347
351
|
| `src/shared/tool-registry/index.ts` | Barrel export + `getDefaultRegistry()` singleton accessor |
|
|
348
352
|
| `src/server/routes/tool-routes.ts` | REST routes for `/api/tools*` (list, rescan, override, diagnostics) |
|
|
349
|
-
| `packages/
|
|
350
|
-
| `packages/
|
|
351
|
-
| `packages/server/src/routes/bootstrap-routes.ts` | REST routes: bootstrap status, upgrade-pi, retry |
|
|
352
|
-
| `packages/server/src/bootstrap-queue.ts` | In-memory ticket queue, flushes on bootstrap-state ready transition |
|
|
353
|
-
| `packages/server/src/pi-version-skew.ts` | Pi compatibility range reader + comparator + bootstrap compatibility writer |
|
|
354
|
-
| `packages/client/src/hooks/useBootstrapStatus.ts` | Client hook for bootstrap state (fetch + WS subscribe) |
|
|
355
|
-
| `packages/client/src/components/BootstrapBanner.tsx` | Banner above MobileShell for installing/failed/upgrade states |
|
|
353
|
+
| `packages/server/src/pi-version-skew.ts` | Pure pi version compatibility helpers (`readPiCompatibility`, `computeCompatibility`) |
|
|
354
|
+
| `packages/shared/src/legacy-managed-dir.ts` | `detectLegacyManagedDir({homedir?})` returns `{present, path, pkgCount, sizeMb}`; surface for Doctor advisory + server CLI startup log |
|
|
356
355
|
| `src/client/lib/tools-api.ts` | Client-side fetch helpers for `/api/tools*` |
|
|
357
356
|
| `src/client/components/ToolsSection.tsx` | Settings → General → Tools section (per-tool status/source/override UI) |
|
|
358
357
|
| `src/server/npm-search-proxy.ts` | Cached proxy for npm registry search (`keywords:pi-package`) and README |
|
|
@@ -380,7 +379,6 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
380
379
|
| `src/shared/platform/node-spawn.ts` | Sole source of `node --import <loader> <entry>` argv construction |
|
|
381
380
|
| `src/shared/__tests__/no-raw-node-import.test.ts` | Repo-lint: forbid raw `--import`/`--loader` argv outside `node-spawn.ts` |
|
|
382
381
|
| `src/shared/__tests__/no-direct-process-kill.test.ts` | Repo-lint: forbid `process.kill(` outside `platform/` |
|
|
383
|
-
| `src/shared/__tests__/bootstrap/` | In-memory bootstrap resolution harness (memfs-backed); 1080-cell scenario cube |
|
|
384
382
|
| `src/server/editor-registry.ts` | Detects available native editors (running processes + CLI) |
|
|
385
383
|
| `src/server/editor-manager.ts` | Lifecycle manager for code-server child processes |
|
|
386
384
|
| `src/server/editor-proxy.ts` | Reverse proxy for `/editor/:id/*` to code-server instances |
|
|
@@ -414,6 +412,7 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
414
412
|
| `src/extension/provider-register.ts` | Reads `providers.json`, calls `pi.registerProvider`, hot-reload on credentials change |
|
|
415
413
|
| `src/client/lib/providers-api.ts` | Client fetch helper for `/api/providers/test` connection probe |
|
|
416
414
|
| `src/client/components/ProviderAuthSection.tsx` | Settings section: OAuth login buttons, device-code modal, API key inputs |
|
|
415
|
+
| `packages/client/src/components/PluginsSection.tsx` | Settings ▸ Plugins activation list; toggle + missing-requirement install. See change: add-plugin-activation-ui. |
|
|
417
416
|
| `src/server/auth-plugin.ts` | Fastify plugin: auth routes, onRequest hook, WS upgrade validation |
|
|
418
417
|
| `src/server/config-api.ts` | Config REST API: read (redacted), write (partial merge), secret preservation |
|
|
419
418
|
| `src/client/components/SettingsPanel.tsx` | Settings UI: all dashboard config fields, grouped form, save to server |
|
|
@@ -455,20 +454,18 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
455
454
|
| `.pi/skills/browser-visual-debug/SKILL.md` | Skill: visual debugging with a real browser via pi-agent-browser |
|
|
456
455
|
| `.pi/skills/browser-visual-debug/references/` | Dashboard recipes, responsive presets, agent-browser cheatsheet |
|
|
457
456
|
| `.pi/skills/browser-visual-debug/scripts/detect-dashboard.sh` | Auto-detect dashboard URL, mode, Vite dev server status |
|
|
458
|
-
| `packages/electron/src/main.ts` | Electron main:
|
|
457
|
+
| `packages/electron/src/main.ts` | Electron main: 6-state startup machine (check-health → attach \| wizard → spawn → health-wait → done \| loading-page-error); single-instance, tray |
|
|
459
458
|
| `packages/electron/src/lib/link-handling.ts` | Pure `isSameOriginUrl` + OAuth-aware `decideWillNavigate` for external-link guard |
|
|
460
459
|
| `packages/client/src/components/MarkdownContent.tsx` | ReactMarkdown renderer (chat/thinking/READMEs/previews); external-link hardening + KaTeX math + `pi-asset:` image scheme |
|
|
461
460
|
| `packages/client/src/lib/SessionAssetsContext.tsx` | Per-session image-asset registry context resolving `pi-asset:<hash>` srcs in `MarkdownContent` |
|
|
462
461
|
| `packages/extension/src/markdown-image-inliner.ts` | Bridge helper rewriting assistant `` → `` (SHA-256/16, MIME allowlist, 5 MB/img + 20 MB/msg caps) |
|
|
463
462
|
| `packages/client/src/__tests__/no-bare-external-anchor.test.ts` | Repo-lint: forbid bare `<a href="http(s)://">` without `target="_blank"` |
|
|
464
|
-
| `packages/electron/src/lib/pick-node.ts` |
|
|
465
|
-
| `packages/electron/src/lib/ensure-windows-path.ts` | `ensureWindowsSystemPath`
|
|
466
|
-
| `packages/electron/src/lib/server-lifecycle.ts` |
|
|
467
|
-
| `packages/electron/src/lib/launch-source.ts` | `selectLaunchSource()` resolver: attach
|
|
468
|
-
| `packages/electron/src/lib/bundle-extract.ts` | `needsExtraction`, `migrateConfigs`, `extractBundle` with survive-extract whitelist for `~/.pi-dashboard/` |
|
|
469
|
-
| `packages/shared/src/installable-list.ts` | `InstallablePackage`/`InstallableList` types; `readInstallableList`, `writeInstallableList`, `mergeInstallableList` |
|
|
470
|
-
| `packages/server/src/bootstrap-install-from-list.ts` | Per-package reconcile loop reading `~/.pi/dashboard/installable.json`; no-op when file absent |
|
|
463
|
+
| `packages/electron/src/lib/pick-node.ts` | `pickNodeForServer` — 2 strategies: bundled → execpath-fallback (corrupted-install signal) |
|
|
464
|
+
| `packages/electron/src/lib/ensure-windows-path.ts` | Re-export shim of shared `ensureWindowsSystemPath` (prepends System32/Wbem/PowerShell/OpenSSH/WindowsApps on Win; no-op on POSIX) |
|
|
465
|
+
| `packages/electron/src/lib/server-lifecycle.ts` | Thin `selectLaunchSource + spawnFromSource` shim; `setSpawnedPid` + `decideShutdownOnQuit` ownership rule |
|
|
466
|
+
| `packages/electron/src/lib/launch-source.ts` | `selectLaunchSource()` resolver — 3 strategies: attach \| devMonorepo \| bundled; `spawnFromSource` |
|
|
471
467
|
| `packages/shared/src/bridge-register.ts` | Shared bridge registration: `findBundledExtension(baseDir)` + `registerBridgeExtension(path)`; non-destructive cleanup, AppImage guard. Used by server startup and Electron wizard. |
|
|
468
|
+
| `packages/shared/src/pi-package-resolver.ts` | Resolves pi `packages[]` (npm/git/https/abs/rel) to install dir + entry path. Tier-2 fallback for plugin peer imports across npm/git/local installs. See change: add-shared-pi-package-resolver. |
|
|
472
469
|
| `packages/electron/src/lib/doctor.ts` | Doctor diagnostic: checks all binaries, versions, server status, offers setup |
|
|
473
470
|
| `packages/shared/src/doctor-core.ts` | Shared doctor primitives: types, SECTION_OF, SUGGESTIONS, safeExec/safeCheck/assumedMandatory, runSharedChecks, formatDoctorReportMarkdown |
|
|
474
471
|
| `packages/electron/src/lib/doctor-bridge-contract.ts` | Typed `DoctorBridge` interface + frozen `DOCTOR_IPC_CHANNELS` (channel-name-drift lint) |
|
|
@@ -480,23 +477,15 @@ This section lists only the **architectural backbone** — the files agents touc
|
|
|
480
477
|
| `packages/client/src/components/DiagnosticsSection.tsx` | Settings → Diagnostics — fetch, sections, suggestions, copy-to-clipboard with textarea fallback |
|
|
481
478
|
| `packages/electron/src/lib/app-menu.ts` | App menu with About dialog and Doctor on all platforms |
|
|
482
479
|
| `packages/electron/src/lib/tray.ts` | System tray with platform-specific icons |
|
|
483
|
-
| `packages/electron/src/lib/dependency-
|
|
484
|
-
| `packages/electron/src/lib/dependency-detector.ts` | Detects pi/openspec/Node on PATH and managed install (AppImage + Win-ext guards) |
|
|
480
|
+
| `packages/electron/src/lib/dependency-detector.ts` | Detects pi/openspec/Node on PATH (AppImage + Win-ext guards) |
|
|
485
481
|
| `packages/electron/src/lib/bundled-node.ts` | Resolves bundled Node.js/npm paths in Electron resources |
|
|
486
|
-
| `packages/electron/src/lib/wizard-window.ts` |
|
|
482
|
+
| `packages/electron/src/lib/wizard-window.ts` | Single-window factory for the slim welcome wizard |
|
|
483
|
+
| `packages/electron/src/renderer/wizard.html` | 179-LOC welcome card + `[Launch dashboard]` CTA + Advanced disclosure |
|
|
487
484
|
| `packages/electron/forge.config.ts` | Electron Forge config: DMG/DEB/AppImage/NSIS makers; arch-tagged DMG; macOS 10.15 floor |
|
|
488
485
|
| `packages/electron/scripts/build-installer.sh` | Build script: native + Docker cross-platform; `--mac-both` arm64+x64 sequence |
|
|
489
486
|
| `packages/electron/scripts/docker-make.sh` | Docker entrypoint: bundles server, native deps, runs Forge make |
|
|
490
487
|
| `packages/electron/scripts/Dockerfile.build` | Docker image for cross-platform builds (node:22-bookworm-slim) |
|
|
491
|
-
| `packages/electron/scripts/bundle-server.mjs` | Bundles
|
|
492
|
-
| `packages/electron/offline-packages.json` | Pinned versions of pi/openspec/tsx for offline npm cacache |
|
|
493
|
-
| `packages/electron/scripts/bundle-offline-packages.sh` | Build-time script: pack pinned versions into cacache tarball with SHA-256 |
|
|
494
|
-
| `packages/electron/resources/offline-packages/manifest.json` | Offline-cache manifest consumed at runtime by `dependency-installer.ts` |
|
|
495
|
-
| `packages/electron/resources/offline-packages/npm-cache.tar.gz` | gzipped npm cacache for first-run offline install |
|
|
496
|
-
| `packages/electron/src/lib/offline-packages.ts` | Pure offline-cache helpers (parse, resolve, verify SHA-256, extract) |
|
|
497
|
-
| `packages/electron/scripts/bundle-recommended-extensions.sh` | Opt-in: clone bundled-extension ids with SPDX allowlist + 15MB budget |
|
|
498
|
-
| `packages/electron/src/lib/dependency-installer.ts` → `installBundledExtensions` | First-run activation of pre-bundled extensions into pi git cache |
|
|
499
|
-
| `packages/electron/src/lib/wizard-badge.ts` | Pure `classifyProgressBadge(output)` (`bundled`/`system`/null) |
|
|
488
|
+
| `packages/electron/scripts/bundle-server.mjs` | Bundles server + workspace deps into `resources/server/`. Runs `npm install --omit=dev`. Phase 1 GO/NO-GO guard asserts node-pty prebuild triples |
|
|
500
489
|
| `packages/shared/src/recommended-extensions.ts` → `BUNDLED_EXTENSION_IDS` | Single source of truth for bundled extension ids in Electron installer |
|
|
501
490
|
| `packages/electron/scripts/test-server-launch.sh` | Docker-based test for server launch on clean Linux |
|
|
502
491
|
| `packages/electron/scripts/test-electron-install.sh` | Full e2e Docker test: install, wizard, server launch, health check |
|
package/README.md
CHANGED
|
@@ -75,6 +75,16 @@ On first launch a setup wizard walks you through mode selection (standalone vs.
|
|
|
75
75
|
|
|
76
76
|
### B — pi package (recommended for CLI users)
|
|
77
77
|
|
|
78
|
+
If you don't have pi yet, you can install the dashboard directly via npm — pi/openspec/tsx ship as regular npm dependencies, so a single install brings everything in:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
npm install -g @blackbelt-technology/pi-agent-dashboard
|
|
82
|
+
pi-dashboard
|
|
83
|
+
# open http://localhost:8000
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If pi is already installed, the bridge-extension flow is equivalent:
|
|
87
|
+
|
|
78
88
|
```bash
|
|
79
89
|
pi install npm:@blackbelt-technology/pi-agent-dashboard
|
|
80
90
|
pi
|
|
@@ -88,16 +98,60 @@ The bridge extension auto-starts the dashboard server on first launch:
|
|
|
88
98
|
|
|
89
99
|
Open **http://localhost:8000** in any browser. All active pi sessions appear automatically. See [Prerequisites](#prerequisites) for Node.js / build-tool requirements.
|
|
90
100
|
|
|
101
|
+
#### Windows install (PowerShell, Administrator)
|
|
102
|
+
|
|
103
|
+
Windows has a few extra one-time setup steps. Run the following in an **Administrator** PowerShell session:
|
|
104
|
+
|
|
105
|
+
```powershell
|
|
106
|
+
# 1. Enable long paths (required — npm node_modules nesting exceeds 260 chars)
|
|
107
|
+
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
|
|
108
|
+
|
|
109
|
+
# 2. Install Node.js LTS 22 via winget (ships >= 22.18 so no node-guard refusal)
|
|
110
|
+
winget install -e --id OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements
|
|
111
|
+
|
|
112
|
+
# 3. CLOSE this PowerShell, open a NEW one as Administrator (PATH refresh)
|
|
113
|
+
|
|
114
|
+
# 4. Verify
|
|
115
|
+
node --version # expect v22.18+ (any 22.x >= 22.18, NOT v22.0–v22.17)
|
|
116
|
+
npm --version # expect 10.x
|
|
117
|
+
|
|
118
|
+
# 5. Install
|
|
119
|
+
npm install -g @blackbelt-technology/pi-agent-dashboard
|
|
120
|
+
|
|
121
|
+
# 6. Start (foreground first time so you can see any errors)
|
|
122
|
+
pi-dashboard start
|
|
123
|
+
|
|
124
|
+
# 7. From the browser
|
|
125
|
+
start http://localhost:8000
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
C++ build tools are typically **not** required — `node-pty` ships a Windows x64 prebuild. Install Visual Studio Build Tools only if the prebuild fails to load. See [docs/installation-windows.md](docs/installation-windows.md) for more detail (offline / tarball / nvm-windows caveats).
|
|
129
|
+
|
|
91
130
|
### C — From source (contributors)
|
|
92
131
|
|
|
93
132
|
```bash
|
|
94
133
|
git clone https://github.com/BlackBeltTechnology/pi-agent-dashboard.git
|
|
95
134
|
cd pi-agent-dashboard
|
|
96
135
|
npm install
|
|
136
|
+
npm run build # one-time client build
|
|
97
137
|
pi install /path/to/pi-agent-dashboard # global
|
|
98
138
|
# or: pi install -l /path/to/pi-agent-dashboard # project-local only
|
|
99
139
|
```
|
|
100
140
|
|
|
141
|
+
#### Use the local checkout as the global `pi-dashboard` command
|
|
142
|
+
|
|
143
|
+
By default, `pi-dashboard` on your PATH refers to whatever copy was installed globally (via `npm i -g` or the Electron bundle). To make it point at your working tree instead — so every edit is live and bridge auto-start uses your changes — link the workspace:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
npm run link:local # symlinks `pi-dashboard` on PATH to packages/server/bin/pi-dashboard.mjs
|
|
147
|
+
pi-dashboard status
|
|
148
|
+
npm run unlink:local # restore (removes the global symlink)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The link survives across shells. Every invocation — including `pi`'s bridge auto-spawn — runs `packages/server/src/cli.ts` via jiti, so you don't need to rebuild the server on edits. The client still requires `npm run build` (or `npm run dev` for HMR).
|
|
152
|
+
|
|
153
|
+
> **Windows note:** symlink creation needs an admin shell or Windows Developer Mode enabled. Everything else works the same as POSIX.
|
|
154
|
+
|
|
101
155
|
To try the extension in a single pi session without registering it:
|
|
102
156
|
|
|
103
157
|
```bash
|
|
@@ -408,7 +462,7 @@ The dashboard integrates tightly with a small, curated set of pi extensions —
|
|
|
408
462
|
| Extension | Source | Status | Unlocks |
|
|
409
463
|
|---|---|---|---|
|
|
410
464
|
| `pi-anthropic-messages` | `git@github.com:BlackBeltTechnology/pi-anthropic-messages.git` | **required** | Tool calls on Claude-model Anthropic OAuth / 9Router `cc/*` / pi-model-proxy providers. Without it, tool calls fall back to Claude Code's built-in `bash_ide` sandbox and fail. |
|
|
411
|
-
|
|
|
465
|
+
| `pi-dashboard-subagents` | `https://github.com/BlackBeltTechnology/pi-dashboard-subagents.git` | optional (bundled) | `Agent` tool card UI, subagent inspector (inline expand + popout), agent-md path display |
|
|
412
466
|
| `pi-flows` | `git@github.com:BlackBeltTechnology/pi-flows.git` | strongly suggested | Flow dashboard, role aliases (`@planning`, `@coding`, …), subagent / flow_write / flow_results / agent_write / ask_user / skill_read / finish tools |
|
|
413
467
|
| `pi-web-access` | `npm:pi-web-access` | strongly suggested | `web_search`, `code_search`, `fetch_content`, `get_search_content` |
|
|
414
468
|
| `pi-agent-browser` | `npm:pi-agent-browser` | optional | `browser` tool (open, snapshot, click, screenshot) |
|
|
@@ -765,6 +819,20 @@ This runs CI, publishes to npm with `--provenance` for supply-chain transparency
|
|
|
765
819
|
|
|
766
820
|
All artifacts are uploaded to a **draft GitHub Release**. Release notes are extracted automatically from the matching `## [<version>]` section of [`CHANGELOG.md`](CHANGELOG.md).
|
|
767
821
|
|
|
822
|
+
### On-demand Electron build (CI dispatch)
|
|
823
|
+
|
|
824
|
+
Build a one-off installer for a feature branch. No release, no publish, no tag.
|
|
825
|
+
|
|
826
|
+
Workflow: [`.github/workflows/ci-electron.yml`](.github/workflows/ci-electron.yml). Trigger from GitHub Actions tab → **CI Electron (on-demand)** → **Run workflow** button.
|
|
827
|
+
|
|
828
|
+
Optional `legs` input narrows the matrix (default `all`; accepts `darwin`, `linux`, `win32`, or comma-list like `darwin-arm64,linux-x64` for cheap iteration).
|
|
829
|
+
|
|
830
|
+
Version slug: `<base>-ci.<UTC-stamp>.<branch-slug>.<sha7>` (e.g. `0.5.3-ci.20260525-143000.feature-foo-bar.abc1234`). Prerelease segment SemVer-ranks below `<base>`.
|
|
831
|
+
|
|
832
|
+
Download installers from the Actions run page → **Artifacts** section. 14-day retention.
|
|
833
|
+
|
|
834
|
+
Safe by construction: no npm publish, no GitHub Release, no auto-update impact. `electron-updater` default `allowPrerelease: false` skips `-ci.` slugs — installed users unaffected.
|
|
835
|
+
|
|
768
836
|
### Trusted Publisher (OIDC) setup
|
|
769
837
|
|
|
770
838
|
The publish workflow uses **[npm Trusted Publishers](https://docs.npmjs.com/trusted-publishers)** over OIDC — **no `NPM_TOKEN` secret required**. Short-lived, workflow-scoped credentials are exchanged between GitHub and npm at publish time, and every release carries automatic [npm provenance](https://docs.npmjs.com/generating-provenance-statements) tying the published artifact to the exact workflow run.
|