@sapiom/harness 0.6.0 → 0.8.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 +134 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +4 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts +36 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +48 -1
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/codex.d.ts +6 -0
- package/dist/core/adapters/codex.d.ts.map +1 -1
- package/dist/core/adapters/codex.js +19 -13
- package/dist/core/adapters/codex.js.map +1 -1
- package/dist/core/bracketed-paste.d.ts +16 -0
- package/dist/core/bracketed-paste.d.ts.map +1 -1
- package/dist/core/bracketed-paste.js +17 -3
- package/dist/core/bracketed-paste.js.map +1 -1
- package/dist/core/canvas-manifest-check.d.ts.map +1 -1
- package/dist/core/canvas-manifest-check.js +3 -0
- package/dist/core/canvas-manifest-check.js.map +1 -1
- package/dist/core/canvas-watcher.d.ts +25 -0
- package/dist/core/canvas-watcher.d.ts.map +1 -1
- package/dist/core/canvas-watcher.js +31 -5
- package/dist/core/canvas-watcher.js.map +1 -1
- package/dist/core/errors.d.ts +12 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +14 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/example-seed.js +1 -1
- package/dist/core/example-seed.js.map +1 -1
- package/dist/core/inject/claude-settings.d.ts.map +1 -1
- package/dist/core/inject/claude-settings.js +69 -7
- package/dist/core/inject/claude-settings.js.map +1 -1
- package/dist/core/inject/mcp-config.d.ts +21 -0
- package/dist/core/inject/mcp-config.d.ts.map +1 -1
- package/dist/core/inject/mcp-config.js +23 -13
- package/dist/core/inject/mcp-config.js.map +1 -1
- package/dist/core/inject/skills-plugin.d.ts.map +1 -1
- package/dist/core/inject/skills-plugin.js +41 -25
- package/dist/core/inject/skills-plugin.js.map +1 -1
- package/dist/core/input-contract.d.ts +10 -0
- package/dist/core/input-contract.d.ts.map +1 -0
- package/dist/core/input-contract.js +37 -0
- package/dist/core/input-contract.js.map +1 -0
- package/dist/core/render-local-run.d.ts +10 -5
- package/dist/core/render-local-run.d.ts.map +1 -1
- package/dist/core/render-local-run.js +31 -4
- package/dist/core/render-local-run.js.map +1 -1
- package/dist/core/render-run-state.d.ts.map +1 -1
- package/dist/core/render-run-state.js +23 -2
- package/dist/core/render-run-state.js.map +1 -1
- package/dist/core/run-local-bootstrap.d.ts +8 -1
- package/dist/core/run-local-bootstrap.d.ts.map +1 -1
- package/dist/core/run-local-bootstrap.js +5 -7
- package/dist/core/run-local-bootstrap.js.map +1 -1
- package/dist/core/session-manager.d.ts +29 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +105 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/spawn-target.d.ts +16 -0
- package/dist/core/spawn-target.d.ts.map +1 -1
- package/dist/core/spawn-target.js +87 -19
- package/dist/core/spawn-target.js.map +1 -1
- package/dist/core/strip-ansi.js +49 -11
- package/dist/core/strip-ansi.js.map +1 -1
- package/dist/core/task-manager.js +1 -1
- package/dist/core/task-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server/actions.d.ts +4 -0
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/actions.js +34 -0
- package/dist/server/actions.js.map +1 -1
- package/dist/server/canvas-render.d.ts +9 -1
- package/dist/server/canvas-render.d.ts.map +1 -1
- package/dist/server/canvas-render.js +1 -0
- package/dist/server/canvas-render.js.map +1 -1
- package/dist/server/cwd-normalize.d.ts +18 -0
- package/dist/server/cwd-normalize.d.ts.map +1 -0
- package/dist/server/cwd-normalize.js +23 -0
- package/dist/server/cwd-normalize.js.map +1 -0
- package/dist/server/error-handler.d.ts +13 -0
- package/dist/server/error-handler.d.ts.map +1 -0
- package/dist/server/error-handler.js +7 -0
- package/dist/server/error-handler.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +13 -6
- package/dist/server/index.js.map +1 -1
- package/dist/server/rest.d.ts.map +1 -1
- package/dist/server/rest.js +29 -9
- package/dist/server/rest.js.map +1 -1
- package/dist/shared/types.d.ts +79 -3
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/web/assets/index-C3nbT8wm.css +32 -0
- package/dist/web/assets/index-DlI78kCp.js +490 -0
- package/dist/web/canvas/sess-boot/index.html +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +4 -3
- package/dist/web/assets/index-C-h9_B2u.js +0 -468
- package/dist/web/assets/index-Dcvwqho4.css +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-plugin.js","sourceRoot":"","sources":["../../../src/core/inject/skills-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-plugin.js","sourceRoot":"","sources":["../../../src/core/inject/skills-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,yBAAyB;IAChC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/C,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,6EAA6E;IAC7E,iEAAiE;IACjE,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QACvE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACpD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,uEAAuE;QACvE,yEAAyE;QACzE,wDAAwD;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE1E,CAAC;gBACF,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB;oBAAE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvF,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;gBACxE,+BAA+B;YACjC,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM;YAC1B,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,gBAAwB,EACxB,UAA+B,EAAE;IAEjC,MAAM,kBAAkB,GAAG,yBAAyB,EAAE,CAAC;IACvD,IAAI,CAAC,kBAAkB;QAAE,OAAO,SAAS,CAAC;IAE1C,qDAAqD;IACrD,IAAI,SAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAE9E,wEAAwE;IACxE,sEAAsE;IACtE,2EAA2E;IAC3E,2DAA2D;IAC3D,IAAI,CAAC;QACH,iDAAiD;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,4EAA4E;QAC5E,0EAA0E;QAC1E,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAClD,MAAM,CACP,CAAC;QAEF,0DAA0D;QAC1D,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;YAC5D,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,yDAAyD,gBAAgB,oCAAoC,EAC7G,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WorkflowInputContractResponse } from "../shared/types.js";
|
|
2
|
+
import { type CachedExtraction } from "./canvas-cache.js";
|
|
3
|
+
export type InputContractExtractor = (sourceDir: string) => Promise<CachedExtraction>;
|
|
4
|
+
/**
|
|
5
|
+
* Read an agent's entry contract from the same cached, deterministic manifest
|
|
6
|
+
* extraction that powers Canvas. The registered-path boundary lives in the
|
|
7
|
+
* HTTP router; this helper only operates on the already-resolved project.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readWorkflowInputContract(sourceDir: string, extract?: InputContractExtractor): Promise<WorkflowInputContractResponse>;
|
|
10
|
+
//# sourceMappingURL=input-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-contract.d.ts","sourceRoot":"","sources":["../../src/core/input-contract.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,sBAAsB,GAAG,CACnC,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,sBAAmD,GAC3D,OAAO,CAAC,6BAA6B,CAAC,CAiCxC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { exampleFromJsonSchema } from "@sapiom/agent";
|
|
2
|
+
import { extractWorkflowGraphCached, } from "./canvas-cache.js";
|
|
3
|
+
/**
|
|
4
|
+
* Read an agent's entry contract from the same cached, deterministic manifest
|
|
5
|
+
* extraction that powers Canvas. The registered-path boundary lives in the
|
|
6
|
+
* HTTP router; this helper only operates on the already-resolved project.
|
|
7
|
+
*/
|
|
8
|
+
export async function readWorkflowInputContract(sourceDir, extract = extractWorkflowGraphCached) {
|
|
9
|
+
const extraction = await extract(sourceDir);
|
|
10
|
+
if (!extraction.result.ok) {
|
|
11
|
+
return {
|
|
12
|
+
status: "unavailable",
|
|
13
|
+
jsonSchema: null,
|
|
14
|
+
example: {},
|
|
15
|
+
reason: "Studio couldn't extract this agent's input contract. You can still run it with raw JSON.",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const { graph } = extraction.result;
|
|
19
|
+
const entry = graph.nodes.find((node) => node.id === graph.entry);
|
|
20
|
+
if (!entry) {
|
|
21
|
+
return {
|
|
22
|
+
status: "unavailable",
|
|
23
|
+
jsonSchema: null,
|
|
24
|
+
example: {},
|
|
25
|
+
reason: "Studio couldn't identify the agent's entry step. You can still run it with raw JSON.",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!entry.inputSchema) {
|
|
29
|
+
return { status: "none", jsonSchema: null, example: {} };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
status: "available",
|
|
33
|
+
jsonSchema: entry.inputSchema,
|
|
34
|
+
example: exampleFromJsonSchema(entry.inputSchema),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=input-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-contract.js","sourceRoot":"","sources":["../../src/core/input-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EACL,0BAA0B,GAE3B,MAAM,mBAAmB,CAAC;AAM3B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,UAAkC,0BAA0B;IAE5D,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EACJ,0FAA0F;SAC7F,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EACJ,sFAAsF;SACzF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC;KAClD,CAAC;AACJ,CAAC"}
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
* - **No cost** — local runs are stubbed and free by construction; a StepView
|
|
17
17
|
* from here never carries `costUsd` (so the inspector reads "local run ·
|
|
18
18
|
* free", never "$0.00").
|
|
19
|
-
* - **
|
|
20
|
-
*
|
|
21
|
-
* `latencyMs` is ABSENT rather than a fabricated `0`.
|
|
19
|
+
* - **Timing is evidence-backed** — new traces carry start/finish timestamps
|
|
20
|
+
* and produce latency; legacy traces without them keep `latencyMs` absent.
|
|
22
21
|
* - **Output** is present only when the trace captured one (a step that threw,
|
|
23
22
|
* or a `continue` with no value, carries none) — but ABSENCE is `undefined`
|
|
24
23
|
* on the trace, and a genuine `null`/`false`/`0`/`""` output is a real value
|
|
@@ -30,8 +29,9 @@
|
|
|
30
29
|
* - **Stub signal (WB15-2)** is RUN-LEVEL. A local run is stub-served by
|
|
31
30
|
* construction, so the run carries `stubbed: true` (prod's renderRunState
|
|
32
31
|
* never does) and the inspector marks each executed step with a "stubbed"
|
|
33
|
-
* chip
|
|
34
|
-
*
|
|
32
|
+
* chip. Recorded calls additionally carry their own `stubUsed` attribution;
|
|
33
|
+
* the run-level flag remains useful for steps that made no call. The terminal
|
|
34
|
+
* summary's `unusedStubs` (a supplied key
|
|
35
35
|
* that matched nothing) and `stubWarnings` (a wrong-shape value) pass through
|
|
36
36
|
* only when NON-empty, so a clean run surfaces no notice at all.
|
|
37
37
|
*/
|
|
@@ -71,6 +71,11 @@ export interface RenderLocalRunOptions {
|
|
|
71
71
|
* {@link RenderLocalRunOptions.unusedStubs}: an empty list is dropped.
|
|
72
72
|
*/
|
|
73
73
|
stubWarnings?: string[];
|
|
74
|
+
input?: unknown;
|
|
75
|
+
output?: unknown;
|
|
76
|
+
error?: unknown;
|
|
77
|
+
startedAt?: string;
|
|
78
|
+
finishedAt?: string;
|
|
74
79
|
}
|
|
75
80
|
/**
|
|
76
81
|
* Map a local stub run's traces (plus the caller-owned execution id and, once
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-local-run.d.ts","sourceRoot":"","sources":["../../src/core/render-local-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EACV,OAAO,EAIP,cAAc,EACf,MAAM,oBAAoB,CAAC;AAQ5B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"render-local-run.d.ts","sourceRoot":"","sources":["../../src/core/render-local-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EACV,OAAO,EAIP,cAAc,EACf,MAAM,oBAAoB,CAAC;AAQ5B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiFD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EAAE,EACxB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CA2BT"}
|
|
@@ -13,6 +13,8 @@ import { toLogSlice } from "./render-log-slice.js";
|
|
|
13
13
|
* `passed`.
|
|
14
14
|
*/
|
|
15
15
|
function toStepStatus(raw) {
|
|
16
|
+
if (raw === "running")
|
|
17
|
+
return "running";
|
|
16
18
|
if (raw === "succeeded")
|
|
17
19
|
return "passed";
|
|
18
20
|
if (raw === "threw")
|
|
@@ -46,14 +48,29 @@ function toStepView(trace) {
|
|
|
46
48
|
// collision-free key across a run's attempts of the same step.
|
|
47
49
|
id: `${trace.step}-${trace.attempt}`,
|
|
48
50
|
name: trace.step,
|
|
51
|
+
attempt: trace.attempt,
|
|
49
52
|
status: toStepStatus(trace.status),
|
|
50
53
|
};
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
if (trace.startedAt)
|
|
55
|
+
view.startedAt = trace.startedAt;
|
|
56
|
+
if (trace.finishedAt)
|
|
57
|
+
view.finishedAt = trace.finishedAt;
|
|
58
|
+
if (trace.startedAt && trace.finishedAt) {
|
|
59
|
+
const start = Date.parse(trace.startedAt);
|
|
60
|
+
const finish = Date.parse(trace.finishedAt);
|
|
61
|
+
if (Number.isFinite(start) && Number.isFinite(finish) && finish >= start) {
|
|
62
|
+
view.latencyMs = finish - start;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
53
65
|
if (trace.input !== undefined)
|
|
54
66
|
view.input = trace.input;
|
|
55
67
|
if (trace.output !== undefined)
|
|
56
68
|
view.output = trace.output;
|
|
69
|
+
if (trace.sharedStateAfter !== undefined) {
|
|
70
|
+
view.sharedState = trace.sharedStateAfter;
|
|
71
|
+
}
|
|
72
|
+
if (trace.directive !== undefined)
|
|
73
|
+
view.directive = trace.directive;
|
|
57
74
|
if (trace.error?.message)
|
|
58
75
|
view.error = trace.error.message;
|
|
59
76
|
const logSlice = toLogSlice(trace.logs);
|
|
@@ -87,8 +104,8 @@ export function renderLocalRun(traces, options = {}) {
|
|
|
87
104
|
// A local run is stub-served by construction (every ctx.sapiom.* call
|
|
88
105
|
// resolves from a stub, never the network) — so the run itself is `stubbed`,
|
|
89
106
|
// and the inspector marks each executed step with the chip. This is the
|
|
90
|
-
// honest per-run truth
|
|
91
|
-
//
|
|
107
|
+
// honest per-run truth even when a step made no call. Recorded calls also
|
|
108
|
+
// carry their own `stubUsed` attribution. renderRunState (prod) never sets this.
|
|
92
109
|
stubbed: true,
|
|
93
110
|
};
|
|
94
111
|
// Honest absence: only a NON-empty signal reaches the view, so the read-only
|
|
@@ -100,6 +117,16 @@ export function renderLocalRun(traces, options = {}) {
|
|
|
100
117
|
if (options.stubWarnings && options.stubWarnings.length > 0) {
|
|
101
118
|
view.stubWarnings = options.stubWarnings;
|
|
102
119
|
}
|
|
120
|
+
if (options.input !== undefined)
|
|
121
|
+
view.input = options.input;
|
|
122
|
+
if (options.output !== undefined)
|
|
123
|
+
view.output = options.output;
|
|
124
|
+
if (options.error !== undefined)
|
|
125
|
+
view.error = options.error;
|
|
126
|
+
if (options.startedAt)
|
|
127
|
+
view.startedAt = options.startedAt;
|
|
128
|
+
if (options.finishedAt)
|
|
129
|
+
view.finishedAt = options.finishedAt;
|
|
103
130
|
return view;
|
|
104
131
|
}
|
|
105
132
|
//# sourceMappingURL=render-local-run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-local-run.js","sourceRoot":"","sources":["../../src/core/render-local-run.ts"],"names":[],"mappings":"AA8CA,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,gFAAgF;AAChF,yEAAyE;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"render-local-run.js","sourceRoot":"","sources":["../../src/core/render-local-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-run-state.d.ts","sourceRoot":"","sources":["../../src/core/render-run-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-run-state.d.ts","sourceRoot":"","sources":["../../src/core/render-run-state.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,oBAAoB,CAAC;AA+FxE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAYpE"}
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Honest absence is preserved end to end: a still-running step gets no
|
|
13
13
|
* `latencyMs`, and a step with no logs gets no `logSlice`. The inspector
|
|
14
|
-
* surfaces
|
|
14
|
+
* surfaces the projection's recorded input, output, state, directive, logs,
|
|
15
|
+
* timing, and status — never cost or invented call traces.
|
|
15
16
|
*/
|
|
16
17
|
import { isExecutionTerminal } from "@sapiom/agent-core";
|
|
17
18
|
// The log-buffer formatter lives in its own dependency-free module so the
|
|
@@ -73,8 +74,13 @@ function toStepView(step) {
|
|
|
73
74
|
const view = {
|
|
74
75
|
id: step.spanId ?? `step-${step.stepOrder}-${step.attempt}`,
|
|
75
76
|
name: step.stepName,
|
|
77
|
+
attempt: step.attempt,
|
|
76
78
|
status: toStepStatus(step.status),
|
|
77
79
|
};
|
|
80
|
+
if (step.startedAt)
|
|
81
|
+
view.startedAt = step.startedAt;
|
|
82
|
+
if (step.finishedAt)
|
|
83
|
+
view.finishedAt = step.finishedAt;
|
|
78
84
|
const latencyMs = toLatencyMs(step.startedAt, step.finishedAt);
|
|
79
85
|
if (latencyMs !== undefined)
|
|
80
86
|
view.latencyMs = latencyMs;
|
|
@@ -93,6 +99,10 @@ function toStepView(step) {
|
|
|
93
99
|
view.input = step.input;
|
|
94
100
|
if (step.output !== null)
|
|
95
101
|
view.output = step.output;
|
|
102
|
+
if (step.sharedStateAfter !== null)
|
|
103
|
+
view.sharedState = step.sharedStateAfter;
|
|
104
|
+
if (step.nextDirective !== null)
|
|
105
|
+
view.directive = step.nextDirective;
|
|
96
106
|
// `step.events` are capability execution events forwarded by dispatched
|
|
97
107
|
// capabilities (e.g. tool_use / thinking / result events from a coding run).
|
|
98
108
|
// They do NOT represent dotted workflow capability calls (search.webSearch,
|
|
@@ -111,10 +121,21 @@ function toStepView(step) {
|
|
|
111
121
|
* projection is already the decoded, degradation-tolerant shape.
|
|
112
122
|
*/
|
|
113
123
|
export function renderRunState(decoded) {
|
|
114
|
-
|
|
124
|
+
const view = {
|
|
115
125
|
executionId: decoded.id,
|
|
116
126
|
status: toRunStatus(decoded.status),
|
|
117
127
|
steps: decoded.steps.map(toStepView),
|
|
118
128
|
};
|
|
129
|
+
if (decoded.input !== null)
|
|
130
|
+
view.input = decoded.input;
|
|
131
|
+
if (decoded.output !== null)
|
|
132
|
+
view.output = decoded.output;
|
|
133
|
+
if (decoded.error !== null)
|
|
134
|
+
view.error = decoded.error;
|
|
135
|
+
if (decoded.startedAt)
|
|
136
|
+
view.startedAt = decoded.startedAt;
|
|
137
|
+
if (decoded.finishedAt)
|
|
138
|
+
view.finishedAt = decoded.finishedAt;
|
|
139
|
+
return view;
|
|
119
140
|
}
|
|
120
141
|
//# sourceMappingURL=render-run-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-run-state.js","sourceRoot":"","sources":["../../src/core/render-run-state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"render-run-state.js","sourceRoot":"","sources":["../../src/core/render-run-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAOzD,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,yCAAyC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACtC,OAAO,WAAW,CAAC,CAAC,iEAAiE;AACvF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IAChE,IACE,GAAG,KAAK,QAAQ;QAChB,GAAG,KAAK,OAAO;QACf,GAAG,KAAK,WAAW;QACnB,GAAG,KAAK,UAAU;QAElB,OAAO,QAAQ,CAAC;IAClB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;kEAEkE;AAClE,SAAS,WAAW,CAClB,SAAwB,EACxB,UAAyB;IAEzB,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACvE,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1B,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED;kFACkF;AAClF,SAAS,UAAU,CAAC,IAAoB;IACtC,MAAM,IAAI,GAAa;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE;QAC3D,IAAI,EAAE,IAAI,CAAC,QAAQ;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KAClC,CAAC;IACF,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpD,IAAI,IAAI,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IACxD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrD,qEAAqE;IACrE,0EAA0E;IAC1E,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,sDAAsD;IACtD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAC7E,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;IACrE,wEAAwE;IACxE,6EAA6E;IAC7E,4EAA4E;IAC5E,uEAAuE;IACvE,6EAA6E;IAC7E,gEAAgE;IAChE,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,yCAAyC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4B;IACzD,MAAM,IAAI,GAAY;QACpB,WAAW,EAAE,OAAO,CAAC,EAAE;QACvB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;KACrC,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI;QAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI;QAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACvD,IAAI,OAAO,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAC1D,IAAI,OAAO,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* *run* is a successful *invocation*); exit 1 only when no run happened
|
|
33
33
|
* (bad request, load error) after writing a terminal `error` line.
|
|
34
34
|
*/
|
|
35
|
-
import { type LocalRunOutcome, type StubFile } from "@sapiom/agent-core";
|
|
35
|
+
import { type LocalStepTrace, type LocalRunOutcome, type StubFile } from "@sapiom/agent-core";
|
|
36
36
|
/** The request shape the route writes to this child's stdin. */
|
|
37
37
|
export interface RunLocalRequest {
|
|
38
38
|
/** Absolute path to the agent project directory (contains `index.ts`). */
|
|
@@ -65,6 +65,13 @@ export interface RunLocalSummaryLine {
|
|
|
65
65
|
}>;
|
|
66
66
|
stubWarnings: string[];
|
|
67
67
|
}
|
|
68
|
+
/** Live attempt event. `started` and `settled` share one stable trace key
|
|
69
|
+
* (`step + attempt`) so clients upsert rather than duplicate a row. */
|
|
70
|
+
export interface RunLocalStepLine {
|
|
71
|
+
kind: "step";
|
|
72
|
+
phase: "started" | "settled";
|
|
73
|
+
trace: LocalStepTrace;
|
|
74
|
+
}
|
|
68
75
|
/**
|
|
69
76
|
* The terminal line written when the run could not be *invoked* at all — a
|
|
70
77
|
* malformed request, an unreadable stub file, a project that fails to load.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-local-bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/run-local-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"run-local-bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/run-local-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAE5B,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;0EACsE;IACtE,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;uEACuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,cAAc,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAWD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAwBjE;AAYD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,MAAM,CAAC,cAAc,GACzB,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
|
|
@@ -72,8 +72,8 @@ export function parseRunLocalRequest(raw) {
|
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
74
|
/** Serialize one step trace as a single NDJSON line (newline-terminated). */
|
|
75
|
-
function traceLine(
|
|
76
|
-
return JSON.stringify(
|
|
75
|
+
function traceLine(line) {
|
|
76
|
+
return JSON.stringify(line) + "\n";
|
|
77
77
|
}
|
|
78
78
|
/** Serialize the terminal summary as a single NDJSON line. */
|
|
79
79
|
function summaryLine(line) {
|
|
@@ -94,12 +94,10 @@ export async function runBootstrap(request, out) {
|
|
|
94
94
|
input: request.input,
|
|
95
95
|
stubs: request.stubs,
|
|
96
96
|
maxAttemptsPerStep: request.maxAttemptsPerStep,
|
|
97
|
+
onStepTrace(phase, trace) {
|
|
98
|
+
out.write(traceLine({ kind: "step", phase, trace }));
|
|
99
|
+
},
|
|
97
100
|
});
|
|
98
|
-
// One line per step-attempt, in execution order — the consumer parses them
|
|
99
|
-
// incrementally rather than buffering the whole trace as a single blob.
|
|
100
|
-
for (const step of result.steps) {
|
|
101
|
-
out.write(traceLine(step));
|
|
102
|
-
}
|
|
103
101
|
const summary = {
|
|
104
102
|
kind: "summary",
|
|
105
103
|
outcome: result.outcome,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-local-bootstrap.js","sourceRoot":"","sources":["../../src/core/run-local-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,eAAe,GAIhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-local-bootstrap.js","sourceRoot":"","sources":["../../src/core/run-local-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,11 @@ export interface SessionManagerOptions {
|
|
|
100
100
|
* probed against real OS processes). Defaults to `defaultIsPidAlive`.
|
|
101
101
|
*/
|
|
102
102
|
isPidAlive?: (pid: number) => boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Host platform, injectable so the Windows-only bracketed-paste assumption
|
|
105
|
+
* (see `submitInput`) is provable from POSIX CI. Defaults to the real one.
|
|
106
|
+
*/
|
|
107
|
+
platform?: NodeJS.Platform;
|
|
103
108
|
}
|
|
104
109
|
export declare class SessionManager {
|
|
105
110
|
private readonly adapters;
|
|
@@ -115,6 +120,7 @@ export declare class SessionManager {
|
|
|
115
120
|
private readonly prepareWorkspaceContext;
|
|
116
121
|
private readonly ensureCanvasTemplate;
|
|
117
122
|
private readonly isPidAlive;
|
|
123
|
+
private readonly platform;
|
|
118
124
|
private readonly sessions;
|
|
119
125
|
private readonly ptys;
|
|
120
126
|
private readonly statusEmitter;
|
|
@@ -286,6 +292,29 @@ export declare class SessionManager {
|
|
|
286
292
|
* registry entry and broadcasts the change like any other status update. */
|
|
287
293
|
setBoundWorkflowPath(id: string, workflowPath: string | null): void;
|
|
288
294
|
private spawn;
|
|
295
|
+
/**
|
|
296
|
+
* For a `readyFallback: "hook-timeout"` harness (Claude Code): rescue a
|
|
297
|
+
* session whose real readiness signal never arrives. `ready` is normally
|
|
298
|
+
* flipped by the SessionStart hook POSTing to /ingest — but that chain runs
|
|
299
|
+
* `node` through the agent's hook shell, and where it breaks (Windows: Git
|
|
300
|
+
* Bash resolves no `.cmd`, so a machine whose only node is a .cmd shim runs
|
|
301
|
+
* zero hooks) the session looked fine in the terminal while every held
|
|
302
|
+
* prompt was silently dropped after the SPA's timeout.
|
|
303
|
+
*
|
|
304
|
+
* Conservative on purpose:
|
|
305
|
+
* - fires no earlier than HOOK_READY_FALLBACK_MS after spawn — a healthy
|
|
306
|
+
* hook (1–3s) always wins the race, so behaviour only changes on
|
|
307
|
+
* machines where the hook is already broken;
|
|
308
|
+
* - requires SOME output — a pty that hasn't drawn anything yet isn't an
|
|
309
|
+
* interactive TUI missing its hook, it's still starting;
|
|
310
|
+
* - keeps waiting while a known blocking prompt (trust dialog, theme
|
|
311
|
+
* picker, login) is on screen, so the submit `\r` that follows readiness
|
|
312
|
+
* can never answer a dialog the user hasn't seen — once the user
|
|
313
|
+
* dismisses it, the next poll flips ready;
|
|
314
|
+
* - dies with the handle (exit clears the interval; a replaced handle is
|
|
315
|
+
* detected via the ptys map, same idempotency rule as markExited()).
|
|
316
|
+
*/
|
|
317
|
+
private armHookReadyFallback;
|
|
289
318
|
/**
|
|
290
319
|
* Transitions a session to "exited". Shared by node-pty's own `onExit`
|
|
291
320
|
* callback and `kill()`'s missed-event fallback (see `kill()`) — both are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAqB5B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAKrB,KAAK,IAAI,GAAG,OAAO,UAAU,EAAE,IAAI,CAAC;AACpC,KAAK,cAAc,GAAG,OAAO,UAAU,EAAE,eAAe,CAAC;AACzD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAKzF;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAcjE;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,6 +113,17 @@ const READY_SETTLE_MS = 700;
|
|
|
113
113
|
* frame (confirmed against a real capture: a single Codex trust-prompt
|
|
114
114
|
* frame is well under 2KB) without re-scanning unbounded history. */
|
|
115
115
|
const BLOCKING_PROMPT_SCAN_BYTES = 4096;
|
|
116
|
+
/**
|
|
117
|
+
* See `armHookReadyFallback()`: how long after spawn a `readyFallback:
|
|
118
|
+
* "hook-timeout"` harness may sit un-ready before the fallback flips it.
|
|
119
|
+
* Generous on purpose: a healthy SessionStart hook lands in 1–3s, so 20s
|
|
120
|
+
* only ever fires when the hook chain is genuinely broken (the Windows
|
|
121
|
+
* node-resolution failure this exists for) — never racing a working hook.
|
|
122
|
+
*/
|
|
123
|
+
const HOOK_READY_FALLBACK_MS = 20000;
|
|
124
|
+
/** Poll cadence for `armHookReadyFallback()` — coarse; nothing user-visible
|
|
125
|
+
* rides on sub-second precision 20s after spawn. */
|
|
126
|
+
const HOOK_READY_POLL_MS = 1000;
|
|
116
127
|
/**
|
|
117
128
|
* See `submitInput()`: how long to wait for a not-yet-ready session to
|
|
118
129
|
* become ready before giving up and throwing `SessionNotReadyError`. Covers
|
|
@@ -207,6 +218,7 @@ export class SessionManager {
|
|
|
207
218
|
this.prepareWorkspaceContext = options.prepareWorkspaceContext ?? (async () => { });
|
|
208
219
|
this.ensureCanvasTemplate = options.ensureCanvasTemplate ?? (async () => { });
|
|
209
220
|
this.isPidAlive = options.isPidAlive ?? defaultIsPidAlive;
|
|
221
|
+
this.platform = options.platform ?? process.platform;
|
|
210
222
|
// Many WS clients (terminal + events) can subscribe over a long-running process.
|
|
211
223
|
this.statusEmitter.setMaxListeners(0);
|
|
212
224
|
this.activityEmitter.setMaxListeners(0);
|
|
@@ -615,7 +627,23 @@ export class SessionManager {
|
|
|
615
627
|
// chat prepends a multi-line step context to every question) then stay
|
|
616
628
|
// literal instead of each submitting a fragment, and the `\r` below is
|
|
617
629
|
// read as Enter rather than as more pasted content.
|
|
618
|
-
|
|
630
|
+
//
|
|
631
|
+
// Observation wins when we have one; the adapter's declared assumption
|
|
632
|
+
// only covers the never-observed case — under ConPTY the app's
|
|
633
|
+
// `ESC[?2004h` announcement is re-rendered away, so on Windows a Claude
|
|
634
|
+
// session that DOES accept bracketed paste looked like one that doesn't
|
|
635
|
+
// and multi-line prompts submitted at their first newline.
|
|
636
|
+
// win32 only: the blind spot is ConPTY's (it re-renders output instead
|
|
637
|
+
// of passing DEC private-mode sequences through). On POSIX a real 2004
|
|
638
|
+
// announcement always arrives, so "not observed yet" there means the
|
|
639
|
+
// app genuinely hasn't enabled it — and writing paste markers at such
|
|
640
|
+
// an app renders them as literal text, the behaviour the observation
|
|
641
|
+
// channel exists to avoid.
|
|
642
|
+
const paste = handle.bracketedPaste.observed
|
|
643
|
+
? handle.bracketedPaste.enabled
|
|
644
|
+
: this.platform === "win32" &&
|
|
645
|
+
(this.adapters[session.harness]?.assumesBracketedPaste ?? false);
|
|
646
|
+
handle.pty.write(paste ? wrapPaste(text) : text);
|
|
619
647
|
await sleep(SUBMIT_DELAY_MS);
|
|
620
648
|
// The pty may have been killed/replaced while we were waiting.
|
|
621
649
|
if (this.ptys.get(id) !== handle)
|
|
@@ -720,8 +748,20 @@ export class SessionManager {
|
|
|
720
748
|
if (session.ready)
|
|
721
749
|
return true;
|
|
722
750
|
const adapter = this.adapters[session.harness];
|
|
751
|
+
// Gated on the DECLARED fallback mode, not on detectBlockingPrompt's mere
|
|
752
|
+
// presence: claude-code now implements detectBlockingPrompt too (for the
|
|
753
|
+
// hook-timeout fallback armed in spawn()), and giving it this immediate
|
|
754
|
+
// shortcut would bypass its reliable SessionStart hook everywhere.
|
|
755
|
+
//
|
|
756
|
+
// `readyFallback` is optional on the PUBLIC HarnessAdapter interface and
|
|
757
|
+
// hosts may inject their own adapters, so an external one predating the
|
|
758
|
+
// field would silently lose its only pre-ready injection path. Treat
|
|
759
|
+
// detectBlockingPrompt-without-readyFallback as the legacy "immediate"
|
|
760
|
+
// contract it used to imply.
|
|
723
761
|
if (!adapter?.detectBlockingPrompt)
|
|
724
762
|
return false;
|
|
763
|
+
if (adapter.readyFallback !== undefined && adapter.readyFallback !== "immediate")
|
|
764
|
+
return false;
|
|
725
765
|
if (Date.now() - handle.spawnedAt < READY_SETTLE_MS)
|
|
726
766
|
return false;
|
|
727
767
|
// Only the tail: `handle.buffer` is the full retained scrollback
|
|
@@ -795,6 +835,16 @@ export class SessionManager {
|
|
|
795
835
|
else
|
|
796
836
|
env[key] = value;
|
|
797
837
|
}
|
|
838
|
+
// The PTY is a real colour-capable xterm, regardless of the shell that
|
|
839
|
+
// launched Studio. Desktop development is often started from CI-like
|
|
840
|
+
// hosts (Codex included) that export NO_COLOR=1 and TERM=dumb for their
|
|
841
|
+
// own logs. Letting those ambient values leak into Claude/Codex makes the
|
|
842
|
+
// embedded terminal monochrome even though xterm can render the full ANSI
|
|
843
|
+
// palette. Own the terminal capability contract at this boundary.
|
|
844
|
+
delete env.NO_COLOR;
|
|
845
|
+
delete env.FORCE_COLOR;
|
|
846
|
+
env.TERM = "xterm-256color";
|
|
847
|
+
env.COLORTERM = "truecolor";
|
|
798
848
|
env[ENV.ingestUrl] = `${this.ingestUrl.replace(/\/$/, "")}/ingest`;
|
|
799
849
|
env[ENV.ingestToken] = this.ingestToken;
|
|
800
850
|
env[ENV.sessionId] = session.id;
|
|
@@ -850,6 +900,60 @@ export class SessionManager {
|
|
|
850
900
|
this.recordActivity(session.id);
|
|
851
901
|
});
|
|
852
902
|
pty.onExit(({ exitCode }) => this.markExited(session.id, handle, exitCode));
|
|
903
|
+
this.armHookReadyFallback(session.id, handle);
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* For a `readyFallback: "hook-timeout"` harness (Claude Code): rescue a
|
|
907
|
+
* session whose real readiness signal never arrives. `ready` is normally
|
|
908
|
+
* flipped by the SessionStart hook POSTing to /ingest — but that chain runs
|
|
909
|
+
* `node` through the agent's hook shell, and where it breaks (Windows: Git
|
|
910
|
+
* Bash resolves no `.cmd`, so a machine whose only node is a .cmd shim runs
|
|
911
|
+
* zero hooks) the session looked fine in the terminal while every held
|
|
912
|
+
* prompt was silently dropped after the SPA's timeout.
|
|
913
|
+
*
|
|
914
|
+
* Conservative on purpose:
|
|
915
|
+
* - fires no earlier than HOOK_READY_FALLBACK_MS after spawn — a healthy
|
|
916
|
+
* hook (1–3s) always wins the race, so behaviour only changes on
|
|
917
|
+
* machines where the hook is already broken;
|
|
918
|
+
* - requires SOME output — a pty that hasn't drawn anything yet isn't an
|
|
919
|
+
* interactive TUI missing its hook, it's still starting;
|
|
920
|
+
* - keeps waiting while a known blocking prompt (trust dialog, theme
|
|
921
|
+
* picker, login) is on screen, so the submit `\r` that follows readiness
|
|
922
|
+
* can never answer a dialog the user hasn't seen — once the user
|
|
923
|
+
* dismisses it, the next poll flips ready;
|
|
924
|
+
* - dies with the handle (exit clears the interval; a replaced handle is
|
|
925
|
+
* detected via the ptys map, same idempotency rule as markExited()).
|
|
926
|
+
*/
|
|
927
|
+
armHookReadyFallback(id, handle) {
|
|
928
|
+
const session = this.sessions.get(id);
|
|
929
|
+
const adapter = session ? this.adapters[session.harness] : undefined;
|
|
930
|
+
if (adapter?.readyFallback !== "hook-timeout")
|
|
931
|
+
return;
|
|
932
|
+
const poll = setInterval(() => {
|
|
933
|
+
const current = this.sessions.get(id);
|
|
934
|
+
if (!current || this.ptys.get(id) !== handle || current.status !== "running") {
|
|
935
|
+
clearInterval(poll);
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
if (current.ready) {
|
|
939
|
+
clearInterval(poll);
|
|
940
|
+
return;
|
|
941
|
+
}
|
|
942
|
+
if (Date.now() - handle.spawnedAt < HOOK_READY_FALLBACK_MS)
|
|
943
|
+
return;
|
|
944
|
+
if (!handle.buffer)
|
|
945
|
+
return;
|
|
946
|
+
if (adapter.detectBlockingPrompt?.(handle.buffer.slice(-BLOCKING_PROMPT_SCAN_BYTES)))
|
|
947
|
+
return;
|
|
948
|
+
clearInterval(poll);
|
|
949
|
+
console.warn(`[harness] session ${id}: SessionStart hook never reached /ingest after ${HOOK_READY_FALLBACK_MS / 1000}s — marking ready by fallback. The hook command may be failing on this machine ` +
|
|
950
|
+
`(is \`node\` resolvable from the agent's hook shell?).`);
|
|
951
|
+
this.setReady(id);
|
|
952
|
+
}, HOOK_READY_POLL_MS);
|
|
953
|
+
// Never the reason the process stays alive; tests with fake timers and
|
|
954
|
+
// the real server both tear down via the exited hook below anyway.
|
|
955
|
+
poll.unref?.();
|
|
956
|
+
void handle.exited.then(() => clearInterval(poll));
|
|
853
957
|
}
|
|
854
958
|
/**
|
|
855
959
|
* Transitions a session to "exited". Shared by node-pty's own `onExit`
|