@archmax-ai/harness 0.0.0 → 0.2.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 (143) hide show
  1. package/README.md +64 -47
  2. package/dist/agent.d.ts +0 -11
  3. package/dist/agent.js.map +1 -1
  4. package/dist/assembly/compose.js +3 -5
  5. package/dist/assembly/compose.js.map +1 -1
  6. package/dist/assembly/delegation-registry.js +4 -2
  7. package/dist/assembly/delegation-registry.js.map +1 -1
  8. package/dist/assembly/index.d.ts +1 -1
  9. package/dist/assembly/index.js +0 -1
  10. package/dist/assembly/index.js.map +1 -1
  11. package/dist/authoring-skill/archmax-harness/README.md +24 -18
  12. package/dist/authoring-skill/archmax-harness/SKILL.md +7 -1
  13. package/dist/authoring-skill/archmax-harness/references/backend-integration.md +66 -11
  14. package/dist/authoring-skill/archmax-harness/references/cases.md +1 -1
  15. package/dist/authoring-skill/archmax-harness/references/hook-and-test-scripts.md +2 -2
  16. package/dist/authoring-skill/archmax-harness/references/wiring.md +1 -1
  17. package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +66 -20
  18. package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +14 -4
  19. package/dist/cli/bootstrap.d.ts +7 -3
  20. package/dist/cli/bootstrap.js.map +1 -1
  21. package/dist/cli/state-flow.js +3 -3
  22. package/dist/cli/state-flow.js.map +1 -1
  23. package/dist/cli/turn.d.ts +9 -4
  24. package/dist/cli/turn.js +36 -9
  25. package/dist/cli/turn.js.map +1 -1
  26. package/dist/cli.js +9 -10
  27. package/dist/cli.js.map +1 -1
  28. package/dist/core/events.d.ts +4 -9
  29. package/dist/core/events.js +5 -5
  30. package/dist/core/events.js.map +1 -1
  31. package/dist/core/workspace-context.d.ts +0 -2
  32. package/dist/core/workspace-context.js +0 -2
  33. package/dist/core/workspace-context.js.map +1 -1
  34. package/dist/core/zones.d.ts +0 -2
  35. package/dist/core/zones.js +0 -2
  36. package/dist/core/zones.js.map +1 -1
  37. package/dist/env.d.ts +0 -2
  38. package/dist/env.js +0 -2
  39. package/dist/env.js.map +1 -1
  40. package/dist/index.d.ts +15 -13
  41. package/dist/index.js +18 -7
  42. package/dist/index.js.map +1 -1
  43. package/dist/machine/machine.d.ts +9 -0
  44. package/dist/machine/machine.js +13 -0
  45. package/dist/machine/machine.js.map +1 -1
  46. package/dist/machine/signature.d.ts +104 -0
  47. package/dist/machine/signature.js +210 -0
  48. package/dist/machine/signature.js.map +1 -0
  49. package/dist/machine/spec-schema.d.ts +158 -8
  50. package/dist/machine/spec-schema.js +78 -6
  51. package/dist/machine/spec-schema.js.map +1 -1
  52. package/dist/machine/triggers.d.ts +6 -2
  53. package/dist/machine/triggers.js +7 -2
  54. package/dist/machine/triggers.js.map +1 -1
  55. package/dist/machine/types.d.ts +7 -1
  56. package/dist/machine/types.js.map +1 -1
  57. package/dist/machine/variables.d.ts +2 -0
  58. package/dist/machine/variables.js +4 -0
  59. package/dist/machine/variables.js.map +1 -1
  60. package/dist/public/spec.d.ts +20 -3
  61. package/dist/public/spec.js +18 -2
  62. package/dist/public/spec.js.map +1 -1
  63. package/dist/sandbox/executor.js.map +1 -1
  64. package/dist/sessions/resolve.d.ts +0 -2
  65. package/dist/sessions/resolve.js +1 -4
  66. package/dist/sessions/resolve.js.map +1 -1
  67. package/dist/sessions/resume.d.ts +4 -8
  68. package/dist/sessions/resume.js +10 -5
  69. package/dist/sessions/resume.js.map +1 -1
  70. package/dist/sessions/summary.d.ts +0 -2
  71. package/dist/sessions/summary.js +1 -1
  72. package/dist/sessions/summary.js.map +1 -1
  73. package/dist/testing/assertions.js +1 -5
  74. package/dist/testing/assertions.js.map +1 -1
  75. package/dist/testing/case-document.d.ts +1 -7
  76. package/dist/testing/case-document.js.map +1 -1
  77. package/dist/testing/case-schema.d.ts +2 -2
  78. package/dist/testing/case-schema.js +8 -21
  79. package/dist/testing/case-schema.js.map +1 -1
  80. package/dist/testing/driver.d.ts +4 -2
  81. package/dist/testing/driver.js +1 -1
  82. package/dist/testing/driver.js.map +1 -1
  83. package/dist/testing/grade.d.ts +2 -2
  84. package/dist/testing/grade.js +1 -1
  85. package/dist/testing/interpreter.d.ts +4 -2
  86. package/dist/testing/interpreter.js.map +1 -1
  87. package/dist/testing/runner.d.ts +13 -9
  88. package/dist/testing/runner.js +0 -1
  89. package/dist/testing/runner.js.map +1 -1
  90. package/dist/testing/target.d.ts +4 -2
  91. package/dist/workflow/control-tools.d.ts +7 -2
  92. package/dist/workflow/control-tools.js +27 -2
  93. package/dist/workflow/control-tools.js.map +1 -1
  94. package/dist/workflow/governance.js +28 -19
  95. package/dist/workflow/governance.js.map +1 -1
  96. package/dist/workflow/middleware.js +5 -10
  97. package/dist/workflow/middleware.js.map +1 -1
  98. package/dist/workflow/on-error.js +0 -1
  99. package/dist/workflow/on-error.js.map +1 -1
  100. package/dist/workflow/parks.js +9 -13
  101. package/dist/workflow/parks.js.map +1 -1
  102. package/dist/workflow/paths.d.ts +0 -1
  103. package/dist/workflow/paths.js +0 -1
  104. package/dist/workflow/paths.js.map +1 -1
  105. package/dist/workflow/prompt-cache.d.ts +0 -2
  106. package/dist/workflow/prompt-cache.js +0 -7
  107. package/dist/workflow/prompt-cache.js.map +1 -1
  108. package/dist/workflow/render-prompt.js +28 -7
  109. package/dist/workflow/render-prompt.js.map +1 -1
  110. package/dist/workflow/session-artifacts.d.ts +1 -3
  111. package/dist/workflow/session-artifacts.js +1 -2
  112. package/dist/workflow/session-artifacts.js.map +1 -1
  113. package/dist/workflow/session-view.d.ts +1 -1
  114. package/dist/workflow/signature-checks.d.ts +22 -0
  115. package/dist/workflow/signature-checks.js +52 -0
  116. package/dist/workflow/signature-checks.js.map +1 -0
  117. package/dist/workflow/state.d.ts +2 -14
  118. package/dist/workflow/state.js +3 -10
  119. package/dist/workflow/state.js.map +1 -1
  120. package/dist/workflow/sub-workflow.d.ts +23 -16
  121. package/dist/workflow/sub-workflow.js +78 -14
  122. package/dist/workflow/sub-workflow.js.map +1 -1
  123. package/dist/workflow/tool-service.js +3 -5
  124. package/dist/workflow/tool-service.js.map +1 -1
  125. package/dist/workflow/turn-boundary.js +5 -6
  126. package/dist/workflow/turn-boundary.js.map +1 -1
  127. package/dist/workflow/workflow-tools.d.ts +17 -9
  128. package/dist/workflow/workflow-tools.js +30 -17
  129. package/dist/workflow/workflow-tools.js.map +1 -1
  130. package/package.json +5 -4
  131. package/skills/archmax-harness/README.md +82 -0
  132. package/skills/archmax-harness/SKILL.md +247 -0
  133. package/skills/archmax-harness/references/backend-integration.md +681 -0
  134. package/skills/archmax-harness/references/cases.md +41 -0
  135. package/skills/archmax-harness/references/diagnostics.md +51 -0
  136. package/skills/archmax-harness/references/hook-and-test-scripts.md +1070 -0
  137. package/skills/archmax-harness/references/hooks-and-scripts.md +82 -0
  138. package/skills/archmax-harness/references/wiring.md +101 -0
  139. package/skills/archmax-harness/references/workflow-schema.md +1677 -0
  140. package/skills/archmax-harness/references/workflow-yaml.md +251 -0
  141. package/dist/behaviour/support.d.ts +0 -232
  142. package/dist/behaviour/support.js +0 -339
  143. package/dist/behaviour/support.js.map +0 -1
@@ -1,339 +0,0 @@
1
- /**
2
- * Shared support for the behaviour-level suite.
3
- *
4
- * Everything here drives the runtime through the **public API only** — the
5
- * `../index.js` barrel and `../public/testing.js` — so that an internal
6
- * restructuring can be verified against these tests without touching them. No
7
- * test in this directory imports from `src/workflow/*`, `src/machine/*`,
8
- * `src/kernel/*` or any other internal module.
9
- *
10
- * Three pieces:
11
- *
12
- * - {@link ScriptedModel}: a fake chat model that replays a queue of turns —
13
- * tool calls (`archmax_advance`, `archmax_wait`, `write_file`, a delegation
14
- * tool, …) and final text replies — and records what it was bound with.
15
- * - {@link makeWorkspace}: writes an authored workspace (workflow.yaml, hooks,
16
- * skills) into a temp directory, cleaned up by {@link cleanupWorkspaces}.
17
- * - {@link assemble} / {@link turn}: assemble a governed agent over a memory
18
- * session store with an event sink, and drive one conversational turn.
19
- */
20
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
21
- import { tmpdir } from "node:os";
22
- import { dirname, join, resolve } from "node:path";
23
- import { stringify as toYaml } from "yaml";
24
- import { AIMessage } from "@langchain/core/messages";
25
- import { BaseChatModel } from "@langchain/core/language_models/chat_models";
26
- import { contentToString, createAgent, createMemorySessionStore, isAiMessage, } from "../index.js";
27
- /**
28
- * A model that replays a fixed script of turns. `bindTools` returns the same
29
- * instance so the cursor is shared across every binding the agent performs —
30
- * the script is the run's plan, not one binding's. When the script runs out the
31
- * model replies with a final `done`, so every turn terminates.
32
- */
33
- export class ScriptedModel extends BaseChatModel {
34
- turns;
35
- cursor = 0;
36
- lastBound = [];
37
- seq = 0;
38
- /** Tool calls the script actually issued, in order. */
39
- issued = [];
40
- /** Every model invocation, in order. */
41
- calls = [];
42
- /** What to say when the script is exhausted. */
43
- fallbackReply;
44
- /**
45
- * The id this model was configured to run, as a real client exposes it — what
46
- * `modelIdOf` reads and what the runtime prices against when a response names
47
- * no model. Left undefined by default so an existing case is unchanged.
48
- */
49
- model;
50
- constructor(turns, opts = {}) {
51
- super({});
52
- this.turns = turns;
53
- this.fallbackReply = opts.fallbackReply ?? "done";
54
- if (opts.model !== undefined)
55
- this.model = opts.model;
56
- }
57
- _llmType() {
58
- return "archmax-behaviour-scripted";
59
- }
60
- /** How many scripted turns are still unplayed. */
61
- get remaining() {
62
- return Math.max(0, this.turns.length - this.cursor);
63
- }
64
- /** Append turns to the script — for a later conversational turn on the same agent. */
65
- enqueue(...turns) {
66
- this.turns.push(...turns);
67
- }
68
- bindTools(tools) {
69
- this.lastBound = tools.map((t) => String(t?.name ?? ""));
70
- return this;
71
- }
72
- async _generate(messages) {
73
- const system = messages.find((m) => m.getType() === "system");
74
- this.calls.push({
75
- tools: [...this.lastBound],
76
- systemPrompt: system ? contentToString(system.content) : "",
77
- messageTypes: messages.map((m) => m.getType()),
78
- });
79
- // The cursor only moves past a scripted turn: a fallback reply consumes
80
- // nothing, so turns enqueued later are still played in order.
81
- const scripted = this.turns[this.cursor];
82
- if (scripted)
83
- this.cursor += 1;
84
- const turn = scripted ?? { reply: this.fallbackReply };
85
- const usage = turn.usage
86
- ? {
87
- usage_metadata: {
88
- input_tokens: turn.usage.input,
89
- output_tokens: turn.usage.output,
90
- total_tokens: turn.usage.input + turn.usage.output,
91
- },
92
- ...(turn.reports ? { response_metadata: { model_name: turn.reports } } : {}),
93
- }
94
- : {};
95
- if ("reply" in turn) {
96
- const message = new AIMessage({ content: turn.reply, ...usage });
97
- return { generations: [{ text: turn.reply, message }] };
98
- }
99
- const calls = "batch" in turn ? turn.batch : [{ tool: turn.tool, args: turn.args }];
100
- const toolCalls = calls.map((c) => {
101
- this.issued.push({ name: c.tool, args: c.args });
102
- return { id: `call-${++this.seq}`, name: c.tool, args: c.args };
103
- });
104
- const message = new AIMessage({ content: "", tool_calls: toolCalls, ...usage });
105
- return { generations: [{ text: "", message }] };
106
- }
107
- }
108
- // --- Temp workspaces ----------------------------------------------------------
109
- const tmpRoots = [];
110
- /**
111
- * Write an authored workspace into a fresh temp directory. Values are file
112
- * contents; a non-string value is serialized as YAML (handy for `workflow.yaml`
113
- * declared as an object). Returns the root path.
114
- */
115
- export function makeWorkspace(files) {
116
- const root = mkdtempSync(join(tmpdir(), "archmax-behaviour-"));
117
- tmpRoots.push(root);
118
- for (const [rel, contents] of Object.entries(files)) {
119
- const full = resolve(root, rel);
120
- mkdirSync(dirname(full), { recursive: true });
121
- writeFileSync(full, typeof contents === "string" ? contents : toYaml(contents));
122
- }
123
- return root;
124
- }
125
- /** Remove every workspace {@link makeWorkspace} created. Call from `afterEach`. */
126
- export function cleanupWorkspaces() {
127
- while (tmpRoots.length)
128
- rmSync(tmpRoots.pop(), { recursive: true, force: true });
129
- }
130
- /** A `SKILL.md` body with the frontmatter the skill loader requires. */
131
- export function skillMarkdown(name, description = `The ${name} skill.`) {
132
- return `---\nname: ${name}\ndescription: ${description}\n---\n\n# ${name}\n`;
133
- }
134
- /**
135
- * One inline rubric, as the value of a `{ rubric: … }` hook. A rubric is
136
- * declared on the hook that applies it, so a fixture builds the declaration and
137
- * drops it straight into a state's `before`/`after`.
138
- */
139
- export function rubricDeclaration(opts = {}) {
140
- return {
141
- instructions: opts.instructions ?? "Judge the reply. Reply with a JSON verdict.",
142
- ...(opts.maxIterations !== undefined ? { max_iterations: opts.maxIterations } : {}),
143
- ...(opts.model !== undefined ? { model: opts.model } : {}),
144
- ...(opts.metadata !== undefined ? { metadata: opts.metadata } : {}),
145
- };
146
- }
147
- /** The default persona file every workspace here carries. */
148
- export const AGENTS_MD = "# Agent\n\nDo what the workflow says.\n";
149
- /** Assemble a governed agent over `root` with an event sink and memory storage. */
150
- export async function assemble(root, opts = {}) {
151
- const model = opts.model ?? new ScriptedModel(opts.turns ?? []);
152
- const events = [];
153
- const store = opts.store ?? createMemorySessionStore();
154
- const rubricModel = opts.rubricModel;
155
- const agent = await createAgent({
156
- workflow: opts.workflow ?? "w",
157
- ...(opts.modelFactory
158
- ? { modelFactory: opts.modelFactory }
159
- : rubricModel
160
- ? {
161
- modelFactory: (role) => (role === "agent" ? model : rubricModel),
162
- }
163
- : { model: model }),
164
- onEvent: (event) => events.push(event),
165
- workspace: { rootDir: root, sessionStore: store },
166
- ...opts.params,
167
- });
168
- if (!agent.workflow)
169
- throw new Error("expected a governed assembly");
170
- return { agent: agent, model, events, store, root };
171
- }
172
- /** Drive one conversational turn on `sessionId`. */
173
- export async function turn(agent, sessionId, text, opts = {}) {
174
- const input = {
175
- messages: [{ role: "user", content: text }],
176
- ...(opts.trigger ? { trigger: opts.trigger } : {}),
177
- };
178
- const result = (await agent.invoke(input, {
179
- configurable: { thread_id: sessionId },
180
- }));
181
- const messages = result.messages ?? [];
182
- return { messages, reply: lastAgentText(messages) };
183
- }
184
- /** The final assistant message carrying text, skipping tool results. */
185
- export function lastAgentText(messages) {
186
- for (let i = messages.length - 1; i >= 0; i--) {
187
- const message = messages[i];
188
- if (!isAiMessage(message))
189
- continue;
190
- const text = contentToString(message.content).trim();
191
- if (text)
192
- return text;
193
- }
194
- return "";
195
- }
196
- /** The type of a message (`ai`, `human`, `tool`, `system`), read across shapes. */
197
- export function messageType(message) {
198
- const msg = message;
199
- const t = msg._getType?.call(msg) ??
200
- msg.getType?.call(msg) ??
201
- msg.type ??
202
- msg.role ??
203
- "";
204
- return String(t);
205
- }
206
- /** Tool results in a transcript: `{ name, content, status }`. */
207
- export function toolResults(messages) {
208
- return messages
209
- .filter((m) => messageType(m) === "tool")
210
- .map((m) => {
211
- const msg = m;
212
- return {
213
- name: String(msg.name ?? ""),
214
- content: contentToString(msg.content),
215
- ...(msg.status ? { status: msg.status } : {}),
216
- };
217
- });
218
- }
219
- // --- Event selectors ----------------------------------------------------------
220
- /** Events of one type, narrowed. */
221
- export function eventsOf(events, type) {
222
- return events.filter((e) => e.type === type);
223
- }
224
- /** The states entered, in order. */
225
- export function statesEntered(events) {
226
- return eventsOf(events, "state-enter").map((e) => e.state);
227
- }
228
- /** The agent-driven transitions (`from -> to`), in order — the opening arrival excluded. */
229
- export function advances(events) {
230
- return eventsOf(events, "advance")
231
- .filter((e) => e.from !== "__start__")
232
- .map((e) => ({ from: e.from, to: e.to, ...(e.reason ? { reason: e.reason } : {}) }));
233
- }
234
- /** Names of the tools governance refused, in order. */
235
- export function blockedTools(events) {
236
- return eventsOf(events, "tool-blocked").map((e) => e.tool);
237
- }
238
- /** Events emitted for one session only. */
239
- export function forSession(events, sessionId) {
240
- return events.filter((e) => e.sessionId === sessionId);
241
- }
242
- // --- Spec builders ------------------------------------------------------------
243
- /**
244
- * A two-state linear machine: `start` (manual) → `done` (terminal), with the
245
- * runtime contract pinned. Extra keys are merged into the spec root.
246
- */
247
- export function linearSpec(extra = {}) {
248
- return {
249
- runtime: { engine: "archmax-harness", version: "2" },
250
- states: {
251
- start: { triggers: { manual: null }, transitions: [{ to: "done", description: "Test edge to done." }] },
252
- done: {},
253
- },
254
- ...extra,
255
- };
256
- }
257
- /** The scripted turn that advances `to` with a reason. */
258
- export function advanceTo(to, reason = `moving to ${to}`) {
259
- return { tool: "archmax_advance", args: { to, reason } };
260
- }
261
- /** A workspace with a persona and one workflow spec under `workflows/w/`. */
262
- export function workspaceWith(spec, extraFiles = {}) {
263
- return makeWorkspace({
264
- "AGENTS.md": AGENTS_MD,
265
- "workflows/w/workflow.yaml": spec,
266
- ...extraFiles,
267
- });
268
- }
269
- /**
270
- * A fake model for the `rubric` role that answers each dispatch with the next
271
- * scripted verdict. When the framework binds a structured-output tool
272
- * (`extract-*`) it is called with the verdict; otherwise the verdict is the reply
273
- * text as JSON — both reach the lifecycle runner as a parseable verdict.
274
- */
275
- export class JudgeModel extends BaseChatModel {
276
- verdicts;
277
- fallback;
278
- failWith;
279
- cursor = 0;
280
- lastBound = [];
281
- seq = 0;
282
- /** How many times the judge was asked. */
283
- get dispatches() {
284
- return this.calls;
285
- }
286
- calls = 0;
287
- constructor(verdicts, fallback = { verdict: "ok", reason: "fine" },
288
- /**
289
- * Fail every dispatch instead of answering — how an unusable `model` id
290
- * surfaces, since a bad id is refused at invocation, not construction.
291
- */
292
- failWith) {
293
- super({});
294
- this.verdicts = verdicts;
295
- this.fallback = fallback;
296
- this.failWith = failWith;
297
- }
298
- _llmType() {
299
- return "archmax-behaviour-judge";
300
- }
301
- bindTools(tools) {
302
- this.lastBound = tools.map((t) => String(t?.name ?? ""));
303
- return this;
304
- }
305
- async _generate() {
306
- this.calls += 1;
307
- if (this.failWith)
308
- throw new Error(this.failWith);
309
- const verdict = this.verdicts[this.cursor++] ?? this.fallback;
310
- const extract = this.lastBound.find((name) => name.startsWith("extract-"));
311
- if (extract) {
312
- const message = new AIMessage({
313
- content: "",
314
- tool_calls: [{ id: `judge-${++this.seq}`, name: extract, args: { ...verdict } }],
315
- });
316
- return { generations: [{ text: "", message }] };
317
- }
318
- const text = JSON.stringify(verdict);
319
- return { generations: [{ text, message: new AIMessage(text) }] };
320
- }
321
- }
322
- // --- Store access -------------------------------------------------------------
323
- /** Read one file from a session store by store-relative path, or `undefined`. */
324
- export async function storeFile(store, path) {
325
- const result = await store.backend.readRaw(path);
326
- const data = result.data;
327
- return typeof data?.content === "string" ? data.content : undefined;
328
- }
329
- // --- Session ids ---------------------------------------------------------------
330
- let sessionSeq = 0;
331
- /**
332
- * A session id no other test in this process has used. Sandbox REPL sessions
333
- * and other per-session resources are keyed by session id for the life of the
334
- * process, so tests that run hooks or scripts must not share one.
335
- */
336
- export function freshSessionId(prefix = "s") {
337
- return `${prefix}-${process.pid}-${++sessionSeq}`;
338
- }
339
- //# sourceMappingURL=support.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/behaviour/support.ts"],"names":[],"mappings":"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"}