@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,468 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The control tools: `archmax_advance`, `archmax_wait`, `archmax_reset`,
|
|
3
|
+
* `archmax_get_variables`, `archmax_set_variables`.
|
|
4
|
+
*
|
|
5
|
+
* 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.
|
|
9
|
+
*/
|
|
10
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
11
|
+
import { Command } from "@langchain/langgraph";
|
|
12
|
+
import { tool } from "langchain";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { spokeSinceLastHumanMessage } from "../core/messages.js";
|
|
15
|
+
import { canonicalizeRelPath } from "../core/workspace.js";
|
|
16
|
+
import { classifyWorkspacePath, NO_MOUNTS, } from "../core/zones.js";
|
|
17
|
+
import { ADVANCE_TOOL, GET_VARIABLES_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL, } from "../machine/tool-names.js";
|
|
18
|
+
import { normalizeTitle, resolvePath, TITLE_VARIABLE, titleWriteError, VARIABLE_NAME_PATTERN, } from "../machine/variables.js";
|
|
19
|
+
import { decisionRecordFor, inputRecordFor } from "./parks.js";
|
|
20
|
+
import { currentWorkflowState, readVariables, readWorkflowState, WORKFLOW_STATUSES, } from "./state.js";
|
|
21
|
+
export { ADVANCE_TOOL, GET_VARIABLES_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL };
|
|
22
|
+
// --- Replies ------------------------------------------------------------------
|
|
23
|
+
function toolReply(name, toolCallId, content) {
|
|
24
|
+
return new ToolMessage({ content, tool_call_id: toolCallId, name });
|
|
25
|
+
}
|
|
26
|
+
/** The one refusal shape: an error-status tool message, so the model self-corrects and a view classifies it. */
|
|
27
|
+
export function refusal(name, toolCallId, text) {
|
|
28
|
+
return new ToolMessage({ content: text, tool_call_id: toolCallId, name, status: "error" });
|
|
29
|
+
}
|
|
30
|
+
function commit(update) {
|
|
31
|
+
return new Command({ update });
|
|
32
|
+
}
|
|
33
|
+
/** A control tool's declaration: a body that only says it is unwired. */
|
|
34
|
+
function declaration(name, description, schema) {
|
|
35
|
+
return tool(async () => `${name} is unavailable: the workflow middleware is not installed.`, {
|
|
36
|
+
name,
|
|
37
|
+
description,
|
|
38
|
+
schema,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function schemaIssues(error) {
|
|
42
|
+
return error.issues.map((i) => `${i.path.join(".") || "(input)"}: ${i.message}`).join("; ");
|
|
43
|
+
}
|
|
44
|
+
// --- Evidence -----------------------------------------------------------------
|
|
45
|
+
/** Most paths one advance may attach — a bound on what a person is asked to read. */
|
|
46
|
+
export const MAX_ADVANCE_EVIDENCE = 20;
|
|
47
|
+
/** Zones an attached path may address: everything the agent itself can read. */
|
|
48
|
+
const READABLE_ZONES = new Set([
|
|
49
|
+
"run-open",
|
|
50
|
+
"run",
|
|
51
|
+
"authored",
|
|
52
|
+
"run-offload",
|
|
53
|
+
]);
|
|
54
|
+
/**
|
|
55
|
+
* Validate attached evidence paths (canonical, deduplicated) or give the reason
|
|
56
|
+
* the call is refused. Classified through the kernel's classifier and mount
|
|
57
|
+
* table, so what may be attached cannot drift from what the agent can read.
|
|
58
|
+
*/
|
|
59
|
+
export function validateAdvanceEvidence(paths, mounts = NO_MOUNTS) {
|
|
60
|
+
if (paths.length > MAX_ADVANCE_EVIDENCE) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
reason: `${paths.length} evidence paths were attached; at most ${MAX_ADVANCE_EVIDENCE} may be. ` +
|
|
64
|
+
`Attach the artifacts the decision actually rests on.`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const out = [];
|
|
68
|
+
for (const entry of paths) {
|
|
69
|
+
const raw = String(entry).trim();
|
|
70
|
+
const { path: rel } = canonicalizeRelPath(raw);
|
|
71
|
+
const zone = classifyWorkspacePath(raw, mounts);
|
|
72
|
+
if (zone === "escapes") {
|
|
73
|
+
return { ok: false, reason: `evidence path '${raw}' points outside the workspace.` };
|
|
74
|
+
}
|
|
75
|
+
if (zone === "root" || rel === "") {
|
|
76
|
+
return { ok: false, reason: `an evidence path is empty — name a file, not the workspace root.` };
|
|
77
|
+
}
|
|
78
|
+
if (!READABLE_ZONES.has(zone)) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
reason: `evidence path '${raw}' addresses a runtime-internal area, which is not readable — ` +
|
|
82
|
+
`attach what you wrote under 'scratchpad/'.`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (!out.includes(rel))
|
|
86
|
+
out.push(rel);
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, paths: out };
|
|
89
|
+
}
|
|
90
|
+
// --- Schemas and declarations ---------------------------------------------------
|
|
91
|
+
export const advanceSchema = z.object({
|
|
92
|
+
to: z.string().describe("Target state slug, as declared in the current state's transitions."),
|
|
93
|
+
reason: z.string().min(1).describe("One sentence: why advance now."),
|
|
94
|
+
evidence: z
|
|
95
|
+
.array(z.string())
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Files for the person deciding, when `to` is a human state: workspace-relative paths " +
|
|
98
|
+
"(e.g. ['scratchpad/refund.json']), shown with that state's own. Refused on any other target."),
|
|
99
|
+
});
|
|
100
|
+
export const waitSchema = z.object({
|
|
101
|
+
reason: z.string().min(1).describe("One sentence: what the run is waiting for."),
|
|
102
|
+
until: z
|
|
103
|
+
.string()
|
|
104
|
+
.optional()
|
|
105
|
+
.describe("When to be resumed if nothing arrives sooner: a duration ('30m', '1d') or an " +
|
|
106
|
+
"ISO-8601 instant."),
|
|
107
|
+
});
|
|
108
|
+
export const resetSchema = z.object({
|
|
109
|
+
reason: z.string().min(1).describe("One sentence: why the run has to start over."),
|
|
110
|
+
});
|
|
111
|
+
export const getVariablesSchema = z.object({
|
|
112
|
+
name: z.string().optional().describe("Variable to read; omit or leave empty for all."),
|
|
113
|
+
path: z
|
|
114
|
+
.string()
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("Dotted path into the value, e.g. 'items.0.sku' or 'items.-1.sku' (last)."),
|
|
117
|
+
});
|
|
118
|
+
export const setVariablesSchema = z.object({
|
|
119
|
+
variables: z.record(z.string(), z.unknown()).describe("Values keyed by name; whole values only."),
|
|
120
|
+
lock: z.boolean().optional().describe("Lock them permanently."),
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* Every control tool, in registration order. Descriptions are paid for on every
|
|
124
|
+
* model call, so they say only what the model cannot infer; the advance tool
|
|
125
|
+
* does not repeat the transition catalog the prompt's graph section renders.
|
|
126
|
+
*/
|
|
127
|
+
export function createControlTools() {
|
|
128
|
+
return [
|
|
129
|
+
declaration(ADVANCE_TOOL, "Advance the workflow to the next state. Pick `to` from the current state's " +
|
|
130
|
+
"transitions in the graph section above (a slug, never a title). The runtime " +
|
|
131
|
+
"validates the edge, runs this state's `after` hook, then unlocks the next " +
|
|
132
|
+
"state's tools.", advanceSchema),
|
|
133
|
+
declaration(RESET_TOOL, "Start the workflow over from the state the conversation began in, keeping the " +
|
|
134
|
+
"conversation and any work already written. Use it when this state cannot serve " +
|
|
135
|
+
"what was asked: a wrong branch, a path no transition from here reaches, or a " +
|
|
136
|
+
"follow-up arriving in a terminal state, where the run already finished. Call it " +
|
|
137
|
+
"before answering, not after.", resetSchema),
|
|
138
|
+
declaration(WAIT_TOOL, "Pause the run in this state until an external event arrives (a callback, a webhook, " +
|
|
139
|
+
"a message someone sends in their own time). The run stays open here: when the event " +
|
|
140
|
+
"is delivered you continue in this same state with what it carried. Use it instead of " +
|
|
141
|
+
"ending your turn when the work cannot proceed until something reaches you. Set " +
|
|
142
|
+
"'until' when you are waiting for a time rather than an event; an earlier event still " +
|
|
143
|
+
"resumes you. This does NOT request a human decision, approval or review: those " +
|
|
144
|
+
`belong to a human node, which you reach with ${ADVANCE_TOOL} and which the runtime ` +
|
|
145
|
+
"parks and presents on its own. This tool moves the run nowhere.", waitSchema),
|
|
146
|
+
declaration(GET_VARIABLES_TOOL, "Read the run's variables. Omit `name` for all of them; pass `path` to drill " +
|
|
147
|
+
"into a structured value instead of pulling it whole into context.", getVariablesSchema),
|
|
148
|
+
declaration(SET_VARIABLES_TOOL, "Record facts for the rest of the run; values may be structured. Pass " +
|
|
149
|
+
"`lock: true` to make one permanent — required for anything a tool guard " +
|
|
150
|
+
"reads. Writing a locked variable is refused, not ignored. `title` is " +
|
|
151
|
+
"reserved for a short single-line label naming this run's task: set it " +
|
|
152
|
+
"early, update it when the task changes, and never lock it.", setVariablesSchema),
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Attempt a transition and commit the outcome: `workflowState` and the `agent`
|
|
157
|
+
* trail step on success, `iterations` always, and — into a human state —
|
|
158
|
+
* the pending-decision record with the park opened in its closing phase.
|
|
159
|
+
*/
|
|
160
|
+
export async function handleAdvance(opts, request) {
|
|
161
|
+
const refuse = (text) => ({ message: refusal(ADVANCE_TOOL, request.toolCallId, text) });
|
|
162
|
+
const parsed = advanceSchema.safeParse(request.args);
|
|
163
|
+
if (!parsed.success) {
|
|
164
|
+
return refuse(`${ADVANCE_TOOL} rejected: invalid arguments — ${schemaIssues(parsed.error)}`);
|
|
165
|
+
}
|
|
166
|
+
// Evidence is settled before the transition is attempted, so a refused
|
|
167
|
+
// attachment leaves the run exactly where it was: no hook run, no trail step.
|
|
168
|
+
const attached = parsed.data.evidence ?? [];
|
|
169
|
+
let evidence = [];
|
|
170
|
+
if (attached.length > 0) {
|
|
171
|
+
if (!opts.machine.isHumanState(parsed.data.to)) {
|
|
172
|
+
return refuse(`${ADVANCE_TOOL} rejected: evidence can only be attached when advancing into a human ` +
|
|
173
|
+
`decision state, and '${parsed.data.to}' is not one — nothing would present it. ` +
|
|
174
|
+
`Call again without 'evidence'.`);
|
|
175
|
+
}
|
|
176
|
+
const validated = validateAdvanceEvidence(attached, opts.mountPrefixes);
|
|
177
|
+
if (!validated.ok)
|
|
178
|
+
return refuse(`${ADVANCE_TOOL} rejected: ${validated.reason}`);
|
|
179
|
+
evidence = validated.paths;
|
|
180
|
+
}
|
|
181
|
+
const from = currentWorkflowState(request.state, opts.machine.entry);
|
|
182
|
+
const result = await opts.lifecycle.attemptTransition(from, parsed.data.to, request.ctx, parsed.data.reason, request.callId ? { callId: request.callId } : undefined);
|
|
183
|
+
if (!result.ok) {
|
|
184
|
+
// A terminal rejection is committed as `rejected` so the run routes through
|
|
185
|
+
// `on_error`; a recoverable one keeps the agent in place, replying without
|
|
186
|
+
// erroring the message so it retries rather than reading a failed run.
|
|
187
|
+
return {
|
|
188
|
+
message: commit({
|
|
189
|
+
iterations: { ...result.corrections },
|
|
190
|
+
...(result.terminal ? { rejected: result.reason } : {}),
|
|
191
|
+
messages: [toolReply(ADVANCE_TOOL, request.toolCallId, `${ADVANCE_TOOL} rejected: ${result.reason}`)],
|
|
192
|
+
}),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const fields = readWorkflowState(request.state);
|
|
196
|
+
const step = { to: result.to, kind: "agent", reason: parsed.data.reason, ts: Date.now() };
|
|
197
|
+
const moved = {
|
|
198
|
+
workflowState: result.to,
|
|
199
|
+
iterations: { ...result.corrections },
|
|
200
|
+
// The gate ran the target's `before` hook: recorded as done for this visit,
|
|
201
|
+
// so the target's first model call does not run it a second time.
|
|
202
|
+
beforeDone: { ...(fields.beforeDone ?? {}), [result.to]: true },
|
|
203
|
+
// A successful transition clears an earlier rejection marker and starts the target's turn budget afresh.
|
|
204
|
+
rejected: null,
|
|
205
|
+
stateTurns: null,
|
|
206
|
+
auditTrail: [step],
|
|
207
|
+
messages: [
|
|
208
|
+
toolReply(ADVANCE_TOOL, request.toolCallId, `Advanced to state '${result.to}'. You may now use the tools allowed in this state.`),
|
|
209
|
+
],
|
|
210
|
+
};
|
|
211
|
+
if (!opts.machine.isHumanState(result.to)) {
|
|
212
|
+
return { message: commit(moved), moved: { from, to: result.to } };
|
|
213
|
+
}
|
|
214
|
+
// Into a human state: the park record is committed with the transition, so a
|
|
215
|
+
// process that dies before the closing turn still sees a parked session.
|
|
216
|
+
const seq = (fields.decisionCount ?? 0) + 1;
|
|
217
|
+
const park = decisionRecordFor(opts.machine, result.to, seq, evidence);
|
|
218
|
+
return {
|
|
219
|
+
message: commit({
|
|
220
|
+
...moved,
|
|
221
|
+
pendingDecision: park,
|
|
222
|
+
decisionCount: seq,
|
|
223
|
+
status: WORKFLOW_STATUSES.awaitingDecision,
|
|
224
|
+
parkPhase: "closing",
|
|
225
|
+
}),
|
|
226
|
+
moved: { from, to: result.to, park },
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// --- archmax_wait ----------------------------------------------------------------
|
|
230
|
+
/** The relative form of `until`: a positive integer and a unit, e.g. `30m`, `1d`. */
|
|
231
|
+
const RELATIVE = /^(\d+)(ms|s|m|h|d)$/;
|
|
232
|
+
const UNIT_MS = { ms: 1, s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 };
|
|
233
|
+
/** The accepted `until` forms, quoted verbatim in every rejection. */
|
|
234
|
+
export const WAIT_UNTIL_FORMS = "a relative duration ('30m', '2h', '1d' — integer plus ms|s|m|h|d) or an absolute " +
|
|
235
|
+
"ISO-8601 instant ('2026-08-13T09:00:00Z')";
|
|
236
|
+
/**
|
|
237
|
+
* Resolve `until` against `now` (epoch ms) to an absolute instant: the
|
|
238
|
+
* checkpoint outlives the process, so "1d" read tomorrow means nothing. Fails
|
|
239
|
+
* closed — an unreadable `until` is refused, because a park that silently loses
|
|
240
|
+
* its schedule is a run nothing ever wakes. An instant in the past means "due now".
|
|
241
|
+
*/
|
|
242
|
+
export function resolveWaitUntil(until, now) {
|
|
243
|
+
const value = until.trim();
|
|
244
|
+
if (value === "")
|
|
245
|
+
return { error: "'until' is empty." };
|
|
246
|
+
const relative = RELATIVE.exec(value);
|
|
247
|
+
if (relative) {
|
|
248
|
+
const amount = Number(relative[1]);
|
|
249
|
+
if (amount <= 0)
|
|
250
|
+
return { error: `'until' must be a positive duration; got '${value}'.` };
|
|
251
|
+
return { resumeAt: new Date(now + amount * UNIT_MS[relative[2]]).toISOString() };
|
|
252
|
+
}
|
|
253
|
+
// Only ISO-8601-shaped input is tried as an instant: `Date.parse` accepts loose, locale-dependent forms.
|
|
254
|
+
if (/^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/.test(value)) {
|
|
255
|
+
const parsed = Date.parse(value);
|
|
256
|
+
if (Number.isFinite(parsed))
|
|
257
|
+
return { resumeAt: new Date(parsed).toISOString() };
|
|
258
|
+
}
|
|
259
|
+
return { error: `'until' value '${value}' is neither a duration nor an instant.` };
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Service a wait call: commit the pending-input record and open the park. The
|
|
263
|
+
* phase is `closing` when the model has said nothing since the person's last
|
|
264
|
+
* message (it owes them one), `suspend` when its question already is the
|
|
265
|
+
* message. An exhausted park budget is committed as `rejected`.
|
|
266
|
+
*/
|
|
267
|
+
export function handleWait(machine, request) {
|
|
268
|
+
const refuse = (text) => ({ message: refusal(WAIT_TOOL, request.toolCallId, text) });
|
|
269
|
+
const parsed = waitSchema.safeParse(request.args);
|
|
270
|
+
if (!parsed.success) {
|
|
271
|
+
return refuse(`${WAIT_TOOL} rejected: a non-empty 'reason' is required — say what the run is waiting for.`);
|
|
272
|
+
}
|
|
273
|
+
const at = Date.now();
|
|
274
|
+
let resumeAt;
|
|
275
|
+
if (parsed.data.until !== undefined) {
|
|
276
|
+
const resolved = resolveWaitUntil(parsed.data.until, at);
|
|
277
|
+
if (resolved.error) {
|
|
278
|
+
return refuse(`${WAIT_TOOL} rejected: ${resolved.error} Expected ${WAIT_UNTIL_FORMS}.`);
|
|
279
|
+
}
|
|
280
|
+
resumeAt = resolved.resumeAt;
|
|
281
|
+
}
|
|
282
|
+
const fields = readWorkflowState(request.state);
|
|
283
|
+
const slug = currentWorkflowState(request.state, machine.entry);
|
|
284
|
+
const counts = fields.parkCounts ?? {};
|
|
285
|
+
const soFar = counts[slug] ?? 0;
|
|
286
|
+
const maxParks = machine.spec.states[slug]?.budget?.maxParks;
|
|
287
|
+
if (maxParks != null && soFar + 1 > maxParks) {
|
|
288
|
+
const reason = `state '${slug}' exhausted its park budget (maxParks: ${maxParks}) — it asked to ` +
|
|
289
|
+
`wait again for: ${parsed.data.reason}`;
|
|
290
|
+
return {
|
|
291
|
+
message: commit({
|
|
292
|
+
rejected: reason,
|
|
293
|
+
messages: [refusal(WAIT_TOOL, request.toolCallId, `${WAIT_TOOL} rejected: ${reason}`)],
|
|
294
|
+
}),
|
|
295
|
+
exhausted: reason,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const park = inputRecordFor(machine, slug, parsed.data.reason, resumeAt);
|
|
299
|
+
const messages = request.state?.messages ?? [];
|
|
300
|
+
return {
|
|
301
|
+
message: commit({
|
|
302
|
+
pendingInput: park,
|
|
303
|
+
status: WORKFLOW_STATUSES.awaitingInput,
|
|
304
|
+
parkPhase: spokeSinceLastHumanMessage(messages) ? "suspend" : "closing",
|
|
305
|
+
replyOnly: null,
|
|
306
|
+
rejected: null,
|
|
307
|
+
// Counted at the park that happened: a request the budget refused never becomes a park.
|
|
308
|
+
parkCounts: { ...counts, [slug]: soFar + 1 },
|
|
309
|
+
messages: [
|
|
310
|
+
toolReply(WAIT_TOOL, request.toolCallId, `Waiting in state '${slug}'. The run is parked here and will continue in ` +
|
|
311
|
+
`this same state when an event is delivered; stop working now.` +
|
|
312
|
+
(resumeAt
|
|
313
|
+
? ` Nothing is scheduled by the runtime: ${resumeAt} is recorded for whoever ` +
|
|
314
|
+
`wakes the run, and an earlier event resumes you just the same.`
|
|
315
|
+
: "")),
|
|
316
|
+
],
|
|
317
|
+
}),
|
|
318
|
+
park,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
// --- archmax_reset ---------------------------------------------------------------
|
|
322
|
+
/** The state a reset returns to: the recorded entry state, else re-resolved from the trigger (older checkpoints). */
|
|
323
|
+
export function entryStateOf(state, machine) {
|
|
324
|
+
if (state.entryState)
|
|
325
|
+
return state.entryState;
|
|
326
|
+
const triggerId = state.trigger?.id;
|
|
327
|
+
return (triggerId ? machine.startStateForTrigger(triggerId) : undefined) ?? machine.entry;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Service a reset: move back to the entry state and clear what gates progress
|
|
331
|
+
* (correction budgets, `beforeDone`). Evidence — messages, files, variables, the
|
|
332
|
+
* trail — is left alone: a reset moves the machine, not the history.
|
|
333
|
+
*/
|
|
334
|
+
export function handleReset(machine, request) {
|
|
335
|
+
const parsed = resetSchema.safeParse(request.args);
|
|
336
|
+
if (!parsed.success) {
|
|
337
|
+
return {
|
|
338
|
+
message: refusal(RESET_TOOL, request.toolCallId, `${RESET_TOOL} rejected: a non-empty 'reason' is required — say why the run has to start over.`),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
const from = currentWorkflowState(request.state, machine.entry);
|
|
342
|
+
const entry = entryStateOf(readWorkflowState(request.state), machine);
|
|
343
|
+
return {
|
|
344
|
+
message: commit({
|
|
345
|
+
workflowState: entry,
|
|
346
|
+
iterations: {},
|
|
347
|
+
beforeDone: {},
|
|
348
|
+
rejected: null,
|
|
349
|
+
stateTurns: null,
|
|
350
|
+
auditTrail: [{ to: entry, kind: "reset", reason: parsed.data.reason, ts: Date.now() }],
|
|
351
|
+
messages: [
|
|
352
|
+
toolReply(RESET_TOOL, request.toolCallId, `Reset to state '${entry}'. Correction budgets are cleared and its entry gate runs ` +
|
|
353
|
+
`again; earlier work in the conversation and in scratchpad/ is untouched.`),
|
|
354
|
+
],
|
|
355
|
+
}),
|
|
356
|
+
moved: { from, to: entry },
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// --- Variables ------------------------------------------------------------------
|
|
360
|
+
/** An optional string argument; `""` or whitespace means "not given", as models often send it. */
|
|
361
|
+
function optionalArg(value) {
|
|
362
|
+
if (typeof value !== "string")
|
|
363
|
+
return undefined;
|
|
364
|
+
const trimmed = value.trim();
|
|
365
|
+
return trimmed === "" ? undefined : trimmed;
|
|
366
|
+
}
|
|
367
|
+
function known(store) {
|
|
368
|
+
const names = Object.keys(store).sort();
|
|
369
|
+
return names.length > 0 ? names.join(", ") : "(none set yet)";
|
|
370
|
+
}
|
|
371
|
+
/** Service an `archmax_get_variables` call against the checkpointed store. */
|
|
372
|
+
export function handleGetVariables(request) {
|
|
373
|
+
const reply = (content) => toolReply(GET_VARIABLES_TOOL, request.toolCallId, content);
|
|
374
|
+
const refuse = (text) => refusal(GET_VARIABLES_TOOL, request.toolCallId, text);
|
|
375
|
+
const parsed = getVariablesSchema.safeParse(request.args);
|
|
376
|
+
if (!parsed.success)
|
|
377
|
+
return refuse(`${GET_VARIABLES_TOOL} rejected: invalid arguments.`);
|
|
378
|
+
const store = readVariables(request.state);
|
|
379
|
+
const name = optionalArg(parsed.data.name);
|
|
380
|
+
const path = optionalArg(parsed.data.path);
|
|
381
|
+
if (name === undefined) {
|
|
382
|
+
const all = Object.fromEntries(Object.entries(store).map(([key, entry]) => [key, { value: entry.value, locked: entry.locked }]));
|
|
383
|
+
return reply(JSON.stringify(all, null, 2));
|
|
384
|
+
}
|
|
385
|
+
const entry = store[name];
|
|
386
|
+
if (entry === undefined)
|
|
387
|
+
return refuse(`Variable '${name}' is not set. Set: ${known(store)}.`);
|
|
388
|
+
if (path === undefined)
|
|
389
|
+
return reply(JSON.stringify({ value: entry.value, locked: entry.locked }, null, 2));
|
|
390
|
+
const resolved = resolvePath(entry.value, path.split("."));
|
|
391
|
+
// No fallback to the whole value: returning something other than what was asked invites acting on it.
|
|
392
|
+
if (resolved === undefined)
|
|
393
|
+
return refuse(`Path '${path}' does not resolve against variable '${name}'.`);
|
|
394
|
+
return reply(JSON.stringify({ value: resolved }, null, 2));
|
|
395
|
+
}
|
|
396
|
+
/** Service an `archmax_set_variables` call. Atomic: one rejected key refuses the whole call. */
|
|
397
|
+
export function handleSetVariables(request) {
|
|
398
|
+
const refuse = (text) => ({ message: refusal(SET_VARIABLES_TOOL, request.toolCallId, text) });
|
|
399
|
+
const parsed = setVariablesSchema.safeParse(request.args);
|
|
400
|
+
if (!parsed.success) {
|
|
401
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: invalid arguments — ${schemaIssues(parsed.error)}`);
|
|
402
|
+
}
|
|
403
|
+
const store = readVariables(request.state);
|
|
404
|
+
const { variables, lock } = parsed.data;
|
|
405
|
+
const names = Object.keys(variables);
|
|
406
|
+
if (names.length === 0)
|
|
407
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: no variables given.`);
|
|
408
|
+
for (const name of names) {
|
|
409
|
+
if (!VARIABLE_NAME_PATTERN.test(name)) {
|
|
410
|
+
const hint = name.includes(".") ? " Variables are written whole — there is no sub-path write." : "";
|
|
411
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: '${name}' is not a valid variable name (lowercase ` +
|
|
412
|
+
`letters, digits and underscores, starting with a letter).${hint} Nothing was written.`);
|
|
413
|
+
}
|
|
414
|
+
if (store[name]?.locked) {
|
|
415
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: '${name}' is locked and cannot be changed ` +
|
|
416
|
+
`(current value: ${JSON.stringify(store[name]?.value)}). Nothing was written.`);
|
|
417
|
+
}
|
|
418
|
+
if (name === TITLE_VARIABLE) {
|
|
419
|
+
// Refused, not silently dropped: an agent that believes it locked the title must not be lied to.
|
|
420
|
+
if (lock === true) {
|
|
421
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: '${TITLE_VARIABLE}' is never locked — it names the ` +
|
|
422
|
+
`task this run is doing, and it has to stay correctable when the task changes. ` +
|
|
423
|
+
`Retry without \`lock\`. Nothing was written.`);
|
|
424
|
+
}
|
|
425
|
+
const problem = titleWriteError(variables[name]);
|
|
426
|
+
if (problem)
|
|
427
|
+
return refuse(`${SET_VARIABLES_TOOL} rejected: ${problem} Nothing was written.`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
const locked = lock === true;
|
|
431
|
+
const delta = {};
|
|
432
|
+
for (const [name, value] of Object.entries(variables)) {
|
|
433
|
+
delta[name] =
|
|
434
|
+
name === TITLE_VARIABLE
|
|
435
|
+
? { value: normalizeTitle(value), locked: false }
|
|
436
|
+
: { value, locked };
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
message: toolReply(SET_VARIABLES_TOOL, request.toolCallId, `Set ${names.join(", ")}${locked ? " (locked)" : ""}.`),
|
|
440
|
+
delta,
|
|
441
|
+
written: names,
|
|
442
|
+
locked,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
/** Wrap an `archmax_set_variables` outcome as the update that commits its delta. */
|
|
446
|
+
export function setVariablesCommand(outcome) {
|
|
447
|
+
if (!outcome.delta)
|
|
448
|
+
return outcome.message;
|
|
449
|
+
return commit({ variables: outcome.delta, messages: [outcome.message] });
|
|
450
|
+
}
|
|
451
|
+
/** The variables a state still owes before it may be left — its `requires` minus what is set. */
|
|
452
|
+
export function unmetRequirements(required, store) {
|
|
453
|
+
return required.filter((name) => store[name] === undefined);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* The wording for a `${{…}}` reference in the agent's own tool arguments that
|
|
457
|
+
* could not be resolved: a correctable refusal carrying the two fixes it might
|
|
458
|
+
* need — discover what is set, or escape a reference meant as literal text.
|
|
459
|
+
*/
|
|
460
|
+
export function unresolvedArgumentMessage(failure) {
|
|
461
|
+
// A function replacer: `$$` in a string replacement is itself an escape for `$`.
|
|
462
|
+
const escaped = failure.reference.replace("${{", () => "$${{");
|
|
463
|
+
return (`Call refused before it ran: the argument reference ${failure.reference} could not be ` +
|
|
464
|
+
`resolved — ${failure.detail}. Nothing was called and no partial value was delivered. ` +
|
|
465
|
+
`Check what is set with \`${GET_VARIABLES_TOOL}\`, then retry with a reference that ` +
|
|
466
|
+
`resolves — or, if you meant the literal text, write it as ${escaped}.`);
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=control-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-tools.js","sourceRoot":"","sources":["../../src/workflow/control-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Governance of the two calls the model makes: `wrapModelCall` shapes the
|
|
3
|
+
* payload (per-state tool disclosure, the volatile prompt section, the cache
|
|
4
|
+
* breakpoint, the `before` hook, the time budget) and `wrapToolCall` decides
|
|
5
|
+
* every tool call (variable substitution, the kernel's verdict, the calls the
|
|
6
|
+
* runtime services itself, telemetry, skill redaction). The hooks that wire
|
|
7
|
+
* these into the agent live in `middleware.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import type { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
10
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
11
|
+
import { Command } from "@langchain/langgraph";
|
|
12
|
+
import type { PtcToolGateway } from "../sandbox/ptc-gateway.js";
|
|
13
|
+
import type { LifecycleContext, LifecycleRunner } from "../lifecycle/runner.js";
|
|
14
|
+
import type { WorkflowMachine } from "../machine/machine.js";
|
|
15
|
+
import type { WorkflowEventEmitter } from "../core/events.js";
|
|
16
|
+
import { type PendingDecision } from "./state.js";
|
|
17
|
+
import type { SubWorkflowDispatcher } from "./sub-workflow.js";
|
|
18
|
+
import { type GovernanceRule } from "../kernel/kernel.js";
|
|
19
|
+
import type { MountPrefixes } from "../core/mounts.js";
|
|
20
|
+
import { type SkillRegistry } from "../core/skills.js";
|
|
21
|
+
import { asModelCallResult, type ModelCallHandler, type ModelCallRequest, type WorkflowToolCallHandler, type WorkflowToolCallRequest } from "../core/deepagents.js";
|
|
22
|
+
import { type CacheTtl, type PromptCacheStrategy } from "./prompt-cache.js";
|
|
23
|
+
export { buildRunnableConfig } from "./runtime-config.js";
|
|
24
|
+
/**
|
|
25
|
+
* Payload shaping resolved once at assembly and applied on every model call.
|
|
26
|
+
* Presentation only — which bytes the model sees and which prefix is marked
|
|
27
|
+
* cacheable; none of it widens what the kernel permits.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Which model a state's calls run on, and the prompt-cache mechanism that model
|
|
31
|
+
* uses. Resolved once per composition (`resolveStateModels`) from what the spec
|
|
32
|
+
* declares; a state with nothing of its own is absent from `modelFor`, so the
|
|
33
|
+
* graph's own model — the workflow's — is what runs.
|
|
34
|
+
*/
|
|
35
|
+
export interface StateModels {
|
|
36
|
+
/** The model this state's calls run on, or `undefined` for the composition's own. */
|
|
37
|
+
modelFor(state: string): BaseChatModel | undefined;
|
|
38
|
+
/** The cache strategy of the model in force for this state. */
|
|
39
|
+
cacheStrategyFor(state: string): PromptCacheStrategy;
|
|
40
|
+
/**
|
|
41
|
+
* The **id** of the model in force for this state — read from the model the
|
|
42
|
+
* assembly will actually run, not from what the spec declares, so it is
|
|
43
|
+
* answered the same way whether the model came from a declared id, the
|
|
44
|
+
* environment, an explicit `model` or a `modelFactory`. `undefined` when the
|
|
45
|
+
* model exposes no id.
|
|
46
|
+
*
|
|
47
|
+
* Used to price a call whose response names no model: an OpenAI-compatible
|
|
48
|
+
* endpoint is not obliged to echo one back, and without this the runtime would
|
|
49
|
+
* hold the id it asked for and still report no cost.
|
|
50
|
+
*/
|
|
51
|
+
idFor(state: string): string | undefined;
|
|
52
|
+
}
|
|
53
|
+
export interface PromptShaping {
|
|
54
|
+
cacheStrategy?: PromptCacheStrategy;
|
|
55
|
+
cacheTtl?: CacheTtl;
|
|
56
|
+
/** Conditional built-ins this assembly withholds; their upstream prompt guidance is pruned. */
|
|
57
|
+
withheldBuiltins?: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface GovernanceContext {
|
|
60
|
+
machine: WorkflowMachine;
|
|
61
|
+
emit: WorkflowEventEmitter;
|
|
62
|
+
lifecycle: LifecycleRunner;
|
|
63
|
+
policyRules: GovernanceRule[];
|
|
64
|
+
mountPrefixes: MountPrefixes;
|
|
65
|
+
skills: SkillRegistry;
|
|
66
|
+
shaping: PromptShaping;
|
|
67
|
+
/** Per-state models; omitted, every call runs on the graph's own model. */
|
|
68
|
+
stateModels?: StateModels;
|
|
69
|
+
ptcGateway?: PtcToolGateway;
|
|
70
|
+
subWorkflows?: SubWorkflowDispatcher;
|
|
71
|
+
sessionIdOf(runtime: unknown): string;
|
|
72
|
+
}
|
|
73
|
+
export interface Governance {
|
|
74
|
+
wrapModelCall(request: ModelCallRequest, handler: ModelCallHandler): Promise<ReturnType<typeof asModelCallResult>>;
|
|
75
|
+
wrapToolCall(request: WorkflowToolCallRequest, handler: WorkflowToolCallHandler): Promise<Command | ToolMessage>;
|
|
76
|
+
/** A hook context for one request, from the model context captured for the session. */
|
|
77
|
+
lifecycleCtx(sessionId: string, state: unknown, messages: unknown[]): LifecycleContext;
|
|
78
|
+
reportMove(sessionId: string, moved: {
|
|
79
|
+
from: string;
|
|
80
|
+
to: string;
|
|
81
|
+
park?: PendingDecision;
|
|
82
|
+
}): void;
|
|
83
|
+
/** End the session's turn: drop its model context and return the `beforeDone` entries staged this turn. */
|
|
84
|
+
endTurn(sessionId: string): Record<string, boolean> | undefined;
|
|
85
|
+
/** Release the session and every sub-run scope nested beneath it; returns the scopes released. */
|
|
86
|
+
release(sessionId: string): string[];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resolve the name the model called to a registered tool: an exact match, or the
|
|
90
|
+
* bare action name of a namespaced `<collection>__<action>` id (models routinely
|
|
91
|
+
* drop the prefix) when that suffix is unambiguous.
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolveToolName(called: string, registered: string[]): string | undefined;
|
|
94
|
+
/** The reason a message stands in for a model call that exceeded its `budget.timeoutMs`, if it does. */
|
|
95
|
+
export declare function budgetExhaustedReason(message: unknown): string | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* The reason a `before` hook refused the state this message stands in for, if it
|
|
98
|
+
* did. The refusal is a fail-closed rejection like any other, so `afterModel`
|
|
99
|
+
* routes it through `on_error` instead of letting the turn settle as completed
|
|
100
|
+
* (issue #29) — the marker is how it tells the refusal apart from an ordinary
|
|
101
|
+
* reply, since the model never ran.
|
|
102
|
+
*/
|
|
103
|
+
export declare function beforeVetoReason(message: unknown): string | undefined;
|
|
104
|
+
export declare function createGovernance(ctx: GovernanceContext): Governance;
|