@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
@@ -0,0 +1,92 @@
1
+ /**
2
+ * One shared notion of "this agent project's dependencies are installed",
3
+ * used by both the render pipeline (core/canvas-render.ts — decides whether to
4
+ * extract or show the "preparing" placeholder) and the install watcher
5
+ * (core/install-watcher.ts — decides when to re-render). Keeping the probe in
6
+ * one place stops those two from disagreeing about readiness, which would
7
+ * either flash the esbuild error or never re-render.
8
+ *
9
+ * "Ready" means EVERY runtime dependency the bundle imports is resolvable —
10
+ * the project's declared `dependencies` (e.g. `@sapiom/agent`, `@sapiom/tools`,
11
+ * `zod`), each found by walking `node_modules` up the directory tree exactly as
12
+ * Node/esbuild module resolution does. Three things this gets right:
13
+ *
14
+ * - Requiring ALL declared deps, not just the SDK, closes the partial-install
15
+ * window. `npm install` writes packages incrementally, so `@sapiom/agent`
16
+ * can land before `zod`; keying on the SDK alone would let the watcher
17
+ * re-render into a `Could not resolve "zod/v4"` failure — the very error
18
+ * we're hiding. The graph appears only once the bundle can actually
19
+ * succeed. (devDependencies — typescript, prettier — don't affect the
20
+ * type-stripped bundle, so they're intentionally not required.)
21
+ * - Checking each package's `package.json` (not just its directory) means a
22
+ * dir npm created but hasn't populated yet still reads as "not ready".
23
+ * - Walking UP resolves deps hoisted to a parent `node_modules` (a monorepo
24
+ * checkout, the repo's own example fixtures), matching what the bundle can
25
+ * resolve; a standalone fresh scaffold has no such ancestor, so it reads as
26
+ * "preparing" until its own `npm install` lands.
27
+ *
28
+ * If `package.json` can't be read (a fixture without one), it falls back to the
29
+ * SDK package every agent project imports — never crashing the render on it.
30
+ */
31
+ import { existsSync, readFileSync } from "node:fs";
32
+ import * as fsp from "node:fs/promises";
33
+ import * as path from "node:path";
34
+ /** The SDK package every agent project imports — the fallback probe when a
35
+ * project's package.json can't be read, and the source of the canonical
36
+ * `Could not resolve "@sapiom/agent"` error on a fresh scaffold. */
37
+ export const AGENT_SDK_PACKAGE = "@sapiom/agent";
38
+ /** The `node_modules/<pkg>/package.json` candidate at each ancestor of
39
+ * `projectDir` — the search path Node/esbuild walk to resolve a bare import. */
40
+ function manifestCandidates(projectDir, pkg) {
41
+ const candidates = [];
42
+ let dir = path.resolve(projectDir);
43
+ for (;;) {
44
+ candidates.push(path.join(dir, "node_modules", pkg, "package.json"));
45
+ const parent = path.dirname(dir);
46
+ if (parent === dir)
47
+ break;
48
+ dir = parent;
49
+ }
50
+ return candidates;
51
+ }
52
+ /** The runtime deps the bundle must resolve: the project's declared
53
+ * `dependencies` keys, or the SDK alone if package.json is missing/unreadable. */
54
+ function requiredDeps(projectDir) {
55
+ try {
56
+ const raw = readFileSync(path.join(projectDir, "package.json"), "utf8");
57
+ const deps = JSON.parse(raw).dependencies;
58
+ const names = deps ? Object.keys(deps) : [];
59
+ return names.length > 0 ? names : [AGENT_SDK_PACKAGE];
60
+ }
61
+ catch {
62
+ return [AGENT_SDK_PACKAGE];
63
+ }
64
+ }
65
+ function resolvesSync(projectDir, pkg) {
66
+ return manifestCandidates(projectDir, pkg).some((c) => existsSync(c));
67
+ }
68
+ async function resolvesAsync(projectDir, pkg) {
69
+ for (const candidate of manifestCandidates(projectDir, pkg)) {
70
+ const found = await fsp
71
+ .access(candidate)
72
+ .then(() => true)
73
+ .catch(() => false);
74
+ if (found)
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ /** Async readiness probe for the render pipeline — true iff every declared
80
+ * runtime dependency resolves. */
81
+ export async function agentDepsInstalled(projectDir) {
82
+ for (const dep of requiredDeps(projectDir)) {
83
+ if (!(await resolvesAsync(projectDir, dep)))
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ /** Sync readiness probe for the install watcher's poll loop. */
89
+ export function agentDepsInstalledSync(projectDir) {
90
+ return requiredDeps(projectDir).every((dep) => resolvesSync(projectDir, dep));
91
+ }
92
+ //# sourceMappingURL=agent-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-deps.js","sourceRoot":"","sources":["../../src/core/agent-deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const AGENT_PROJECT_SCAN_MAX_DEPTH = 3;
2
+ export interface AgentProjectMarker {
3
+ definitionId?: number | null;
4
+ /** The agent's `defineAgent({ name })`, cached by `link`. */
5
+ name?: string;
6
+ /** Gallery-template provenance, written by clone (a clone carries `forkId` too). */
7
+ templateId?: string | null;
8
+ /** Fork record id, written by clone. */
9
+ forkId?: string | null;
10
+ /** Bundled-starter id, written by scaffold; `"default"` = bare scaffold. */
11
+ starterId?: string | null;
12
+ }
13
+ /**
14
+ * A detailed marker result for callers that must distinguish definitive
15
+ * absence/invalidity from a transient filesystem failure. Most UI callers only
16
+ * need the nullable wrappers below; registry reconciliation needs all states so
17
+ * an unreadable project is not mistaken for a deleted one.
18
+ */
19
+ export type AgentProjectMarkerInspection = {
20
+ status: "valid";
21
+ marker: AgentProjectMarker;
22
+ } | {
23
+ status: "absent" | "invalid" | "unreadable";
24
+ };
25
+ export declare function isAgentProjectScanIgnoredDir(name: string): boolean;
26
+ /** A marker is JSON whose top-level value is an object (including `{}`). */
27
+ export declare function parseAgentProjectMarker(raw: string): AgentProjectMarker | null;
28
+ export declare function readAgentProjectMarkerSync(dir: string): AgentProjectMarker | null;
29
+ export declare function inspectAgentProjectMarkerSync(dir: string): AgentProjectMarkerInspection;
30
+ export declare function readAgentProjectMarker(dir: string): Promise<AgentProjectMarker | null>;
31
+ export declare function inspectAgentProjectMarker(dir: string): Promise<AgentProjectMarkerInspection>;
32
+ //# sourceMappingURL=agent-project-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-project-discovery.d.ts","sourceRoot":"","sources":["../../src/core/agent-project-discovery.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAW9C,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GACpC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAA;CAAE,CAAC;AAEpD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,GACV,kBAAkB,GAAG,IAAI,CAS3B;AA6BD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GACV,kBAAkB,GAAG,IAAI,CAG3B;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,GACV,4BAA4B,CAqB9B;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGpC;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,4BAA4B,CAAC,CAuBvC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * One discovery contract for Agent Studio's registry, live workspace watcher,
3
+ * and folder picker. Keeping marker parsing and traversal policy here prevents
4
+ * the three surfaces from disagreeing about whether a directory is an agent
5
+ * project.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as fsp from "node:fs/promises";
9
+ import * as path from "node:path";
10
+ import { AGENT_PROJECT_MARKER } from "../shared/types.js";
11
+ export const AGENT_PROJECT_SCAN_MAX_DEPTH = 3;
12
+ const IGNORED_DIR_NAMES = new Set([
13
+ "node_modules",
14
+ ".git",
15
+ ".sapiom",
16
+ "dist",
17
+ "build",
18
+ ".next",
19
+ ]);
20
+ export function isAgentProjectScanIgnoredDir(name) {
21
+ return IGNORED_DIR_NAMES.has(name);
22
+ }
23
+ /** A marker is JSON whose top-level value is an object (including `{}`). */
24
+ export function parseAgentProjectMarker(raw) {
25
+ try {
26
+ const parsed = JSON.parse(raw);
27
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
28
+ return null;
29
+ return parsed;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Resolve the fixed marker filename beneath the directory the user selected.
37
+ * The folder picker deliberately accepts any absolute local directory, so the
38
+ * selected directory itself is not confined to one application-owned root.
39
+ * What we can and must prove is that the derived read stays inside that exact
40
+ * directory rather than treating either input as a free-form file path.
41
+ */
42
+ function resolveAgentProjectMarkerPath(dir) {
43
+ const resolvedDir = path.resolve(dir);
44
+ const markerPath = path.resolve(resolvedDir, AGENT_PROJECT_MARKER);
45
+ const relativeMarker = path.relative(resolvedDir, markerPath);
46
+ if (!relativeMarker ||
47
+ relativeMarker.startsWith(`..${path.sep}`) ||
48
+ relativeMarker === ".." ||
49
+ path.isAbsolute(relativeMarker)) {
50
+ return null;
51
+ }
52
+ return markerPath;
53
+ }
54
+ function markerReadErrorStatus(error) {
55
+ const code = error.code;
56
+ return code === "ENOENT" || code === "ENOTDIR" ? "absent" : "unreadable";
57
+ }
58
+ export function readAgentProjectMarkerSync(dir) {
59
+ const result = inspectAgentProjectMarkerSync(dir);
60
+ return result.status === "valid" ? result.marker : null;
61
+ }
62
+ export function inspectAgentProjectMarkerSync(dir) {
63
+ const markerPath = resolveAgentProjectMarkerPath(dir);
64
+ if (!markerPath)
65
+ return { status: "invalid" };
66
+ let markerStat;
67
+ try {
68
+ markerStat = fs.lstatSync(markerPath);
69
+ }
70
+ catch (error) {
71
+ return { status: markerReadErrorStatus(error) };
72
+ }
73
+ if (!markerStat.isFile() || markerStat.isSymbolicLink()) {
74
+ return { status: "invalid" };
75
+ }
76
+ try {
77
+ const marker = parseAgentProjectMarker(fs.readFileSync(markerPath, "utf8"));
78
+ return marker ? { status: "valid", marker } : { status: "invalid" };
79
+ }
80
+ catch (error) {
81
+ return { status: markerReadErrorStatus(error) };
82
+ }
83
+ }
84
+ export async function readAgentProjectMarker(dir) {
85
+ const result = await inspectAgentProjectMarker(dir);
86
+ return result.status === "valid" ? result.marker : null;
87
+ }
88
+ export async function inspectAgentProjectMarker(dir) {
89
+ const markerPath = resolveAgentProjectMarkerPath(dir);
90
+ if (!markerPath)
91
+ return { status: "invalid" };
92
+ let markerStat;
93
+ try {
94
+ markerStat = await fsp.lstat(markerPath);
95
+ }
96
+ catch (error) {
97
+ return { status: markerReadErrorStatus(error) };
98
+ }
99
+ if (!markerStat.isFile() || markerStat.isSymbolicLink()) {
100
+ return { status: "invalid" };
101
+ }
102
+ try {
103
+ const marker = parseAgentProjectMarker(await fsp.readFile(markerPath, "utf8"));
104
+ return marker ? { status: "valid", marker } : { status: "invalid" };
105
+ }
106
+ catch (error) {
107
+ return { status: markerReadErrorStatus(error) };
108
+ }
109
+ }
110
+ //# sourceMappingURL=agent-project-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-project-discovery.js","sourceRoot":"","sources":["../../src/core/agent-project-discovery.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,14 @@ export declare function buildWorkflowPanelHtml(graph: CanvasGraph, meta: Workflo
36
36
  * a crash, never a silent fallback to the LLM path, just an honest reason
37
37
  * styled through the same shell. */
38
38
  export declare function buildErrorPanelHtml(title: string, reason: string): string;
39
+ /** A calm, transient panel for a workflow whose dependencies aren't installed
40
+ * yet (a freshly scaffolded project between `scaffold` and `npm install`).
41
+ * Extraction WOULD fail here with esbuild "Could not resolve …" noise, so we
42
+ * don't run it — we show this instead and let the install watcher re-render
43
+ * once `node_modules` lands. Crucially it emits NO `#sapiom-render-error`
44
+ * script, so the SPA shows no "render failed" card / Retry buttons: this is a
45
+ * normal setup state, not an error the user has to act on. */
46
+ export declare function buildPreparingPanelHtml(title: string): string;
39
47
  /** Joins the workflow panel(s) into the final `#canvas-root` body — the string
40
48
  * `renderCanvasDocument()` wraps. Each panel already carries its own legend
41
49
  * footer (see `buildWorkflowPanelHtml`); there is no document-level footer. */
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-body.d.ts","sourceRoot":"","sources":["../../src/core/canvas-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAoBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAYtG;AAwED;;;aAGa;AACb,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,iBAAiB,EACvB,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACnC,MAAM,CA2BR;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAYzE;AAED;;gFAEgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAEtE"}
1
+ {"version":3,"file":"canvas-body.d.ts","sourceRoot":"","sources":["../../src/core/canvas-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAoBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAYtG;AA6ED;;;aAGa;AACb,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,iBAAiB,EACvB,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACnC,MAAM,CA2BR;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAczE;AAED;;;;;;+DAM+D;AAC/D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED;;gFAEgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAEtE"}
@@ -83,7 +83,9 @@ function buildGraphPayload(graph, enrichment) {
83
83
  * graph — everything here is derived from the graph, no LLM. */
84
84
  function buildOverviewPayload(graph, enrichment) {
85
85
  const exits = graph.nodes.filter((n) => n.kind === "terminal-success" || n.kind === "terminal-warn").length;
86
- const steps = graph.nodes.length - exits;
86
+ const steps = graph.nodes.filter((n) => n.kind !== "terminal-success" &&
87
+ n.kind !== "terminal-warn" &&
88
+ n.kind !== "launched-workflow").length;
87
89
  const entryLabel = graph.nodes.find((n) => n.id === graph.entry)?.label ?? graph.entry;
88
90
  const parts = [`${steps} ${steps === 1 ? "step" : "steps"}`];
89
91
  if (exits > 0)
@@ -135,6 +137,7 @@ ${renderGraphSvg(graph, enrichment)}
135
137
  * a crash, never a silent fallback to the LLM path, just an honest reason
136
138
  * styled through the same shell. */
137
139
  export function buildErrorPanelHtml(title, reason) {
140
+ const errorData = JSON.stringify({ title, reason }).replace(/</g, "\\u003c");
138
141
  return `<section class="canvas-panel">
139
142
  <header class="canvas-header">
140
143
  <div class="canvas-title-row">
@@ -143,7 +146,28 @@ export function buildErrorPanelHtml(title, reason) {
143
146
  </div>
144
147
  </header>
145
148
  <div class="canvas-diagram-panel">
146
- <p class="canvas-empty-note">Could not extract this agent's step graph: ${esc(reason)}. Ask your coding agent to fix the issue (see the terminal for details) — this pane updates automatically once it builds cleanly.</p>
149
+ <p class="canvas-empty-note">Could not extract this agent's step graph: ${esc(reason)}. Use the workbench actions to ask your coding agent to fix it or retry the deterministic render.</p>
150
+ </div>
151
+ <script type="application/json" id="sapiom-render-error">${errorData}</script>
152
+ </section>`;
153
+ }
154
+ /** A calm, transient panel for a workflow whose dependencies aren't installed
155
+ * yet (a freshly scaffolded project between `scaffold` and `npm install`).
156
+ * Extraction WOULD fail here with esbuild "Could not resolve …" noise, so we
157
+ * don't run it — we show this instead and let the install watcher re-render
158
+ * once `node_modules` lands. Crucially it emits NO `#sapiom-render-error`
159
+ * script, so the SPA shows no "render failed" card / Retry buttons: this is a
160
+ * normal setup state, not an error the user has to act on. */
161
+ export function buildPreparingPanelHtml(title) {
162
+ return `<section class="canvas-panel">
163
+ <header class="canvas-header">
164
+ <div class="canvas-title-row">
165
+ <h1 class="canvas-title">${esc(title)}</h1>
166
+ <span class="canvas-badge">preparing</span>
167
+ </div>
168
+ </header>
169
+ <div class="canvas-diagram-panel">
170
+ <p class="canvas-empty-note">Preparing your agent — installing dependencies. The step graph appears here automatically once setup finishes.</p>
147
171
  </div>
148
172
  </section>`;
149
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-body.js","sourceRoot":"","sources":["../../src/core/canvas-body.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-body.js","sourceRoot":"","sources":["../../src/core/canvas-body.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-derive.d.ts","sourceRoot":"","sources":["../../src/core/canvas-derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,mBAAmB,CAAC;AAgBjF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAuBxD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAK1E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,CAOrE"}
1
+ {"version":3,"file":"canvas-derive.d.ts","sourceRoot":"","sources":["../../src/core/canvas-derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,mBAAmB,CAAC;AAgBjF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA8BxD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAK1E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,CAOrE"}
@@ -31,8 +31,12 @@ function plural(n, one, many = `${one}s`) {
31
31
  * the same graph the diagram is drawn from, so it can never disagree with it.
32
32
  */
33
33
  export function deriveSummary(graph) {
34
- // Real steps only exclude the dashed launched-workflow placeholders.
35
- const stepCount = graph.nodes.filter((n) => n.kind !== "launched-workflow").length;
34
+ // Pipeline steps only. Terminal outcomes and dashed launched-workflow
35
+ // placeholders have their own labels/counts; counting either as a step made
36
+ // the board summary disagree with the Steps header for the same graph.
37
+ const stepCount = graph.nodes.filter((n) => n.kind !== "launched-workflow" &&
38
+ n.kind !== "terminal-success" &&
39
+ n.kind !== "terminal-warn").length;
36
40
  // A branch point is a step that fans out to multiple successors; the graph
37
41
  // marks exactly those edges "branching" (core/canvas-graph.ts's edgesForStep).
38
42
  const branchPoints = new Set(graph.edges.filter((e) => e.kind === "branching").map((e) => e.from)).size;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-derive.js","sourceRoot":"","sources":["../../src/core/canvas-derive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-derive.js","sourceRoot":"","sources":["../../src/core/canvas-derive.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export interface RenderableWorkflow {
6
6
  path: string;
7
7
  name: string;
8
8
  definitionId: number | null;
9
+ activeBuildRunStatus?: string | null;
9
10
  }
10
11
  /**
11
12
  * Stable, filesystem-safe render-file name for a workflow: its directory
@@ -35,6 +36,11 @@ export interface CanvasRenderOutcome {
35
36
  writeError?: string;
36
37
  /** True when `preserveExistingOnFailure` kept the existing render instead of writing an error panel over it. */
37
38
  preservedExisting?: boolean;
39
+ /** True when the workflow's `node_modules` isn't present yet, so extraction
40
+ * was skipped and a calm "preparing" placeholder was written instead of an
41
+ * esbuild error panel. The server arms an install watcher on this to
42
+ * re-render once dependencies land — see server/index.ts. */
43
+ depsMissing?: boolean;
38
44
  }
39
45
  export interface RenderCanvasOptions {
40
46
  /**
@@ -46,6 +52,15 @@ export interface RenderCanvasOptions {
46
52
  * page IS the answer the user asked for.
47
53
  */
48
54
  preserveExistingOnFailure?: boolean;
55
+ /**
56
+ * Force extraction even when the project's dependencies aren't installed,
57
+ * so the honest esbuild error panel is written instead of the calm
58
+ * "preparing" placeholder. The install watcher's timeout path sets this to
59
+ * restore the Retry / Ask-coding-agent actions when an install never
60
+ * completes — otherwise the placeholder (and its `depsMissing` re-arm) would
61
+ * wait forever. Normal renders leave it off.
62
+ */
63
+ surfaceErrorOnMissingDeps?: boolean;
49
64
  }
50
65
  /**
51
66
  * Renders `session`'s bound workflow to its per-workflow render file. Never
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-render.d.ts","sourceRoot":"","sources":["../../src/core/canvas-render.ts"],"names":[],"mappings":"AAsCA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAShE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,MAAM,WAAW,mBAAmB;IAClC;;8EAE0E;IAC1E,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yGAAyG;IACzG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;iDAC6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,8HAA8H;IAC9H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAsBD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAmD9B"}
1
+ {"version":3,"file":"canvas-render.d.ts","sourceRoot":"","sources":["../../src/core/canvas-render.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAShE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,MAAM,WAAW,mBAAmB;IAClC;;8EAE0E;IAC1E,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yGAAyG;IACzG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;iDAC6C;IAC7C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,8HAA8H;IAC9H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;kEAG8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAqCD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}
@@ -25,10 +25,11 @@ import { createHash } from "node:crypto";
25
25
  import * as fs from "node:fs/promises";
26
26
  import * as path from "node:path";
27
27
  import { CANVAS_RENDERS_DIR } from "../shared/types.js";
28
+ import { agentDepsInstalled } from "./agent-deps.js";
28
29
  import { renderCanvasDocument } from "./canvas-template.js";
29
30
  import { extractWorkflowGraphCached } from "./canvas-cache.js";
30
31
  import { deriveEnrichment } from "./canvas-derive.js";
31
- import { assembleCanvasBody, buildErrorPanelHtml, buildWorkflowPanelHtml, } from "./canvas-body.js";
32
+ import { assembleCanvasBody, buildErrorPanelHtml, buildPreparingPanelHtml, buildWorkflowPanelHtml, } from "./canvas-body.js";
32
33
  /**
33
34
  * Stable, filesystem-safe render-file name for a workflow: its directory
34
35
  * basename (readable in `ls`) plus a short path hash (two same-named
@@ -49,7 +50,15 @@ export function renderFileFor(cwd, workflowPath) {
49
50
  return path.join(cwd, CANVAS_RENDERS_DIR, `${slugForWorkflowPath(workflowPath)}.html`);
50
51
  }
51
52
  function badgesFor(workflow) {
52
- return [workflow.definitionId != null ? "deployed" : "local only"];
53
+ if (workflow.activeBuildRunStatus === "ready")
54
+ return ["deployed"];
55
+ if (["pending", "queued", "building"].includes(workflow.activeBuildRunStatus ?? "")) {
56
+ return ["building"];
57
+ }
58
+ if (["failed", "cancelled", "superseded", "stale"].includes(workflow.activeBuildRunStatus ?? "")) {
59
+ return ["deploy failed"];
60
+ }
61
+ return [workflow.definitionId != null ? "linked" : "local only"];
53
62
  }
54
63
  function buildSingleBody(workflow, graph, reason, enrichment) {
55
64
  if (!graph) {
@@ -83,6 +92,33 @@ export async function renderCanvasForSession(session, workflows, options = {}) {
83
92
  * file is per-workflow.
84
93
  */
85
94
  export async function renderWorkflowRenderFile(cwd, bound, options = {}) {
95
+ const renderPath = renderFileFor(cwd, bound.path);
96
+ // A freshly scaffolded project — between `scaffold` and the coding agent's
97
+ // `npm install` — has no installed SDK, so extraction (an esbuild bundle of
98
+ // the project's own index.ts) is guaranteed to fail with "Could not resolve
99
+ // @sapiom/agent / zod/v4". That's not an error the user caused or can act on;
100
+ // it self-resolves when install finishes. So skip extraction entirely and
101
+ // write a calm "preparing" placeholder, flagging `depsMissing` so the server
102
+ // arms an install watcher that re-renders once dependencies land. A bundle
103
+ // failure WITH deps installed stays a genuine error (below).
104
+ if (!options.surfaceErrorOnMissingDeps && !(await agentDepsInstalled(bound.path))) {
105
+ const outcome = {
106
+ mode: "single",
107
+ workflowPath: bound.path,
108
+ renderPath,
109
+ extractionFailed: [],
110
+ depsMissing: true,
111
+ };
112
+ // Preserve semantics: an unprompted render must not replace an existing
113
+ // (possibly good) diagram just because deps went missing — but still flag
114
+ // depsMissing so the watcher re-renders when they return.
115
+ if (options.preserveExistingOnFailure && (await pathExists(renderPath))) {
116
+ outcome.preservedExisting = true;
117
+ return outcome;
118
+ }
119
+ await writeRenderFile(renderPath, buildPreparingPanelHtml(bound.name), outcome);
120
+ return outcome;
121
+ }
86
122
  const { result, cached } = await extractWorkflowGraphCached(bound.path);
87
123
  const failed = !result.ok;
88
124
  // Enrichment only decorates a successful extraction — deriving annotations
@@ -91,7 +127,6 @@ export async function renderWorkflowRenderFile(cwd, bound, options = {}) {
91
127
  // with the diagram and can never go stale.
92
128
  const enrichment = result.ok ? deriveEnrichment(result.graph) : null;
93
129
  const body = buildSingleBody(bound, result.ok ? result.graph : null, result.ok ? null : result.reason, enrichment);
94
- const renderPath = renderFileFor(cwd, bound.path);
95
130
  const outcome = {
96
131
  mode: "single",
97
132
  workflowPath: bound.path,
@@ -101,25 +136,32 @@ export async function renderWorkflowRenderFile(cwd, bound, options = {}) {
101
136
  ...(enrichment ? { enrichmentApplied: true } : {}),
102
137
  };
103
138
  // An unprompted render that failed to extract must not destroy an existing
104
- // (possibly good) diagram for this workflow — e.g. a project that merely
105
- // hasn't run `npm install` yet after a fresh clone.
106
- if (options.preserveExistingOnFailure && failed) {
107
- const exists = await fs
108
- .access(renderPath)
109
- .then(() => true)
110
- .catch(() => false);
111
- if (exists) {
112
- outcome.preservedExisting = true;
113
- return outcome;
114
- }
139
+ // (possibly good) diagram for this workflow — e.g. an agent mid-edit whose
140
+ // sources are transiently un-buildable. (The deps-not-installed case is
141
+ // handled above; this is a genuine extraction failure with deps present.)
142
+ if (options.preserveExistingOnFailure && failed && (await pathExists(renderPath))) {
143
+ outcome.preservedExisting = true;
144
+ return outcome;
115
145
  }
146
+ await writeRenderFile(renderPath, body, outcome);
147
+ return outcome;
148
+ }
149
+ /** True if `p` exists (any type). */
150
+ async function pathExists(p) {
151
+ return fs
152
+ .access(p)
153
+ .then(() => true)
154
+ .catch(() => false);
155
+ }
156
+ /** Writes the render file, skipping an identical rewrite (which would bump the
157
+ * mtime and make the canvas watcher fire a needless iframe reload — a true
158
+ * no-op now that any workflow source edit triggers a re-render). A write
159
+ * failure (e.g. an unwritable cwd) is captured on `outcome.writeError`;
160
+ * extraction success/failure is unaffected. */
161
+ async function writeRenderFile(renderPath, body, outcome) {
116
162
  try {
117
163
  const document = renderCanvasDocument(body);
118
164
  const existing = await fs.readFile(renderPath, "utf8").catch(() => null);
119
- // Skip the write when nothing changed: an identical rewrite would still
120
- // bump the render file's mtime and make the canvas watcher fire a needless
121
- // iframe reload. This matters now that any workflow source edit triggers a
122
- // re-render — a save that doesn't change the diagram is a true no-op.
123
165
  if (existing !== document) {
124
166
  await fs.mkdir(path.dirname(renderPath), { recursive: true });
125
167
  await fs.writeFile(renderPath, document, "utf8");
@@ -128,6 +170,5 @@ export async function renderWorkflowRenderFile(cwd, bound, options = {}) {
128
170
  catch (err) {
129
171
  outcome.writeError = err instanceof Error ? err.message : String(err);
130
172
  }
131
- return outcome;
132
173
  }
133
174
  //# sourceMappingURL=canvas-render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-render.js","sourceRoot":"","sources":["../../src/core/canvas-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-render.js","sourceRoot":"","sources":["../../src/core/canvas-render.ts"],"names":[],"mappings":"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"}
@@ -137,4 +137,11 @@ export declare function bootCanvasGraph(): void;
137
137
  * the template by `canvas-template.ts`.
138
138
  */
139
139
  export declare function bootCanvasOverview(): void;
140
+ /**
141
+ * Posts deterministic extraction failures to the parent workbench. The error
142
+ * panel embeds `{ title, reason }` in `#sapiom-render-error`; without this
143
+ * bridge the app's actionable error overlay can never appear and the iframe
144
+ * is left showing only static prose.
145
+ */
146
+ export declare function bootCanvasError(): void;
140
147
  //# sourceMappingURL=canvas-run-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-run-state.d.ts","sourceRoot":"","sources":["../../src/core/canvas-run-state.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE;IACH,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GACA,IAAI,CA+CN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAqC3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAkDrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAkBtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAwBzC"}
1
+ {"version":3,"file":"canvas-run-state.d.ts","sourceRoot":"","sources":["../../src/core/canvas-run-state.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE;IACH,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GACA,IAAI,CAwDN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAqC3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAkDrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAkBtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAwBzC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAuBtC"}