@sapiom/harness 0.2.7 → 0.4.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 (117) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/dist/cli/doctor.d.ts.map +1 -1
  3. package/dist/cli/doctor.js +21 -2
  4. package/dist/cli/doctor.js.map +1 -1
  5. package/dist/core/adapters/claude-code.d.ts +46 -0
  6. package/dist/core/adapters/claude-code.d.ts.map +1 -1
  7. package/dist/core/adapters/claude-code.js +76 -1
  8. package/dist/core/adapters/claude-code.js.map +1 -1
  9. package/dist/core/adapters/codex.d.ts +0 -7
  10. package/dist/core/adapters/codex.d.ts.map +1 -1
  11. package/dist/core/adapters/codex.js +1 -23
  12. package/dist/core/adapters/codex.js.map +1 -1
  13. package/dist/core/agent-deps.d.ts +10 -0
  14. package/dist/core/agent-deps.d.ts.map +1 -0
  15. package/dist/core/agent-deps.js +92 -0
  16. package/dist/core/agent-deps.js.map +1 -0
  17. package/dist/core/agent-project-discovery.d.ts +32 -0
  18. package/dist/core/agent-project-discovery.d.ts.map +1 -0
  19. package/dist/core/agent-project-discovery.js +110 -0
  20. package/dist/core/agent-project-discovery.js.map +1 -0
  21. package/dist/core/canvas-body.d.ts +8 -0
  22. package/dist/core/canvas-body.d.ts.map +1 -1
  23. package/dist/core/canvas-body.js +26 -2
  24. package/dist/core/canvas-body.js.map +1 -1
  25. package/dist/core/canvas-derive.d.ts.map +1 -1
  26. package/dist/core/canvas-derive.js +6 -2
  27. package/dist/core/canvas-derive.js.map +1 -1
  28. package/dist/core/canvas-render.d.ts +15 -0
  29. package/dist/core/canvas-render.d.ts.map +1 -1
  30. package/dist/core/canvas-render.js +60 -19
  31. package/dist/core/canvas-render.js.map +1 -1
  32. package/dist/core/canvas-run-state.d.ts +7 -0
  33. package/dist/core/canvas-run-state.d.ts.map +1 -1
  34. package/dist/core/canvas-run-state.js +41 -3
  35. package/dist/core/canvas-run-state.js.map +1 -1
  36. package/dist/core/canvas-template.d.ts +12 -0
  37. package/dist/core/canvas-template.d.ts.map +1 -1
  38. package/dist/core/canvas-template.js +47 -5
  39. package/dist/core/canvas-template.js.map +1 -1
  40. package/dist/core/definition-slug-resolver.d.ts +10 -1
  41. package/dist/core/definition-slug-resolver.d.ts.map +1 -1
  42. package/dist/core/definition-slug-resolver.js +41 -26
  43. package/dist/core/definition-slug-resolver.js.map +1 -1
  44. package/dist/core/inject/claude-settings.d.ts +18 -0
  45. package/dist/core/inject/claude-settings.d.ts.map +1 -1
  46. package/dist/core/inject/claude-settings.js +17 -2
  47. package/dist/core/inject/claude-settings.js.map +1 -1
  48. package/dist/core/install-watcher.d.ts +35 -0
  49. package/dist/core/install-watcher.d.ts.map +1 -0
  50. package/dist/core/install-watcher.js +120 -0
  51. package/dist/core/install-watcher.js.map +1 -0
  52. package/dist/core/macros.d.ts +6 -4
  53. package/dist/core/macros.d.ts.map +1 -1
  54. package/dist/core/macros.js.map +1 -1
  55. package/dist/core/render-local-run.d.ts +2 -2
  56. package/dist/core/render-local-run.js +1 -1
  57. package/dist/core/run-local-bootstrap.d.ts +4 -2
  58. package/dist/core/run-local-bootstrap.d.ts.map +1 -1
  59. package/dist/core/run-local-bootstrap.js +4 -2
  60. package/dist/core/run-local-bootstrap.js.map +1 -1
  61. package/dist/core/session-manager.d.ts +14 -1
  62. package/dist/core/session-manager.d.ts.map +1 -1
  63. package/dist/core/session-manager.js +70 -3
  64. package/dist/core/session-manager.js.map +1 -1
  65. package/dist/core/strip-ansi.d.ts +13 -0
  66. package/dist/core/strip-ansi.d.ts.map +1 -0
  67. package/dist/core/strip-ansi.js +29 -0
  68. package/dist/core/strip-ansi.js.map +1 -0
  69. package/dist/core/template-catalog.d.ts +1 -1
  70. package/dist/core/template-catalog.d.ts.map +1 -1
  71. package/dist/core/template-catalog.js +25 -9
  72. package/dist/core/template-catalog.js.map +1 -1
  73. package/dist/core/workflow-registry.d.ts +6 -1
  74. package/dist/core/workflow-registry.d.ts.map +1 -1
  75. package/dist/core/workflow-registry.js +70 -20
  76. package/dist/core/workflow-registry.js.map +1 -1
  77. package/dist/core/workspace-watcher.d.ts +4 -3
  78. package/dist/core/workspace-watcher.d.ts.map +1 -1
  79. package/dist/core/workspace-watcher.js +52 -32
  80. package/dist/core/workspace-watcher.js.map +1 -1
  81. package/dist/profiles/default.d.ts.map +1 -1
  82. package/dist/profiles/default.js +10 -7
  83. package/dist/profiles/default.js.map +1 -1
  84. package/dist/server/actions.d.ts +11 -8
  85. package/dist/server/actions.d.ts.map +1 -1
  86. package/dist/server/actions.js +22 -13
  87. package/dist/server/actions.js.map +1 -1
  88. package/dist/server/canvas-render.d.ts +3 -2
  89. package/dist/server/canvas-render.d.ts.map +1 -1
  90. package/dist/server/canvas-render.js +2 -1
  91. package/dist/server/canvas-render.js.map +1 -1
  92. package/dist/server/canvas.d.ts.map +1 -1
  93. package/dist/server/canvas.js +6 -20
  94. package/dist/server/canvas.js.map +1 -1
  95. package/dist/server/fs.d.ts.map +1 -1
  96. package/dist/server/fs.js +5 -8
  97. package/dist/server/fs.js.map +1 -1
  98. package/dist/server/index.d.ts.map +1 -1
  99. package/dist/server/index.js +125 -27
  100. package/dist/server/index.js.map +1 -1
  101. package/dist/server/rest.d.ts.map +1 -1
  102. package/dist/server/rest.js +1 -0
  103. package/dist/server/rest.js.map +1 -1
  104. package/dist/server/templates.js +1 -1
  105. package/dist/shared/types.d.ts +58 -8
  106. package/dist/shared/types.d.ts.map +1 -1
  107. package/dist/shared/types.js +5 -3
  108. package/dist/shared/types.js.map +1 -1
  109. package/dist/web/assets/Geist-Variable-Bj2R_7yk.woff2 +0 -0
  110. package/dist/web/assets/GeistMono-Variable-Dispecij.woff2 +0 -0
  111. package/dist/web/assets/index-CRkNIc9y.js +458 -0
  112. package/dist/web/assets/index-T7PZTM4k.css +32 -0
  113. package/dist/web/canvas/sess-boot/index.html +6 -3
  114. package/dist/web/index.html +11 -5
  115. package/package.json +4 -4
  116. package/dist/web/assets/index-AAGKe1y6.css +0 -32
  117. package/dist/web/assets/index-DXRbHg-Q.js +0 -448
@@ -64,6 +64,17 @@ export function runStateNodeClass(status) {
64
64
  */
65
65
  export function applyRunStateToCanvas(doc, msg) {
66
66
  const stateClasses = ["is-running", "is-passed", "is-failed", "is-pending"];
67
+ // A message describes one complete run snapshot, not a delta. Clear every
68
+ // node first so switching runs (or rebinding to a run with fewer steps)
69
+ // cannot leave pass/fail/latency evidence from the previous run behind.
70
+ const allNodes = doc.querySelectorAll(".canvas-node");
71
+ for (let i = 0; i < allNodes.length; i++) {
72
+ const node = allNodes[i];
73
+ for (let j = 0; j < stateClasses.length; j++) {
74
+ node.classList.remove(stateClasses[j]);
75
+ }
76
+ node.removeAttribute("data-latency");
77
+ }
67
78
  for (let i = 0; i < msg.steps.length; i++) {
68
79
  const step = msg.steps[i];
69
80
  // Match by step name (the node's data-step-name), falling back to the
@@ -82,9 +93,6 @@ export function applyRunStateToCanvas(doc, msg) {
82
93
  }
83
94
  if (!node)
84
95
  continue;
85
- for (let j = 0; j < stateClasses.length; j++) {
86
- node.classList.remove(stateClasses[j]);
87
- }
88
96
  node.classList.add(runStateNodeClass(step.status));
89
97
  if (step.latencyMs != null) {
90
98
  node.setAttribute("data-latency", String(step.latencyMs));
@@ -324,4 +332,34 @@ export function bootCanvasOverview() {
324
332
  post();
325
333
  }
326
334
  }
335
+ /**
336
+ * Posts deterministic extraction failures to the parent workbench. The error
337
+ * panel embeds `{ title, reason }` in `#sapiom-render-error`; without this
338
+ * bridge the app's actionable error overlay can never appear and the iframe
339
+ * is left showing only static prose.
340
+ */
341
+ export function bootCanvasError() {
342
+ function post() {
343
+ const el = document.getElementById("sapiom-render-error");
344
+ if (!el)
345
+ return;
346
+ try {
347
+ const data = JSON.parse(el.textContent || "{}");
348
+ window.parent.postMessage({
349
+ type: "sapiom-canvas:error",
350
+ title: typeof data.title === "string" ? data.title : "",
351
+ reason: typeof data.reason === "string" ? data.reason : "",
352
+ }, "*");
353
+ }
354
+ catch {
355
+ /* malformed payload — keep the in-document error panel visible */
356
+ }
357
+ }
358
+ if (document.readyState === "loading") {
359
+ window.addEventListener("DOMContentLoaded", post);
360
+ }
361
+ else {
362
+ post();
363
+ }
364
+ }
327
365
  //# sourceMappingURL=canvas-run-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-run-state.js","sourceRoot":"","sources":["../../src/core/canvas-run-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-run-state.js","sourceRoot":"","sources":["../../src/core/canvas-run-state.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,18 @@ export declare const CANVAS_TEMPLATE_FILE = ".sapiom/canvas/_template.html";
25
25
  * can't drift from each other.
26
26
  */
27
27
  export declare function renderCanvasDocument(bodyHtml: string): string;
28
+ /**
29
+ * A minimal, THEME-AWARE document for the canvas pane's non-graph states —
30
+ * the empty state and the "rendering…" placeholder the server serves for a
31
+ * session with nothing (yet) to draw. It reuses the SAME theme mechanism as
32
+ * `renderCanvasDocument` (the `?theme` reader + the ported token block), so
33
+ * these pages follow the app's light/dark theme instead of always painting a
34
+ * white panel inside a dark app. No graph, so it deliberately omits the
35
+ * run-state/pan-zoom script and SVG defs — just a centered title + subtitle on
36
+ * the themed canvas backdrop. `title`/`subtitle` are trusted, static server
37
+ * copy (never user input), so they're inlined without escaping.
38
+ */
39
+ export declare function renderCanvasMessageDocument(title: string, subtitle: string): string;
28
40
  /** The exact document written to both `_template.html` and the initial
29
41
  * `index.html` — a friendly empty state plus the patterns reference. */
30
42
  export declare const TEMPLATE_HTML: string;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-template.d.ts","sourceRoot":"","sources":["../../src/core/canvas-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH;;uEAEuE;AACvE,eAAO,MAAM,oBAAoB,kCAAiC,CAAC;AA4UnE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyB7D;AAgCD;yEACyE;AACzE,eAAO,MAAM,aAAa,QAAsC,CAAC;AAoBjE;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE"}
1
+ {"version":3,"file":"canvas-template.d.ts","sourceRoot":"","sources":["../../src/core/canvas-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH;;uEAEuE;AACvE,eAAO,MAAM,oBAAoB,kCAAiC,CAAC;AAiVnE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyB7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyBnF;AAgCD;yEACyE;AACzE,eAAO,MAAM,aAAa,QAAsC,CAAC;AAoBjE;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE"}
@@ -17,7 +17,7 @@ import * as fs from "node:fs/promises";
17
17
  import * as path from "node:path";
18
18
  import { CANVAS_DIR, CANVAS_INDEX } from "../shared/types.js";
19
19
  import { isLegacyDeterministicCanvas } from "./canvas-index-classify.js";
20
- import { applyRunStateToCanvas, bootCanvasGraph, bootCanvasOverview, bootCanvasNodeClicks, bootCanvasRunState, bootCanvasView, runStateNodeClass, } from "./canvas-run-state.js";
20
+ import { applyRunStateToCanvas, bootCanvasError, bootCanvasGraph, bootCanvasOverview, bootCanvasNodeClicks, bootCanvasRunState, bootCanvasView, runStateNodeClass, } from "./canvas-run-state.js";
21
21
  /** Lives alongside index.html, in the same CANVAS_DIR — a pristine copy of
22
22
  * the template, written once and never touched again, so "clone the
23
23
  * template" always has a clean, un-filled-in source to clone from. */
@@ -30,14 +30,19 @@ function themeStyleBlock() {
30
30
  // canvas look before per-theme passthrough landed for embedded iframes.
31
31
  return `
32
32
  :root {
33
- --canvas-bg: #f3f4f6;
33
+ /* The whole graph column is the raised "lighter white" (--surface-raised in
34
+ the app) — the dotted board included, so it never reads darker than the
35
+ rail/terminal shell it's meant to sit in front of. */
36
+ --canvas-bg: #ffffff;
34
37
  --canvas-panel: #f5f5f5;
35
38
  --canvas-border: #e5e5e5;
36
39
  --canvas-border-strong: #d4d4d8;
37
40
  --canvas-text: #1a1a1a;
38
41
  --canvas-text-dim: #737373;
39
- --canvas-accent: #05a9bc;
40
- --canvas-success: #05a9bc;
42
+ /* Brand green (Studio light --brand), matching the dark theme's #6be195 — the
43
+ graph accent/success were an off-brand cyan (#05a9bc) in light only. */
44
+ --canvas-accent: #167e3a;
45
+ --canvas-success: #167e3a;
41
46
  --canvas-running: #2563eb;
42
47
  --canvas-passed: #16a34a;
43
48
  --canvas-escalation: #b45309;
@@ -345,7 +350,7 @@ const NAME_SHIM = "function __name(fn){return fn;}";
345
350
  * embedded step graph so the Steps tab can project it — all via the same
346
351
  * stringify pattern. `NAME_SHIM` MUST come first (see its doc — without it,
347
352
  * esbuild/tsx output throws in the iframe). */
348
- const RUN_STATE_SCRIPT = `${NAME_SHIM}\n${runStateNodeClass.toString()}\n${applyRunStateToCanvas.toString()}\n${bootCanvasRunState.toString()}\nbootCanvasRunState();\n${bootCanvasNodeClicks.toString()}\nbootCanvasNodeClicks();\n${bootCanvasView.toString()}\nbootCanvasView();\n${bootCanvasGraph.toString()}\nbootCanvasGraph();\n${bootCanvasOverview.toString()}\nbootCanvasOverview();`;
353
+ const RUN_STATE_SCRIPT = `${NAME_SHIM}\n${runStateNodeClass.toString()}\n${applyRunStateToCanvas.toString()}\n${bootCanvasRunState.toString()}\nbootCanvasRunState();\n${bootCanvasNodeClicks.toString()}\nbootCanvasNodeClicks();\n${bootCanvasView.toString()}\nbootCanvasView();\n${bootCanvasGraph.toString()}\nbootCanvasGraph();\n${bootCanvasOverview.toString()}\nbootCanvasOverview();\n${bootCanvasError.toString()}\nbootCanvasError();`;
349
354
  /**
350
355
  * Wraps `bodyHtml` in the shared canvas document shell: doctype, the theme
351
356
  * switch script, the run-state listener, and every CSS class an agent's markup
@@ -379,6 +384,43 @@ ${bodyHtml}
379
384
  </html>
380
385
  `;
381
386
  }
387
+ /**
388
+ * A minimal, THEME-AWARE document for the canvas pane's non-graph states —
389
+ * the empty state and the "rendering…" placeholder the server serves for a
390
+ * session with nothing (yet) to draw. It reuses the SAME theme mechanism as
391
+ * `renderCanvasDocument` (the `?theme` reader + the ported token block), so
392
+ * these pages follow the app's light/dark theme instead of always painting a
393
+ * white panel inside a dark app. No graph, so it deliberately omits the
394
+ * run-state/pan-zoom script and SVG defs — just a centered title + subtitle on
395
+ * the themed canvas backdrop. `title`/`subtitle` are trusted, static server
396
+ * copy (never user input), so they're inlined without escaping.
397
+ */
398
+ export function renderCanvasMessageDocument(title, subtitle) {
399
+ return `<!DOCTYPE html>
400
+ <html lang="en">
401
+ <head>
402
+ <meta charset="UTF-8" />
403
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
404
+ <title>Agent Studio canvas</title>
405
+ <script>
406
+ ${THEME_SCRIPT}
407
+ </script>
408
+ <style>
409
+ ${themeStyleBlock()}
410
+ .canvas-message { text-align: center; padding: 0 2rem; max-width: 520px; }
411
+ .canvas-message h1 { margin: 0 0 0.5rem; font-size: 1.1rem; font-weight: 600; color: var(--canvas-text); }
412
+ .canvas-message p { margin: 0; font-size: 13px; color: var(--canvas-text-dim); }
413
+ </style>
414
+ </head>
415
+ <body>
416
+ <div class="canvas-message">
417
+ <h1>${title}</h1>
418
+ <p>${subtitle}</p>
419
+ </div>
420
+ </body>
421
+ </html>
422
+ `;
423
+ }
382
424
  const TEMPLATE_BODY = `
383
425
  <!--
384
426
  ═══════════════════════════════════════════════════════════════════════
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-template.js","sourceRoot":"","sources":["../../src/core/canvas-template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-template.js","sourceRoot":"","sources":["../../src/core/canvas-template.ts"],"names":[],"mappings":"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"}
@@ -27,8 +27,16 @@ export declare function resolveAgentsBaseUrl(): string;
27
27
  * env-precedence helpers live together.
28
28
  */
29
29
  export declare function resolveCoreBaseUrl(): string;
30
+ export interface DefinitionMetadata {
31
+ slug: string | null;
32
+ activeBuildRunId: string | null;
33
+ activeBuildRunStatus: string | null;
34
+ }
30
35
  export interface DefinitionSlugResolver {
31
36
  resolve(definitionId: string): Promise<string | null>;
37
+ /** Fetch mutable definition metadata. Unlike the stable slug lookup, build
38
+ * state is deliberately not cached so a completed build becomes visible. */
39
+ resolveMetadata(definitionId: string): Promise<DefinitionMetadata | null>;
32
40
  }
33
41
  /**
34
42
  * Creates a resolver that fetches `GET /agents/v1/definitions/<id>` with the
@@ -38,7 +46,8 @@ export interface DefinitionSlugResolver {
38
46
  * failure (network, 4xx, missing field, unparseable body).
39
47
  */
40
48
  export declare function createDefinitionSlugResolver(opts: {
41
- apiKey: string | null;
49
+ /** A getter keeps enrichment working when the user signs in after boot. */
50
+ apiKey: string | null | (() => string | null);
42
51
  baseUrl?: string;
43
52
  /** Injectable for unit tests; defaults to the global `fetch`. */
44
53
  fetchImpl?: typeof fetch;
@@ -1 +1 @@
1
- {"version":3,"file":"definition-slug-resolver.d.ts","sourceRoot":"","sources":["../../src/core/definition-slug-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;wCACwC;AACxC,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAc3C;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,sBAAsB,CAyDzB"}
1
+ {"version":3,"file":"definition-slug-resolver.d.ts","sourceRoot":"","sources":["../../src/core/definition-slug-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;wCACwC;AACxC,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAc3C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtD;iFAC6E;IAC7E,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;CAC3E;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,sBAAsB,CAwEzB"}
@@ -56,6 +56,7 @@ export function resolveCoreBaseUrl() {
56
56
  */
57
57
  export function createDefinitionSlugResolver(opts) {
58
58
  const { apiKey, baseUrl = resolveAgentsBaseUrl(), fetchImpl = fetch } = opts;
59
+ const getApiKey = typeof apiKey === "function" ? apiKey : () => apiKey;
59
60
  const cache = new Map();
60
61
  // Each id's resolution failure is logged at most once. resolve() runs on
61
62
  // every /api/state and /api/workflows poll and null results are deliberately
@@ -72,38 +73,52 @@ export function createDefinitionSlugResolver(opts) {
72
73
  `at ${baseUrl} (${reason}); the snippet panel will fall back to the project name — ` +
73
74
  `check the harness is signed into the account that owns this agent`);
74
75
  };
76
+ const resolveMetadata = async (definitionId) => {
77
+ const currentApiKey = getApiKey();
78
+ // Not signed in is expected, not a failure worth logging. Because this is
79
+ // a getter, a later sign-in is picked up without restarting Studio.
80
+ if (!currentApiKey)
81
+ return null;
82
+ try {
83
+ const url = `${baseUrl}/agents/v1/definitions/${encodeURIComponent(definitionId)}`;
84
+ const response = await fetchImpl(url, {
85
+ headers: { "x-sapiom-api-key": currentApiKey },
86
+ });
87
+ if (!response.ok) {
88
+ warnOnce(definitionId, `HTTP ${response.status}`);
89
+ return null;
90
+ }
91
+ const body = (await response.json());
92
+ const slug = typeof body.slug === "string" ? body.slug : null;
93
+ const activeBuildRunId = typeof body.activeBuildRunId === "string"
94
+ ? body.activeBuildRunId
95
+ : null;
96
+ const activeBuildRunStatus = typeof body.activeBuildRunStatus === "string"
97
+ ? body.activeBuildRunStatus
98
+ : null;
99
+ if (slug !== null) {
100
+ cache.set(definitionId, slug);
101
+ }
102
+ else {
103
+ warnOnce(definitionId, "response had no string `slug` field");
104
+ }
105
+ return { slug, activeBuildRunId, activeBuildRunStatus };
106
+ }
107
+ catch (err) {
108
+ warnOnce(definitionId, err instanceof Error ? err.message : String(err));
109
+ return null;
110
+ }
111
+ };
75
112
  return {
113
+ resolveMetadata,
76
114
  async resolve(definitionId) {
77
- // Not signed in: expected (a harness launched without auth), not a
78
- // failure worth logging — the panel's project-name fallback covers it.
79
- if (!apiKey)
115
+ // Keep the old stable-slug cache contract for existing callers.
116
+ if (!getApiKey())
80
117
  return null;
81
118
  const cached = cache.get(definitionId);
82
119
  if (cached !== undefined)
83
120
  return cached;
84
- try {
85
- const url = `${baseUrl}/agents/v1/definitions/${encodeURIComponent(definitionId)}`;
86
- const response = await fetchImpl(url, {
87
- headers: { "x-sapiom-api-key": apiKey },
88
- });
89
- if (!response.ok) {
90
- warnOnce(definitionId, `HTTP ${response.status}`);
91
- return null;
92
- }
93
- const body = (await response.json());
94
- const slug = typeof body.slug === "string" ? body.slug : null;
95
- if (slug !== null) {
96
- cache.set(definitionId, slug);
97
- }
98
- else {
99
- warnOnce(definitionId, "response had no string `slug` field");
100
- }
101
- return slug;
102
- }
103
- catch (err) {
104
- warnOnce(definitionId, err instanceof Error ? err.message : String(err));
105
- return null;
106
- }
121
+ return (await resolveMetadata(definitionId))?.slug ?? null;
107
122
  },
108
123
  };
109
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"definition-slug-resolver.js","sourceRoot":"","sources":["../../src/core/definition-slug-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definition-slug-resolver.js","sourceRoot":"","sources":["../../src/core/definition-slug-resolver.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,17 @@
11
11
  */
12
12
  declare const HOOK_EVENTS: readonly ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "Stop", "SessionEnd"];
13
13
  export type ClaudeHookEvent = (typeof HOOK_EVENTS)[number];
14
+ /**
15
+ * The two Claude Code themes that paint with the terminal's own 16-color ANSI
16
+ * palette (`ansi:<name>`) instead of hardcoded 256-color hex. Selecting one of
17
+ * these is what makes the embedded xterm's palette (Terminal.tsx's
18
+ * DARK_ANSI/LIGHT_ANSI) authoritative over Claude's accent colors — without it
19
+ * Claude emits fixed 256-color indices the palette can't touch. `theme` is not
20
+ * a documented settings.json key but is honoured by Claude Code (verified on
21
+ * 2.1.220); an older/newer build that ignores it simply falls back to its
22
+ * default 256-color rendering, so this degrades gracefully rather than failing.
23
+ */
24
+ export type ClaudeAnsiTheme = "dark-ansi" | "light-ansi";
14
25
  export interface GenerateClaudeSettingsOptions {
15
26
  /** The harness session this config is generated for. */
16
27
  harnessSessionId: string;
@@ -20,6 +31,13 @@ export interface GenerateClaudeSettingsOptions {
20
31
  * tests to avoid touching the real home directory.
21
32
  */
22
33
  generatedRoot?: string;
34
+ /**
35
+ * ANSI theme to pin for this session so the app's terminal palette controls
36
+ * Claude's colors. Match it to the app theme (dark app → `dark-ansi`) or
37
+ * secondary/dim text loses contrast. Omitted → no `theme` key is written and
38
+ * Claude keeps its default (256-color) rendering.
39
+ */
40
+ claudeTheme?: ClaudeAnsiTheme;
23
41
  }
24
42
  export interface GeneratedClaudeSettings {
25
43
  /** Absolute path to the generated settings.json (pass as `--settings`). */
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../../src/core/inject/claude-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;GAEG;AACH,QAAA,MAAM,WAAW,kGAOP,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,6BAA6B;IAC5C,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;CACxB;AA0GD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CA2BlC"}
1
+ {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../../src/core/inject/claude-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;GAEG;AACH,QAAA,MAAM,WAAW,kGAOP,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,YAAY,CAAC;AAEzD,MAAM,WAAW,6BAA6B;IAC5C,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;CACxB;AA0GD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CA0ClC"}
@@ -128,6 +128,7 @@ function settingsDirFor(root, harnessSessionId) {
128
128
  * Returns the settings.json path — pass it as `claude --settings <path>`.
129
129
  */
130
130
  export async function generateClaudeSettings(options) {
131
+ const { claudeTheme } = options;
131
132
  const root = expandHome(options.generatedRoot ?? HARNESS_PATHS.generated);
132
133
  const dir = settingsDirFor(root, options.harnessSessionId);
133
134
  await fs.mkdir(dir, { recursive: true });
@@ -141,14 +142,28 @@ export async function generateClaudeSettings(options) {
141
142
  hooks: [
142
143
  {
143
144
  type: "command",
144
- command: `node ${emitScriptPath} ${event}`,
145
+ // The script path is double-quoted because Claude Code runs a
146
+ // `command` hook through a shell (`/bin/sh -c …`; `cmd.exe` on
147
+ // Windows). An unquoted path under a home directory that contains a
148
+ // space (`/Users/First Last/.sapiom/harness/generated/…/emit.cjs`)
149
+ // word-splits, so `node` receives `/Users/First` and the hook dies
150
+ // with "Cannot find module" — the SessionStart hook then never
151
+ // POSTs and the session's agentSessionId is never established
152
+ // (the exact "exited before establishing a session id" failure).
153
+ // Double quotes group the path on both sh and cmd.exe and are
154
+ // stripped before `node` sees the argument. This is the harness
155
+ // CLAUDE.md's "paths contain spaces — never hand a shell an
156
+ // unquoted path" rule. The event name is a fixed identifier from
157
+ // HOOK_EVENTS, so it needs no quoting.
158
+ command: `node "${emitScriptPath}" ${event}`,
145
159
  },
146
160
  ],
147
161
  },
148
162
  ];
149
163
  }
150
164
  const settingsPath = path.join(dir, "settings.json");
151
- await fs.writeFile(settingsPath, JSON.stringify({ hooks }, null, 2) + "\n", "utf8");
165
+ const settings = claudeTheme ? { theme: claudeTheme, hooks } : { hooks };
166
+ await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf8");
152
167
  return { settingsPath, emitScriptPath };
153
168
  }
154
169
  //# sourceMappingURL=claude-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../../src/core/inject/claude-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,MAAM;IACN,YAAY;CACJ,CAAC;AAsBX;;;;;;;;;;;GAWG;AACH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF1B,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY,EAAE,gBAAwB;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsC;IAEtC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExE,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,CAAC,GAAG;YACb;gBACE,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,QAAQ,cAAc,IAAI,KAAK,EAAE;qBAC3C;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../../src/core/inject/claude-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,MAAM;IACN,YAAY;CACJ,CAAC;AAyCX;;;;;;;;;;;GAWG;AACH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF1B,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY,EAAE,gBAAwB;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsC;IAEtC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExE,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,CAAC,GAAG;YACb;gBACE,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,8DAA8D;wBAC9D,+DAA+D;wBAC/D,oEAAoE;wBACpE,mEAAmE;wBACnE,mEAAmE;wBACnE,+DAA+D;wBAC/D,8DAA8D;wBAC9D,iEAAiE;wBACjE,8DAA8D;wBAC9D,gEAAgE;wBAChE,4DAA4D;wBAC5D,iEAAiE;wBACjE,uCAAuC;wBACvC,OAAO,EAAE,SAAS,cAAc,KAAK,KAAK,EAAE;qBAC7C;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAEnF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface InstallWatcherOptions {
2
+ /** Poll cadence in ms (test hook). */
3
+ pollIntervalMs?: number;
4
+ /** Max wait before `onTimeout` fires (test hook). */
5
+ timeoutMs?: number;
6
+ }
7
+ export interface InstallWatcherManagerDeps {
8
+ /** Dependencies are now installed for this session's project — re-render. */
9
+ onInstalled(harnessSessionId: string): void;
10
+ /** Install didn't complete within the window — restore the honest error. */
11
+ onTimeout(harnessSessionId: string): void;
12
+ }
13
+ /** Registry of one SessionInstallWatcher per session currently waiting on an
14
+ * install. Arm from a `depsMissing` render; it self-removes on fire. */
15
+ export declare class InstallWatcherManager {
16
+ private readonly deps;
17
+ private readonly options;
18
+ private readonly watchers;
19
+ constructor(deps: InstallWatcherManagerDeps, options?: InstallWatcherOptions);
20
+ /**
21
+ * Begin (or continue) watching `projectDir` for this session's install.
22
+ * Idempotent for the same project: a repeated `depsMissing` render must NOT
23
+ * reset the timeout. Re-arms only when the watched project actually changed
24
+ * (a rebind to a different workflow).
25
+ */
26
+ start(harnessSessionId: string, projectDir: string): void;
27
+ /** Removes and closes this session's watcher, then invokes `cb`. Removal
28
+ * happens first so the callback's own re-render can safely re-arm. */
29
+ private fire;
30
+ stop(harnessSessionId: string): void;
31
+ stopAll(): void;
32
+ /** Test/debug helper — how many sessions currently have an active watcher. */
33
+ get size(): number;
34
+ }
35
+ //# sourceMappingURL=install-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-watcher.d.ts","sourceRoot":"","sources":["../../src/core/install-watcher.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmDD,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED;yEACyE;AACzE,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGrB;gBAGe,IAAI,EAAE,yBAAyB,EAC/B,OAAO,GAAE,qBAA0B;IAGtD;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBzD;2EACuE;IACvE,OAAO,CAAC,IAAI;IAYZ,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAKpC,OAAO,IAAI,IAAI;IAIf,8EAA8E;IAC9E,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Install watcher: bridges the gap between a freshly scaffolded agent project
3
+ * and its `npm install` finishing. A brand-new project renders a calm
4
+ * "preparing" placeholder because its dependencies aren't installed yet
5
+ * (core/canvas-render.ts's `depsMissing` path). Neither the canvas watcher nor
6
+ * the workspace watcher can re-fire the render when install completes — both
7
+ * deliberately ignore `node_modules` (it's high-churn, and a workflow marker
8
+ * never lives there). So without this, the placeholder would sit forever and
9
+ * the user would have to hit Retry. This watcher notices the SDK landing and
10
+ * lets the server re-render automatically.
11
+ *
12
+ * It POLLS a precise marker (core/agent-deps.ts — the SDK package esbuild must
13
+ * resolve) rather than `fs.watch`ing `node_modules`: polling one path avoids
14
+ * the churn both other watchers avoid, is deterministic, and — keyed on the
15
+ * exact package the bundle needs — never fires on a half-populated
16
+ * `node_modules`. One-shot: it fires `onInstalled` once and closes. If install
17
+ * never completes within a bounded window (offline, npm missing on PATH in a
18
+ * stripped host), it fires `onTimeout` so the server can restore the honest
19
+ * error panel — the placeholder is for the normal install window, not a dead
20
+ * end.
21
+ */
22
+ import { agentDepsInstalledSync } from "./agent-deps.js";
23
+ const DEFAULT_POLL_INTERVAL_MS = 750;
24
+ /** How long to wait for install before giving up and restoring the honest
25
+ * error. Generous — a cold `npm install` on a slow network can run a while. */
26
+ const DEFAULT_TIMEOUT_MS = 180000;
27
+ /** One session's install watcher — polls until the project's deps are
28
+ * installed, then fires exactly once and stops itself. */
29
+ class SessionInstallWatcher {
30
+ constructor(projectDir, harnessSessionId, onInstalled, onTimeout, options = {}) {
31
+ this.projectDir = projectDir;
32
+ this.harnessSessionId = harnessSessionId;
33
+ this.onInstalled = onInstalled;
34
+ this.onTimeout = onTimeout;
35
+ this.pollTimer = null;
36
+ this.timeoutTimer = null;
37
+ this.closed = false;
38
+ const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
39
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
40
+ // Deps may already be present the moment we arm (install finished between
41
+ // the render deciding `depsMissing` and the server arming us) — check on
42
+ // the next tick so the manager has finished registering this watcher
43
+ // before any callback can fire and re-enter it.
44
+ this.pollTimer = setInterval(() => this.check(), pollIntervalMs);
45
+ this.pollTimer.unref?.();
46
+ setTimeout(() => this.check(), 0).unref?.();
47
+ this.timeoutTimer = setTimeout(() => {
48
+ if (this.closed)
49
+ return;
50
+ this.close();
51
+ this.onTimeout(this.harnessSessionId);
52
+ }, timeoutMs);
53
+ this.timeoutTimer.unref?.();
54
+ }
55
+ check() {
56
+ if (this.closed)
57
+ return;
58
+ if (!agentDepsInstalledSync(this.projectDir))
59
+ return;
60
+ this.close();
61
+ this.onInstalled(this.harnessSessionId);
62
+ }
63
+ close() {
64
+ this.closed = true;
65
+ if (this.pollTimer)
66
+ clearInterval(this.pollTimer);
67
+ if (this.timeoutTimer)
68
+ clearTimeout(this.timeoutTimer);
69
+ this.pollTimer = null;
70
+ this.timeoutTimer = null;
71
+ }
72
+ }
73
+ /** Registry of one SessionInstallWatcher per session currently waiting on an
74
+ * install. Arm from a `depsMissing` render; it self-removes on fire. */
75
+ export class InstallWatcherManager {
76
+ constructor(deps, options = {}) {
77
+ this.deps = deps;
78
+ this.options = options;
79
+ this.watchers = new Map();
80
+ }
81
+ /**
82
+ * Begin (or continue) watching `projectDir` for this session's install.
83
+ * Idempotent for the same project: a repeated `depsMissing` render must NOT
84
+ * reset the timeout. Re-arms only when the watched project actually changed
85
+ * (a rebind to a different workflow).
86
+ */
87
+ start(harnessSessionId, projectDir) {
88
+ const existing = this.watchers.get(harnessSessionId);
89
+ if (existing) {
90
+ if (existing.projectDir === projectDir)
91
+ return;
92
+ existing.watcher.close();
93
+ }
94
+ const watcher = new SessionInstallWatcher(projectDir, harnessSessionId, (id) => this.fire(id, this.deps.onInstalled), (id) => this.fire(id, this.deps.onTimeout), this.options);
95
+ this.watchers.set(harnessSessionId, { projectDir, watcher });
96
+ }
97
+ /** Removes and closes this session's watcher, then invokes `cb`. Removal
98
+ * happens first so the callback's own re-render can safely re-arm. */
99
+ fire(harnessSessionId, cb) {
100
+ const entry = this.watchers.get(harnessSessionId);
101
+ if (entry) {
102
+ entry.watcher.close();
103
+ this.watchers.delete(harnessSessionId);
104
+ }
105
+ cb(harnessSessionId);
106
+ }
107
+ stop(harnessSessionId) {
108
+ this.watchers.get(harnessSessionId)?.watcher.close();
109
+ this.watchers.delete(harnessSessionId);
110
+ }
111
+ stopAll() {
112
+ for (const harnessSessionId of [...this.watchers.keys()])
113
+ this.stop(harnessSessionId);
114
+ }
115
+ /** Test/debug helper — how many sessions currently have an active watcher. */
116
+ get size() {
117
+ return this.watchers.size;
118
+ }
119
+ }
120
+ //# sourceMappingURL=install-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-watcher.js","sourceRoot":"","sources":["../../src/core/install-watcher.ts"],"names":[],"mappings":"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"}