@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.
- package/CHANGELOG.md +178 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +21 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts +46 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +76 -1
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/codex.d.ts +0 -7
- package/dist/core/adapters/codex.d.ts.map +1 -1
- package/dist/core/adapters/codex.js +1 -23
- package/dist/core/adapters/codex.js.map +1 -1
- package/dist/core/agent-deps.d.ts +10 -0
- package/dist/core/agent-deps.d.ts.map +1 -0
- package/dist/core/agent-deps.js +92 -0
- package/dist/core/agent-deps.js.map +1 -0
- package/dist/core/agent-project-discovery.d.ts +32 -0
- package/dist/core/agent-project-discovery.d.ts.map +1 -0
- package/dist/core/agent-project-discovery.js +110 -0
- package/dist/core/agent-project-discovery.js.map +1 -0
- package/dist/core/canvas-body.d.ts +8 -0
- package/dist/core/canvas-body.d.ts.map +1 -1
- package/dist/core/canvas-body.js +26 -2
- package/dist/core/canvas-body.js.map +1 -1
- package/dist/core/canvas-derive.d.ts.map +1 -1
- package/dist/core/canvas-derive.js +6 -2
- package/dist/core/canvas-derive.js.map +1 -1
- package/dist/core/canvas-render.d.ts +15 -0
- package/dist/core/canvas-render.d.ts.map +1 -1
- package/dist/core/canvas-render.js +60 -19
- package/dist/core/canvas-render.js.map +1 -1
- package/dist/core/canvas-run-state.d.ts +7 -0
- package/dist/core/canvas-run-state.d.ts.map +1 -1
- package/dist/core/canvas-run-state.js +41 -3
- package/dist/core/canvas-run-state.js.map +1 -1
- package/dist/core/canvas-template.d.ts +12 -0
- package/dist/core/canvas-template.d.ts.map +1 -1
- package/dist/core/canvas-template.js +47 -5
- package/dist/core/canvas-template.js.map +1 -1
- package/dist/core/definition-slug-resolver.d.ts +10 -1
- package/dist/core/definition-slug-resolver.d.ts.map +1 -1
- package/dist/core/definition-slug-resolver.js +41 -26
- package/dist/core/definition-slug-resolver.js.map +1 -1
- package/dist/core/inject/claude-settings.d.ts +18 -0
- package/dist/core/inject/claude-settings.d.ts.map +1 -1
- package/dist/core/inject/claude-settings.js +17 -2
- package/dist/core/inject/claude-settings.js.map +1 -1
- package/dist/core/install-watcher.d.ts +35 -0
- package/dist/core/install-watcher.d.ts.map +1 -0
- package/dist/core/install-watcher.js +120 -0
- package/dist/core/install-watcher.js.map +1 -0
- package/dist/core/macros.d.ts +6 -4
- package/dist/core/macros.d.ts.map +1 -1
- package/dist/core/macros.js.map +1 -1
- package/dist/core/render-local-run.d.ts +2 -2
- package/dist/core/render-local-run.js +1 -1
- package/dist/core/run-local-bootstrap.d.ts +4 -2
- package/dist/core/run-local-bootstrap.d.ts.map +1 -1
- package/dist/core/run-local-bootstrap.js +4 -2
- package/dist/core/run-local-bootstrap.js.map +1 -1
- package/dist/core/session-manager.d.ts +14 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +70 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/strip-ansi.d.ts +13 -0
- package/dist/core/strip-ansi.d.ts.map +1 -0
- package/dist/core/strip-ansi.js +29 -0
- package/dist/core/strip-ansi.js.map +1 -0
- package/dist/core/template-catalog.d.ts +1 -1
- package/dist/core/template-catalog.d.ts.map +1 -1
- package/dist/core/template-catalog.js +25 -9
- package/dist/core/template-catalog.js.map +1 -1
- package/dist/core/workflow-registry.d.ts +6 -1
- package/dist/core/workflow-registry.d.ts.map +1 -1
- package/dist/core/workflow-registry.js +70 -20
- package/dist/core/workflow-registry.js.map +1 -1
- package/dist/core/workspace-watcher.d.ts +4 -3
- package/dist/core/workspace-watcher.d.ts.map +1 -1
- package/dist/core/workspace-watcher.js +52 -32
- package/dist/core/workspace-watcher.js.map +1 -1
- package/dist/profiles/default.d.ts.map +1 -1
- package/dist/profiles/default.js +10 -7
- package/dist/profiles/default.js.map +1 -1
- package/dist/server/actions.d.ts +11 -8
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/actions.js +22 -13
- package/dist/server/actions.js.map +1 -1
- package/dist/server/canvas-render.d.ts +3 -2
- package/dist/server/canvas-render.d.ts.map +1 -1
- package/dist/server/canvas-render.js +2 -1
- package/dist/server/canvas-render.js.map +1 -1
- package/dist/server/canvas.d.ts.map +1 -1
- package/dist/server/canvas.js +6 -20
- package/dist/server/canvas.js.map +1 -1
- package/dist/server/fs.d.ts.map +1 -1
- package/dist/server/fs.js +5 -8
- package/dist/server/fs.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +125 -27
- package/dist/server/index.js.map +1 -1
- package/dist/server/rest.d.ts.map +1 -1
- package/dist/server/rest.js +1 -0
- package/dist/server/rest.js.map +1 -1
- package/dist/server/templates.js +1 -1
- package/dist/shared/types.d.ts +58 -8
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +5 -3
- package/dist/shared/types.js.map +1 -1
- package/dist/web/assets/Geist-Variable-Bj2R_7yk.woff2 +0 -0
- package/dist/web/assets/GeistMono-Variable-Dispecij.woff2 +0 -0
- package/dist/web/assets/index-CRkNIc9y.js +458 -0
- package/dist/web/assets/index-T7PZTM4k.css +32 -0
- package/dist/web/canvas/sess-boot/index.html +6 -3
- package/dist/web/index.html +11 -5
- package/package.json +4 -4
- package/dist/web/assets/index-AAGKe1y6.css +0 -32
- 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;
|
|
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"}
|
package/dist/core/canvas-body.js
CHANGED
|
@@ -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.
|
|
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)}.
|
|
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,
|
|
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
|
-
//
|
|
35
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,iBAAiB,EAAyB,MAAM,wBAAwB,CAAC;AAGlF;8EAC8E;AAC9E,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW;IACvC,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACrE,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B,EAAE,IAAoB;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC;AAED,SAAS,MAAM,CAAC,CAAS,EAAE,GAAW,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG;IACtD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,uEAAuE;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,
|
|
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":"
|
|
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
|
-
|
|
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.
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;
|
|
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,
|
|
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"}
|