@archmax-ai/harness 0.0.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/LICENSE +21 -0
- package/README.md +219 -0
- package/dist/agent.d.ts +174 -0
- package/dist/agent.js +140 -0
- package/dist/agent.js.map +1 -0
- package/dist/assembly/compose.d.ts +170 -0
- package/dist/assembly/compose.js +391 -0
- package/dist/assembly/compose.js.map +1 -0
- package/dist/assembly/delegation-registry.d.ts +5 -0
- package/dist/assembly/delegation-registry.js +118 -0
- package/dist/assembly/delegation-registry.js.map +1 -0
- package/dist/assembly/index.d.ts +192 -0
- package/dist/assembly/index.js +265 -0
- package/dist/assembly/index.js.map +1 -0
- package/dist/assembly/plain.d.ts +7 -0
- package/dist/assembly/plain.js +41 -0
- package/dist/assembly/plain.js.map +1 -0
- package/dist/authoring-skill/archmax-harness/README.md +76 -0
- package/dist/authoring-skill/archmax-harness/SKILL.md +241 -0
- package/dist/authoring-skill/archmax-harness/references/backend-integration.md +626 -0
- package/dist/authoring-skill/archmax-harness/references/cases.md +41 -0
- package/dist/authoring-skill/archmax-harness/references/diagnostics.md +51 -0
- package/dist/authoring-skill/archmax-harness/references/hook-and-test-scripts.md +1070 -0
- package/dist/authoring-skill/archmax-harness/references/hooks-and-scripts.md +82 -0
- package/dist/authoring-skill/archmax-harness/references/wiring.md +101 -0
- package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +1631 -0
- package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +241 -0
- package/dist/behaviour/support.d.ts +232 -0
- package/dist/behaviour/support.js +339 -0
- package/dist/behaviour/support.js.map +1 -0
- package/dist/cli/banner.d.ts +11 -0
- package/dist/cli/banner.js +29 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +33 -0
- package/dist/cli/bootstrap.js +153 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/command.d.ts +39 -0
- package/dist/cli/command.js +97 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/state-flow.d.ts +46 -0
- package/dist/cli/state-flow.js +268 -0
- package/dist/cli/state-flow.js.map +1 -0
- package/dist/cli/style.d.ts +41 -0
- package/dist/cli/style.js +64 -0
- package/dist/cli/style.js.map +1 -0
- package/dist/cli/turn.d.ts +41 -0
- package/dist/cli/turn.js +161 -0
- package/dist/cli/turn.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +426 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/code-description.d.ts +22 -0
- package/dist/core/code-description.js +38 -0
- package/dist/core/code-description.js.map +1 -0
- package/dist/core/deepagents.d.ts +183 -0
- package/dist/core/deepagents.js +128 -0
- package/dist/core/deepagents.js.map +1 -0
- package/dist/core/events.d.ts +350 -0
- package/dist/core/events.js +205 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/frontmatter.d.ts +15 -0
- package/dist/core/frontmatter.js +32 -0
- package/dist/core/frontmatter.js.map +1 -0
- package/dist/core/listing-redact.d.ts +37 -0
- package/dist/core/listing-redact.js +88 -0
- package/dist/core/listing-redact.js.map +1 -0
- package/dist/core/match.d.ts +26 -0
- package/dist/core/match.js +75 -0
- package/dist/core/match.js.map +1 -0
- package/dist/core/message-readers.d.ts +84 -0
- package/dist/core/message-readers.js +159 -0
- package/dist/core/message-readers.js.map +1 -0
- package/dist/core/messages.d.ts +49 -0
- package/dist/core/messages.js +85 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/mount-prompt.d.ts +28 -0
- package/dist/core/mount-prompt.js +55 -0
- package/dist/core/mount-prompt.js.map +1 -0
- package/dist/core/mount-redact.d.ts +28 -0
- package/dist/core/mount-redact.js +32 -0
- package/dist/core/mount-redact.js.map +1 -0
- package/dist/core/mounts.d.ts +88 -0
- package/dist/core/mounts.js +147 -0
- package/dist/core/mounts.js.map +1 -0
- package/dist/core/path-mapping.d.ts +52 -0
- package/dist/core/path-mapping.js +113 -0
- package/dist/core/path-mapping.js.map +1 -0
- package/dist/core/platform-prompt.generated.d.ts +2 -0
- package/dist/core/platform-prompt.generated.js +4 -0
- package/dist/core/platform-prompt.generated.js.map +1 -0
- package/dist/core/prompt.d.ts +42 -0
- package/dist/core/prompt.js +75 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/session-id.d.ts +38 -0
- package/dist/core/session-id.js +61 -0
- package/dist/core/session-id.js.map +1 -0
- package/dist/core/session-store.d.ts +85 -0
- package/dist/core/session-store.js +149 -0
- package/dist/core/session-store.js.map +1 -0
- package/dist/core/session-zone.d.ts +54 -0
- package/dist/core/session-zone.js +82 -0
- package/dist/core/session-zone.js.map +1 -0
- package/dist/core/skill-prompt.d.ts +31 -0
- package/dist/core/skill-prompt.js +54 -0
- package/dist/core/skill-prompt.js.map +1 -0
- package/dist/core/skill-redact.d.ts +15 -0
- package/dist/core/skill-redact.js +27 -0
- package/dist/core/skill-redact.js.map +1 -0
- package/dist/core/skills.d.ts +172 -0
- package/dist/core/skills.js +214 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/tool-mocks.d.ts +23 -0
- package/dist/core/tool-mocks.js +39 -0
- package/dist/core/tool-mocks.js.map +1 -0
- package/dist/core/tool-telemetry.d.ts +16 -0
- package/dist/core/tool-telemetry.js +40 -0
- package/dist/core/tool-telemetry.js.map +1 -0
- package/dist/core/usage.d.ts +114 -0
- package/dist/core/usage.js +226 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/workspace-context.d.ts +136 -0
- package/dist/core/workspace-context.js +178 -0
- package/dist/core/workspace-context.js.map +1 -0
- package/dist/core/workspace-prompt.d.ts +7 -0
- package/dist/core/workspace-prompt.js +102 -0
- package/dist/core/workspace-prompt.js.map +1 -0
- package/dist/core/workspace-router.d.ts +61 -0
- package/dist/core/workspace-router.js +145 -0
- package/dist/core/workspace-router.js.map +1 -0
- package/dist/core/workspace.d.ts +85 -0
- package/dist/core/workspace.js +193 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/core/zones.d.ts +181 -0
- package/dist/core/zones.js +202 -0
- package/dist/core/zones.js.map +1 -0
- package/dist/env.d.ts +99 -0
- package/dist/env.js +271 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +265 -0
- package/dist/index.js +197 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/kernel.d.ts +192 -0
- package/dist/kernel/kernel.js +751 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/lifecycle/hook-shape.d.ts +44 -0
- package/dist/lifecycle/hook-shape.js +66 -0
- package/dist/lifecycle/hook-shape.js.map +1 -0
- package/dist/lifecycle/runner.d.ts +177 -0
- package/dist/lifecycle/runner.js +372 -0
- package/dist/lifecycle/runner.js.map +1 -0
- package/dist/lifecycle/transcript.d.ts +27 -0
- package/dist/lifecycle/transcript.js +43 -0
- package/dist/lifecycle/transcript.js.map +1 -0
- package/dist/machine/allow.d.ts +65 -0
- package/dist/machine/allow.js +107 -0
- package/dist/machine/allow.js.map +1 -0
- package/dist/machine/delegation.d.ts +9 -0
- package/dist/machine/delegation.js +10 -0
- package/dist/machine/delegation.js.map +1 -0
- package/dist/machine/diagnostic.d.ts +14 -0
- package/dist/machine/diagnostic.js +2 -0
- package/dist/machine/diagnostic.js.map +1 -0
- package/dist/machine/lint-spec.d.ts +4 -0
- package/dist/machine/lint-spec.js +266 -0
- package/dist/machine/lint-spec.js.map +1 -0
- package/dist/machine/load-spec.d.ts +90 -0
- package/dist/machine/load-spec.js +120 -0
- package/dist/machine/load-spec.js.map +1 -0
- package/dist/machine/machine.d.ts +273 -0
- package/dist/machine/machine.js +551 -0
- package/dist/machine/machine.js.map +1 -0
- package/dist/machine/mount-grants.d.ts +25 -0
- package/dist/machine/mount-grants.js +24 -0
- package/dist/machine/mount-grants.js.map +1 -0
- package/dist/machine/slug.d.ts +14 -0
- package/dist/machine/slug.js +17 -0
- package/dist/machine/slug.js.map +1 -0
- package/dist/machine/spec-schema.d.ts +662 -0
- package/dist/machine/spec-schema.js +717 -0
- package/dist/machine/spec-schema.js.map +1 -0
- package/dist/machine/tool-names.d.ts +98 -0
- package/dist/machine/tool-names.js +144 -0
- package/dist/machine/tool-names.js.map +1 -0
- package/dist/machine/triggers.d.ts +114 -0
- package/dist/machine/triggers.js +165 -0
- package/dist/machine/triggers.js.map +1 -0
- package/dist/machine/types.d.ts +186 -0
- package/dist/machine/types.js +12 -0
- package/dist/machine/types.js.map +1 -0
- package/dist/machine/validate-spec.d.ts +42 -0
- package/dist/machine/validate-spec.js +29 -0
- package/dist/machine/validate-spec.js.map +1 -0
- package/dist/machine/variables.d.ts +196 -0
- package/dist/machine/variables.js +415 -0
- package/dist/machine/variables.js.map +1 -0
- package/dist/public/cli.d.ts +15 -0
- package/dist/public/cli.js +14 -0
- package/dist/public/cli.js.map +1 -0
- package/dist/public/messages.d.ts +33 -0
- package/dist/public/messages.js +33 -0
- package/dist/public/messages.js.map +1 -0
- package/dist/public/sandbox.d.ts +99 -0
- package/dist/public/sandbox.js +32 -0
- package/dist/public/sandbox.js.map +1 -0
- package/dist/public/spec.d.ts +147 -0
- package/dist/public/spec.js +149 -0
- package/dist/public/spec.js.map +1 -0
- package/dist/public/testing.d.ts +71 -0
- package/dist/public/testing.js +39 -0
- package/dist/public/testing.js.map +1 -0
- package/dist/rubrics/rubrics.d.ts +135 -0
- package/dist/rubrics/rubrics.js +145 -0
- package/dist/rubrics/rubrics.js.map +1 -0
- package/dist/runtime/contract.d.ts +73 -0
- package/dist/runtime/contract.js +96 -0
- package/dist/runtime/contract.js.map +1 -0
- package/dist/sandbox/assets/parts/core.js +22 -0
- package/dist/sandbox/assets/parts/lifecycle-hook.js +47 -0
- package/dist/sandbox/bridge.d.ts +16 -0
- package/dist/sandbox/bridge.js +95 -0
- package/dist/sandbox/bridge.js.map +1 -0
- package/dist/sandbox/executor.d.ts +46 -0
- package/dist/sandbox/executor.js +119 -0
- package/dist/sandbox/executor.js.map +1 -0
- package/dist/sandbox/imports.d.ts +33 -0
- package/dist/sandbox/imports.js +67 -0
- package/dist/sandbox/imports.js.map +1 -0
- package/dist/sandbox/prelude.d.ts +12 -0
- package/dist/sandbox/prelude.js +51 -0
- package/dist/sandbox/prelude.js.map +1 -0
- package/dist/sandbox/ptc-gateway.d.ts +104 -0
- package/dist/sandbox/ptc-gateway.js +167 -0
- package/dist/sandbox/ptc-gateway.js.map +1 -0
- package/dist/sandbox/runtime.d.ts +59 -0
- package/dist/sandbox/runtime.js +51 -0
- package/dist/sandbox/runtime.js.map +1 -0
- package/dist/sandbox/tools.d.ts +34 -0
- package/dist/sandbox/tools.js +147 -0
- package/dist/sandbox/tools.js.map +1 -0
- package/dist/sessions/operations.d.ts +79 -0
- package/dist/sessions/operations.js +121 -0
- package/dist/sessions/operations.js.map +1 -0
- package/dist/sessions/resolve.d.ts +97 -0
- package/dist/sessions/resolve.js +145 -0
- package/dist/sessions/resolve.js.map +1 -0
- package/dist/sessions/resume.d.ts +242 -0
- package/dist/sessions/resume.js +288 -0
- package/dist/sessions/resume.js.map +1 -0
- package/dist/sessions/scope.d.ts +99 -0
- package/dist/sessions/scope.js +145 -0
- package/dist/sessions/scope.js.map +1 -0
- package/dist/sessions/summary.d.ts +65 -0
- package/dist/sessions/summary.js +56 -0
- package/dist/sessions/summary.js.map +1 -0
- package/dist/testing/assertions.d.ts +30 -0
- package/dist/testing/assertions.js +231 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/case-document.d.ts +141 -0
- package/dist/testing/case-document.js +51 -0
- package/dist/testing/case-document.js.map +1 -0
- package/dist/testing/case-schema.d.ts +29 -0
- package/dist/testing/case-schema.js +519 -0
- package/dist/testing/case-schema.js.map +1 -0
- package/dist/testing/discovery.d.ts +10 -0
- package/dist/testing/discovery.js +24 -0
- package/dist/testing/discovery.js.map +1 -0
- package/dist/testing/driver.d.ts +78 -0
- package/dist/testing/driver.js +117 -0
- package/dist/testing/driver.js.map +1 -0
- package/dist/testing/grade.d.ts +116 -0
- package/dist/testing/grade.js +261 -0
- package/dist/testing/grade.js.map +1 -0
- package/dist/testing/interpreter.d.ts +55 -0
- package/dist/testing/interpreter.js +103 -0
- package/dist/testing/interpreter.js.map +1 -0
- package/dist/testing/mock-middleware.d.ts +5 -0
- package/dist/testing/mock-middleware.js +33 -0
- package/dist/testing/mock-middleware.js.map +1 -0
- package/dist/testing/runner.d.ts +205 -0
- package/dist/testing/runner.js +266 -0
- package/dist/testing/runner.js.map +1 -0
- package/dist/testing/target.d.ts +27 -0
- package/dist/testing/target.js +21 -0
- package/dist/testing/target.js.map +1 -0
- package/dist/validate/validate.d.ts +41 -0
- package/dist/validate/validate.js +669 -0
- package/dist/validate/validate.js.map +1 -0
- package/dist/workflow/agent-tools.d.ts +10 -0
- package/dist/workflow/agent-tools.js +10 -0
- package/dist/workflow/agent-tools.js.map +1 -0
- package/dist/workflow/checkpointer.d.ts +52 -0
- package/dist/workflow/checkpointer.js +200 -0
- package/dist/workflow/checkpointer.js.map +1 -0
- package/dist/workflow/control-tools.d.ts +174 -0
- package/dist/workflow/control-tools.js +468 -0
- package/dist/workflow/control-tools.js.map +1 -0
- package/dist/workflow/governance.d.ts +104 -0
- package/dist/workflow/governance.js +546 -0
- package/dist/workflow/governance.js.map +1 -0
- package/dist/workflow/middleware.d.ts +85 -0
- package/dist/workflow/middleware.js +283 -0
- package/dist/workflow/middleware.js.map +1 -0
- package/dist/workflow/on-error.d.ts +25 -0
- package/dist/workflow/on-error.js +58 -0
- package/dist/workflow/on-error.js.map +1 -0
- package/dist/workflow/parks.d.ts +46 -0
- package/dist/workflow/parks.js +513 -0
- package/dist/workflow/parks.js.map +1 -0
- package/dist/workflow/paths.d.ts +67 -0
- package/dist/workflow/paths.js +108 -0
- package/dist/workflow/paths.js.map +1 -0
- package/dist/workflow/prompt-cache.d.ts +70 -0
- package/dist/workflow/prompt-cache.js +103 -0
- package/dist/workflow/prompt-cache.js.map +1 -0
- package/dist/workflow/prompt-pruning.d.ts +20 -0
- package/dist/workflow/prompt-pruning.js +83 -0
- package/dist/workflow/prompt-pruning.js.map +1 -0
- package/dist/workflow/render-prompt.d.ts +45 -0
- package/dist/workflow/render-prompt.js +140 -0
- package/dist/workflow/render-prompt.js.map +1 -0
- package/dist/workflow/runtime-config.d.ts +7 -0
- package/dist/workflow/runtime-config.js +9 -0
- package/dist/workflow/runtime-config.js.map +1 -0
- package/dist/workflow/session-artifacts.d.ts +90 -0
- package/dist/workflow/session-artifacts.js +134 -0
- package/dist/workflow/session-artifacts.js.map +1 -0
- package/dist/workflow/session-view.d.ts +31 -0
- package/dist/workflow/session-view.js +94 -0
- package/dist/workflow/session-view.js.map +1 -0
- package/dist/workflow/snapshot.d.ts +14 -0
- package/dist/workflow/snapshot.js +97 -0
- package/dist/workflow/snapshot.js.map +1 -0
- package/dist/workflow/state.d.ts +347 -0
- package/dist/workflow/state.js +322 -0
- package/dist/workflow/state.js.map +1 -0
- package/dist/workflow/sub-workflow.d.ts +174 -0
- package/dist/workflow/sub-workflow.js +392 -0
- package/dist/workflow/sub-workflow.js.map +1 -0
- package/dist/workflow/tool-service.d.ts +48 -0
- package/dist/workflow/tool-service.js +291 -0
- package/dist/workflow/tool-service.js.map +1 -0
- package/dist/workflow/turn-boundary.d.ts +39 -0
- package/dist/workflow/turn-boundary.js +128 -0
- package/dist/workflow/turn-boundary.js.map +1 -0
- package/dist/workflow/turn-runner.d.ts +40 -0
- package/dist/workflow/turn-runner.js +122 -0
- package/dist/workflow/turn-runner.js.map +1 -0
- package/dist/workflow/workflow-tools.d.ts +46 -0
- package/dist/workflow/workflow-tools.js +90 -0
- package/dist/workflow/workflow-tools.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow lifecycle diagnostics the harness emits during assembly and while a
|
|
3
|
+
* machine-governed workflow runs. Every runtime diagnostic flows through this
|
|
4
|
+
* single typed stream; callers subscribe via `onEvent` on
|
|
5
|
+
* `CreateWorkflowAgentOptions`. With no subscriber, the harness installs
|
|
6
|
+
* {@link consoleEventHandler} (`[workflow]` / `[interpreter]` / `[rubrics]`
|
|
7
|
+
* console output).
|
|
8
|
+
*
|
|
9
|
+
* Two visual tiers: **node-change** events (`state-enter`, `state-leave`) render
|
|
10
|
+
* at the outer level; **action** events (`hook-*`, `advance`, `agent-text`)
|
|
11
|
+
* happen within a node and render indented beneath it.
|
|
12
|
+
*
|
|
13
|
+
* `callId` pairing rule: every event a tool call causes carries that call's
|
|
14
|
+
* `callId` — its own `tool-called`/`tool-result` pair and the effects it produced
|
|
15
|
+
* (`advance`, `parked`, `variables-set`, the sub-workflow pair). An event no call
|
|
16
|
+
* caused (a turn's opening arrival, a human-node park, run-start seeding) omits
|
|
17
|
+
* the field rather than carrying a synthetic id, so the set of events one call
|
|
18
|
+
* produced is derivable from ids alone. No governed call is exempt,
|
|
19
|
+
* `archmax_advance` included.
|
|
20
|
+
*/
|
|
21
|
+
export type WorkflowEventLevel = "info" | "warn" | "error";
|
|
22
|
+
/**
|
|
23
|
+
* The `advance.from` marker for a turn's opening arrival at its state: a
|
|
24
|
+
* transition with no prior state. Mirrors LangGraph's `START` constant, kept as
|
|
25
|
+
* a local literal so this module stays free of a LangGraph dependency.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SESSION_ORIGIN = "__start__";
|
|
28
|
+
/**
|
|
29
|
+
* Where a tool call came from, on the tool events. Absent means the model called
|
|
30
|
+
* the tool directly; a value marks a programmatic call from inside a sandbox
|
|
31
|
+
* script (`script`) or a lifecycle hook (`lifecycle`).
|
|
32
|
+
*/
|
|
33
|
+
export type ToolEventOrigin = "script" | "lifecycle";
|
|
34
|
+
/** How a programmatic tool call's origin reads in human-facing output. */
|
|
35
|
+
export declare function originLabel(origin: ToolEventOrigin): string;
|
|
36
|
+
/**
|
|
37
|
+
* Event payloads, without the severity level (added by the emitter). Every
|
|
38
|
+
* `state` field carries a **state slug** — never a `title`, so a retitled node
|
|
39
|
+
* emits byte-identical events.
|
|
40
|
+
*/
|
|
41
|
+
export type WorkflowEventPayload = {
|
|
42
|
+
type: "interpreter-enabled";
|
|
43
|
+
} | {
|
|
44
|
+
type: "skills-loaded";
|
|
45
|
+
names: string[];
|
|
46
|
+
} | {
|
|
47
|
+
type: "hooks-summary";
|
|
48
|
+
summary: string;
|
|
49
|
+
} | {
|
|
50
|
+
type: "graph-topology";
|
|
51
|
+
topology: string;
|
|
52
|
+
} | {
|
|
53
|
+
type: "warning";
|
|
54
|
+
scope: string;
|
|
55
|
+
message: string;
|
|
56
|
+
} | {
|
|
57
|
+
type: "workflow-reset";
|
|
58
|
+
entry: string;
|
|
59
|
+
} | {
|
|
60
|
+
type: "state-enter";
|
|
61
|
+
state: string;
|
|
62
|
+
} | {
|
|
63
|
+
type: "state-leave";
|
|
64
|
+
state: string;
|
|
65
|
+
next: string;
|
|
66
|
+
} | {
|
|
67
|
+
type: "state-error-routed";
|
|
68
|
+
state: string;
|
|
69
|
+
to: string;
|
|
70
|
+
reason: string;
|
|
71
|
+
} | {
|
|
72
|
+
type: "hook-start";
|
|
73
|
+
state: string;
|
|
74
|
+
phase: "before" | "after";
|
|
75
|
+
label: string;
|
|
76
|
+
} | {
|
|
77
|
+
type: "hook-output";
|
|
78
|
+
state: string;
|
|
79
|
+
line: string;
|
|
80
|
+
} | {
|
|
81
|
+
type: "hook-passed";
|
|
82
|
+
state: string;
|
|
83
|
+
phase: "before" | "after";
|
|
84
|
+
} | {
|
|
85
|
+
type: "hook-verdict";
|
|
86
|
+
state: string;
|
|
87
|
+
phase: "before" | "after";
|
|
88
|
+
label: string;
|
|
89
|
+
/** The hook's verdict, kept as the exact kernel vocabulary (never widened). */
|
|
90
|
+
verdict: "ok" | "correct" | "veto";
|
|
91
|
+
reason: string;
|
|
92
|
+
missing?: string[];
|
|
93
|
+
} | {
|
|
94
|
+
type: "hook-rejected";
|
|
95
|
+
state: string;
|
|
96
|
+
phase: "before" | "after";
|
|
97
|
+
reason: string;
|
|
98
|
+
} | {
|
|
99
|
+
type: "advance";
|
|
100
|
+
from: string;
|
|
101
|
+
to: string;
|
|
102
|
+
reason?: string;
|
|
103
|
+
/**
|
|
104
|
+
* The `archmax_advance` call that drove this transition, matching its
|
|
105
|
+
* `tool-called`/`tool-result` pair. Absent for the turn's opening arrival
|
|
106
|
+
* (`from` is {@link SESSION_ORIGIN}), which the turn boundary commits
|
|
107
|
+
* rather than a call.
|
|
108
|
+
*/
|
|
109
|
+
callId?: string;
|
|
110
|
+
} | {
|
|
111
|
+
type: "parked";
|
|
112
|
+
/** @deprecated Older spelling of {@link state}; emitted for one release. */
|
|
113
|
+
node: string;
|
|
114
|
+
/** The state the session parked at: a human state, or the state that waits. */
|
|
115
|
+
state?: string;
|
|
116
|
+
sessionId: string;
|
|
117
|
+
/**
|
|
118
|
+
* Which channel the session awaits: a human's decision, or an external
|
|
119
|
+
* event delivered as a trigger — so a subscriber can tell a waiting run
|
|
120
|
+
* from an ended one without reading checkpoints.
|
|
121
|
+
*/
|
|
122
|
+
awaiting: "decision" | "input";
|
|
123
|
+
/**
|
|
124
|
+
* For an agent park, why the agent is waiting — its own `archmax_wait`
|
|
125
|
+
* reason. This is what a surface shows: an in-place park declares no
|
|
126
|
+
* awaited trigger ids, since any delivered firing resumes it.
|
|
127
|
+
*/
|
|
128
|
+
reason?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Absolute time the park asked to be resumed at, when the wait declared
|
|
131
|
+
* an `until`. A hint for whoever schedules the wake-up — the runtime holds
|
|
132
|
+
* no timer.
|
|
133
|
+
*/
|
|
134
|
+
resumeAt?: string;
|
|
135
|
+
/**
|
|
136
|
+
* The `archmax_wait` call that asked for this park, matching that call's
|
|
137
|
+
* `tool-called`/`tool-result` pair. Absent for a human-node park: the run
|
|
138
|
+
* routed there, and no call asked for it.
|
|
139
|
+
*/
|
|
140
|
+
callId?: string;
|
|
141
|
+
} | {
|
|
142
|
+
type: "decided";
|
|
143
|
+
node: string;
|
|
144
|
+
state?: string;
|
|
145
|
+
to: string;
|
|
146
|
+
sessionId: string;
|
|
147
|
+
} | {
|
|
148
|
+
type: "park-message";
|
|
149
|
+
node: string;
|
|
150
|
+
state?: string;
|
|
151
|
+
sessionId: string;
|
|
152
|
+
direction: "inbound" | "outbound";
|
|
153
|
+
text: string;
|
|
154
|
+
} | {
|
|
155
|
+
type: "delivered";
|
|
156
|
+
node: string;
|
|
157
|
+
state?: string;
|
|
158
|
+
/** The trigger id that resumed the park. */
|
|
159
|
+
trigger: string;
|
|
160
|
+
/**
|
|
161
|
+
* The state the run continues in — the parked node itself, since a
|
|
162
|
+
* delivery resumes in place rather than routing an edge.
|
|
163
|
+
*/
|
|
164
|
+
to: string;
|
|
165
|
+
sessionId: string;
|
|
166
|
+
} | {
|
|
167
|
+
type: "agent-text";
|
|
168
|
+
state: string;
|
|
169
|
+
text: string;
|
|
170
|
+
messageId?: string;
|
|
171
|
+
partial?: boolean;
|
|
172
|
+
} | {
|
|
173
|
+
type: "agent-text-delta";
|
|
174
|
+
state: string;
|
|
175
|
+
text: string;
|
|
176
|
+
messageId?: string;
|
|
177
|
+
} | {
|
|
178
|
+
type: "tool-called";
|
|
179
|
+
state: string;
|
|
180
|
+
tool: string;
|
|
181
|
+
callId?: string;
|
|
182
|
+
args?: Record<string, unknown>;
|
|
183
|
+
detail?: string;
|
|
184
|
+
origin?: ToolEventOrigin;
|
|
185
|
+
} | {
|
|
186
|
+
type: "tool-result";
|
|
187
|
+
state: string;
|
|
188
|
+
tool: string;
|
|
189
|
+
callId: string;
|
|
190
|
+
status: "ok" | "error";
|
|
191
|
+
durationMs: number;
|
|
192
|
+
output: string;
|
|
193
|
+
truncated: boolean;
|
|
194
|
+
origin?: ToolEventOrigin;
|
|
195
|
+
} | {
|
|
196
|
+
type: "variables-set";
|
|
197
|
+
/** State the write was made from, or absent for run-start seeding. */
|
|
198
|
+
state?: string;
|
|
199
|
+
names: string[];
|
|
200
|
+
locked: boolean;
|
|
201
|
+
/**
|
|
202
|
+
* The `archmax_set_variables` call that wrote them, matching that call's
|
|
203
|
+
* `tool-called`/`tool-result` pair. Absent for run-start seeding, which no
|
|
204
|
+
* call made.
|
|
205
|
+
*/
|
|
206
|
+
callId?: string;
|
|
207
|
+
} | {
|
|
208
|
+
type: "title-set";
|
|
209
|
+
/** The stored (trimmed) value. */
|
|
210
|
+
title: string;
|
|
211
|
+
/** State the write was made from, or absent for run-start seeding. */
|
|
212
|
+
state?: string;
|
|
213
|
+
/**
|
|
214
|
+
* The `archmax_set_variables` call that wrote it, matching that call's
|
|
215
|
+
* `tool-called`/`tool-result` pair. Absent when no call made the write.
|
|
216
|
+
*/
|
|
217
|
+
callId?: string;
|
|
218
|
+
} | {
|
|
219
|
+
type: "tool-blocked";
|
|
220
|
+
state: string;
|
|
221
|
+
tool: string;
|
|
222
|
+
reason: string;
|
|
223
|
+
callId?: string;
|
|
224
|
+
args?: Record<string, unknown>;
|
|
225
|
+
origin?: ToolEventOrigin;
|
|
226
|
+
} | {
|
|
227
|
+
type: "rubric-start";
|
|
228
|
+
state: string;
|
|
229
|
+
name: string;
|
|
230
|
+
dispatchId: string;
|
|
231
|
+
} | {
|
|
232
|
+
type: "rubric-result";
|
|
233
|
+
state: string;
|
|
234
|
+
name: string;
|
|
235
|
+
dispatchId: string;
|
|
236
|
+
status: "ok" | "error";
|
|
237
|
+
durationMs: number;
|
|
238
|
+
} | {
|
|
239
|
+
type: "sub-workflow-start";
|
|
240
|
+
/** The state the call was made from. */
|
|
241
|
+
state: string;
|
|
242
|
+
/** The child workflow slug. */
|
|
243
|
+
workflow: string;
|
|
244
|
+
dispatchId: string;
|
|
245
|
+
/**
|
|
246
|
+
* The tool call that started it, when one did. Concurrent sub-runs differ
|
|
247
|
+
* in both this and `dispatchId`.
|
|
248
|
+
*/
|
|
249
|
+
toolCallId?: string;
|
|
250
|
+
/** How many delegations deep this sub-run is; `1` directly under a root run. */
|
|
251
|
+
depth: number;
|
|
252
|
+
/** The ancestor chain above it, when there is one. */
|
|
253
|
+
chain?: string[];
|
|
254
|
+
} | {
|
|
255
|
+
type: "sub-workflow-result";
|
|
256
|
+
state: string;
|
|
257
|
+
workflow: string;
|
|
258
|
+
dispatchId: string;
|
|
259
|
+
/** The tool call this answers, matching its `sub-workflow-start`. */
|
|
260
|
+
toolCallId?: string;
|
|
261
|
+
/**
|
|
262
|
+
* How the dispatch settled. `parked` is not an outcome but a suspension:
|
|
263
|
+
* the child reached a human node (or waited), so the *parent* suspended
|
|
264
|
+
* with it and the dispatch resumes when the decision arrives.
|
|
265
|
+
*/
|
|
266
|
+
status: "ok" | "error" | "parked";
|
|
267
|
+
durationMs: number;
|
|
268
|
+
/** Why it failed; absent on success. */
|
|
269
|
+
reason?: string;
|
|
270
|
+
/**
|
|
271
|
+
* The variables the sub-run returned, by **name** — absent when its target
|
|
272
|
+
* declares no `returns`. Names only, never values (this is a diagnostic
|
|
273
|
+
* channel); the values reach the parent as its `result:` variable.
|
|
274
|
+
*/
|
|
275
|
+
returns?: string[];
|
|
276
|
+
} | {
|
|
277
|
+
type: "model-usage";
|
|
278
|
+
state: string;
|
|
279
|
+
inputTokens: number;
|
|
280
|
+
outputTokens: number;
|
|
281
|
+
cacheReadTokens?: number;
|
|
282
|
+
cacheCreationTokens?: number;
|
|
283
|
+
model?: string;
|
|
284
|
+
costUsd?: number;
|
|
285
|
+
} | {
|
|
286
|
+
type: "prompt-shaping";
|
|
287
|
+
cache: string;
|
|
288
|
+
withheld: string[];
|
|
289
|
+
};
|
|
290
|
+
/**
|
|
291
|
+
* Metadata stamped on every delivered event: emission time, a sequence number
|
|
292
|
+
* that is strictly increasing across all events delivered to the same handler
|
|
293
|
+
* (i.e. the same assembled agent), and — when a session context is bound — the
|
|
294
|
+
* session the event belongs to, so one handler can demultiplex concurrent runs.
|
|
295
|
+
*/
|
|
296
|
+
export interface WorkflowEventEnvelope {
|
|
297
|
+
ts: number;
|
|
298
|
+
seq: number;
|
|
299
|
+
sessionId?: string;
|
|
300
|
+
/**
|
|
301
|
+
* The sub-workflow dispatch this event was emitted inside, when it was. A
|
|
302
|
+
* sub-run has its own session but shares its caller's event handler, so
|
|
303
|
+
* without this a child's `state-enter` would read as the parent moving to
|
|
304
|
+
* that state. Absent for everything a run does on its own behalf.
|
|
305
|
+
*/
|
|
306
|
+
subWorkflowDispatchId?: string;
|
|
307
|
+
}
|
|
308
|
+
/** A lifecycle event as delivered to subscribers: payload, severity, envelope. */
|
|
309
|
+
export type WorkflowLifecycleEvent = WorkflowEventPayload & {
|
|
310
|
+
level: WorkflowEventLevel;
|
|
311
|
+
} & WorkflowEventEnvelope;
|
|
312
|
+
/** Callback signature for {@link WorkflowLifecycleEvent} subscribers. */
|
|
313
|
+
export type WorkflowEventHandler = (event: WorkflowLifecycleEvent) => void;
|
|
314
|
+
/** Payload with an optional explicit level override (else derived per type). */
|
|
315
|
+
export type WorkflowEventInput = WorkflowEventPayload & {
|
|
316
|
+
level?: WorkflowEventLevel;
|
|
317
|
+
};
|
|
318
|
+
/** Internal emitter shape: accepts payloads, fills in the level, delivers. */
|
|
319
|
+
export type WorkflowEventEmitter = (event: WorkflowEventInput) => void;
|
|
320
|
+
/** What the ambient binding contributes to every event's envelope. */
|
|
321
|
+
export interface EventContext {
|
|
322
|
+
sessionId: string;
|
|
323
|
+
/** Set while a sub-run executes, so its events can be told from its parent's. */
|
|
324
|
+
subWorkflowDispatchId?: string;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Run `fn` with the ambient event-envelope context bound. Nested calls
|
|
328
|
+
* **inherit** what they do not override: a sub-run binds its dispatch id without
|
|
329
|
+
* having to restate the session id it is running on.
|
|
330
|
+
*/
|
|
331
|
+
export declare function withEventContext<T>(context: Partial<EventContext> & {
|
|
332
|
+
sessionId?: string;
|
|
333
|
+
}, fn: () => T): T;
|
|
334
|
+
/**
|
|
335
|
+
* Build the runtime's event emitter: fills in each event's severity level and
|
|
336
|
+
* envelope (`ts`, `seq`, ambient `sessionId`) and delivers it to `handler`,
|
|
337
|
+
* defaulting to {@link consoleEventHandler} so diagnostics are never silently
|
|
338
|
+
* dropped.
|
|
339
|
+
*/
|
|
340
|
+
export declare function createWorkflowEventEmitter(handler?: WorkflowEventHandler): WorkflowEventEmitter;
|
|
341
|
+
/**
|
|
342
|
+
* The default console line for an event, or `null` for events the console
|
|
343
|
+
* output does not show (`tool-called`, `agent-text`).
|
|
344
|
+
*/
|
|
345
|
+
export declare function renderEventLine(event: WorkflowLifecycleEvent): string | null;
|
|
346
|
+
/**
|
|
347
|
+
* Default subscriber: renders events with the established console prefixes.
|
|
348
|
+
* Installed by the harness when the caller supplies no `onEvent` handler.
|
|
349
|
+
*/
|
|
350
|
+
export declare const consoleEventHandler: WorkflowEventHandler;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow lifecycle diagnostics the harness emits during assembly and while a
|
|
3
|
+
* machine-governed workflow runs. Every runtime diagnostic flows through this
|
|
4
|
+
* single typed stream; callers subscribe via `onEvent` on
|
|
5
|
+
* `CreateWorkflowAgentOptions`. With no subscriber, the harness installs
|
|
6
|
+
* {@link consoleEventHandler} (`[workflow]` / `[interpreter]` / `[rubrics]`
|
|
7
|
+
* console output).
|
|
8
|
+
*
|
|
9
|
+
* Two visual tiers: **node-change** events (`state-enter`, `state-leave`) render
|
|
10
|
+
* at the outer level; **action** events (`hook-*`, `advance`, `agent-text`)
|
|
11
|
+
* happen within a node and render indented beneath it.
|
|
12
|
+
*
|
|
13
|
+
* `callId` pairing rule: every event a tool call causes carries that call's
|
|
14
|
+
* `callId` — its own `tool-called`/`tool-result` pair and the effects it produced
|
|
15
|
+
* (`advance`, `parked`, `variables-set`, the sub-workflow pair). An event no call
|
|
16
|
+
* caused (a turn's opening arrival, a human-node park, run-start seeding) omits
|
|
17
|
+
* the field rather than carrying a synthetic id, so the set of events one call
|
|
18
|
+
* produced is derivable from ids alone. No governed call is exempt,
|
|
19
|
+
* `archmax_advance` included.
|
|
20
|
+
*/
|
|
21
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
22
|
+
/**
|
|
23
|
+
* The `advance.from` marker for a turn's opening arrival at its state: a
|
|
24
|
+
* transition with no prior state. Mirrors LangGraph's `START` constant, kept as
|
|
25
|
+
* a local literal so this module stays free of a LangGraph dependency.
|
|
26
|
+
*/
|
|
27
|
+
export const SESSION_ORIGIN = "__start__";
|
|
28
|
+
/** How a programmatic tool call's origin reads in human-facing output. */
|
|
29
|
+
export function originLabel(origin) {
|
|
30
|
+
return origin === "script" ? "script" : "lifecycle hook";
|
|
31
|
+
}
|
|
32
|
+
function defaultLevel(event) {
|
|
33
|
+
switch (event.type) {
|
|
34
|
+
case "warning":
|
|
35
|
+
case "tool-blocked":
|
|
36
|
+
case "hook-rejected":
|
|
37
|
+
return "warn";
|
|
38
|
+
case "tool-result":
|
|
39
|
+
case "rubric-result":
|
|
40
|
+
case "sub-workflow-result":
|
|
41
|
+
return event.status === "error" ? "warn" : "info";
|
|
42
|
+
default:
|
|
43
|
+
return "info";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Ambient session binding for the event envelope. The turn runner binds it
|
|
48
|
+
* around each invoke so every event emitted while a session executes — from any
|
|
49
|
+
* emitter instance — carries that session's id without threading it through
|
|
50
|
+
* every emit call site.
|
|
51
|
+
*/
|
|
52
|
+
const eventContext = new AsyncLocalStorage();
|
|
53
|
+
/**
|
|
54
|
+
* Run `fn` with the ambient event-envelope context bound. Nested calls
|
|
55
|
+
* **inherit** what they do not override: a sub-run binds its dispatch id without
|
|
56
|
+
* having to restate the session id it is running on.
|
|
57
|
+
*/
|
|
58
|
+
export function withEventContext(context, fn) {
|
|
59
|
+
const current = eventContext.getStore();
|
|
60
|
+
const merged = {
|
|
61
|
+
sessionId: context.sessionId ?? current?.sessionId ?? "",
|
|
62
|
+
...(context.subWorkflowDispatchId ?? current?.subWorkflowDispatchId
|
|
63
|
+
? {
|
|
64
|
+
subWorkflowDispatchId: context.subWorkflowDispatchId ?? current?.subWorkflowDispatchId,
|
|
65
|
+
}
|
|
66
|
+
: {}),
|
|
67
|
+
};
|
|
68
|
+
return eventContext.run(merged, fn);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Per-handler sequence counters. Many emitter instances deliver to one
|
|
72
|
+
* handler (one assembled agent), so the counter is keyed by the handler to
|
|
73
|
+
* keep `seq` strictly increasing across everything that agent observes.
|
|
74
|
+
*/
|
|
75
|
+
const seqByHandler = new WeakMap();
|
|
76
|
+
function nextSeq(handler) {
|
|
77
|
+
let counter = seqByHandler.get(handler);
|
|
78
|
+
if (!counter) {
|
|
79
|
+
counter = { n: 0 };
|
|
80
|
+
seqByHandler.set(handler, counter);
|
|
81
|
+
}
|
|
82
|
+
return ++counter.n;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build the runtime's event emitter: fills in each event's severity level and
|
|
86
|
+
* envelope (`ts`, `seq`, ambient `sessionId`) and delivers it to `handler`,
|
|
87
|
+
* defaulting to {@link consoleEventHandler} so diagnostics are never silently
|
|
88
|
+
* dropped.
|
|
89
|
+
*/
|
|
90
|
+
export function createWorkflowEventEmitter(handler) {
|
|
91
|
+
const deliver = handler ?? consoleEventHandler;
|
|
92
|
+
return (event) => {
|
|
93
|
+
const { level, ...payload } = event;
|
|
94
|
+
const sessionId = payload.sessionId ?? eventContext.getStore()?.sessionId;
|
|
95
|
+
const dispatchId = eventContext.getStore()?.subWorkflowDispatchId;
|
|
96
|
+
deliver({
|
|
97
|
+
...payload,
|
|
98
|
+
level: level ?? defaultLevel(payload),
|
|
99
|
+
ts: Date.now(),
|
|
100
|
+
seq: nextSeq(deliver),
|
|
101
|
+
...(sessionId ? { sessionId } : {}),
|
|
102
|
+
...(dispatchId ? { subWorkflowDispatchId: dispatchId } : {}),
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The default console line for an event, or `null` for events the console
|
|
108
|
+
* output does not show (`tool-called`, `agent-text`).
|
|
109
|
+
*/
|
|
110
|
+
export function renderEventLine(event) {
|
|
111
|
+
switch (event.type) {
|
|
112
|
+
case "interpreter-enabled":
|
|
113
|
+
return "[interpreter] enabled (ptc: all agent tools)";
|
|
114
|
+
case "skills-loaded":
|
|
115
|
+
return `[skills] loaded: ${event.names.join(", ")}`;
|
|
116
|
+
case "hooks-summary":
|
|
117
|
+
return `[workflow] lifecycle: ${event.summary}`;
|
|
118
|
+
case "graph-topology":
|
|
119
|
+
return `[workflow] LangGraph graph:\n ${event.topology}`;
|
|
120
|
+
case "warning":
|
|
121
|
+
return `[${event.scope}] ${event.message}`;
|
|
122
|
+
case "workflow-reset":
|
|
123
|
+
return `[workflow] reset to entry '${event.entry}'`;
|
|
124
|
+
case "state-enter":
|
|
125
|
+
return `[workflow] entering node '${event.state}'`;
|
|
126
|
+
case "state-leave":
|
|
127
|
+
return `[workflow] leaving node '${event.state}' -> workflowState=${event.next}`;
|
|
128
|
+
case "state-error-routed":
|
|
129
|
+
return `[workflow] '${event.state}' failed -> routing to on_error '${event.to}': ${event.reason}`;
|
|
130
|
+
case "hook-start":
|
|
131
|
+
return `[workflow] ${event.phase} '${event.state}': running ${event.label}`;
|
|
132
|
+
case "hook-output":
|
|
133
|
+
return `[workflow:${event.state}] ${event.line}`;
|
|
134
|
+
case "hook-passed":
|
|
135
|
+
return `[workflow] '${event.state}' ${event.phase}-script passed`;
|
|
136
|
+
case "hook-verdict": {
|
|
137
|
+
const missing = event.missing?.length ? ` (missing: ${event.missing.join(", ")})` : "";
|
|
138
|
+
return `[workflow:${event.state}] ${event.label}: ${event.verdict.toUpperCase()} — ${event.reason}${missing}`;
|
|
139
|
+
}
|
|
140
|
+
case "hook-rejected":
|
|
141
|
+
return `[workflow] '${event.state}' ${event.phase} REJECTED: ${event.reason}`;
|
|
142
|
+
case "advance":
|
|
143
|
+
return event.from === SESSION_ORIGIN
|
|
144
|
+
? `[workflow] entering start state '${event.to}'`
|
|
145
|
+
: `[workflow] advanced '${event.from}' -> '${event.to}'${event.reason ? `: ${event.reason}` : ""}`;
|
|
146
|
+
case "parked":
|
|
147
|
+
return event.awaiting === "input"
|
|
148
|
+
? `[workflow] parked in '${event.node}' awaiting an event${event.reason ? `: ${event.reason}` : ""}${event.resumeAt ? ` (due ${event.resumeAt})` : ""} (session ${event.sessionId})`
|
|
149
|
+
: `[workflow] parked at human node '${event.node}' awaiting a decision (session ${event.sessionId})`;
|
|
150
|
+
case "decided":
|
|
151
|
+
return `[workflow] decision at '${event.node}' routed to '${event.to}' (session ${event.sessionId})`;
|
|
152
|
+
case "park-message":
|
|
153
|
+
return (`[workflow] ${event.direction === "inbound" ? "message to" : "reply from"} the run parked ` +
|
|
154
|
+
`at '${event.node}' (session ${event.sessionId})`);
|
|
155
|
+
case "delivered":
|
|
156
|
+
return `[workflow] '${event.trigger}' delivered to '${event.node}', resuming it (session ${event.sessionId})`;
|
|
157
|
+
case "variables-set":
|
|
158
|
+
return `[workflow] variables set${event.state ? ` in ${event.state}` : ""}: ${event.names.join(", ")}${event.locked ? " (locked)" : ""}`;
|
|
159
|
+
case "title-set":
|
|
160
|
+
// Printed in full: the write check bounds a title to one short line, so
|
|
161
|
+
// there is nothing here to cap or elide.
|
|
162
|
+
return `[workflow] title set${event.state ? ` in ${event.state}` : ""}: ${event.title}`;
|
|
163
|
+
case "tool-blocked":
|
|
164
|
+
// A refused programmatic call says so: the reason names a tool and a
|
|
165
|
+
// state, and without this an author would look for the call in the
|
|
166
|
+
// model's transcript, where it never appears.
|
|
167
|
+
return event.origin ? `${event.reason} (called from a ${originLabel(event.origin)})` : event.reason;
|
|
168
|
+
case "prompt-shaping":
|
|
169
|
+
return (`[workflow] prompt cache ${event.cache}` +
|
|
170
|
+
(event.withheld.length ? ` (withheld: ${event.withheld.join(", ")})` : ""));
|
|
171
|
+
case "sub-workflow-start":
|
|
172
|
+
return `[workflow] running sub-workflow '${event.workflow}' from '${event.state}'`;
|
|
173
|
+
case "sub-workflow-result":
|
|
174
|
+
if (event.status === "parked") {
|
|
175
|
+
return `[workflow] sub-workflow '${event.workflow}' parked, suspending the run with it`;
|
|
176
|
+
}
|
|
177
|
+
return event.status === "ok"
|
|
178
|
+
? `[workflow] sub-workflow '${event.workflow}' completed (${event.durationMs}ms)`
|
|
179
|
+
: `[workflow] sub-workflow '${event.workflow}' failed: ${event.reason ?? "unknown error"}`;
|
|
180
|
+
case "tool-called":
|
|
181
|
+
case "agent-text":
|
|
182
|
+
case "agent-text-delta":
|
|
183
|
+
case "tool-result":
|
|
184
|
+
case "rubric-start":
|
|
185
|
+
case "rubric-result":
|
|
186
|
+
case "model-usage":
|
|
187
|
+
// Accounting is not console output: the CLI renders its own usage footer
|
|
188
|
+
// from its own subscriber, so a line here would duplicate it.
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Default subscriber: renders events with the established console prefixes.
|
|
194
|
+
* Installed by the harness when the caller supplies no `onEvent` handler.
|
|
195
|
+
*/
|
|
196
|
+
export const consoleEventHandler = (event) => {
|
|
197
|
+
const line = renderEventLine(event);
|
|
198
|
+
if (line == null)
|
|
199
|
+
return;
|
|
200
|
+
if (event.level === "info")
|
|
201
|
+
console.log(line);
|
|
202
|
+
else
|
|
203
|
+
console.warn(line);
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ParsedFrontmatter {
|
|
2
|
+
/** Parsed YAML frontmatter block (whatever shape the caller expects). */
|
|
3
|
+
data: unknown;
|
|
4
|
+
/** Markdown content after the closing `---` delimiter. */
|
|
5
|
+
body: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parse a `---`-delimited YAML frontmatter block followed by a Markdown body,
|
|
9
|
+
* the convention shared by `SUBAGENT.md` and `WORKFLOW.md`. Returns `null` when
|
|
10
|
+
* the input has no frontmatter delimiters or the YAML block fails to parse.
|
|
11
|
+
*
|
|
12
|
+
* Delegates delimiter handling (CRLF/LF, trailing-newline, BOM) to gray-matter
|
|
13
|
+
* while parsing the YAML with the project's `yaml` engine.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseFrontmatter(raw: string): ParsedFrontmatter | null;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import matter from "gray-matter";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
/**
|
|
4
|
+
* gray-matter engine that reuses this project's `yaml` package (YAML 1.2)
|
|
5
|
+
* instead of gray-matter's bundled `js-yaml` (YAML 1.1), so frontmatter parses
|
|
6
|
+
* with the same semantics as the rest of the runtime. gray-matter hands the
|
|
7
|
+
* block over with CRLF line endings intact, and a trailing `\r` would otherwise
|
|
8
|
+
* end up inside parsed string values, so normalize before parsing.
|
|
9
|
+
*/
|
|
10
|
+
const YAML_ENGINE = {
|
|
11
|
+
yaml: (input) => (parseYaml(input.replace(/\r(?=\n|$)/g, "")) ?? {}),
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Parse a `---`-delimited YAML frontmatter block followed by a Markdown body,
|
|
15
|
+
* the convention shared by `SUBAGENT.md` and `WORKFLOW.md`. Returns `null` when
|
|
16
|
+
* the input has no frontmatter delimiters or the YAML block fails to parse.
|
|
17
|
+
*
|
|
18
|
+
* Delegates delimiter handling (CRLF/LF, trailing-newline, BOM) to gray-matter
|
|
19
|
+
* while parsing the YAML with the project's `yaml` engine.
|
|
20
|
+
*/
|
|
21
|
+
export function parseFrontmatter(raw) {
|
|
22
|
+
if (!matter.test(raw))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = matter(raw, { engines: YAML_ENGINE });
|
|
26
|
+
return { data: parsed.data, body: parsed.content };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/core/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC,KAAa,EAAU,EAAE,CAC9B,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAW;CAChE,CAAC;AASF;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The line-oriented listing filter both governed-capability redactions run on.
|
|
3
|
+
*
|
|
4
|
+
* The kernel refuses a path the state may not reach, which is enforcement — but
|
|
5
|
+
* a scoped tool asks about a *directory*, not a file: `ls skills/`, `glob
|
|
6
|
+
* catalogs/**\/*.csv`, and `grep` over the root all name a scope the state may
|
|
7
|
+
* legitimately reach and would hand back everything in it. Blocking those calls
|
|
8
|
+
* outright is the wrong trade (a state with one enabled capability could then
|
|
9
|
+
* not list it), so the result is filtered instead.
|
|
10
|
+
*
|
|
11
|
+
* This is the only place governance touches a tool **result** rather than a
|
|
12
|
+
* call, and it exists because invisibility is a requirement of governance in its
|
|
13
|
+
* own right: a name the model never sees is a capability it never tries.
|
|
14
|
+
*
|
|
15
|
+
* Filtering is line-oriented because the upstream filesystem tools render
|
|
16
|
+
* line-oriented text: `ls` one entry per line, `glob` one path per line, `grep`
|
|
17
|
+
* a `<path>:` header followed by indented ` <line>: <text>` matches. A header
|
|
18
|
+
* for a hidden owner therefore suppresses its continuation lines too —
|
|
19
|
+
* otherwise the matched *content* would survive its filename.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Drop from `text` every line about an owner `isHidden` refuses.
|
|
23
|
+
*
|
|
24
|
+
* `ownerOf` maps a result line's path to the governed thing that owns it (a
|
|
25
|
+
* skill slug, a mount name) or `null` when it owns none — a line no owner claims
|
|
26
|
+
* is always kept, since the state's other rules govern it.
|
|
27
|
+
*
|
|
28
|
+
* Returns the text unchanged when nothing was hidden, so a result the filter has
|
|
29
|
+
* no opinion about is passed through by identity rather than rebuilt.
|
|
30
|
+
*/
|
|
31
|
+
export declare function redactListing(text: string, ownerOf: (path: string) => string | null, isHidden: (owner: string) => boolean): string;
|
|
32
|
+
/**
|
|
33
|
+
* The scoped file tools whose results are filtered. `read_file` is absent on
|
|
34
|
+
* purpose: it names one path, which the kernel already refuses, and filtering a
|
|
35
|
+
* file's *contents* would hand the model a silently truncated document.
|
|
36
|
+
*/
|
|
37
|
+
export declare const REDACTED_TOOLS: ReadonlySet<string>;
|