@archmax-ai/harness 0.8.0 → 1.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.
Files changed (219) hide show
  1. package/README.md +58 -14
  2. package/dist/agent.d.ts +4 -4
  3. package/dist/agent.js +4 -4
  4. package/dist/assembly/compose.d.ts +5 -24
  5. package/dist/assembly/compose.js +40 -41
  6. package/dist/assembly/compose.js.map +1 -1
  7. package/dist/assembly/delegation-registry.js +3 -14
  8. package/dist/assembly/delegation-registry.js.map +1 -1
  9. package/dist/assembly/index.d.ts +18 -15
  10. package/dist/assembly/index.js +50 -32
  11. package/dist/assembly/index.js.map +1 -1
  12. package/dist/assembly/plain.js +1 -2
  13. package/dist/assembly/plain.js.map +1 -1
  14. package/dist/authoring-skill/archmax-harness/README.md +5 -5
  15. package/dist/authoring-skill/archmax-harness/SKILL.md +72 -30
  16. package/dist/authoring-skill/archmax-harness/references/backend-integration.md +35 -23
  17. package/dist/authoring-skill/archmax-harness/references/cases.md +44 -10
  18. package/dist/authoring-skill/archmax-harness/references/{hook-and-test-scripts.md → code-state-and-test-scripts.md} +617 -313
  19. package/dist/authoring-skill/archmax-harness/references/code-states-and-scripts.md +115 -0
  20. package/dist/authoring-skill/archmax-harness/references/diagnostics.md +40 -7
  21. package/dist/authoring-skill/archmax-harness/references/wiring.md +19 -10
  22. package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +416 -276
  23. package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +161 -62
  24. package/dist/cli/state-flow.d.ts +1 -1
  25. package/dist/cli/state-flow.js +18 -28
  26. package/dist/cli/state-flow.js.map +1 -1
  27. package/dist/cli/turn.d.ts +1 -1
  28. package/dist/cli/turn.js +2 -3
  29. package/dist/cli/turn.js.map +1 -1
  30. package/dist/core/clock.d.ts +26 -0
  31. package/dist/core/clock.js +64 -0
  32. package/dist/core/clock.js.map +1 -0
  33. package/dist/core/code-description.d.ts +3 -3
  34. package/dist/core/code-description.js +3 -3
  35. package/dist/core/deepagents.d.ts +5 -5
  36. package/dist/core/deepagents.js +4 -4
  37. package/dist/core/events.d.ts +23 -42
  38. package/dist/core/events.js +21 -24
  39. package/dist/core/events.js.map +1 -1
  40. package/dist/core/message-readers.d.ts +22 -2
  41. package/dist/core/message-readers.js +31 -0
  42. package/dist/core/message-readers.js.map +1 -1
  43. package/dist/core/messages.d.ts +1 -23
  44. package/dist/core/messages.js +2 -35
  45. package/dist/core/messages.js.map +1 -1
  46. package/dist/core/mounts.js +3 -3
  47. package/dist/core/platform-prompt.generated.js +1 -1
  48. package/dist/core/platform-prompt.generated.js.map +1 -1
  49. package/dist/core/session-zone.d.ts +1 -1
  50. package/dist/core/session-zone.js +1 -1
  51. package/dist/core/workspace-context.d.ts +1 -1
  52. package/dist/core/workspace.d.ts +1 -1
  53. package/dist/core/workspace.js +1 -1
  54. package/dist/core/zones.d.ts +4 -4
  55. package/dist/core/zones.js +5 -5
  56. package/dist/core/zones.js.map +1 -1
  57. package/dist/env.d.ts +9 -9
  58. package/dist/index.d.ts +3 -7
  59. package/dist/index.js +2 -4
  60. package/dist/index.js.map +1 -1
  61. package/dist/kernel/kernel.d.ts +31 -61
  62. package/dist/kernel/kernel.js +57 -114
  63. package/dist/kernel/kernel.js.map +1 -1
  64. package/dist/machine/allow.d.ts +17 -2
  65. package/dist/machine/allow.js +16 -6
  66. package/dist/machine/allow.js.map +1 -1
  67. package/dist/machine/lint-spec.js +68 -12
  68. package/dist/machine/lint-spec.js.map +1 -1
  69. package/dist/machine/machine.d.ts +39 -16
  70. package/dist/machine/machine.js +72 -49
  71. package/dist/machine/machine.js.map +1 -1
  72. package/dist/machine/spec-schema.d.ts +34 -179
  73. package/dist/machine/spec-schema.js +93 -106
  74. package/dist/machine/spec-schema.js.map +1 -1
  75. package/dist/machine/tool-names.d.ts +34 -10
  76. package/dist/machine/tool-names.js +41 -10
  77. package/dist/machine/tool-names.js.map +1 -1
  78. package/dist/machine/tool-paths.d.ts +6 -0
  79. package/dist/machine/tool-paths.js +10 -0
  80. package/dist/machine/tool-paths.js.map +1 -1
  81. package/dist/machine/types.d.ts +14 -38
  82. package/dist/machine/types.js.map +1 -1
  83. package/dist/machine/validate-spec.d.ts +1 -1
  84. package/dist/machine/variables.d.ts +2 -0
  85. package/dist/machine/variables.js.map +1 -1
  86. package/dist/public/sandbox.d.ts +62 -66
  87. package/dist/public/sandbox.js +22 -23
  88. package/dist/public/sandbox.js.map +1 -1
  89. package/dist/public/spec.d.ts +12 -19
  90. package/dist/public/spec.js +11 -19
  91. package/dist/public/spec.js.map +1 -1
  92. package/dist/runtime/contract.d.ts +11 -12
  93. package/dist/runtime/contract.js +16 -16
  94. package/dist/runtime/contract.js.map +1 -1
  95. package/dist/sandbox/assets/parts/code-state.js +17 -0
  96. package/dist/sandbox/executor.d.ts +25 -7
  97. package/dist/sandbox/executor.js +56 -47
  98. package/dist/sandbox/executor.js.map +1 -1
  99. package/dist/sandbox/imports.d.ts +10 -10
  100. package/dist/sandbox/imports.js +11 -11
  101. package/dist/sandbox/imports.js.map +1 -1
  102. package/dist/sandbox/prelude.d.ts +5 -6
  103. package/dist/sandbox/prelude.js +38 -35
  104. package/dist/sandbox/prelude.js.map +1 -1
  105. package/dist/sandbox/ptc-gateway.d.ts +19 -18
  106. package/dist/sandbox/ptc-gateway.js +26 -22
  107. package/dist/sandbox/ptc-gateway.js.map +1 -1
  108. package/dist/sessions/operations.js +4 -5
  109. package/dist/sessions/operations.js.map +1 -1
  110. package/dist/sessions/resume.d.ts +12 -7
  111. package/dist/sessions/resume.js +12 -9
  112. package/dist/sessions/resume.js.map +1 -1
  113. package/dist/sessions/summary.d.ts +1 -1
  114. package/dist/testing/assertions.js +9 -4
  115. package/dist/testing/assertions.js.map +1 -1
  116. package/dist/testing/case-document.d.ts +2 -0
  117. package/dist/testing/case-document.js.map +1 -1
  118. package/dist/testing/case-schema.d.ts +1 -1
  119. package/dist/testing/case-schema.js +17 -1
  120. package/dist/testing/case-schema.js.map +1 -1
  121. package/dist/testing/driver.d.ts +4 -0
  122. package/dist/testing/driver.js +22 -3
  123. package/dist/testing/driver.js.map +1 -1
  124. package/dist/testing/grade.js +3 -3
  125. package/dist/testing/grade.js.map +1 -1
  126. package/dist/testing/interpreter.d.ts +2 -2
  127. package/dist/testing/interpreter.js +1 -0
  128. package/dist/testing/interpreter.js.map +1 -1
  129. package/dist/testing/runner.d.ts +2 -2
  130. package/dist/validate/validate.d.ts +1 -1
  131. package/dist/validate/validate.js +39 -70
  132. package/dist/validate/validate.js.map +1 -1
  133. package/dist/workflow/automated-controls.d.ts +63 -0
  134. package/dist/workflow/automated-controls.js +158 -0
  135. package/dist/workflow/automated-controls.js.map +1 -0
  136. package/dist/workflow/automated.d.ts +112 -0
  137. package/dist/workflow/automated.js +163 -0
  138. package/dist/workflow/automated.js.map +1 -0
  139. package/dist/workflow/checkpointer.d.ts +7 -0
  140. package/dist/workflow/checkpointer.js +28 -0
  141. package/dist/workflow/checkpointer.js.map +1 -1
  142. package/dist/workflow/code-state.d.ts +46 -0
  143. package/dist/workflow/code-state.js +26 -0
  144. package/dist/workflow/code-state.js.map +1 -0
  145. package/dist/workflow/control-tools.d.ts +54 -23
  146. package/dist/workflow/control-tools.js +121 -77
  147. package/dist/workflow/control-tools.js.map +1 -1
  148. package/dist/workflow/file-values.d.ts +4 -4
  149. package/dist/workflow/file-values.js +1 -1
  150. package/dist/workflow/file-values.js.map +1 -1
  151. package/dist/workflow/governance.d.ts +13 -22
  152. package/dist/workflow/governance.js +51 -87
  153. package/dist/workflow/governance.js.map +1 -1
  154. package/dist/workflow/grader-state.d.ts +55 -0
  155. package/dist/workflow/grader-state.js +182 -0
  156. package/dist/workflow/grader-state.js.map +1 -0
  157. package/dist/workflow/history.d.ts +11 -0
  158. package/dist/workflow/history.js +64 -0
  159. package/dist/workflow/history.js.map +1 -0
  160. package/dist/workflow/middleware.d.ts +14 -17
  161. package/dist/workflow/middleware.js +106 -74
  162. package/dist/workflow/middleware.js.map +1 -1
  163. package/dist/workflow/move-events.d.ts +21 -0
  164. package/dist/workflow/move-events.js +20 -0
  165. package/dist/workflow/move-events.js.map +1 -0
  166. package/dist/workflow/parks.d.ts +9 -2
  167. package/dist/workflow/parks.js +16 -8
  168. package/dist/workflow/parks.js.map +1 -1
  169. package/dist/workflow/paths.d.ts +9 -9
  170. package/dist/workflow/paths.js +19 -19
  171. package/dist/workflow/paths.js.map +1 -1
  172. package/dist/workflow/render-prompt.d.ts +7 -5
  173. package/dist/workflow/render-prompt.js +22 -37
  174. package/dist/workflow/render-prompt.js.map +1 -1
  175. package/dist/workflow/signature-checks.d.ts +2 -2
  176. package/dist/workflow/snapshot.js +5 -29
  177. package/dist/workflow/snapshot.js.map +1 -1
  178. package/dist/workflow/state.d.ts +19 -6
  179. package/dist/workflow/state.js +24 -8
  180. package/dist/workflow/state.js.map +1 -1
  181. package/dist/workflow/sub-workflow.d.ts +3 -3
  182. package/dist/workflow/tool-service.d.ts +1 -9
  183. package/dist/workflow/tool-service.js +21 -24
  184. package/dist/workflow/tool-service.js.map +1 -1
  185. package/dist/workflow/turn-boundary.d.ts +2 -2
  186. package/dist/workflow/turn-boundary.js +10 -7
  187. package/dist/workflow/turn-boundary.js.map +1 -1
  188. package/dist/workflow/turn-runner.js +30 -2
  189. package/dist/workflow/turn-runner.js.map +1 -1
  190. package/package.json +1 -1
  191. package/skills/archmax-harness/README.md +5 -5
  192. package/skills/archmax-harness/SKILL.md +72 -30
  193. package/skills/archmax-harness/references/backend-integration.md +35 -23
  194. package/skills/archmax-harness/references/cases.md +44 -10
  195. package/skills/archmax-harness/references/{hook-and-test-scripts.md → code-state-and-test-scripts.md} +617 -313
  196. package/skills/archmax-harness/references/code-states-and-scripts.md +115 -0
  197. package/skills/archmax-harness/references/diagnostics.md +40 -7
  198. package/skills/archmax-harness/references/wiring.md +19 -10
  199. package/skills/archmax-harness/references/workflow-schema.md +416 -276
  200. package/skills/archmax-harness/references/workflow-yaml.md +161 -62
  201. package/dist/authoring-skill/archmax-harness/references/hooks-and-scripts.md +0 -88
  202. package/dist/lifecycle/hook-shape.d.ts +0 -44
  203. package/dist/lifecycle/hook-shape.js +0 -66
  204. package/dist/lifecycle/hook-shape.js.map +0 -1
  205. package/dist/lifecycle/runner.d.ts +0 -183
  206. package/dist/lifecycle/runner.js +0 -373
  207. package/dist/lifecycle/runner.js.map +0 -1
  208. package/dist/lifecycle/transcript.d.ts +0 -27
  209. package/dist/lifecycle/transcript.js +0 -43
  210. package/dist/lifecycle/transcript.js.map +0 -1
  211. package/dist/rubrics/rubrics.d.ts +0 -135
  212. package/dist/rubrics/rubrics.js +0 -145
  213. package/dist/rubrics/rubrics.js.map +0 -1
  214. package/dist/sandbox/assets/parts/core.js +0 -22
  215. package/dist/sandbox/assets/parts/lifecycle-hook.js +0 -47
  216. package/dist/sandbox/bridge.d.ts +0 -16
  217. package/dist/sandbox/bridge.js +0 -95
  218. package/dist/sandbox/bridge.js.map +0 -1
  219. package/skills/archmax-harness/references/hooks-and-scripts.md +0 -88
@@ -49,4 +49,11 @@ export declare class BackendCheckpointSaver extends MemorySaver {
49
49
  * removal is the session store's job. Named `deleteThread` because LangGraph owns the word.
50
50
  */
51
51
  deleteThread(sessionId: string): Promise<void>;
52
+ /**
53
+ * Drop a session and every child session under it from memory, leaving their
54
+ * record files in the store: unlike {@link deleteThread} nothing is marked, so
55
+ * the next access replays them as after a restart. Synchronous, because
56
+ * `dispose` is.
57
+ */
58
+ evict(sessionId: string): void;
52
59
  }
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { MemorySaver, WRITES_IDX_MAP, } from "@langchain/langgraph-checkpoint";
3
3
  import { isReservedRootName } from "../core/zones.js";
4
+ import { isChildSessionOf } from "../sessions/scope.js";
4
5
  import { sessionPaths } from "./paths.js";
5
6
  const enc = (bytes) => Buffer.from(bytes).toString("base64");
6
7
  const dec = (b64) => new Uint8Array(Buffer.from(b64, "base64"));
@@ -124,6 +125,14 @@ export class BackendCheckpointSaver extends MemorySaver {
124
125
  const sessionId = config.configurable?.thread_id;
125
126
  if (sessionId !== undefined)
126
127
  await this.ensureLoaded(sessionId);
128
+ // `MemorySaver.put` creates the namespace before it stores the checkpoint, across an
129
+ // await; read in that window, the parent takes the newest of no checkpoints and throws.
130
+ if (sessionId !== undefined && config.configurable?.checkpoint_id === undefined) {
131
+ const ns = config.configurable?.checkpoint_ns ?? "";
132
+ const held = this.storage[sessionId]?.[ns];
133
+ if (held !== undefined && Object.keys(held).length === 0)
134
+ return undefined;
135
+ }
127
136
  return super.getTuple(config);
128
137
  }
129
138
  async *list(config, options) {
@@ -196,5 +205,24 @@ export class BackendCheckpointSaver extends MemorySaver {
196
205
  // Marked as replayed (with nothing to replay) so a later access does not resurrect the files.
197
206
  this.loading.set(sessionId, Promise.resolve());
198
207
  }
208
+ /**
209
+ * Drop a session and every child session under it from memory, leaving their
210
+ * record files in the store: unlike {@link deleteThread} nothing is marked, so
211
+ * the next access replays them as after a restart. Synchronous, because
212
+ * `dispose` is.
213
+ */
214
+ evict(sessionId) {
215
+ const covered = (id) => id === sessionId || isChildSessionOf(id, sessionId);
216
+ for (const id of Object.keys(this.storage))
217
+ if (covered(id))
218
+ delete this.storage[id];
219
+ for (const key of Object.keys(this.writes)) {
220
+ if (covered(String(JSON.parse(key)[0])))
221
+ delete this.writes[key];
222
+ }
223
+ for (const id of [...this.loading.keys()])
224
+ if (covered(id))
225
+ this.loading.delete(id);
226
+ }
199
227
  }
200
228
  //# sourceMappingURL=checkpointer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkpointer.js","sourceRoot":"","sources":["../../src/workflow/checkpointer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkpointer.js","sourceRoot":"","sources":["../../src/workflow/checkpointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A code state's run: its `script`, read from the authoring backend, evaluated
3
+ * in the sandbox with its state's input and its state's tools — nothing else.
4
+ *
5
+ * The run decides nothing here: the script moves the session through
6
+ * `tools.archmax_advance` or ends it through `tools.archmax_raise`, which the
7
+ * step recorder holds, and the orchestrator (`automated.ts`) reads the outcome
8
+ * from that record and from whether the script finished cleanly.
9
+ */
10
+ import type { StructuredTool } from "@langchain/core/tools";
11
+ import type { WorkflowEventEmitter } from "../core/events.js";
12
+ import type { ScriptExecutor } from "../sandbox/executor.js";
13
+ /** Resolves a code state's declared `script` to its authoring-backend path, or refuses it with a reason. */
14
+ export type CodeScriptResolver = (declared: string) => {
15
+ ok: true;
16
+ path: string;
17
+ } | {
18
+ ok: false;
19
+ reason: string;
20
+ };
21
+ export interface CodeStateRun {
22
+ emit: WorkflowEventEmitter;
23
+ /** The executor reading sources from the authoring backend. */
24
+ executor: ScriptExecutor;
25
+ resolveScript: CodeScriptResolver;
26
+ sessionId: string;
27
+ state: string;
28
+ /** The state's declared `script`. */
29
+ script: string;
30
+ /** The script's input: `{ state, trigger?, variables }`. */
31
+ input: Record<string, unknown>;
32
+ /** The code state's tools, governed. */
33
+ tools: StructuredTool[];
34
+ /** The names those tools are listed and reached by. */
35
+ surface: readonly string[];
36
+ signal?: AbortSignal;
37
+ }
38
+ /**
39
+ * Run a code state's script. Settles with the error that stopped it, if one did
40
+ * — a script that cannot be placed or read, a foreign import, a throw, a
41
+ * timeout, a cancelled turn — and with nothing when it ran to its end. Each
42
+ * console line is reported as it was logged.
43
+ */
44
+ export declare function runCodeState(run: CodeStateRun): Promise<{
45
+ error?: string;
46
+ }>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Run a code state's script. Settles with the error that stopped it, if one did
3
+ * — a script that cannot be placed or read, a foreign import, a throw, a
4
+ * timeout, a cancelled turn — and with nothing when it ran to its end. Each
5
+ * console line is reported as it was logged.
6
+ */
7
+ export async function runCodeState(run) {
8
+ const resolved = run.resolveScript(run.script);
9
+ if (!resolved.ok)
10
+ return { error: resolved.reason };
11
+ const outcome = await run.executor.runCodeState(resolved.path, {
12
+ sessionId: run.sessionId,
13
+ args: run.input,
14
+ tools: run.tools,
15
+ surface: run.surface,
16
+ ...(run.signal ? { signal: run.signal } : {}),
17
+ });
18
+ for (const line of outcome.logs) {
19
+ if (line.trim())
20
+ run.emit({ type: "code-output", state: run.state, line: line.trimEnd() });
21
+ }
22
+ if (outcome.ok)
23
+ return {};
24
+ return { error: outcome.error?.message ?? "the script failed" };
25
+ }
26
+ //# sourceMappingURL=code-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-state.js","sourceRoot":"","sources":["../../src/workflow/code-state.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAiB;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC7D,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,IAAI,EAAE,GAAG,CAAC,KAAK;QACf,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,mBAAmB,EAAE,CAAC;AAClE,CAAC"}
@@ -1,23 +1,25 @@
1
1
  /**
2
2
  * The control tools: `archmax_advance`, `archmax_wait`, `archmax_reset`,
3
- * `archmax_raise`, `archmax_get_variables`, `archmax_set_variables`.
3
+ * `archmax_raise`, `archmax_get_variables`, `archmax_set_variables` — and
4
+ * `archmax_get_history`, which only a grader state is offered.
4
5
  *
5
6
  * Each is a declaration whose body never runs in a wired assembly: governance
6
- * intercepts the call in `wrapToolCall`, where checkpointed state is in hand, and
7
- * services it with the handler here. A handler returns the tool message the
8
- * model reads and, when the call changed the run, the `Command` committing it.
7
+ * intercepts the session's agent's call in `wrapToolCall`, where checkpointed
8
+ * state is in hand, and services it with the handler here. A handler returns the
9
+ * tool message the model reads and, when the call changed the run, the `Command`
10
+ * committing it. An automated state's controls (`automated-controls.ts`) reuse
11
+ * the same schemas, handlers and {@link transitionUpdate}.
9
12
  */
10
13
  import { ToolMessage } from "@langchain/core/messages";
11
14
  import type { StructuredTool } from "@langchain/core/tools";
12
15
  import { Command } from "@langchain/langgraph";
13
16
  import { z } from "zod";
14
17
  import { type MountPrefixes } from "../core/zones.js";
15
- import type { LifecycleContext, LifecycleRunner } from "../lifecycle/runner.js";
16
18
  import type { WorkflowMachine } from "../machine/machine.js";
17
19
  import { ADVANCE_TOOL, GET_VARIABLES_TOOL, RAISE_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL } from "../machine/tool-names.js";
18
20
  import { type UnresolvedGlob, type VariableStore } from "../machine/variables.js";
19
21
  import { type FileValueCheck } from "./signature-checks.js";
20
- import { type PendingDecision, type PendingInput, type RaiseRecord, type WorkflowStateFields } from "./state.js";
22
+ import { type MoveKind, type PendingDecision, type PendingInput, type RaiseRecord, type WorkflowStateFields, type WorkflowUpdate } from "./state.js";
21
23
  export { ADVANCE_TOOL, GET_VARIABLES_TOOL, RAISE_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL };
22
24
  /** The one refusal shape: an error-status tool message, so the model self-corrects and a view classifies it. */
23
25
  export declare function refusal(name: string, toolCallId: string, text: string): ToolMessage;
@@ -71,36 +73,66 @@ export declare const setVariablesSchema: z.ZodObject<{
71
73
  export declare function createControlTools(opts?: {
72
74
  child?: boolean;
73
75
  }): StructuredTool[];
76
+ /** One move along a declared edge, as a trail step and a park will record it. */
77
+ export interface Move {
78
+ to: string;
79
+ /** Who moved the session: its agent, a grader state or a code state. */
80
+ kind: MoveKind;
81
+ reason: string;
82
+ /** Attached evidence paths, already validated; only into a human state. */
83
+ evidence?: readonly string[];
84
+ }
85
+ /**
86
+ * The update a move commits — the target position, the trail step, a cleared
87
+ * rejection marker and a fresh turn budget — plus, into a human state, the park
88
+ * record opened in its closing phase. The one derivation every mover shares: the
89
+ * session's agent through {@link handleAdvance}, and an automated state's run.
90
+ * Messages are the caller's (a tool reply, a runtime note).
91
+ */
92
+ export declare function transitionUpdate(machine: WorkflowMachine, state: unknown, move: Move): {
93
+ update: WorkflowUpdate;
94
+ park?: PendingDecision;
95
+ };
96
+ /**
97
+ * Why `from` may not be left for `to` right now, or `undefined` when it may: the
98
+ * kernel's transition verdict — the state's `requires` against `variables`, then
99
+ * the declared edge. Every refusal is recoverable: the mover sets what is owed,
100
+ * or picks a valid target.
101
+ */
102
+ export declare function transitionRefusal(machine: WorkflowMachine, from: string, to: string, variables: VariableStore): string | undefined;
103
+ /**
104
+ * Evidence an advance attaches, validated for the target: accepted only into a
105
+ * human state, and only paths the session itself could read.
106
+ */
107
+ export declare function advanceEvidence(machine: WorkflowMachine, to: string, attached: readonly string[], mounts?: MountPrefixes): EvidenceValidation;
74
108
  export interface AdvanceRequest {
75
109
  /** Tool call id, echoed on the resulting ToolMessage. */
76
110
  toolCallId: string;
77
- /** The id this call is reported under on the event stream (the provider's, else the generated fallback). */
78
- callId?: string;
79
111
  args: Record<string, unknown>;
80
112
  /** Checkpointed agent state at the time of the call. */
81
113
  state: unknown;
82
- /** Lifecycle context; its `iterations` are seeded from state and committed back. */
83
- ctx: LifecycleContext;
84
114
  }
85
115
  export interface AdvanceOutcome {
86
116
  message: Command | ToolMessage;
87
117
  moved?: {
88
118
  from: string;
89
119
  to: string;
120
+ reason: string;
90
121
  /** The decision record committed when `to` is a human state. */
91
122
  park?: PendingDecision;
92
123
  };
93
124
  }
94
125
  /**
95
- * Attempt a transition and commit the outcome: `workflowState` and the `agent`
96
- * trail step on success, `iterations` always, and — into a human state —
97
- * the pending-decision record with the park opened in its closing phase.
126
+ * Service the session's agent's `archmax_advance`: validate the arguments, the
127
+ * evidence and the transition, then commit {@link transitionUpdate} with the
128
+ * reply the agent reads. A refusal leaves the session exactly where it was — no
129
+ * trail step — and replies without erroring the message, so the agent corrects
130
+ * the call rather than reading a failed run.
98
131
  */
99
132
  export declare function handleAdvance(opts: {
100
133
  machine: WorkflowMachine;
101
- lifecycle: LifecycleRunner;
102
134
  mountPrefixes?: MountPrefixes;
103
- }, request: AdvanceRequest): Promise<AdvanceOutcome>;
135
+ }, request: AdvanceRequest): AdvanceOutcome;
104
136
  /** The accepted `until` forms, quoted verbatim in every rejection. */
105
137
  export declare const WAIT_UNTIL_FORMS: string;
106
138
  export type WaitUntilResult = {
@@ -150,9 +182,9 @@ export interface ResetOutcome {
150
182
  };
151
183
  }
152
184
  /**
153
- * Service a reset: move back to the entry state and clear what gates progress
154
- * (correction budgets, `beforeDone`). Evidence — messages, files, variables, the
155
- * trail — is left alone: a reset moves the machine, not the history.
185
+ * Service a reset: move back to the entry state. Evidence — messages, files,
186
+ * variables, the trail — is left alone: a reset moves the machine, not the
187
+ * history.
156
188
  */
157
189
  export declare function handleReset(machine: WorkflowMachine, request: ResetRequest): ResetOutcome;
158
190
  export interface RaiseRequest {
@@ -170,9 +202,9 @@ export interface RaiseOutcome {
170
202
  * Service a raise: end the session as a failure in the state it was called in.
171
203
  * Commits the record and `status: failed`, and drops a pending rejection — the
172
204
  * agent's own account of the failure is what the session ends with. The turn
173
- * ends at the next model hook; nothing routes and no hook runs. Refused, with the
174
- * session left in place, for invalid arguments or a message making other calls:
175
- * those run concurrently, so a raise beside them could not mean one thing.
205
+ * ends at the next model hook; nothing routes and nothing further runs. Refused,
206
+ * with the session left in place, for invalid arguments or a message making other
207
+ * calls: those run concurrently, so a raise beside them could not mean one thing.
176
208
  */
177
209
  export declare function handleRaise(machine: WorkflowMachine, request: RaiseRequest): RaiseOutcome;
178
210
  export interface VariableToolRequest {
@@ -209,8 +241,7 @@ fileRefusal?: string): SetVariablesOutcome;
209
241
  export declare function fileReturnsRefusal(machine: WorkflowMachine, state: unknown, args: Record<string, unknown>, check: FileValueCheck): Promise<string | undefined>;
210
242
  /** Wrap an `archmax_set_variables` outcome as the update that commits its delta. */
211
243
  export declare function setVariablesCommand(outcome: SetVariablesOutcome): Command | ToolMessage;
212
- /** The variables a state still owes before it may be left — its `requires` minus what is set. */
213
- export declare function unmetRequirements(required: string[], store: VariableStore): string[];
244
+ export { unmetRequirements } from "../kernel/kernel.js";
214
245
  /**
215
246
  * The wording for a `${{…}}` reference in the agent's own tool arguments that
216
247
  * could not be resolved: a correctable refusal carrying the two fixes it might
@@ -1,11 +1,14 @@
1
1
  /**
2
2
  * The control tools: `archmax_advance`, `archmax_wait`, `archmax_reset`,
3
- * `archmax_raise`, `archmax_get_variables`, `archmax_set_variables`.
3
+ * `archmax_raise`, `archmax_get_variables`, `archmax_set_variables` — and
4
+ * `archmax_get_history`, which only a grader state is offered.
4
5
  *
5
6
  * Each is a declaration whose body never runs in a wired assembly: governance
6
- * intercepts the call in `wrapToolCall`, where checkpointed state is in hand, and
7
- * services it with the handler here. A handler returns the tool message the
8
- * model reads and, when the call changed the run, the `Command` committing it.
7
+ * intercepts the session's agent's call in `wrapToolCall`, where checkpointed
8
+ * state is in hand, and services it with the handler here. A handler returns the
9
+ * tool message the model reads and, when the call changed the run, the `Command`
10
+ * committing it. An automated state's controls (`automated-controls.ts`) reuse
11
+ * the same schemas, handlers and {@link transitionUpdate}.
9
12
  */
10
13
  import { ToolMessage } from "@langchain/core/messages";
11
14
  import { Command } from "@langchain/langgraph";
@@ -14,6 +17,7 @@ import { z } from "zod";
14
17
  import { spokeSinceLastHumanMessage } from "../core/messages.js";
15
18
  import { canonicalizeRelPath } from "../core/workspace.js";
16
19
  import { classifyWorkspacePath, NO_MOUNTS, } from "../core/zones.js";
20
+ import { decide } from "../kernel/kernel.js";
17
21
  import { signatureValueIssues } from "../machine/signature.js";
18
22
  import { ADVANCE_TOOL, GET_VARIABLES_TOOL, RAISE_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL, } from "../machine/tool-names.js";
19
23
  import { normalizeTitle, resolvePath, TITLE_VARIABLE, titleWriteError, VARIABLE_NAME_PATTERN, } from "../machine/variables.js";
@@ -157,8 +161,7 @@ export function createControlTools(opts = {}) {
157
161
  return [
158
162
  declaration(ADVANCE_TOOL, "Advance the workflow to the next state. Pick `to` from the current state's " +
159
163
  "transitions in the graph section above (a slug, never a title). The runtime " +
160
- "validates the edge, runs this state's `after` hook, then unlocks the next " +
161
- "state's tools.", advanceSchema),
164
+ "validates the edge, then unlocks the next state's tools.", advanceSchema),
162
165
  declaration(RESET_TOOL, "Start the workflow over from the state the conversation began in, keeping the " +
163
166
  "conversation and any work already written. Use it when this state cannot serve " +
164
167
  "what was asked: a wrong branch, a path no transition from here reaches, or a " +
@@ -190,77 +193,102 @@ export function createControlTools(opts = {}) {
190
193
  ];
191
194
  }
192
195
  /**
193
- * Attempt a transition and commit the outcome: `workflowState` and the `agent`
194
- * trail step on success, `iterations` always, and — into a human state —
195
- * the pending-decision record with the park opened in its closing phase.
196
+ * The update a move commits — the target position, the trail step, a cleared
197
+ * rejection marker and a fresh turn budget — plus, into a human state, the park
198
+ * record opened in its closing phase. The one derivation every mover shares: the
199
+ * session's agent through {@link handleAdvance}, and an automated state's run.
200
+ * Messages are the caller's (a tool reply, a runtime note).
196
201
  */
197
- export async function handleAdvance(opts, request) {
198
- const refuse = (text) => ({ message: refusal(ADVANCE_TOOL, request.toolCallId, text) });
199
- const parsed = advanceSchema.safeParse(request.args);
200
- if (!parsed.success) {
201
- return refuse(`${ADVANCE_TOOL} rejected: invalid arguments — ${schemaIssues(parsed.error)}`);
202
- }
203
- // Evidence is settled before the transition is attempted, so a refused
204
- // attachment leaves the run exactly where it was: no hook run, no trail step.
205
- const attached = parsed.data.evidence ?? [];
206
- let evidence = [];
207
- if (attached.length > 0) {
208
- if (!opts.machine.isHumanState(parsed.data.to)) {
209
- return refuse(`${ADVANCE_TOOL} rejected: evidence can only be attached when advancing into a human ` +
210
- `decision state, and '${parsed.data.to}' is not one — nothing would present it. ` +
211
- `Call again without 'evidence'.`);
212
- }
213
- const validated = validateAdvanceEvidence(attached, opts.mountPrefixes);
214
- if (!validated.ok)
215
- return refuse(`${ADVANCE_TOOL} rejected: ${validated.reason}`);
216
- evidence = validated.paths;
217
- }
218
- const from = currentWorkflowState(request.state, opts.machine.entry);
219
- const result = await opts.lifecycle.attemptTransition(from, parsed.data.to, request.ctx, parsed.data.reason, request.callId ? { callId: request.callId } : undefined);
220
- if (!result.ok) {
221
- // A terminal rejection is committed as `rejected` so the run routes through
222
- // `on_error`; a recoverable one keeps the agent in place, replying without
223
- // erroring the message so it retries rather than reading a failed run.
224
- return {
225
- message: commit({
226
- iterations: { ...result.corrections },
227
- ...(result.terminal ? { rejected: result.reason } : {}),
228
- messages: [toolReply(ADVANCE_TOOL, request.toolCallId, `${ADVANCE_TOOL} rejected: ${result.reason}`)],
229
- }),
230
- };
231
- }
232
- const fields = readWorkflowState(request.state);
233
- const step = { to: result.to, kind: "agent", reason: parsed.data.reason, ts: Date.now() };
234
- const moved = {
235
- workflowState: result.to,
236
- iterations: { ...result.corrections },
237
- // The gate ran the target's `before` hook: recorded as done for this visit,
238
- // so the target's first model call does not run it a second time.
239
- beforeDone: { ...(fields.beforeDone ?? {}), [result.to]: true },
202
+ export function transitionUpdate(machine, state, move) {
203
+ const fields = readWorkflowState(state);
204
+ const step = { to: move.to, kind: move.kind, reason: move.reason, ts: Date.now() };
205
+ const update = {
206
+ workflowState: move.to,
240
207
  // A successful transition clears an earlier rejection marker and starts the target's turn budget afresh.
241
208
  ...NO_PENDING_FAILURE,
242
209
  stateTurns: null,
243
210
  auditTrail: [step],
244
- messages: [
245
- toolReply(ADVANCE_TOOL, request.toolCallId, `Advanced to state '${result.to}'. You may now use the tools allowed in this state.`),
246
- ],
247
211
  };
248
- if (!opts.machine.isHumanState(result.to)) {
249
- return { message: commit(moved), moved: { from, to: result.to } };
250
- }
212
+ if (!machine.isHumanState(move.to))
213
+ return { update };
251
214
  // Into a human state: the park record is committed with the transition, so a
252
215
  // process that dies before the closing turn still sees a parked session.
253
216
  const seq = (fields.decisionCount ?? 0) + 1;
254
- const park = decisionRecordFor(opts.machine, result.to, seq, evidence);
217
+ const park = decisionRecordFor(machine, move.to, seq, move.evidence ?? []);
255
218
  return {
256
- message: commit({
257
- ...moved,
219
+ update: {
220
+ ...update,
258
221
  pendingDecision: park,
259
222
  decisionCount: seq,
260
223
  status: WORKFLOW_STATUSES.awaitingDecision,
261
224
  parkPhase: "closing",
225
+ },
226
+ park,
227
+ };
228
+ }
229
+ /**
230
+ * Why `from` may not be left for `to` right now, or `undefined` when it may: the
231
+ * kernel's transition verdict — the state's `requires` against `variables`, then
232
+ * the declared edge. Every refusal is recoverable: the mover sets what is owed,
233
+ * or picks a valid target.
234
+ */
235
+ export function transitionRefusal(machine, from, to, variables) {
236
+ const verdict = decide(machine, { kind: "transition", from, to }, [], undefined, variables);
237
+ return verdict.decision === "block" ? (verdict.reason ?? `cannot advance from '${from}' to '${to}'.`) : undefined;
238
+ }
239
+ /**
240
+ * Evidence an advance attaches, validated for the target: accepted only into a
241
+ * human state, and only paths the session itself could read.
242
+ */
243
+ export function advanceEvidence(machine, to, attached, mounts = NO_MOUNTS) {
244
+ if (attached.length === 0)
245
+ return { ok: true, paths: [] };
246
+ if (!machine.isHumanState(to)) {
247
+ return {
248
+ ok: false,
249
+ reason: `evidence can only be attached when advancing into a human decision state, and '${to}' ` +
250
+ `is not one — nothing would present it. Call again without 'evidence'.`,
251
+ };
252
+ }
253
+ return validateAdvanceEvidence(attached, mounts);
254
+ }
255
+ /**
256
+ * Service the session's agent's `archmax_advance`: validate the arguments, the
257
+ * evidence and the transition, then commit {@link transitionUpdate} with the
258
+ * reply the agent reads. A refusal leaves the session exactly where it was — no
259
+ * trail step — and replies without erroring the message, so the agent corrects
260
+ * the call rather than reading a failed run.
261
+ */
262
+ export function handleAdvance(opts, request) {
263
+ const reply = (text) => toolReply(ADVANCE_TOOL, request.toolCallId, text);
264
+ const parsed = advanceSchema.safeParse(request.args);
265
+ if (!parsed.success) {
266
+ return {
267
+ message: refusal(ADVANCE_TOOL, request.toolCallId, `${ADVANCE_TOOL} rejected: invalid arguments — ${schemaIssues(parsed.error)}`),
268
+ };
269
+ }
270
+ const { to, reason } = parsed.data;
271
+ // Evidence is settled before the transition is attempted, so a refused
272
+ // attachment leaves the run exactly where it was.
273
+ const evidence = advanceEvidence(opts.machine, to, parsed.data.evidence ?? [], opts.mountPrefixes);
274
+ if (!evidence.ok)
275
+ return { message: refusal(ADVANCE_TOOL, request.toolCallId, `${ADVANCE_TOOL} rejected: ${evidence.reason}`) };
276
+ const from = currentWorkflowState(request.state, opts.machine.entry);
277
+ const refused = transitionRefusal(opts.machine, from, to, readVariables(request.state));
278
+ if (refused)
279
+ return { message: reply(`${ADVANCE_TOOL} rejected: ${refused}`) };
280
+ const { update, park } = transitionUpdate(opts.machine, request.state, {
281
+ to,
282
+ kind: "agent",
283
+ reason,
284
+ evidence: evidence.paths,
285
+ });
286
+ return {
287
+ message: commit({
288
+ ...update,
289
+ messages: [reply(`Advanced to state '${to}'. You may now use the tools allowed in this state.`)],
262
290
  }),
263
- moved: { from, to: result.to, park },
291
+ moved: { from, to, reason, ...(park ? { park } : {}) },
264
292
  };
265
293
  }
266
294
  // --- archmax_wait ----------------------------------------------------------------
@@ -364,9 +392,9 @@ export function entryStateOf(state, machine) {
364
392
  return (triggerId ? machine.startStateForTrigger(triggerId) : undefined) ?? machine.entry;
365
393
  }
366
394
  /**
367
- * Service a reset: move back to the entry state and clear what gates progress
368
- * (correction budgets, `beforeDone`). Evidence — messages, files, variables, the
369
- * trail — is left alone: a reset moves the machine, not the history.
395
+ * Service a reset: move back to the entry state. Evidence — messages, files,
396
+ * variables, the trail — is left alone: a reset moves the machine, not the
397
+ * history.
370
398
  */
371
399
  export function handleReset(machine, request) {
372
400
  const parsed = resetSchema.safeParse(request.args);
@@ -377,17 +405,26 @@ export function handleReset(machine, request) {
377
405
  }
378
406
  const from = currentWorkflowState(request.state, machine.entry);
379
407
  const entry = entryStateOf(readWorkflowState(request.state), machine);
408
+ // The locks this run set are released, each value kept; the host's stay. A
409
+ // boundary write is the only one the merge accepts over a lock.
410
+ const released = Object.entries(readVariables(request.state)).filter(([, held]) => held.locked && held.lockedBy === "agent");
380
411
  return {
381
412
  message: commit({
382
413
  workflowState: entry,
383
- iterations: {},
384
- beforeDone: {},
385
414
  ...NO_PENDING_FAILURE,
386
415
  stateTurns: null,
387
416
  auditTrail: [{ to: entry, kind: "reset", reason: parsed.data.reason, ts: Date.now() }],
417
+ ...(released.length > 0
418
+ ? {
419
+ variables: Object.fromEntries(released.map(([name, held]) => [name, { value: held.value, locked: false, reseed: true }])),
420
+ }
421
+ : {}),
388
422
  messages: [
389
- toolReply(RESET_TOOL, request.toolCallId, `Reset to state '${entry}'. Correction budgets are cleared and its entry gate runs ` +
390
- `again; earlier work in the conversation and in scratchpad/ is untouched.`),
423
+ toolReply(RESET_TOOL, request.toolCallId, `Reset to state '${entry}'. Earlier work in the conversation and in scratchpad/ is ` +
424
+ `untouched.` +
425
+ (released.length > 0
426
+ ? ` The locks you set are released: ${released.map(([name]) => `'${name}'`).join(", ")} can be written again.`
427
+ : "")),
391
428
  ],
392
429
  }),
393
430
  moved: { from, to: entry },
@@ -415,9 +452,9 @@ function callsInMessageOf(state, toolCallId) {
415
452
  * Service a raise: end the session as a failure in the state it was called in.
416
453
  * Commits the record and `status: failed`, and drops a pending rejection — the
417
454
  * agent's own account of the failure is what the session ends with. The turn
418
- * ends at the next model hook; nothing routes and no hook runs. Refused, with the
419
- * session left in place, for invalid arguments or a message making other calls:
420
- * those run concurrently, so a raise beside them could not mean one thing.
455
+ * ends at the next model hook; nothing routes and nothing further runs. Refused,
456
+ * with the session left in place, for invalid arguments or a message making other
457
+ * calls: those run concurrently, so a raise beside them could not mean one thing.
421
458
  */
422
459
  export function handleRaise(machine, request) {
423
460
  const refuse = (text) => ({ message: refusal(RAISE_TOOL, request.toolCallId, text) });
@@ -516,6 +553,16 @@ fileRefusal) {
516
553
  return refuse(`${SET_VARIABLES_TOOL} rejected: '${name}' is locked and cannot be changed ` +
517
554
  `(current value: ${JSON.stringify(store[name]?.value)}). Nothing was written.`);
518
555
  }
556
+ // An owned variable is decided in its owner alone, and stays changeable there.
557
+ const owner = machine?.ownerOf(name);
558
+ if (owner !== undefined && owner !== currentWorkflowState(request.state, machine.entry)) {
559
+ return refuse(`${SET_VARIABLES_TOOL} rejected: '${name}' belongs to state '${owner}': only '${owner}' can ` +
560
+ `change it. Go back to '${owner}' to change it. Nothing was written.`);
561
+ }
562
+ if (owner !== undefined && lock === true) {
563
+ return refuse(`${SET_VARIABLES_TOOL} rejected: '${name}' belongs to this state, '${owner}', so it stays ` +
564
+ `changeable here and cannot be locked. Retry without \`lock\`. Nothing was written.`);
565
+ }
519
566
  if (name === TITLE_VARIABLE) {
520
567
  // Refused, not silently dropped: an agent that believes it locked the title must not be lied to.
521
568
  if (lock === true) {
@@ -539,7 +586,7 @@ fileRefusal) {
539
586
  delta[name] =
540
587
  name === TITLE_VARIABLE
541
588
  ? { value: normalizeTitle(value), locked: false }
542
- : { value, locked };
589
+ : { value, locked, ...(locked ? { lockedBy: "agent" } : {}) };
543
590
  }
544
591
  return {
545
592
  message: toolReply(SET_VARIABLES_TOOL, request.toolCallId, `Set ${names.join(", ")}${locked ? " (locked)" : ""}.`),
@@ -592,10 +639,7 @@ export function setVariablesCommand(outcome) {
592
639
  return outcome.message;
593
640
  return commit({ variables: outcome.delta, messages: [outcome.message] });
594
641
  }
595
- /** The variables a state still owes before it may be left — its `requires` minus what is set. */
596
- export function unmetRequirements(required, store) {
597
- return required.filter((name) => store[name] === undefined);
598
- }
642
+ export { unmetRequirements } from "../kernel/kernel.js";
599
643
  /**
600
644
  * The wording for a `${{…}}` reference in the agent's own tool arguments that
601
645
  * could not be resolved: a correctable refusal carrying the two fixes it might