@blackbelt-technology/pi-agent-dashboard 0.4.5 → 0.5.0

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.
Files changed (133) hide show
  1. package/AGENTS.md +342 -267
  2. package/README.md +51 -2
  3. package/docs/architecture.md +266 -25
  4. package/package.json +14 -4
  5. package/packages/extension/package.json +2 -2
  6. package/packages/extension/src/__tests__/build-provider-catalogue.test.ts +176 -0
  7. package/packages/extension/src/__tests__/markdown-image-inliner.test.ts +355 -0
  8. package/packages/extension/src/__tests__/openspec-activity-detector.test.ts +68 -0
  9. package/packages/extension/src/__tests__/prompt-bus.test.ts +44 -0
  10. package/packages/extension/src/__tests__/prompt-expander.test.ts +45 -0
  11. package/packages/extension/src/__tests__/server-launcher.test.ts +24 -1
  12. package/packages/extension/src/__tests__/vcs-info-jj.test.ts +145 -0
  13. package/packages/extension/src/__tests__/{git-info.test.ts → vcs-info.test.ts} +6 -6
  14. package/packages/extension/src/bridge-context.ts +7 -0
  15. package/packages/extension/src/bridge.ts +142 -4
  16. package/packages/extension/src/command-handler.ts +6 -0
  17. package/packages/extension/src/markdown-image-inliner.ts +268 -0
  18. package/packages/extension/src/model-tracker.ts +35 -1
  19. package/packages/extension/src/prompt-bus.ts +4 -3
  20. package/packages/extension/src/prompt-expander.ts +50 -2
  21. package/packages/extension/src/provider-register.ts +117 -0
  22. package/packages/extension/src/server-launcher.ts +18 -1
  23. package/packages/extension/src/session-sync.ts +6 -1
  24. package/packages/extension/src/vcs-info.ts +184 -0
  25. package/packages/server/package.json +4 -4
  26. package/packages/server/src/__tests__/auto-attach-slug-defense.test.ts +104 -0
  27. package/packages/server/src/__tests__/bootstrap-install-from-list.test.ts +263 -0
  28. package/packages/server/src/__tests__/browser-gateway-snapshot-on-connect.test.ts +143 -0
  29. package/packages/server/src/__tests__/build-auth-status.test.ts +190 -0
  30. package/packages/server/src/__tests__/cold-boot-openspec-broadcast.test.ts +161 -0
  31. package/packages/server/src/__tests__/doctor-route.test.ts +132 -0
  32. package/packages/server/src/__tests__/event-wiring-providers-list.test.ts +87 -0
  33. package/packages/server/src/__tests__/has-openspec-dir.test.ts +64 -0
  34. package/packages/server/src/__tests__/health-shape.test.ts +43 -0
  35. package/packages/server/src/__tests__/idle-timer-respects-terminals.test.ts +115 -0
  36. package/packages/server/src/__tests__/is-unread-trigger.test.ts +4 -2
  37. package/packages/server/src/__tests__/jj-routes.test.ts +93 -0
  38. package/packages/server/src/__tests__/openspec-connect-snapshot.test.ts +92 -0
  39. package/packages/server/src/__tests__/openspec-tasks-parser.test.ts +114 -0
  40. package/packages/server/src/__tests__/pi-core-updater-managed-path.test.ts +177 -0
  41. package/packages/server/src/__tests__/process-manager-codes.test.ts +80 -0
  42. package/packages/server/src/__tests__/process-manager-managed-path.test.ts +73 -0
  43. package/packages/server/src/__tests__/provider-auth-storage.test.ts +42 -11
  44. package/packages/server/src/__tests__/provider-catalogue-cache.test.ts +54 -0
  45. package/packages/server/src/__tests__/session-action-handler-spawn-error.test.ts +17 -2
  46. package/packages/server/src/__tests__/session-action-handler-spawn.test.ts +150 -0
  47. package/packages/server/src/__tests__/session-diff-vcs.test.ts +61 -0
  48. package/packages/server/src/__tests__/session-discovery-skill-firstmessage.test.ts +95 -0
  49. package/packages/server/src/__tests__/spawn-failure-log.test.ts +118 -0
  50. package/packages/server/src/__tests__/spawn-preflight.test.ts +91 -0
  51. package/packages/server/src/__tests__/spawn-register-watchdog.test.ts +166 -0
  52. package/packages/server/src/__tests__/subscription-handler.test.ts +98 -6
  53. package/packages/server/src/__tests__/system-routes-reextract.test.ts +91 -0
  54. package/packages/server/src/__tests__/system-routes-restart.test.ts +4 -4
  55. package/packages/server/src/__tests__/system-routes-spawn-failures.test.ts +84 -0
  56. package/packages/server/src/__tests__/terminal-manager.test.ts +45 -0
  57. package/packages/server/src/bootstrap-install-from-list.ts +232 -0
  58. package/packages/server/src/bootstrap-state.ts +18 -0
  59. package/packages/server/src/browser-gateway.ts +58 -21
  60. package/packages/server/src/browser-handlers/directory-handler.ts +4 -0
  61. package/packages/server/src/browser-handlers/session-action-handler.ts +60 -2
  62. package/packages/server/src/browser-handlers/subscription-handler.ts +50 -3
  63. package/packages/server/src/cli.ts +22 -0
  64. package/packages/server/src/directory-service.ts +31 -0
  65. package/packages/server/src/event-wiring.ts +57 -2
  66. package/packages/server/src/home-lock.d.ts +124 -0
  67. package/packages/server/src/home-lock.js +330 -0
  68. package/packages/server/src/home-lock.js.map +1 -0
  69. package/packages/server/src/idle-timer.ts +15 -1
  70. package/packages/server/src/openspec-tasks.ts +50 -19
  71. package/packages/server/src/pi-core-updater.ts +65 -9
  72. package/packages/server/src/pi-gateway.ts +6 -0
  73. package/packages/server/src/process-manager.ts +62 -11
  74. package/packages/server/src/provider-auth-handlers.ts +9 -0
  75. package/packages/server/src/provider-auth-storage.ts +83 -51
  76. package/packages/server/src/provider-catalogue-cache.ts +41 -0
  77. package/packages/server/src/routes/doctor-routes.ts +140 -0
  78. package/packages/server/src/routes/jj-routes.ts +386 -0
  79. package/packages/server/src/routes/provider-auth-routes.ts +9 -0
  80. package/packages/server/src/routes/session-routes.ts +12 -3
  81. package/packages/server/src/routes/system-routes.ts +38 -1
  82. package/packages/server/src/server.ts +16 -9
  83. package/packages/server/src/session-bootstrap.ts +27 -12
  84. package/packages/server/src/session-diff.ts +118 -1
  85. package/packages/server/src/session-discovery.ts +10 -3
  86. package/packages/server/src/session-scanner.ts +4 -2
  87. package/packages/server/src/spawn-failure-log.ts +130 -0
  88. package/packages/server/src/spawn-preflight.ts +82 -0
  89. package/packages/server/src/spawn-register-watchdog.ts +236 -0
  90. package/packages/server/src/terminal-manager.ts +12 -1
  91. package/packages/shared/package.json +1 -1
  92. package/packages/shared/src/__tests__/bootstrap/__snapshots__/cube.test.ts.snap +1 -0
  93. package/packages/shared/src/__tests__/bootstrap/families/__snapshots__/g-windows-specifics.test.ts.snap +1 -0
  94. package/packages/shared/src/__tests__/bootstrap-install-resolve-npm.test.ts +72 -0
  95. package/packages/shared/src/__tests__/browser-protocol-types.test.ts +47 -1
  96. package/packages/shared/src/__tests__/config.test.ts +48 -0
  97. package/packages/shared/src/__tests__/dashboard-starter.test.ts +40 -0
  98. package/packages/shared/src/__tests__/detached-spawn.test.ts +24 -0
  99. package/packages/shared/src/__tests__/doctor-core.test.ts +134 -0
  100. package/packages/shared/src/__tests__/doctor-fault-tolerance.test.ts +218 -0
  101. package/packages/shared/src/__tests__/doctor-format.test.ts +121 -0
  102. package/packages/shared/src/__tests__/install-managed-node-bootstrap-order.test.ts +68 -0
  103. package/packages/shared/src/__tests__/install-managed-node.test.ts +192 -0
  104. package/packages/shared/src/__tests__/installable-list.test.ts +130 -0
  105. package/packages/shared/src/__tests__/managed-node-path.test.ts +122 -0
  106. package/packages/shared/src/__tests__/managed-runtime-strategy.test.ts +74 -0
  107. package/packages/shared/src/__tests__/no-installable-list-in-bridge.test.ts +52 -0
  108. package/packages/shared/src/__tests__/no-raw-openspec-status-in-skills.test.ts +6 -1
  109. package/packages/shared/src/__tests__/platform-jj.test.ts +339 -0
  110. package/packages/shared/src/__tests__/skill-block-parser.test.ts +153 -0
  111. package/packages/shared/src/__tests__/tool-registry-definitions.test.ts +18 -2
  112. package/packages/shared/src/bootstrap-install.ts +196 -2
  113. package/packages/shared/src/browser-protocol.ts +112 -1
  114. package/packages/shared/src/config.ts +29 -0
  115. package/packages/shared/src/dashboard-starter.ts +33 -0
  116. package/packages/shared/src/diff-types.ts +17 -0
  117. package/packages/shared/src/doctor-core.ts +821 -0
  118. package/packages/shared/src/index.ts +9 -0
  119. package/packages/shared/src/installable-list.ts +152 -0
  120. package/packages/shared/src/launch-source-flag.ts +14 -0
  121. package/packages/shared/src/launch-source-types.ts +18 -0
  122. package/packages/shared/src/openspec-activity-detector.ts +25 -7
  123. package/packages/shared/src/platform/detached-spawn.ts +13 -2
  124. package/packages/shared/src/platform/jj.ts +405 -0
  125. package/packages/shared/src/platform/managed-node-path.ts +77 -0
  126. package/packages/shared/src/protocol.ts +60 -2
  127. package/packages/shared/src/rest-api.ts +4 -0
  128. package/packages/shared/src/skill-block-parser.ts +115 -0
  129. package/packages/shared/src/tool-registry/__tests__/managed-runtime-strategy.test.ts +166 -0
  130. package/packages/shared/src/tool-registry/definitions.ts +19 -5
  131. package/packages/shared/src/tool-registry/strategies.ts +42 -0
  132. package/packages/shared/src/types.ts +91 -0
  133. package/packages/extension/src/git-info.ts +0 -55
@@ -4,6 +4,31 @@ export type SessionSource = "tui" | "zed" | "tmux" | "dashboard" | "terminal" |
4
4
  /** Current status of a session */
5
5
  export type SessionStatus = "active" | "idle" | "streaming" | "ended";
6
6
 
7
+ /**
8
+ * Per-session jj (Jujutsu) probe state. Populated by the bridge when the
9
+ * cwd contains a `.jj/` directory and the `jj` tool resolves; otherwise
10
+ * left undefined.
11
+ * See change: add-jj-workspace-plugin.
12
+ */
13
+ export interface JjState {
14
+ /** True iff cwd is inside a jj repo (`.jj/` reachable). */
15
+ isJjRepo: boolean;
16
+ /** True iff the repo is jj-colocated with git (both `.jj/` and `.git/`). */
17
+ isColocated: boolean;
18
+ /**
19
+ * Name of the workspace whose working copy is at this cwd.
20
+ * `"default"` for the original/source workspace; user-named for siblings
21
+ * created via `jj workspace add`.
22
+ */
23
+ workspaceName?: string;
24
+ /** Absolute path of the workspace root (== cwd for the active workspace). */
25
+ workspaceRoot?: string;
26
+ /** Bookmarks present on the workspace's `@-` (used by the badge / fold-back). */
27
+ bookmarks?: string[];
28
+ /** Last probe error, surfaced for diagnostics. Empty when probe succeeded. */
29
+ lastError?: string;
30
+ }
31
+
7
32
  /** A dashboard session representing a connected pi instance */
8
33
  export interface DashboardSession {
9
34
  id: string;
@@ -44,6 +69,15 @@ export interface DashboardSession {
44
69
  gitBranchUrl?: string;
45
70
  gitPrNumber?: number;
46
71
  gitPrUrl?: string;
72
+ /**
73
+ * Per-session jj (Jujutsu) state. Populated by the bridge's per-session
74
+ * VCS probe when (a) the tool registry resolves `jj` AND (b) `.jj/` exists
75
+ * in the session cwd. Absent or `{ isJjRepo: false }` for sessions outside
76
+ * a jj repo — jj-plugin slot predicates treat both as inactive. NOT
77
+ * persisted to `.meta.json`; refreshed on every probe tick.
78
+ * See change: add-jj-workspace-plugin.
79
+ */
80
+ jjState?: JjState;
47
81
  openspecPhase?: OpenSpecPhase | null;
48
82
  openspecChange?: string | null;
49
83
  attachedProposal?: string | null;
@@ -91,6 +125,15 @@ export interface DashboardSession {
91
125
  * the entry. See change: add-extension-ui-decorations.
92
126
  */
93
127
  uiDecorators?: Record<string, DecoratorDescriptor>;
128
+ /**
129
+ * Per-session image asset registry, keyed by content hash. Populated by
130
+ * `asset_register` events emitted by the bridge for local-file images
131
+ * referenced as `![](path)` in assistant markdown. Survives event-buffer
132
+ * eviction (lives on Session, not in the rolling event buffer) so
133
+ * `pi-asset:<hash>` references in older messages still resolve.
134
+ * See change: chat-markdown-local-images-and-math.
135
+ */
136
+ assets?: Record<string, { data: string; mimeType: string }>;
94
137
  }
95
138
 
96
139
  // ── Extension UI System (Phase 1: management-modal slot) ───────────
@@ -299,6 +342,41 @@ export interface ModelInfo {
299
342
  id: string;
300
343
  }
301
344
 
345
+ /**
346
+ * Provider catalogue entry pushed by the bridge to the server.
347
+ * Derived from pi's live `ModelRegistry` (see provider-register.ts in
348
+ * the bridge). The server caches the most recently received catalogue
349
+ * and uses it as the source for `GET /api/provider-auth/status`.
350
+ * See change: replace-hardcoded-provider-lists.
351
+ */
352
+ export interface ProviderInfo {
353
+ /** pi-ai provider id (e.g. "anthropic", "deepseek", "google-vertex"). */
354
+ id: string;
355
+ /** From `modelRegistry.getProviderDisplayName(id)`; falls back to id. */
356
+ displayName: string;
357
+ /** True iff `authStorage.getOAuthProviders()` includes this id. */
358
+ hasOAuth: boolean;
359
+ /** True iff a credential is stored in auth.json. */
360
+ configured: boolean;
361
+ /** Where the credential is sourced from, when configured. */
362
+ source?: "stored" | "environment" | "fallback" | "runtime";
363
+ /** First env var name pi-ai consults for this provider, when applicable. */
364
+ envVar?: string;
365
+ /** True when configured via ambient credential chain (AWS profile / GCP ADC). */
366
+ ambient?: boolean;
367
+ /** Expiry timestamp for OAuth credentials. */
368
+ expires?: number;
369
+ /**
370
+ * True when this provider was registered by the dashboard itself via
371
+ * `pi.registerProvider()` from `~/.pi/agent/providers.json` (a "custom"
372
+ * provider managed by the LLM Providers settings section). Consumers
373
+ * use this to suppress API-key auth rows for custom providers — their
374
+ * keys are managed elsewhere. OAuth rows are still emitted because a
375
+ * custom OAuth provider needs its login button.
376
+ */
377
+ custom?: boolean;
378
+ }
379
+
302
380
  /** Role assignment info (from pi-flows role-manager) */
303
381
  export interface RoleInfo {
304
382
  roles: Record<string, string>;
@@ -349,6 +427,19 @@ export function deriveChangeState(change: OpenSpecChange): ChangeState {
349
427
  export interface OpenSpecData {
350
428
  initialized: boolean;
351
429
  changes: OpenSpecChange[];
430
+ /**
431
+ * Cold-boot signaling: server has detected `openspec/changes/` for this
432
+ * cwd but the slow poll has not yet produced authoritative data.
433
+ *
434
+ * Optional for backwards compatibility — absence means `false`. Composes
435
+ * with `initialized` to encode three states:
436
+ * - { initialized: false, pending: false } → no openspec dir
437
+ * - { initialized: false, pending: true } → dir exists, polling
438
+ * - { initialized: true, pending: ? } → poll complete
439
+ *
440
+ * See change: fix-cold-boot-openspec-protocol.
441
+ */
442
+ pending?: boolean;
352
443
  }
353
444
 
354
445
  /** OpenSpec workflow phase detected from tool calls */
@@ -1,55 +0,0 @@
1
- /**
2
- * Git info gathering — detects branch, remote URL, and PR number.
3
- * Delegates to the shared git tool module so there's no inline execSync
4
- * and every call benefits from the runner's safety defaults (windowsHide,
5
- * timeout, tolerated exit codes).
6
- * See change: platform-command-executor.
7
- */
8
- import * as git from "@blackbelt-technology/pi-dashboard-shared/platform/git.js";
9
- import { buildGitLinks, type GitLinks } from "./git-link-builder.js";
10
-
11
- export interface GitInfo {
12
- gitBranch: string;
13
- gitBranchUrl?: string;
14
- gitPrNumber?: number;
15
- gitPrUrl?: string;
16
- }
17
-
18
- /** Detect the current git branch. Returns short SHA for detached HEAD. */
19
- export function detectBranch(cwd: string): string | undefined {
20
- const ref = git.currentBranchOr({ cwd });
21
- if (!ref) return undefined;
22
- if (ref === "HEAD") {
23
- // Detached HEAD — return short commit SHA
24
- return git.headShaOr({ cwd, short: true }) ?? "HEAD";
25
- }
26
- return ref;
27
- }
28
-
29
- /** Detect the remote origin URL. */
30
- export function detectRemoteUrl(cwd: string): string | undefined {
31
- return git.remoteUrlOr({ cwd });
32
- }
33
-
34
- /** Detect the PR number via gh CLI (best effort). */
35
- export function detectPrNumber(cwd: string): number | undefined {
36
- return git.prNumberOr({ cwd });
37
- }
38
-
39
- /** Gather all git info for a directory. Returns undefined if not a git repo. */
40
- export function gatherGitInfo(cwd: string): GitInfo | undefined {
41
- const branch = detectBranch(cwd);
42
- if (!branch) return undefined;
43
-
44
- const remoteUrl = detectRemoteUrl(cwd);
45
- const prNumber = detectPrNumber(cwd);
46
-
47
- const links: GitLinks = remoteUrl ? buildGitLinks(remoteUrl, branch, prNumber) : {};
48
-
49
- return {
50
- gitBranch: branch,
51
- gitBranchUrl: links.branchUrl,
52
- gitPrNumber: prNumber,
53
- gitPrUrl: links.prUrl,
54
- };
55
- }