@archmax-ai/harness 0.9.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.
- package/README.md +58 -14
- package/dist/agent.d.ts +4 -6
- package/dist/agent.js +4 -6
- package/dist/agent.js.map +1 -1
- package/dist/assembly/compose.d.ts +5 -24
- package/dist/assembly/compose.js +28 -42
- package/dist/assembly/compose.js.map +1 -1
- package/dist/assembly/delegation-registry.js +3 -14
- package/dist/assembly/delegation-registry.js.map +1 -1
- package/dist/assembly/index.d.ts +8 -15
- package/dist/assembly/index.js +21 -28
- package/dist/assembly/index.js.map +1 -1
- package/dist/assembly/plain.js +1 -2
- package/dist/assembly/plain.js.map +1 -1
- package/dist/authoring-skill/archmax-harness/README.md +5 -5
- package/dist/authoring-skill/archmax-harness/SKILL.md +72 -30
- package/dist/authoring-skill/archmax-harness/references/backend-integration.md +33 -24
- package/dist/authoring-skill/archmax-harness/references/cases.md +41 -8
- package/dist/authoring-skill/archmax-harness/references/{hook-and-test-scripts.md → code-state-and-test-scripts.md} +599 -339
- package/dist/authoring-skill/archmax-harness/references/code-states-and-scripts.md +115 -0
- package/dist/authoring-skill/archmax-harness/references/diagnostics.md +40 -7
- package/dist/authoring-skill/archmax-harness/references/wiring.md +19 -10
- package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +404 -293
- package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +151 -62
- package/dist/cli/state-flow.d.ts +1 -1
- package/dist/cli/state-flow.js +18 -28
- package/dist/cli/state-flow.js.map +1 -1
- package/dist/cli/turn.d.ts +1 -1
- package/dist/cli/turn.js +1 -1
- package/dist/core/code-description.d.ts +3 -3
- package/dist/core/code-description.js +3 -3
- package/dist/core/deepagents.d.ts +5 -12
- package/dist/core/deepagents.js +4 -17
- package/dist/core/deepagents.js.map +1 -1
- package/dist/core/events.d.ts +23 -42
- package/dist/core/events.js +21 -24
- package/dist/core/events.js.map +1 -1
- package/dist/core/message-readers.d.ts +4 -5
- package/dist/core/message-readers.js +3 -8
- package/dist/core/message-readers.js.map +1 -1
- package/dist/core/messages.d.ts +0 -22
- package/dist/core/messages.js +1 -32
- package/dist/core/messages.js.map +1 -1
- package/dist/core/mounts.js +3 -3
- package/dist/core/platform-prompt.generated.js +1 -1
- package/dist/core/platform-prompt.generated.js.map +1 -1
- package/dist/core/session-zone.d.ts +1 -1
- package/dist/core/session-zone.js +1 -1
- package/dist/core/workspace-context.d.ts +1 -1
- package/dist/core/workspace.d.ts +1 -1
- package/dist/core/workspace.js +1 -1
- package/dist/core/zones.d.ts +4 -4
- package/dist/core/zones.js +5 -5
- package/dist/core/zones.js.map +1 -1
- package/dist/env.d.ts +9 -9
- package/dist/index.d.ts +3 -7
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/kernel/kernel.d.ts +31 -61
- package/dist/kernel/kernel.js +54 -112
- package/dist/kernel/kernel.js.map +1 -1
- package/dist/machine/lint-spec.js +53 -12
- package/dist/machine/lint-spec.js.map +1 -1
- package/dist/machine/machine.d.ts +36 -18
- package/dist/machine/machine.js +62 -51
- package/dist/machine/machine.js.map +1 -1
- package/dist/machine/spec-schema.d.ts +32 -180
- package/dist/machine/spec-schema.js +52 -113
- package/dist/machine/spec-schema.js.map +1 -1
- package/dist/machine/tool-names.d.ts +34 -16
- package/dist/machine/tool-names.js +41 -16
- package/dist/machine/tool-names.js.map +1 -1
- package/dist/machine/types.d.ts +14 -46
- package/dist/machine/types.js +0 -2
- package/dist/machine/types.js.map +1 -1
- package/dist/machine/validate-spec.d.ts +1 -1
- package/dist/public/sandbox.d.ts +59 -95
- package/dist/public/sandbox.js +22 -23
- package/dist/public/sandbox.js.map +1 -1
- package/dist/public/spec.d.ts +13 -20
- package/dist/public/spec.js +12 -20
- package/dist/public/spec.js.map +1 -1
- package/dist/runtime/contract.d.ts +11 -12
- package/dist/runtime/contract.js +16 -16
- package/dist/runtime/contract.js.map +1 -1
- package/dist/sandbox/assets/parts/code-state.js +17 -0
- package/dist/sandbox/executor.d.ts +25 -7
- package/dist/sandbox/executor.js +56 -57
- package/dist/sandbox/executor.js.map +1 -1
- package/dist/sandbox/imports.d.ts +10 -10
- package/dist/sandbox/imports.js +11 -11
- package/dist/sandbox/imports.js.map +1 -1
- package/dist/sandbox/prelude.d.ts +5 -6
- package/dist/sandbox/prelude.js +38 -35
- package/dist/sandbox/prelude.js.map +1 -1
- package/dist/sandbox/ptc-gateway.d.ts +19 -18
- package/dist/sandbox/ptc-gateway.js +26 -22
- package/dist/sandbox/ptc-gateway.js.map +1 -1
- package/dist/sessions/resume.d.ts +2 -2
- package/dist/sessions/resume.js +1 -1
- package/dist/sessions/resume.js.map +1 -1
- package/dist/sessions/scope.d.ts +0 -10
- package/dist/sessions/scope.js +0 -17
- package/dist/sessions/scope.js.map +1 -1
- package/dist/sessions/summary.d.ts +1 -1
- package/dist/testing/assertions.js +9 -4
- package/dist/testing/assertions.js.map +1 -1
- package/dist/testing/driver.js +3 -0
- package/dist/testing/driver.js.map +1 -1
- package/dist/testing/interpreter.d.ts +2 -2
- package/dist/testing/runner.d.ts +2 -2
- package/dist/validate/validate.d.ts +1 -1
- package/dist/validate/validate.js +39 -70
- package/dist/validate/validate.js.map +1 -1
- package/dist/workflow/automated-controls.d.ts +63 -0
- package/dist/workflow/automated-controls.js +158 -0
- package/dist/workflow/automated-controls.js.map +1 -0
- package/dist/workflow/automated.d.ts +112 -0
- package/dist/workflow/automated.js +163 -0
- package/dist/workflow/automated.js.map +1 -0
- package/dist/workflow/code-state.d.ts +46 -0
- package/dist/workflow/code-state.js +26 -0
- package/dist/workflow/code-state.js.map +1 -0
- package/dist/workflow/control-tools.d.ts +54 -23
- package/dist/workflow/control-tools.js +99 -79
- package/dist/workflow/control-tools.js.map +1 -1
- package/dist/workflow/file-values.d.ts +4 -4
- package/dist/workflow/file-values.js +1 -1
- package/dist/workflow/file-values.js.map +1 -1
- package/dist/workflow/governance.d.ts +11 -22
- package/dist/workflow/governance.js +47 -104
- package/dist/workflow/governance.js.map +1 -1
- package/dist/workflow/grader-state.d.ts +55 -0
- package/dist/workflow/grader-state.js +182 -0
- package/dist/workflow/grader-state.js.map +1 -0
- package/dist/workflow/history.d.ts +11 -0
- package/dist/{lifecycle/transcript.js → workflow/history.js} +24 -8
- package/dist/workflow/history.js.map +1 -0
- package/dist/workflow/middleware.d.ts +14 -17
- package/dist/workflow/middleware.js +109 -95
- package/dist/workflow/middleware.js.map +1 -1
- package/dist/workflow/move-events.d.ts +21 -0
- package/dist/workflow/move-events.js +20 -0
- package/dist/workflow/move-events.js.map +1 -0
- package/dist/workflow/on-error.js +0 -2
- package/dist/workflow/on-error.js.map +1 -1
- package/dist/workflow/parks.d.ts +9 -2
- package/dist/workflow/parks.js +16 -10
- package/dist/workflow/parks.js.map +1 -1
- package/dist/workflow/paths.d.ts +9 -9
- package/dist/workflow/paths.js +19 -19
- package/dist/workflow/paths.js.map +1 -1
- package/dist/workflow/render-prompt.d.ts +7 -5
- package/dist/workflow/render-prompt.js +22 -37
- package/dist/workflow/render-prompt.js.map +1 -1
- package/dist/workflow/signature-checks.d.ts +2 -2
- package/dist/workflow/snapshot.js +5 -29
- package/dist/workflow/snapshot.js.map +1 -1
- package/dist/workflow/state.d.ts +14 -42
- package/dist/workflow/state.js +20 -33
- package/dist/workflow/state.js.map +1 -1
- package/dist/workflow/sub-workflow.d.ts +3 -3
- package/dist/workflow/sub-workflow.js +3 -7
- package/dist/workflow/sub-workflow.js.map +1 -1
- package/dist/workflow/tool-service.d.ts +1 -9
- package/dist/workflow/tool-service.js +21 -24
- package/dist/workflow/tool-service.js.map +1 -1
- package/dist/workflow/turn-boundary.d.ts +2 -2
- package/dist/workflow/turn-boundary.js +10 -15
- package/dist/workflow/turn-boundary.js.map +1 -1
- package/dist/workflow/turn-runner.js +5 -6
- package/dist/workflow/turn-runner.js.map +1 -1
- package/package.json +1 -1
- package/skills/archmax-harness/README.md +5 -5
- package/skills/archmax-harness/SKILL.md +72 -30
- package/skills/archmax-harness/references/backend-integration.md +33 -24
- package/skills/archmax-harness/references/cases.md +41 -8
- package/skills/archmax-harness/references/{hook-and-test-scripts.md → code-state-and-test-scripts.md} +599 -339
- package/skills/archmax-harness/references/code-states-and-scripts.md +115 -0
- package/skills/archmax-harness/references/diagnostics.md +40 -7
- package/skills/archmax-harness/references/wiring.md +19 -10
- package/skills/archmax-harness/references/workflow-schema.md +404 -293
- package/skills/archmax-harness/references/workflow-yaml.md +151 -62
- package/dist/authoring-skill/archmax-harness/references/hooks-and-scripts.md +0 -89
- package/dist/lifecycle/hook-shape.d.ts +0 -44
- package/dist/lifecycle/hook-shape.js +0 -66
- package/dist/lifecycle/hook-shape.js.map +0 -1
- package/dist/lifecycle/runner.d.ts +0 -197
- package/dist/lifecycle/runner.js +0 -419
- package/dist/lifecycle/runner.js.map +0 -1
- package/dist/lifecycle/tool-calls.d.ts +0 -9
- package/dist/lifecycle/tool-calls.js +0 -57
- package/dist/lifecycle/tool-calls.js.map +0 -1
- package/dist/lifecycle/transcript.d.ts +0 -31
- package/dist/lifecycle/transcript.js.map +0 -1
- package/dist/rubrics/rubrics.d.ts +0 -135
- package/dist/rubrics/rubrics.js +0 -145
- package/dist/rubrics/rubrics.js.map +0 -1
- package/dist/sandbox/assets/parts/core.js +0 -22
- package/dist/sandbox/assets/parts/lifecycle-hook.js +0 -47
- package/dist/sandbox/bridge.d.ts +0 -16
- package/dist/sandbox/bridge.js +0 -95
- package/dist/sandbox/bridge.js.map +0 -1
- package/dist/workflow/visits.d.ts +0 -21
- package/dist/workflow/visits.js +0 -45
- package/dist/workflow/visits.js.map +0 -1
- package/skills/archmax-harness/references/hooks-and-scripts.md +0 -89
package/dist/runtime/contract.js
CHANGED
|
@@ -2,37 +2,37 @@
|
|
|
2
2
|
* What each supported runtime version implies for the surfaces that used to
|
|
3
3
|
* version themselves.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Version 3 = the state types `agent`, `human`, `grader` and `code`, with no
|
|
6
|
+
* `before`/`after` hooks; sandbox 3 = a code state's script is a default-export
|
|
7
|
+
* function called with the state's input that moves the session through
|
|
8
|
+
* `tools.archmax_advance`, plus typed `@archmax-ai/harness/*` import stripping.
|
|
9
|
+
* Versions 1 and 2 (the hook contract) are retired: a workspace declaring one is
|
|
10
|
+
* refused rather than half-run. The test-case format has not changed across
|
|
11
|
+
* runtime versions, which is exactly why it did not need an axis of its own.
|
|
10
12
|
*
|
|
11
13
|
* This table is the single source of the supported set — adding a runtime
|
|
12
14
|
* version is one entry here.
|
|
13
15
|
*/
|
|
14
16
|
const CONTRACT_SURFACES = {
|
|
15
|
-
"
|
|
16
|
-
"2": { sandbox: 2, testFormat: "1" },
|
|
17
|
+
"3": { sandbox: 3, testFormat: "1" },
|
|
17
18
|
};
|
|
19
|
+
/** Default contract version applied when metadata is omitted. */
|
|
20
|
+
export const DEFAULT_RUNTIME_VERSION = "3";
|
|
18
21
|
/** The sandbox script contract applied when nothing resolves a runtime version. */
|
|
19
|
-
export const DEFAULT_SANDBOX_VERSION = CONTRACT_SURFACES[
|
|
22
|
+
export const DEFAULT_SANDBOX_VERSION = CONTRACT_SURFACES[DEFAULT_RUNTIME_VERSION].sandbox;
|
|
20
23
|
/** The runtime engine this package implements. */
|
|
21
24
|
export const RUNTIME_ENGINE = "archmax-harness";
|
|
22
|
-
/** Default contract version applied when metadata is omitted. */
|
|
23
|
-
export const DEFAULT_RUNTIME_VERSION = "1";
|
|
24
25
|
/** The contract resolved for workspaces that omit `runtime` metadata. */
|
|
25
26
|
export const DEFAULT_RUNTIME_CONTRACT = {
|
|
26
27
|
engine: RUNTIME_ENGINE,
|
|
27
28
|
version: DEFAULT_RUNTIME_VERSION,
|
|
28
29
|
};
|
|
29
30
|
/**
|
|
30
|
-
* The explicit set of runtime contracts the installed runtime supports.
|
|
31
|
-
*
|
|
32
|
-
* `WORKFLOW.md` layout, declarative `tests:` block, typed sandbox imports,
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* support checking, validation, and docs. Version 1 remains supported.
|
|
31
|
+
* The explicit set of runtime contracts the installed runtime supports. Version
|
|
32
|
+
* 3 identifies the current authoring contract (two-file `workflow.yaml` /
|
|
33
|
+
* `WORKFLOW.md` layout, declarative `tests:` block, typed sandbox imports, the
|
|
34
|
+
* four state types). Load behavior is layout-driven, not version-driven — the
|
|
35
|
+
* version is declarative metadata for support checking, validation, and docs.
|
|
36
36
|
*/
|
|
37
37
|
export const SUPPORTED_RUNTIME_CONTRACTS = Object.keys(CONTRACT_SURFACES).map((version) => ({ engine: RUNTIME_ENGINE, version }));
|
|
38
38
|
/** Render a contract as `engine@version` for messages and artifacts. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/runtime/contract.ts"],"names":[],"mappings":"AA+BA
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/runtime/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Code-state context: the contract marker and the `defineCodeState` authoring
|
|
2
|
+
// alias. These globals are absent from the PTC context.
|
|
3
|
+
//
|
|
4
|
+
// A code state's script moves the session itself — `tools.archmax_advance` — or
|
|
5
|
+
// ends it — `tools.archmax_raise`; nothing it returns is read, so there is no
|
|
6
|
+
// verdict vocabulary here.
|
|
7
|
+
|
|
8
|
+
globalThis.SANDBOX_CONTRACT = { context: "code", version: globalThis.__SANDBOX_VERSION };
|
|
9
|
+
|
|
10
|
+
// `export default defineCodeState(fn)` and `export default async function (...)`
|
|
11
|
+
// both register the state's function: the executor rewrites `export default` to
|
|
12
|
+
// an assignment of `__stateDef`, so `defineCodeState` is an identity that also
|
|
13
|
+
// registers.
|
|
14
|
+
globalThis.defineCodeState = (fn) => {
|
|
15
|
+
globalThis.__stateDef = fn;
|
|
16
|
+
return fn;
|
|
17
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { StructuredTool } from "@langchain/core/tools";
|
|
2
2
|
import type { Workspace } from "../core/workspace.js";
|
|
3
3
|
import { type SandboxRuntime } from "./runtime.js";
|
|
4
|
+
/** The REPL namespace of the agent's own sandbox tools: one per session scope, kept across states. */
|
|
4
5
|
export declare const AGENT_SESSION = "agent";
|
|
5
|
-
|
|
6
|
+
/** The REPL namespace a code state's script runs in: fresh per run, disposed when it settles. */
|
|
7
|
+
export declare const CODE_SESSION = "code";
|
|
6
8
|
export interface ScriptRunParams {
|
|
7
9
|
sessionId: string;
|
|
8
10
|
sessionNamespace: string;
|
|
9
11
|
args?: Record<string, unknown>;
|
|
10
12
|
tools?: StructuredTool[];
|
|
11
|
-
/** Run as a lifecycle hook: the hook prelude, the hook input, a verdict back. */
|
|
12
|
-
lifecycle?: boolean;
|
|
13
13
|
/**
|
|
14
14
|
* `runCode` only: prepend the context's prelude, so inline code runs under
|
|
15
15
|
* the same contract as an authored file. The agent's `archmax_eval` sets it;
|
|
@@ -17,10 +17,9 @@ export interface ScriptRunParams {
|
|
|
17
17
|
*/
|
|
18
18
|
prelude?: boolean;
|
|
19
19
|
/**
|
|
20
|
-
* The tool names a
|
|
21
|
-
* surface, re-applied at the start of this evaluation.
|
|
22
|
-
*
|
|
23
|
-
* which is what a lifecycle hook keeps.
|
|
20
|
+
* The tool names a script lists and reaches under `tools`: the active state's
|
|
21
|
+
* surface, re-applied at the start of this evaluation. Absent, `tools` is
|
|
22
|
+
* every tool the session injected (a bare executor, in a test).
|
|
24
23
|
*/
|
|
25
24
|
surface?: readonly string[];
|
|
26
25
|
/**
|
|
@@ -39,9 +38,28 @@ export interface ScriptOutcome {
|
|
|
39
38
|
};
|
|
40
39
|
formatted: string;
|
|
41
40
|
}
|
|
41
|
+
/** What a code state's run is given: its session, its input, its state's tools. */
|
|
42
|
+
export interface CodeStateRunParams {
|
|
43
|
+
sessionId: string;
|
|
44
|
+
/** The state's input: the default export's argument (without `tools`) and the global `args`. */
|
|
45
|
+
args: Record<string, unknown>;
|
|
46
|
+
/** The code state's tools, already governed. */
|
|
47
|
+
tools: StructuredTool[];
|
|
48
|
+
/** The names `tools` lists and reaches — the code state's surface. */
|
|
49
|
+
surface: readonly string[];
|
|
50
|
+
/** The turn's abort signal: once it aborts, the run settles with an error. */
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
}
|
|
42
53
|
export interface ScriptExecutor {
|
|
43
54
|
runFile(filePath: string, params: ScriptRunParams): Promise<ScriptOutcome>;
|
|
44
55
|
runCode(code: string, params: ScriptRunParams): Promise<ScriptOutcome>;
|
|
56
|
+
/**
|
|
57
|
+
* Run a code state's script (`code` context) in a REPL of its own: fresh for
|
|
58
|
+
* the run and disposed when it settles, so its injected `tools` are exactly its
|
|
59
|
+
* state's and nothing it defines reaches the next run. The default export is
|
|
60
|
+
* called with `args` plus `tools`; its return value is not read.
|
|
61
|
+
*/
|
|
62
|
+
runCodeState(filePath: string, params: CodeStateRunParams): Promise<ScriptOutcome>;
|
|
45
63
|
dispose(sessionId: string, sessionNamespace?: string): void;
|
|
46
64
|
}
|
|
47
65
|
export interface ScriptExecutorOptions {
|
package/dist/sandbox/executor.js
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
import { toCamelCase, transformForEval } from "@langchain/quickjs";
|
|
2
2
|
import { normalizeRelPath } from "../core/workspace.js";
|
|
3
3
|
import { readPrelude } from "./prelude.js";
|
|
4
|
-
import {
|
|
5
|
-
import { TOOL_CALLS_QUERY } from "../machine/tool-names.js";
|
|
4
|
+
import { prepareScriptSource } from "./imports.js";
|
|
6
5
|
import { DEFAULT_SANDBOX_VERSION } from "../runtime/contract.js";
|
|
7
6
|
import { createQuickJsSandboxRuntime } from "./runtime.js";
|
|
8
7
|
/**
|
|
9
8
|
* Sandboxed execution for the two sandbox tools (`archmax_eval`, `archmax_run`)
|
|
10
|
-
* and for
|
|
9
|
+
* and for code states.
|
|
11
10
|
*
|
|
12
11
|
* Script *sources* are read through the {@link Workspace} backend (not the
|
|
13
12
|
* local filesystem), so scripts work against whatever Deep Agents backend the
|
|
14
13
|
* runtime is configured with. Inline code and an authored file evaluate in the
|
|
15
14
|
* same REPL session for a scope and under the same PTC contract — the only
|
|
16
|
-
* difference is where the source came from.
|
|
15
|
+
* difference is where the source came from. A code state's script runs in a
|
|
16
|
+
* REPL of its own, fresh per run.
|
|
17
17
|
*/
|
|
18
18
|
const DEFAULT_TIMEOUT_MS = 5_000;
|
|
19
|
+
/** The REPL namespace of the agent's own sandbox tools: one per session scope, kept across states. */
|
|
19
20
|
export const AGENT_SESSION = "agent";
|
|
20
|
-
|
|
21
|
+
/** The REPL namespace a code state's script runs in: fresh per run, disposed when it settles. */
|
|
22
|
+
export const CODE_SESSION = "code";
|
|
21
23
|
function errorOutcome(message) {
|
|
22
24
|
return { ok: false, value: undefined, logs: [], error: { message }, formatted: `error: ${message}` };
|
|
23
25
|
}
|
|
24
|
-
/** Lifecycle hooks get the hook contract; everything else the PTC contract. */
|
|
25
|
-
function sandboxContext(params) {
|
|
26
|
-
return params.lifecycle ? "lifecycle-hook" : "ptc";
|
|
27
|
-
}
|
|
28
26
|
const argsAssignment = (args) => `globalThis.args = ${JSON.stringify(args ?? {})};`;
|
|
29
27
|
/**
|
|
30
28
|
* The line that scopes `tools` to a surface, after the `ptc` prelude installed
|
|
@@ -41,35 +39,23 @@ function ownNames(tools) {
|
|
|
41
39
|
return Object.fromEntries(tools.map((tool) => [tool.name, toCamelCase(tool.name)]).filter(([own, key]) => own !== key));
|
|
42
40
|
}
|
|
43
41
|
/**
|
|
44
|
-
* The code a
|
|
45
|
-
* async IIFE (`transformForEval`)
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
42
|
+
* The code a code state's script runs as. The body is evaluated as its own
|
|
43
|
+
* async IIFE (`transformForEval`) — a bare-body script simply runs — and a
|
|
44
|
+
* registered `export default` function is then called with the state's input:
|
|
45
|
+
* the arguments plus the scoped `tools`. The value is `undefined` either way: a
|
|
46
|
+
* code state moves the session through its tools, never through a return.
|
|
49
47
|
*/
|
|
50
|
-
function
|
|
51
|
-
const query = toCamelCase(TOOL_CALLS_QUERY);
|
|
48
|
+
function buildCodeStateCode(prepared, filePath, preamble, args) {
|
|
52
49
|
return [
|
|
53
|
-
|
|
54
|
-
"globalThis.
|
|
50
|
+
...preamble,
|
|
51
|
+
"globalThis.__stateDef = undefined;",
|
|
55
52
|
argsAssignment(args),
|
|
56
|
-
// The sandbox keeps the tools it was first handed: the `toolCalls` function is
|
|
57
|
-
// taken out of `tools` on the first run and kept, hidden, for every run after.
|
|
58
|
-
`if (typeof tools !== "undefined" && typeof tools.${query} === "function") {`,
|
|
59
|
-
` const query = tools.${query};`,
|
|
60
|
-
` delete tools.${query};`,
|
|
61
|
-
" globalThis.__archmaxToolCalls = async (filter) => JSON.parse(await query(filter ?? {}));",
|
|
62
|
-
"}",
|
|
63
|
-
"globalThis.args.toolCalls = globalThis.__archmaxToolCalls;",
|
|
64
53
|
`globalThis.__scriptPath = ${JSON.stringify(normalizeRelPath(filePath))};`,
|
|
65
|
-
`
|
|
66
|
-
"globalThis.
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
" }))",
|
|
71
|
-
" : globalThis.__hookBody,",
|
|
72
|
-
");",
|
|
54
|
+
`await ${transformForEval(prepared)};`,
|
|
55
|
+
"if (typeof globalThis.__stateDef === \"function\") {",
|
|
56
|
+
" await globalThis.__stateDef(Object.assign({}, globalThis.args, { tools }));",
|
|
57
|
+
"}",
|
|
58
|
+
"undefined;",
|
|
73
59
|
].join("\n");
|
|
74
60
|
}
|
|
75
61
|
export function createScriptExecutor(opts) {
|
|
@@ -91,28 +77,12 @@ export function createScriptExecutor(opts) {
|
|
|
91
77
|
});
|
|
92
78
|
return session.eval(code, timeoutMs, params.signal);
|
|
93
79
|
}
|
|
94
|
-
async function runHook(source, filePath, params) {
|
|
95
|
-
// Typed `@archmax-ai/harness/*` imports are stripped (the prelude provides the
|
|
96
|
-
// globals) and `export default` becomes the hook registration; any other
|
|
97
|
-
// import — or a source that does not parse — fails closed here, host-side.
|
|
98
|
-
let code;
|
|
99
|
-
try {
|
|
100
|
-
const prelude = readPrelude("lifecycle-hook", sandboxVersion);
|
|
101
|
-
code = buildHookCode(prepareHookSource(source, { file: filePath }), filePath, prelude, params.args);
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
return errorOutcome(err.message);
|
|
105
|
-
}
|
|
106
|
-
return evalCode(code, params);
|
|
107
|
-
}
|
|
108
80
|
return {
|
|
109
81
|
async runFile(filePath, params) {
|
|
110
82
|
const source = await workspace.readText(filePath);
|
|
111
83
|
if (source == null)
|
|
112
84
|
return errorOutcome(`cannot read script '${filePath}' from the agent workspace.`);
|
|
113
|
-
|
|
114
|
-
return runHook(source, filePath, params);
|
|
115
|
-
const prelude = readPrelude(sandboxContext(params), sandboxVersion);
|
|
85
|
+
const prelude = readPrelude("ptc", sandboxVersion);
|
|
116
86
|
const code = [
|
|
117
87
|
prelude,
|
|
118
88
|
...scopeCall(params.surface, params.tools),
|
|
@@ -127,19 +97,48 @@ export function createScriptExecutor(opts) {
|
|
|
127
97
|
return evalCode(code, params);
|
|
128
98
|
// Same contract as an authored file: the PTC prelude runs first so inline
|
|
129
99
|
// code sees the same `SANDBOX_CONTRACT` marker, the same scoped `tools` and
|
|
130
|
-
// the same absence of the
|
|
131
|
-
const preamble = [
|
|
132
|
-
readPrelude(sandboxContext(params), sandboxVersion),
|
|
133
|
-
...scopeCall(params.surface, params.tools),
|
|
134
|
-
];
|
|
100
|
+
// the same absence of the code-state vocabulary.
|
|
101
|
+
const preamble = [readPrelude("ptc", sandboxVersion), ...scopeCall(params.surface, params.tools)];
|
|
135
102
|
return evalCode(`${preamble.join("\n")}\n${code}`, params);
|
|
136
103
|
},
|
|
104
|
+
async runCodeState(filePath, params) {
|
|
105
|
+
const source = await workspace.readText(filePath);
|
|
106
|
+
if (source == null)
|
|
107
|
+
return errorOutcome(`cannot read script '${filePath}' from the authoring backend.`);
|
|
108
|
+
// Typed `@archmax-ai/harness/*` imports are stripped (the prelude provides the
|
|
109
|
+
// globals) and `export default` becomes the state's registration; any
|
|
110
|
+
// other import — or a source that does not parse — fails closed here,
|
|
111
|
+
// host-side, before a REPL exists.
|
|
112
|
+
let code;
|
|
113
|
+
try {
|
|
114
|
+
const preamble = [readPrelude("code", sandboxVersion), ...scopeCall(params.surface, params.tools)];
|
|
115
|
+
code = buildCodeStateCode(prepareScriptSource(source, { file: filePath }), filePath, preamble, params.args);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return errorOutcome(err.message);
|
|
119
|
+
}
|
|
120
|
+
// Fresh per run: a REPL keeps the tools it was first handed for good, and a
|
|
121
|
+
// code state's are its own state's.
|
|
122
|
+
const key = sessionKey(params.sessionId, CODE_SESSION);
|
|
123
|
+
runtime.dispose(key);
|
|
124
|
+
try {
|
|
125
|
+
return await evalCode(code, {
|
|
126
|
+
sessionId: params.sessionId,
|
|
127
|
+
sessionNamespace: CODE_SESSION,
|
|
128
|
+
tools: params.tools,
|
|
129
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
runtime.dispose(key);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
137
136
|
dispose(sessionId, sessionNamespace) {
|
|
138
137
|
if (sessionNamespace) {
|
|
139
138
|
runtime.dispose(sessionKey(sessionId, sessionNamespace));
|
|
140
139
|
return;
|
|
141
140
|
}
|
|
142
|
-
for (const ns of [AGENT_SESSION,
|
|
141
|
+
for (const ns of [AGENT_SESSION, CODE_SESSION]) {
|
|
143
142
|
runtime.dispose(sessionKey(sessionId, ns));
|
|
144
143
|
}
|
|
145
144
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/sandbox/executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/sandbox/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Source preparation for
|
|
2
|
+
* Source preparation for code-state scripts.
|
|
3
3
|
*
|
|
4
4
|
* `@langchain/quickjs`'s `transformForEval` (which `ReplSession.eval` applies to
|
|
5
5
|
* everything it runs) silently **drops** `import` and `export` statements and
|
|
6
|
-
* rejects nothing — so a
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* rejects nothing — so a script's `export default async function (...)` would
|
|
7
|
+
* vanish and a foreign import would pass unnoticed. This module does the three
|
|
8
|
+
* things the transform will not:
|
|
9
9
|
*
|
|
10
10
|
* - **reject** any import that is not a `@archmax-ai/harness/*` type carrier (sandbox
|
|
11
11
|
* scripts are self-contained — inline the logic or use `tools.*`);
|
|
12
12
|
* - **strip** the `@archmax-ai/harness/*` imports, preserving line count so sandbox
|
|
13
13
|
* stack traces keep pointing at the right source lines;
|
|
14
|
-
* - **rewrite** `export default <expr>` to `globalThis.
|
|
15
|
-
* the
|
|
16
|
-
* it with the
|
|
14
|
+
* - **rewrite** `export default <expr>` to `globalThis.__stateDef = <expr>`, so
|
|
15
|
+
* the state's function survives evaluation as a script and the executor can
|
|
16
|
+
* call it with the state's input.
|
|
17
17
|
*/
|
|
18
18
|
/** Thrown (host-side) when a sandbox script imports a non-`@archmax-ai/harness/*` specifier. */
|
|
19
19
|
export declare class ForbiddenSandboxImportError extends Error {
|
|
@@ -24,10 +24,10 @@ export declare class ForbiddenSandboxImportError extends Error {
|
|
|
24
24
|
/** All import specifiers in a source that are NOT `@archmax-ai/harness/*` (for validation). */
|
|
25
25
|
export declare function findForeignImports(source: string): string[];
|
|
26
26
|
/**
|
|
27
|
-
* Prepare a
|
|
28
|
-
* `export default` to the `
|
|
27
|
+
* Prepare a code-state script for evaluation: strip `@archmax-ai/harness/*`
|
|
28
|
+
* imports, rewrite `export default` to the `__stateDef` registration, and throw
|
|
29
29
|
* {@link ForbiddenSandboxImportError} on any other import specifier.
|
|
30
30
|
*/
|
|
31
|
-
export declare function
|
|
31
|
+
export declare function prepareScriptSource(source: string, opts?: {
|
|
32
32
|
file?: string;
|
|
33
33
|
}): string;
|
package/dist/sandbox/imports.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Source preparation for
|
|
2
|
+
* Source preparation for code-state scripts.
|
|
3
3
|
*
|
|
4
4
|
* `@langchain/quickjs`'s `transformForEval` (which `ReplSession.eval` applies to
|
|
5
5
|
* everything it runs) silently **drops** `import` and `export` statements and
|
|
6
|
-
* rejects nothing — so a
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* rejects nothing — so a script's `export default async function (...)` would
|
|
7
|
+
* vanish and a foreign import would pass unnoticed. This module does the three
|
|
8
|
+
* things the transform will not:
|
|
9
9
|
*
|
|
10
10
|
* - **reject** any import that is not a `@archmax-ai/harness/*` type carrier (sandbox
|
|
11
11
|
* scripts are self-contained — inline the logic or use `tools.*`);
|
|
12
12
|
* - **strip** the `@archmax-ai/harness/*` imports, preserving line count so sandbox
|
|
13
13
|
* stack traces keep pointing at the right source lines;
|
|
14
|
-
* - **rewrite** `export default <expr>` to `globalThis.
|
|
15
|
-
* the
|
|
16
|
-
* it with the
|
|
14
|
+
* - **rewrite** `export default <expr>` to `globalThis.__stateDef = <expr>`, so
|
|
15
|
+
* the state's function survives evaluation as a script and the executor can
|
|
16
|
+
* call it with the state's input.
|
|
17
17
|
*/
|
|
18
18
|
/** Import specifiers the sandbox accepts (and strips) in script sources. */
|
|
19
19
|
const ALLOWED_SPECIFIER_PREFIX = "@archmax-ai/harness";
|
|
@@ -52,16 +52,16 @@ export function findForeignImports(source) {
|
|
|
52
52
|
return foreign;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Prepare a
|
|
56
|
-
* `export default` to the `
|
|
55
|
+
* Prepare a code-state script for evaluation: strip `@archmax-ai/harness/*`
|
|
56
|
+
* imports, rewrite `export default` to the `__stateDef` registration, and throw
|
|
57
57
|
* {@link ForbiddenSandboxImportError} on any other import specifier.
|
|
58
58
|
*/
|
|
59
|
-
export function
|
|
59
|
+
export function prepareScriptSource(source, opts = {}) {
|
|
60
60
|
const stripped = String(source).replace(IMPORT_RE, (whole, _lead, specifier) => {
|
|
61
61
|
if (!specifierAllowed(specifier))
|
|
62
62
|
throw new ForbiddenSandboxImportError(specifier, opts.file);
|
|
63
63
|
return "\n".repeat(whole.split("\n").length - 1);
|
|
64
64
|
});
|
|
65
|
-
return stripped.replace(EXPORT_DEFAULT_RE, "$1$2globalThis.
|
|
65
|
+
return stripped.replace(EXPORT_DEFAULT_RE, "$1$2globalThis.__stateDef = ");
|
|
66
66
|
}
|
|
67
67
|
//# sourceMappingURL=imports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/sandbox/imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,4EAA4E;AAC5E,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,SAAS,GAAG,qEAAqE,CAAC;AAExF,8CAA8C;AAC9C,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AAErE,gGAAgG;AAChG,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAEzC;IACA;IAFX,YACW,SAAiB,EACjB,IAAa;QAEtB,KAAK,CACH,0FAA0F;YACxF,2BAA2B,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;YACtE,gFAAgF,CACnF,CAAC;QAPO,cAAS,GAAT,SAAS,CAAQ;QACjB,SAAI,GAAJ,IAAI,CAAS;QAOtB,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,CACL,SAAS,KAAK,wBAAwB;QACtC,SAAS,CAAC,UAAU,CAAC,GAAG,wBAAwB,GAAG,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD;;;;GAIG;AACH,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/sandbox/imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,4EAA4E;AAC5E,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,SAAS,GAAG,qEAAqE,CAAC;AAExF,8CAA8C;AAC9C,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AAErE,gGAAgG;AAChG,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAEzC;IACA;IAFX,YACW,SAAiB,EACjB,IAAa;QAEtB,KAAK,CACH,0FAA0F;YACxF,2BAA2B,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;YACtE,gFAAgF,CACnF,CAAC;QAPO,cAAS,GAAT,SAAS,CAAQ;QACjB,SAAI,GAAJ,IAAI,CAAS;QAOtB,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,CACL,SAAS,KAAK,wBAAwB;QACtC,SAAS,CAAC,UAAU,CAAC,GAAG,wBAAwB,GAAG,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAA0B,EAAE;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,SAAiB,EAAE,EAAE;QAC7F,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,8BAA8B,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { type SandboxContext } from "../runtime/contract.js";
|
|
2
2
|
/**
|
|
3
|
-
* Assemble the QuickJS prelude for a sandbox context
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Assemble the QuickJS prelude for a sandbox context: `ptc` is the contract
|
|
4
|
+
* marker and the scoped `tools` view; `code` adds the code-state part — its own
|
|
5
|
+
* marker and the `defineCodeState` alias — to the same view. Cached per
|
|
6
6
|
* `(context, version)`.
|
|
7
7
|
*
|
|
8
|
-
* There are exactly two preludes
|
|
9
|
-
*
|
|
10
|
-
* the phase vetoes fail-closed.
|
|
8
|
+
* There are exactly two preludes and no compatibility prelude for a superseded
|
|
9
|
+
* vocabulary, so a source using one throws in the sandbox and fails closed.
|
|
11
10
|
*/
|
|
12
11
|
export declare function readPrelude(context?: SandboxContext, version?: number): string;
|
package/dist/sandbox/prelude.js
CHANGED
|
@@ -16,26 +16,23 @@ function readPart(name) {
|
|
|
16
16
|
return content;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* The
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
19
|
+
* The scoped `tools` view, shared by both contexts. The session injects every
|
|
20
|
+
* tool it was handed once, at its first evaluation, and keeps that object for
|
|
21
|
+
* its lifetime — for the agent's REPL, across every state the session moves
|
|
22
|
+
* through. So the scoping happens in here: one Proxy, installed once, whose
|
|
23
|
+
* listing *and* lookup are the surface the executor names per evaluation
|
|
24
|
+
* (`__archmaxScope`). A name outside the surface is `undefined`, exactly as it
|
|
25
|
+
* is absent from `Object.keys(tools)` and from `in`: a script reaches the
|
|
26
|
+
* state's tools and nothing else. Its identity never changes, so a reference an
|
|
27
|
+
* earlier evaluation kept reads the current state. The session keys each tool by
|
|
28
|
+
* its camelCase name, but a model writes the name it calls the tool by
|
|
29
|
+
* (`tools.read_file`), so the executor also hands over each tool's own name →
|
|
30
|
+
* its key, and every lookup resolves through that; the listing stays the keys.
|
|
31
|
+
* A call without an input passes `{}`: the session reads its argument handle
|
|
32
|
+
* unconditionally, so a bare `tools.archmax_get_history()` would otherwise fail.
|
|
33
|
+
* An IIFE: the evaluation hoists top-level declarations onto `globalThis`.
|
|
23
34
|
*/
|
|
24
|
-
const
|
|
25
|
-
`globalThis.SANDBOX_CONTRACT = { context: "ptc", version: globalThis.__SANDBOX_VERSION };`,
|
|
26
|
-
// The session injects every PTC tool once, at its first evaluation, and keeps
|
|
27
|
-
// that object for its lifetime — across every state the run moves through. So
|
|
28
|
-
// the scoping happens in here: one Proxy, installed once, whose listing is the
|
|
29
|
-
// surface the executor names per evaluation (`__archmaxScope`). Its identity
|
|
30
|
-
// never changes, so a reference an earlier evaluation kept reads the current
|
|
31
|
-
// state. `get` still resolves a registered name outside the view, so calling
|
|
32
|
-
// one reaches governance and its refusal, not a TypeError. The session keys
|
|
33
|
-
// each tool by its camelCase name, but a model writes the name it calls the
|
|
34
|
-
// tool by (`tools.read_file`), so the executor also hands over each tool's own
|
|
35
|
-
// name → its key, and every lookup resolves through that; the listing stays
|
|
36
|
-
// the keys. An IIFE: the evaluation hoists top-level declarations onto
|
|
37
|
-
// `globalThis`.
|
|
38
|
-
`(() => {
|
|
35
|
+
const SCOPED_TOOLS_VIEW = `(() => {
|
|
39
36
|
if (globalThis.__archmaxScope) return;
|
|
40
37
|
const all = globalThis.tools != null && typeof globalThis.tools === "object" ? globalThis.tools : {};
|
|
41
38
|
const injected = (name) => typeof name === "string" && Object.prototype.hasOwnProperty.call(all, name);
|
|
@@ -44,16 +41,19 @@ const PTC_PRELUDE = [
|
|
|
44
41
|
const keyOf = (name) =>
|
|
45
42
|
!injected(name) && typeof name === "string" && Object.prototype.hasOwnProperty.call(keys, name) ? keys[name] : name;
|
|
46
43
|
const visible = (name) => injected(name) && (surface === null || surface.has(name));
|
|
44
|
+
const callers = {};
|
|
45
|
+
const caller = (key) =>
|
|
46
|
+
(callers[key] ??= (input, ...rest) => all[key](input === undefined ? {} : input, ...rest));
|
|
47
47
|
const view = new Proxy({}, {
|
|
48
48
|
get: (_target, name) => {
|
|
49
49
|
const key = keyOf(name);
|
|
50
|
-
return
|
|
50
|
+
return visible(key) ? caller(key) : undefined;
|
|
51
51
|
},
|
|
52
52
|
has: (_target, name) => visible(keyOf(name)),
|
|
53
53
|
ownKeys: () => Object.keys(all).filter(visible),
|
|
54
54
|
getOwnPropertyDescriptor: (_target, name) => {
|
|
55
55
|
const key = keyOf(name);
|
|
56
|
-
return visible(key) ? { value:
|
|
56
|
+
return visible(key) ? { value: caller(key), writable: false, enumerable: true, configurable: true } : undefined;
|
|
57
57
|
},
|
|
58
58
|
});
|
|
59
59
|
Object.defineProperty(globalThis, "__archmaxScope", {
|
|
@@ -63,30 +63,33 @@ const PTC_PRELUDE = [
|
|
|
63
63
|
globalThis.tools = view;
|
|
64
64
|
},
|
|
65
65
|
});
|
|
66
|
-
})()
|
|
66
|
+
})();`;
|
|
67
|
+
/**
|
|
68
|
+
* The PTC context's prelude: the versioned contract marker and the scoped
|
|
69
|
+
* `tools` view. The agent's own code (`archmax_eval`, `archmax_run`) gets no
|
|
70
|
+
* code-state vocabulary — `tools` and `args` are injected separately by the
|
|
71
|
+
* executor and the QuickJS session.
|
|
72
|
+
*/
|
|
73
|
+
const PTC_PRELUDE = [
|
|
74
|
+
`globalThis.SANDBOX_CONTRACT = { context: "ptc", version: globalThis.__SANDBOX_VERSION };`,
|
|
75
|
+
SCOPED_TOOLS_VIEW,
|
|
67
76
|
].join("\n");
|
|
68
77
|
/**
|
|
69
|
-
* Assemble the QuickJS prelude for a sandbox context
|
|
70
|
-
*
|
|
71
|
-
*
|
|
78
|
+
* Assemble the QuickJS prelude for a sandbox context: `ptc` is the contract
|
|
79
|
+
* marker and the scoped `tools` view; `code` adds the code-state part — its own
|
|
80
|
+
* marker and the `defineCodeState` alias — to the same view. Cached per
|
|
72
81
|
* `(context, version)`.
|
|
73
82
|
*
|
|
74
|
-
* There are exactly two preludes
|
|
75
|
-
*
|
|
76
|
-
* the phase vetoes fail-closed.
|
|
83
|
+
* There are exactly two preludes and no compatibility prelude for a superseded
|
|
84
|
+
* vocabulary, so a source using one throws in the sandbox and fails closed.
|
|
77
85
|
*/
|
|
78
|
-
export function readPrelude(context = "
|
|
86
|
+
export function readPrelude(context = "ptc", version = DEFAULT_SANDBOX_VERSION) {
|
|
79
87
|
const key = `${context}@${version}`;
|
|
80
88
|
const cached = assembledCache.get(key);
|
|
81
89
|
if (cached !== undefined)
|
|
82
90
|
return cached;
|
|
83
91
|
const header = `globalThis.__SANDBOX_VERSION = ${JSON.stringify(version)};`;
|
|
84
|
-
const parts = context === "ptc"
|
|
85
|
-
? [PTC_PRELUDE]
|
|
86
|
-
: [
|
|
87
|
-
readPart("core"),
|
|
88
|
-
readPart("lifecycle-hook"),
|
|
89
|
-
];
|
|
92
|
+
const parts = context === "ptc" ? [PTC_PRELUDE] : [SCOPED_TOOLS_VIEW, readPart("code-state")];
|
|
90
93
|
const assembled = [header, ...parts].join("\n");
|
|
91
94
|
assembledCache.set(key, assembled);
|
|
92
95
|
return assembled;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../src/sandbox/prelude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAuB,MAAM,wBAAwB,CAAC;AAEtF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEjD,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../src/sandbox/prelude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAuB,MAAM,wBAAwB,CAAC;AAEtF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEjD,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BpB,CAAC;AAEP;;;;;GAKG;AACH,MAAM,WAAW,GAAG;IAClB,0FAA0F;IAC1F,iBAAiB;CAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,UAA0B,KAAK,EAC/B,UAAkB,uBAAuB;IAEzC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,MAAM,GAAG,kCAAkC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5E,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|