@acpus/runtime 0.8.0 → 0.9.0-alpha.1
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/dist/.tsbuildinfo +1 -0
- package/dist/admission/input.d.ts +5 -0
- package/dist/admission/input.d.ts.map +1 -0
- package/dist/admission/input.js +17 -0
- package/dist/admission/input.js.map +1 -0
- package/dist/artifacts/rewrite.d.ts +7 -0
- package/dist/artifacts/rewrite.d.ts.map +1 -0
- package/dist/artifacts/rewrite.js +28 -0
- package/dist/artifacts/rewrite.js.map +1 -0
- package/dist/control/agent-overrides.d.ts +4 -0
- package/dist/control/agent-overrides.d.ts.map +1 -0
- package/dist/control/agent-overrides.js +40 -0
- package/dist/control/agent-overrides.js.map +1 -0
- package/dist/daemon/loop.d.ts +16 -0
- package/dist/daemon/loop.d.ts.map +1 -0
- package/dist/daemon/loop.js +191 -0
- package/dist/daemon/loop.js.map +1 -0
- package/dist/daemon/sessions.d.ts +23 -0
- package/dist/daemon/sessions.d.ts.map +1 -0
- package/dist/daemon/sessions.js +190 -0
- package/dist/daemon/sessions.js.map +1 -0
- package/dist/daemon/socket.d.ts +82 -0
- package/dist/daemon/socket.d.ts.map +1 -0
- package/dist/daemon/socket.js +341 -0
- package/dist/daemon/socket.js.map +1 -0
- package/dist/daemon/tick.d.ts +9 -0
- package/dist/daemon/tick.d.ts.map +1 -0
- package/dist/daemon/tick.js +18 -0
- package/dist/daemon/tick.js.map +1 -0
- package/dist/evaluation/admissible.d.ts +2 -0
- package/dist/evaluation/admissible.d.ts.map +1 -0
- package/dist/evaluation/admissible.js +50 -0
- package/dist/evaluation/admissible.js.map +1 -0
- package/dist/evaluation/evaluator.d.ts +14 -0
- package/dist/evaluation/evaluator.d.ts.map +1 -0
- package/dist/evaluation/evaluator.js +34 -0
- package/dist/evaluation/evaluator.js.map +1 -0
- package/dist/evaluation/loop-limit.d.ts +4 -0
- package/dist/evaluation/loop-limit.d.ts.map +1 -0
- package/dist/evaluation/loop-limit.js +9 -0
- package/dist/evaluation/loop-limit.js.map +1 -0
- package/dist/evaluation/schema.d.ts +4 -0
- package/dist/evaluation/schema.d.ts.map +1 -0
- package/dist/evaluation/schema.js +92 -0
- package/dist/evaluation/schema.js.map +1 -0
- package/dist/execution/advance.d.ts +18 -0
- package/dist/execution/advance.d.ts.map +1 -0
- package/dist/execution/advance.js +57 -0
- package/dist/execution/advance.js.map +1 -0
- package/dist/execution/agent-node.d.ts +23 -0
- package/dist/execution/agent-node.d.ts.map +1 -0
- package/dist/execution/agent-node.js +512 -0
- package/dist/execution/agent-node.js.map +1 -0
- package/dist/execution/duration.d.ts +2 -0
- package/dist/execution/duration.d.ts.map +1 -0
- package/dist/execution/duration.js +15 -0
- package/dist/execution/duration.js.map +1 -0
- package/dist/execution/ir.d.ts +3 -0
- package/dist/execution/ir.d.ts.map +1 -0
- package/dist/execution/ir.js +46 -0
- package/dist/execution/ir.js.map +1 -0
- package/dist/execution/scheduler.d.ts +59 -0
- package/dist/execution/scheduler.d.ts.map +1 -0
- package/dist/execution/scheduler.js +306 -0
- package/dist/execution/scheduler.js.map +1 -0
- package/dist/execution/task-executor.d.ts +14 -0
- package/dist/execution/task-executor.d.ts.map +1 -0
- package/dist/execution/task-executor.js +186 -0
- package/dist/execution/task-executor.js.map +1 -0
- package/dist/hooks/config.d.ts +32 -0
- package/dist/hooks/config.d.ts.map +1 -0
- package/dist/hooks/config.js +112 -0
- package/dist/hooks/config.js.map +1 -0
- package/dist/hooks/context.d.ts +50 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +116 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/events.d.ts +22 -0
- package/dist/hooks/events.d.ts.map +1 -0
- package/dist/hooks/events.js +41 -0
- package/dist/hooks/events.js.map +1 -0
- package/dist/hooks/journal.d.ts +21 -19
- package/dist/hooks/journal.d.ts.map +1 -1
- package/dist/hooks/journal.js +1 -48
- package/dist/hooks/journal.js.map +1 -1
- package/dist/hooks/loader.d.ts +33 -39
- package/dist/hooks/loader.d.ts.map +1 -1
- package/dist/hooks/loader.js +79 -95
- package/dist/hooks/loader.js.map +1 -1
- package/dist/hooks/runner.d.ts +14 -41
- package/dist/hooks/runner.d.ts.map +1 -1
- package/dist/hooks/runner.js +177 -145
- package/dist/hooks/runner.js.map +1 -1
- package/dist/index.d.ts +13 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -33
- package/dist/index.js.map +1 -1
- package/dist/runs/advance-runtime.d.ts +50 -0
- package/dist/runs/advance-runtime.d.ts.map +1 -0
- package/dist/runs/advance-runtime.js +82 -0
- package/dist/runs/advance-runtime.js.map +1 -0
- package/dist/runs/use-cases.d.ts +111 -0
- package/dist/runs/use-cases.d.ts.map +1 -0
- package/dist/runs/use-cases.js +539 -0
- package/dist/runs/use-cases.js.map +1 -0
- package/dist/scheduler/advance.d.ts +65 -0
- package/dist/scheduler/advance.d.ts.map +1 -0
- package/dist/scheduler/advance.js +435 -0
- package/dist/scheduler/advance.js.map +1 -0
- package/dist/scheduler/control.d.ts +49 -0
- package/dist/scheduler/control.d.ts.map +1 -0
- package/dist/scheduler/control.js +212 -0
- package/dist/scheduler/control.js.map +1 -0
- package/dist/scheduler/event-codec.d.ts +4 -0
- package/dist/scheduler/event-codec.d.ts.map +1 -0
- package/dist/scheduler/event-codec.js +57 -0
- package/dist/scheduler/event-codec.js.map +1 -0
- package/dist/scheduler/events.d.ts +193 -0
- package/dist/scheduler/events.d.ts.map +1 -0
- package/dist/scheduler/events.js +13 -0
- package/dist/scheduler/events.js.map +1 -0
- package/dist/scheduler/fork-seed.d.ts +38 -0
- package/dist/scheduler/fork-seed.d.ts.map +1 -0
- package/dist/scheduler/fork-seed.js +590 -0
- package/dist/scheduler/fork-seed.js.map +1 -0
- package/dist/scheduler/identity.d.ts +8 -0
- package/dist/scheduler/identity.d.ts.map +1 -0
- package/dist/scheduler/identity.js +49 -0
- package/dist/scheduler/identity.js.map +1 -0
- package/dist/scheduler/ir-walk.d.ts +3 -0
- package/dist/scheduler/ir-walk.d.ts.map +1 -0
- package/dist/scheduler/ir-walk.js +25 -0
- package/dist/scheduler/ir-walk.js.map +1 -0
- package/dist/scheduler/limiter.d.ts +7 -0
- package/dist/scheduler/limiter.d.ts.map +1 -0
- package/dist/scheduler/limiter.js +10 -0
- package/dist/scheduler/limiter.js.map +1 -0
- package/dist/scheduler/materialize.d.ts +7 -0
- package/dist/scheduler/materialize.d.ts.map +1 -0
- package/dist/scheduler/materialize.js +756 -0
- package/dist/scheduler/materialize.js.map +1 -0
- package/dist/scheduler/membership.d.ts +12 -0
- package/dist/scheduler/membership.d.ts.map +1 -0
- package/dist/scheduler/membership.js +74 -0
- package/dist/scheduler/membership.js.map +1 -0
- package/dist/scheduler/node-executor.d.ts +15 -0
- package/dist/scheduler/node-executor.d.ts.map +1 -0
- package/dist/scheduler/node-executor.js +69 -0
- package/dist/scheduler/node-executor.js.map +1 -0
- package/dist/scheduler/runtime-runner.d.ts +44 -0
- package/dist/scheduler/runtime-runner.d.ts.map +1 -0
- package/dist/scheduler/runtime-runner.js +155 -0
- package/dist/scheduler/runtime-runner.js.map +1 -0
- package/dist/scheduler/scope.d.ts +6 -0
- package/dist/scheduler/scope.d.ts.map +1 -0
- package/dist/scheduler/scope.js +56 -0
- package/dist/scheduler/scope.js.map +1 -0
- package/dist/scheduler/store-port.d.ts +211 -0
- package/dist/scheduler/store-port.d.ts.map +1 -0
- package/dist/scheduler/store-port.js +28 -0
- package/dist/scheduler/store-port.js.map +1 -0
- package/dist/scheduler/transitions.d.ts +89 -0
- package/dist/scheduler/transitions.d.ts.map +1 -0
- package/dist/scheduler/transitions.js +967 -0
- package/dist/scheduler/transitions.js.map +1 -0
- package/dist/scheduler/types.d.ts +146 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/{executors → scheduler}/types.js.map +1 -1
- package/dist/store/store.d.ts +390 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +3053 -0
- package/dist/store/store.js.map +1 -0
- package/dist/visualization/overlay.d.ts +86 -0
- package/dist/visualization/overlay.d.ts.map +1 -0
- package/dist/visualization/overlay.js +161 -0
- package/dist/visualization/overlay.js.map +1 -0
- package/package.json +19 -37
- package/README.md +0 -7
- package/dist/agent-telemetry.d.ts +0 -56
- package/dist/agent-telemetry.d.ts.map +0 -1
- package/dist/agent-telemetry.js +0 -304
- package/dist/agent-telemetry.js.map +0 -1
- package/dist/artifacts.d.ts +0 -45
- package/dist/artifacts.d.ts.map +0 -1
- package/dist/artifacts.js +0 -163
- package/dist/artifacts.js.map +0 -1
- package/dist/attempt-artifacts.d.ts +0 -35
- package/dist/attempt-artifacts.d.ts.map +0 -1
- package/dist/attempt-artifacts.js +0 -90
- package/dist/attempt-artifacts.js.map +0 -1
- package/dist/client.d.ts +0 -82
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -200
- package/dist/client.js.map +0 -1
- package/dist/evaluator.d.ts +0 -36
- package/dist/evaluator.d.ts.map +0 -1
- package/dist/evaluator.js +0 -101
- package/dist/evaluator.js.map +0 -1
- package/dist/executors/agent.d.ts +0 -103
- package/dist/executors/agent.d.ts.map +0 -1
- package/dist/executors/agent.js +0 -516
- package/dist/executors/agent.js.map +0 -1
- package/dist/executors/mock-program.d.ts +0 -26
- package/dist/executors/mock-program.d.ts.map +0 -1
- package/dist/executors/mock-program.js +0 -100
- package/dist/executors/mock-program.js.map +0 -1
- package/dist/executors/output-preview.d.ts +0 -2
- package/dist/executors/output-preview.d.ts.map +0 -1
- package/dist/executors/output-preview.js +0 -20
- package/dist/executors/output-preview.js.map +0 -1
- package/dist/executors/program.d.ts +0 -30
- package/dist/executors/program.d.ts.map +0 -1
- package/dist/executors/program.js +0 -230
- package/dist/executors/program.js.map +0 -1
- package/dist/executors/types.d.ts +0 -32
- package/dist/executors/types.d.ts.map +0 -1
- package/dist/fork.d.ts +0 -74
- package/dist/fork.d.ts.map +0 -1
- package/dist/fork.js +0 -278
- package/dist/fork.js.map +0 -1
- package/dist/hooks/payload.d.ts +0 -17
- package/dist/hooks/payload.d.ts.map +0 -1
- package/dist/hooks/payload.js +0 -45
- package/dist/hooks/payload.js.map +0 -1
- package/dist/interpreter.d.ts +0 -168
- package/dist/interpreter.d.ts.map +0 -1
- package/dist/interpreter.js +0 -1747
- package/dist/interpreter.js.map +0 -1
- package/dist/keys.d.ts +0 -77
- package/dist/keys.d.ts.map +0 -1
- package/dist/keys.js +0 -382
- package/dist/keys.js.map +0 -1
- package/dist/run-control.d.ts +0 -45
- package/dist/run-control.d.ts.map +0 -1
- package/dist/run-control.js +0 -255
- package/dist/run-control.js.map +0 -1
- package/dist/run-id.d.ts +0 -3
- package/dist/run-id.d.ts.map +0 -1
- package/dist/run-id.js +0 -10
- package/dist/run-id.js.map +0 -1
- package/dist/state-machine.d.ts +0 -31
- package/dist/state-machine.d.ts.map +0 -1
- package/dist/state-machine.js +0 -102
- package/dist/state-machine.js.map +0 -1
- package/dist/store.d.ts +0 -92
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -420
- package/dist/store.js.map +0 -1
- package/dist/supervisor-app.d.ts +0 -27
- package/dist/supervisor-app.d.ts.map +0 -1
- package/dist/supervisor-app.js +0 -694
- package/dist/supervisor-app.js.map +0 -1
- package/dist/supervisor-discovery.d.ts +0 -18
- package/dist/supervisor-discovery.d.ts.map +0 -1
- package/dist/supervisor-discovery.js +0 -180
- package/dist/supervisor-discovery.js.map +0 -1
- package/dist/supervisor-entry.d.ts +0 -11
- package/dist/supervisor-entry.d.ts.map +0 -1
- package/dist/supervisor-entry.js +0 -50
- package/dist/supervisor-entry.js.map +0 -1
- package/dist/supervisor-lock.d.ts +0 -26
- package/dist/supervisor-lock.d.ts.map +0 -1
- package/dist/supervisor-lock.js +0 -49
- package/dist/supervisor-lock.js.map +0 -1
- package/dist/supervisor-runner.d.ts +0 -11
- package/dist/supervisor-runner.d.ts.map +0 -1
- package/dist/supervisor-runner.js +0 -128
- package/dist/supervisor-runner.js.map +0 -1
- package/dist/types.d.ts +0 -375
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -7
- package/dist/types.js.map +0 -1
- package/dist/validate-input.d.ts +0 -27
- package/dist/validate-input.d.ts.map +0 -1
- package/dist/validate-input.js +0 -56
- package/dist/validate-input.js.map +0 -1
- package/dist/validate-signal.d.ts +0 -14
- package/dist/validate-signal.d.ts.map +0 -1
- package/dist/validate-signal.js +0 -31
- package/dist/validate-signal.js.map +0 -1
- package/dist/workflow-context.d.ts +0 -4
- package/dist/workflow-context.d.ts.map +0 -1
- package/dist/workflow-context.js +0 -11
- package/dist/workflow-context.js.map +0 -1
- package/dist/workflow-outputs.d.ts +0 -9
- package/dist/workflow-outputs.d.ts.map +0 -1
- package/dist/workflow-outputs.js +0 -60
- package/dist/workflow-outputs.js.map +0 -1
- /package/dist/{executors → scheduler}/types.js +0 -0
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import type { ExpressionContext, ExecutorResult } from "../types.js";
|
|
2
|
-
import type { AgentExecutionRequest, ExecutorAdapter } from "./types.js";
|
|
3
|
-
import { ExpressionEvaluator } from "../evaluator.js";
|
|
4
|
-
/**
|
|
5
|
-
* Drives an ACP agent through the `acpx` CLI. Acpus owns scheduling/state;
|
|
6
|
-
* acpx owns the ACP saved-session lifecycle and dead-pid recovery.
|
|
7
|
-
*
|
|
8
|
-
* - Session name is derived from the resolved node key (stable, unique per
|
|
9
|
-
* loop round / fanout lane / subworkflow nesting).
|
|
10
|
-
* - First run: `sessions ensure` then `prompt -s <session>` with the rendered
|
|
11
|
-
* prompt; continuation: same session with a fixed continuation prompt.
|
|
12
|
-
* - Cancel is cooperative: on abort we run `acpx cancel -s <session>` and wait
|
|
13
|
-
* for the in-flight prompt to settle (SIGKILL only as a last resort).
|
|
14
|
-
* - Output is the concatenation of `agent_message_chunk` text from the ACP
|
|
15
|
-
* NDJSON stream; stdout buffering is disabled so the full stream is not
|
|
16
|
-
* retained in memory.
|
|
17
|
-
*/
|
|
18
|
-
export declare class AgentExecutor implements ExecutorAdapter<AgentExecutionRequest> {
|
|
19
|
-
private readonly evaluator;
|
|
20
|
-
private readonly ajv;
|
|
21
|
-
private readonly acpxPath?;
|
|
22
|
-
private readonly cancelGraceMs;
|
|
23
|
-
constructor(options?: {
|
|
24
|
-
acpxPath?: string;
|
|
25
|
-
evaluator?: ExpressionEvaluator;
|
|
26
|
-
cancelGraceMs?: number;
|
|
27
|
-
});
|
|
28
|
-
execute({ node, context, signal, nodeKey, prompt: preparedPrompt, sessionKey: preparedSessionKey, continuation, retry, onStream }: AgentExecutionRequest): Promise<ExecutorResult>;
|
|
29
|
-
/**
|
|
30
|
-
* On abort, request a cooperative `session/cancel` via acpx and schedule a
|
|
31
|
-
* SIGKILL fallback if the in-flight prompt does not settle within the grace
|
|
32
|
-
* period. Returns a handle exposing whether cancel fired and a cleanup fn.
|
|
33
|
-
*/
|
|
34
|
-
private wireCooperativeCancel;
|
|
35
|
-
/**
|
|
36
|
-
* Build acpx arg lists for a subcommand. Global flags (--cwd, --model,
|
|
37
|
-
* --format, policy flags) precede the command. For `command` agents the
|
|
38
|
-
* custom ACP server is selected via the `--agent` escape hatch; for
|
|
39
|
-
* `builtin` agents the adapter name is the command prefix.
|
|
40
|
-
*
|
|
41
|
-
* Policy flag mapping:
|
|
42
|
-
* full → --approve-all --non-interactive-permissions deny
|
|
43
|
-
* read → --approve-reads --non-interactive-permissions fail
|
|
44
|
-
*/
|
|
45
|
-
private argsBuilder;
|
|
46
|
-
/** Resolve how to invoke acpx: an explicit path, or the resolved package bin via node. */
|
|
47
|
-
private resolveInvoker;
|
|
48
|
-
private sessionName;
|
|
49
|
-
private resolveCwd;
|
|
50
|
-
private resolveEffectivePolicy;
|
|
51
|
-
private resolveTimeoutSeconds;
|
|
52
|
-
/** Adapter-specific env defaults, layered under inherited env and above agent `env` overrides. */
|
|
53
|
-
private defaultAgentEnv;
|
|
54
|
-
private stringEnv;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Decide the prompt text for an agent turn:
|
|
58
|
-
* - first run → rendered task template
|
|
59
|
-
* - continuation → fixed continuation prompt
|
|
60
|
-
* - parse/schema retry→ fixed continuation prompt
|
|
61
|
-
* When an output schema is declared it is appended as a `# OUTPUT SCHEMA`
|
|
62
|
-
* section on the first run and on retries, but NOT on a plain continuation
|
|
63
|
-
* (the original task is still live in the acpx session there).
|
|
64
|
-
*/
|
|
65
|
-
export declare function buildAgentPrompt(renderedTask: string, outputSchema: Record<string, unknown> | undefined, continuation: boolean, retry: boolean): string;
|
|
66
|
-
/** Render the exact Agent request prompt that will be sent to acpx. */
|
|
67
|
-
export declare function renderAgentRequestPrompt(node: {
|
|
68
|
-
metadata: Record<string, unknown>;
|
|
69
|
-
}, context: ExpressionContext, evaluator: ExpressionEvaluator, continuation: boolean, retry: boolean): string;
|
|
70
|
-
/** Render the optional Agent Step session key using the workflow evaluator. */
|
|
71
|
-
export declare function renderAgentSessionKey(node: {
|
|
72
|
-
metadata: Record<string, unknown>;
|
|
73
|
-
}, context: ExpressionContext, evaluator: ExpressionEvaluator): string | undefined;
|
|
74
|
-
/**
|
|
75
|
-
* Extract a JSON value from an agent reply that may wrap JSON in prose and/or
|
|
76
|
-
* Markdown code fences. Three tiers, strictest first:
|
|
77
|
-
* 1. Strict fast path: parse the whole trimmed reply (pure-JSON response).
|
|
78
|
-
* 2. Independent balanced scan: try every `{...}`/`[...]` candidate from each
|
|
79
|
-
* opening brace/bracket so unbalanced prose/code cannot block later JSON.
|
|
80
|
-
* 3. Candidate-local jsonrepair fallback: for each later candidate, try strict
|
|
81
|
-
* parse first, then repair that same candidate before moving earlier.
|
|
82
|
-
* Returns `undefined` when no JSON can be recovered (→ retryable parse failure).
|
|
83
|
-
*/
|
|
84
|
-
export declare function extractJson(text: string): unknown | undefined;
|
|
85
|
-
/**
|
|
86
|
-
* Extract a human-readable error message from acpx JSON-RPC error output.
|
|
87
|
-
* acpx writes errors on stdout as JSON-RPC `{"jsonrpc":"2.0","error":{"message":"..."}}`.
|
|
88
|
-
* Returns the `error.message` field, or undefined if the input is not a valid
|
|
89
|
-
* JSON-RPC error.
|
|
90
|
-
*/
|
|
91
|
-
export declare function extractAcpxError(stdout: string): string | undefined;
|
|
92
|
-
/**
|
|
93
|
-
* Filter a raw stdout buffer to lines that are NOT ACP NDJSON protocol
|
|
94
|
-
* messages. NDJSON lines start with '{' and contain "jsonrpc" — these are
|
|
95
|
-
* agent protocol events, not error messages. The remaining lines are
|
|
96
|
-
* likely acpx error output (plain text or JSON-RPC error objects).
|
|
97
|
-
*
|
|
98
|
-
* This is best-effort: when acpx fails, NDJSON is minimal or absent, and
|
|
99
|
-
* the error text dominates. The filter just prevents accidental mixing when
|
|
100
|
-
* a few NDJSON lines happen to be in the buffer tail.
|
|
101
|
-
*/
|
|
102
|
-
export declare function nonNdjsonLines(raw: string): string;
|
|
103
|
-
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/executors/agent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAWtD;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,eAAe,CAAC,qBAAqB,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YAAY,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAKnG;IAEK,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8KvL;IAED;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAkBnB,0FAA0F;IAC1F,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,qBAAqB;IAU7B,kGAAkG;IAClG,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,SAAS;CAMlB;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,OAAO,GACb,MAAM,CAQR;AAED,uEAAuE;AACvE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC3C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,mBAAmB,EAC9B,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,OAAO,GACb,MAAM,CAIR;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CACnC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC3C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CA4B7D;AAmFD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYlD"}
|
package/dist/executors/agent.js
DELETED
|
@@ -1,516 +0,0 @@
|
|
|
1
|
-
import { execa } from "execa";
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { dirname, resolve } from "node:path";
|
|
5
|
-
import { parseDurationMs } from "@acpus/core";
|
|
6
|
-
import { ExpressionEvaluator } from "../evaluator.js";
|
|
7
|
-
import { Ajv } from "ajv";
|
|
8
|
-
import { jsonrepair } from "jsonrepair";
|
|
9
|
-
import { AgentTelemetryAccumulator } from "../agent-telemetry.js";
|
|
10
|
-
/** Fixed runtime prompt used when continuing an existing agent session. */
|
|
11
|
-
const CONTINUATION_PROMPT = "Continue the previous task from where you left off.";
|
|
12
|
-
/** Grace period (ms) to wait for a cooperative cancel before SIGKILL. */
|
|
13
|
-
const DEFAULT_CANCEL_GRACE_MS = 5000;
|
|
14
|
-
/**
|
|
15
|
-
* Drives an ACP agent through the `acpx` CLI. Acpus owns scheduling/state;
|
|
16
|
-
* acpx owns the ACP saved-session lifecycle and dead-pid recovery.
|
|
17
|
-
*
|
|
18
|
-
* - Session name is derived from the resolved node key (stable, unique per
|
|
19
|
-
* loop round / fanout lane / subworkflow nesting).
|
|
20
|
-
* - First run: `sessions ensure` then `prompt -s <session>` with the rendered
|
|
21
|
-
* prompt; continuation: same session with a fixed continuation prompt.
|
|
22
|
-
* - Cancel is cooperative: on abort we run `acpx cancel -s <session>` and wait
|
|
23
|
-
* for the in-flight prompt to settle (SIGKILL only as a last resort).
|
|
24
|
-
* - Output is the concatenation of `agent_message_chunk` text from the ACP
|
|
25
|
-
* NDJSON stream; stdout buffering is disabled so the full stream is not
|
|
26
|
-
* retained in memory.
|
|
27
|
-
*/
|
|
28
|
-
export class AgentExecutor {
|
|
29
|
-
evaluator;
|
|
30
|
-
ajv;
|
|
31
|
-
acpxPath;
|
|
32
|
-
cancelGraceMs;
|
|
33
|
-
constructor(options) {
|
|
34
|
-
this.evaluator = options?.evaluator ?? new ExpressionEvaluator();
|
|
35
|
-
this.ajv = new Ajv({ allErrors: true, strict: false });
|
|
36
|
-
this.acpxPath = options?.acpxPath;
|
|
37
|
-
this.cancelGraceMs = options?.cancelGraceMs ?? DEFAULT_CANCEL_GRACE_MS;
|
|
38
|
-
}
|
|
39
|
-
async execute({ node, context, signal, nodeKey, prompt: preparedPrompt, sessionKey: preparedSessionKey, continuation, retry, onStream }) {
|
|
40
|
-
const agent = node.metadata.agent;
|
|
41
|
-
if (!agent) {
|
|
42
|
-
return { failureKind: "spawn", error: `Agent step '${node.id}' has no resolved agent definition` };
|
|
43
|
-
}
|
|
44
|
-
const outputSchema = node.metadata.output;
|
|
45
|
-
const timeoutSeconds = this.resolveTimeoutSeconds(node.metadata.timeout);
|
|
46
|
-
// Evaluate local templates before touching acpx. These are deterministic
|
|
47
|
-
// config errors and must not consume output-retry attempts.
|
|
48
|
-
let cwd;
|
|
49
|
-
let env;
|
|
50
|
-
let prompt;
|
|
51
|
-
let sessionName;
|
|
52
|
-
try {
|
|
53
|
-
// Step-level cwd overrides the agent definition's default cwd.
|
|
54
|
-
cwd = this.resolveCwd(node.metadata.cwd ?? agent.cwd, context);
|
|
55
|
-
// Adapter defaults sit below inherited env and agent `env`, so either can override them.
|
|
56
|
-
env = { ...this.defaultAgentEnv(agent), ...process.env, ...this.stringEnv(agent.env, context) };
|
|
57
|
-
prompt = preparedPrompt ?? renderAgentRequestPrompt(node, context, this.evaluator, Boolean(continuation), Boolean(retry));
|
|
58
|
-
const sessionKey = preparedSessionKey ?? renderAgentSessionKey(node, context, this.evaluator);
|
|
59
|
-
sessionName = this.sessionName(context.run_id, nodeKey, sessionKey);
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
return {
|
|
63
|
-
failureKind: "config",
|
|
64
|
-
error: `Failed to evaluate agent configuration template: ${error instanceof Error ? error.message : String(error)}`
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (signal.aborted) {
|
|
68
|
-
return { partial: true, error: "Aborted before execution", prompt, responseText: "" };
|
|
69
|
-
}
|
|
70
|
-
const invoker = this.resolveInvoker();
|
|
71
|
-
const effectivePolicy = this.resolveEffectivePolicy(node.metadata.policy, agent.policy);
|
|
72
|
-
const build = this.argsBuilder(agent, cwd, effectivePolicy);
|
|
73
|
-
let acpxRecordId;
|
|
74
|
-
try {
|
|
75
|
-
// Ensure a saved session exists (idempotent). acpx requires a session
|
|
76
|
-
// record before prompt commands route to it.
|
|
77
|
-
const ensureResult = await execa(invoker.command, [...invoker.prefixArgs, ...build(["--format", "json"], ["sessions", "ensure", "--name", sessionName])], {
|
|
78
|
-
reject: false,
|
|
79
|
-
env
|
|
80
|
-
});
|
|
81
|
-
if (ensureResult.failed) {
|
|
82
|
-
const exitCode = ensureResult.exitCode ?? 1;
|
|
83
|
-
const stderr = ensureResult.stderr ?? "";
|
|
84
|
-
const stdout = ensureResult.stdout ?? "";
|
|
85
|
-
// acpx may write errors to stdout (e.g. model rejection) as JSON-RPC
|
|
86
|
-
// or plain text. Prefer stderr, then extract the message from JSON-RPC
|
|
87
|
-
// stdout, fall back to raw stdout, then the generic shortMessage.
|
|
88
|
-
const detail = stderr || extractAcpxError(stdout) || stdout || ensureResult.shortMessage || `acpx sessions ensure exited with code ${exitCode}`;
|
|
89
|
-
return { failureKind: "exit", exitCode, error: detail, prompt, responseText: "", stdout, stderr };
|
|
90
|
-
}
|
|
91
|
-
if (ensureResult.stdout) {
|
|
92
|
-
try {
|
|
93
|
-
acpxRecordId = JSON.parse(ensureResult.stdout).acpxRecordId;
|
|
94
|
-
}
|
|
95
|
-
catch { /* non-JSON output; record ID stays undefined */ }
|
|
96
|
-
}
|
|
97
|
-
if (signal.aborted) {
|
|
98
|
-
return { partial: true, error: "Aborted before prompt", prompt, responseText: "", acpxRecordId, cwd };
|
|
99
|
-
}
|
|
100
|
-
// Run the prompt, streaming the ACP protocol as NDJSON. Stdout buffering
|
|
101
|
-
// is disabled so execa does not retain the full stream in memory.
|
|
102
|
-
const promptGlobalArgs = [...(timeoutSeconds ? ["--timeout", timeoutSeconds] : []), "--format", "json"];
|
|
103
|
-
const promptArgs = [...invoker.prefixArgs, ...build(promptGlobalArgs, ["prompt", "-s", sessionName, prompt])];
|
|
104
|
-
const accumulator = new AgentTelemetryAccumulator({ attempt: 1, inputText: prompt, acpxRecordId, cwd });
|
|
105
|
-
const proc = execa(invoker.command, promptArgs, {
|
|
106
|
-
reject: false,
|
|
107
|
-
env,
|
|
108
|
-
buffer: { stdout: false }
|
|
109
|
-
});
|
|
110
|
-
let stderrText = "";
|
|
111
|
-
// Capture raw non-NDJSON stdout lines in a bounded buffer for error
|
|
112
|
-
// reporting. The accumulator only extracts agent_message_chunk NDJSON,
|
|
113
|
-
// but acpx writes errors (e.g. model rejection, ACP errors) to stdout
|
|
114
|
-
// as plain text or JSON-RPC. We filter out NDJSON lines so the tail
|
|
115
|
-
// doesn't mix agent response content with error text. The buffer is
|
|
116
|
-
// line-aware at the tail boundary to avoid mid-line truncation.
|
|
117
|
-
let rawErrorTail = "";
|
|
118
|
-
const MAX_RAW_ERROR_TAIL = 2048;
|
|
119
|
-
proc.stdout?.on("data", (chunk) => {
|
|
120
|
-
const text = String(chunk);
|
|
121
|
-
onStream?.("stdout", text);
|
|
122
|
-
accumulator.append(text);
|
|
123
|
-
// Filter NDJSON lines: skip lines that start with '{' and contain
|
|
124
|
-
// "jsonrpc" (ACP protocol). Keep everything else as error candidates.
|
|
125
|
-
// Use line-aware append: only keep complete trailing lines so the
|
|
126
|
-
// buffer doesn't leave a mid-line fragment at the end.
|
|
127
|
-
rawErrorTail += text;
|
|
128
|
-
// Trim to last MAX_RAW_ERROR_TAIL bytes, then drop any leading
|
|
129
|
-
// partial line (first \n is our boundary).
|
|
130
|
-
if (rawErrorTail.length > MAX_RAW_ERROR_TAIL) {
|
|
131
|
-
rawErrorTail = rawErrorTail.slice(-MAX_RAW_ERROR_TAIL);
|
|
132
|
-
const nl = rawErrorTail.indexOf("\n");
|
|
133
|
-
if (nl > -1)
|
|
134
|
-
rawErrorTail = rawErrorTail.slice(nl + 1);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
proc.stderr?.on("data", (chunk) => {
|
|
138
|
-
const text = String(chunk);
|
|
139
|
-
stderrText += text;
|
|
140
|
-
onStream?.("stderr", text);
|
|
141
|
-
});
|
|
142
|
-
const cancellation = this.wireCooperativeCancel(proc, signal, invoker, build, sessionName, env);
|
|
143
|
-
const result = await proc;
|
|
144
|
-
cancellation.cleanup();
|
|
145
|
-
const stderr = result.stderr ?? stderrText;
|
|
146
|
-
accumulator.flush();
|
|
147
|
-
const text = accumulator.responseText();
|
|
148
|
-
const stopReason = accumulator.finalStopReason();
|
|
149
|
-
// Cooperative cancel (or any cancelled turn) → paused with partial response.
|
|
150
|
-
if (cancellation.cancelled || stopReason === "cancelled") {
|
|
151
|
-
return { partial: true, output: { text }, prompt, responseText: text, stderr, error: "Aborted", acpxRecordId, cwd };
|
|
152
|
-
}
|
|
153
|
-
// Spawn failure (no exit code) → non-recoverable.
|
|
154
|
-
if (result.failed && (result.exitCode === undefined || result.exitCode === null)) {
|
|
155
|
-
return { failureKind: "spawn", error: result.shortMessage || "Failed to spawn acpx", prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
156
|
-
}
|
|
157
|
-
// Non-zero exit (and not cancelled) → non-recoverable agent failure.
|
|
158
|
-
if (result.exitCode !== 0) {
|
|
159
|
-
// acpx writes errors to stdout (e.g. model rejection, ACP errors),
|
|
160
|
-
// while stderr typically contains session lifecycle messages.
|
|
161
|
-
// When the agent produced no response text, the stdout error stream
|
|
162
|
-
// is likely the cause; surface it in the error message.
|
|
163
|
-
//
|
|
164
|
-
// Priority: extracted error lines (plain text / JSON-RPC, but not
|
|
165
|
-
// agent NDJSON), then stderr, then response text, then generic.
|
|
166
|
-
const exitError = nonNdjsonLines(rawErrorTail).trim() || stderr || text || `acpx exited with code ${result.exitCode}`;
|
|
167
|
-
return { failureKind: "exit", exitCode: result.exitCode ?? 1, error: exitError, prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
168
|
-
}
|
|
169
|
-
// Assemble structured output. When a schema is declared, extract a JSON
|
|
170
|
-
// object from the (possibly prose-wrapped) reply; failure to extract is a
|
|
171
|
-
// retryable parse failure. Otherwise wrap as { text }.
|
|
172
|
-
let output;
|
|
173
|
-
if (outputSchema) {
|
|
174
|
-
if (text.trim().length === 0) {
|
|
175
|
-
// Agent produced no output at all — likely an infrastructure failure
|
|
176
|
-
// (acpx couldn't reach the agent, model rejected, etc.). This is not
|
|
177
|
-
// a parse failure; classify as spawn (no usable response) so it is
|
|
178
|
-
// not retried as parse. exitCode is left undefined to avoid the
|
|
179
|
-
// semantic contradiction of exitCode:0 + failureKind:'exit'.
|
|
180
|
-
const noOutputError = nonNdjsonLines(rawErrorTail).trim() || stderr || `acpx exited with code ${result.exitCode} but produced no output`;
|
|
181
|
-
return { failureKind: "spawn", error: noOutputError, output: { text }, prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
182
|
-
}
|
|
183
|
-
const parsed = extractJson(text);
|
|
184
|
-
if (parsed === undefined) {
|
|
185
|
-
return { failureKind: "parse", error: "Failed to parse agent output as JSON", output: { text }, prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
186
|
-
}
|
|
187
|
-
const validate = this.ajv.compile(outputSchema);
|
|
188
|
-
if (!validate(parsed)) {
|
|
189
|
-
return { failureKind: "schema", error: `Output validation failed: ${this.ajv.errorsText(validate.errors)}`, output: parsed, prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
190
|
-
}
|
|
191
|
-
output = parsed;
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
output = { text };
|
|
195
|
-
}
|
|
196
|
-
return { exitCode: 0, output, prompt, responseText: text, stderr, acpxRecordId, cwd };
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
return { failureKind: "spawn", error: error instanceof Error ? error.message : String(error), prompt, responseText: "", acpxRecordId, cwd };
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* On abort, request a cooperative `session/cancel` via acpx and schedule a
|
|
204
|
-
* SIGKILL fallback if the in-flight prompt does not settle within the grace
|
|
205
|
-
* period. Returns a handle exposing whether cancel fired and a cleanup fn.
|
|
206
|
-
*/
|
|
207
|
-
wireCooperativeCancel(proc, signal, invoker, build, sessionName, env) {
|
|
208
|
-
const handle = { cancelled: false, cleanup: () => undefined };
|
|
209
|
-
let killTimer;
|
|
210
|
-
const onAbort = () => {
|
|
211
|
-
handle.cancelled = true;
|
|
212
|
-
// Fire-and-forget cooperative cancel; failures are non-fatal.
|
|
213
|
-
void execa(invoker.command, [...invoker.prefixArgs, ...build([], ["cancel", "-s", sessionName])], { reject: false, env }).catch(() => undefined);
|
|
214
|
-
// Last-resort kill if the prompt process refuses to settle.
|
|
215
|
-
killTimer = setTimeout(() => { proc.kill("SIGKILL"); }, this.cancelGraceMs);
|
|
216
|
-
};
|
|
217
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
218
|
-
if (signal.aborted)
|
|
219
|
-
onAbort();
|
|
220
|
-
handle.cleanup = () => {
|
|
221
|
-
if (killTimer)
|
|
222
|
-
clearTimeout(killTimer);
|
|
223
|
-
signal.removeEventListener("abort", onAbort);
|
|
224
|
-
};
|
|
225
|
-
return handle;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Build acpx arg lists for a subcommand. Global flags (--cwd, --model,
|
|
229
|
-
* --format, policy flags) precede the command. For `command` agents the
|
|
230
|
-
* custom ACP server is selected via the `--agent` escape hatch; for
|
|
231
|
-
* `builtin` agents the adapter name is the command prefix.
|
|
232
|
-
*
|
|
233
|
-
* Policy flag mapping:
|
|
234
|
-
* full → --approve-all --non-interactive-permissions deny
|
|
235
|
-
* read → --approve-reads --non-interactive-permissions fail
|
|
236
|
-
*/
|
|
237
|
-
argsBuilder(agent, cwd, policy) {
|
|
238
|
-
const globalBase = [
|
|
239
|
-
"--cwd",
|
|
240
|
-
cwd,
|
|
241
|
-
...(agent.model ? ["--model", agent.model] : []),
|
|
242
|
-
...(policy === "full"
|
|
243
|
-
? ["--approve-all", "--non-interactive-permissions", "deny"]
|
|
244
|
-
: ["--approve-reads", "--non-interactive-permissions", "fail"])
|
|
245
|
-
];
|
|
246
|
-
if (agent.type === "command") {
|
|
247
|
-
const command = agent.use ?? "";
|
|
248
|
-
return (global, sub) => ["--agent", command, ...globalBase, ...global, ...sub];
|
|
249
|
-
}
|
|
250
|
-
// builtin (default): adapter name from `use`.
|
|
251
|
-
const adapter = agent.use ?? "";
|
|
252
|
-
return (global, sub) => [...globalBase, ...global, adapter, ...sub];
|
|
253
|
-
}
|
|
254
|
-
/** Resolve how to invoke acpx: an explicit path, or the resolved package bin via node. */
|
|
255
|
-
resolveInvoker() {
|
|
256
|
-
if (this.acpxPath)
|
|
257
|
-
return { command: this.acpxPath, prefixArgs: [] };
|
|
258
|
-
const req = createRequire(import.meta.url);
|
|
259
|
-
const pkgJsonPath = req.resolve("acpx/package.json");
|
|
260
|
-
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
|
|
261
|
-
const bin = typeof pkg.bin === "string" ? pkg.bin : pkg.bin?.acpx ?? "dist/cli.js";
|
|
262
|
-
return { command: process.execPath, prefixArgs: [resolve(dirname(pkgJsonPath), bin)] };
|
|
263
|
-
}
|
|
264
|
-
sessionName(runId, nodeKey, sessionKey) {
|
|
265
|
-
const key = sessionKey === undefined ? sanitizeNodeKeySession(nodeKey) : encodeSessionKey(sessionKey);
|
|
266
|
-
return `acpus-${runId}-${key}`;
|
|
267
|
-
}
|
|
268
|
-
resolveCwd(cwd, context) {
|
|
269
|
-
if (typeof cwd === "string" && cwd.length > 0) {
|
|
270
|
-
return resolve(this.evaluator.evaluateTemplate(cwd, context));
|
|
271
|
-
}
|
|
272
|
-
return process.cwd();
|
|
273
|
-
}
|
|
274
|
-
resolveEffectivePolicy(stepPolicy, agentPolicy) {
|
|
275
|
-
if (stepPolicy === "read" || stepPolicy === "full")
|
|
276
|
-
return stepPolicy;
|
|
277
|
-
if (agentPolicy === "read" || agentPolicy === "full")
|
|
278
|
-
return agentPolicy;
|
|
279
|
-
return "full";
|
|
280
|
-
}
|
|
281
|
-
resolveTimeoutSeconds(timeout) {
|
|
282
|
-
const milliseconds = typeof timeout === "number"
|
|
283
|
-
? timeout
|
|
284
|
-
: typeof timeout === "string"
|
|
285
|
-
? parseDurationMs(timeout)
|
|
286
|
-
: undefined;
|
|
287
|
-
if (milliseconds === undefined || milliseconds <= 0)
|
|
288
|
-
return undefined;
|
|
289
|
-
return String(milliseconds / 1000);
|
|
290
|
-
}
|
|
291
|
-
/** Adapter-specific env defaults, layered under inherited env and above agent `env` overrides. */
|
|
292
|
-
defaultAgentEnv(agent) {
|
|
293
|
-
if ((agent.type ?? "builtin") === "builtin" && agent.use === "claude") {
|
|
294
|
-
return { ACPX_CLAUDE_INCLUDE_USER_SETTINGS: "1" };
|
|
295
|
-
}
|
|
296
|
-
return {};
|
|
297
|
-
}
|
|
298
|
-
stringEnv(env, context) {
|
|
299
|
-
if (!env)
|
|
300
|
-
return {};
|
|
301
|
-
const out = {};
|
|
302
|
-
for (const [k, v] of Object.entries(env))
|
|
303
|
-
out[k] = typeof v === "string" ? this.evaluator.evaluateTemplate(v, context) : String(v);
|
|
304
|
-
return out;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/** Replace characters not safe for an acpx `-s <name>` value in generated node keys. */
|
|
308
|
-
function sanitizeNodeKeySession(nodeKey) {
|
|
309
|
-
return nodeKey.replace(/\//g, "__").replace(/:/g, "-");
|
|
310
|
-
}
|
|
311
|
-
/** Encode author-controlled session keys without collisions from normalization. */
|
|
312
|
-
function encodeSessionKey(sessionKey) {
|
|
313
|
-
if (sessionKey.trim().length === 0) {
|
|
314
|
-
throw new Error("session_key must render to a non-empty string");
|
|
315
|
-
}
|
|
316
|
-
return `key-${Buffer.from(sessionKey, "utf8").toString("base64url")}`;
|
|
317
|
-
}
|
|
318
|
-
/** Render the declared output schema as an explicit contract section appended to the prompt. */
|
|
319
|
-
function schemaSection(outputSchema) {
|
|
320
|
-
return `\n\n# OUTPUT SCHEMA\n**After completing the task, your final response MUST be exactly one JSON object that conforms to this schema, with no Markdown or prose. Extra keys are accepted but are not available to later workflow expressions.**\n${JSON.stringify(outputSchema, null, 2)}`;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Decide the prompt text for an agent turn:
|
|
324
|
-
* - first run → rendered task template
|
|
325
|
-
* - continuation → fixed continuation prompt
|
|
326
|
-
* - parse/schema retry→ fixed continuation prompt
|
|
327
|
-
* When an output schema is declared it is appended as a `# OUTPUT SCHEMA`
|
|
328
|
-
* section on the first run and on retries, but NOT on a plain continuation
|
|
329
|
-
* (the original task is still live in the acpx session there).
|
|
330
|
-
*/
|
|
331
|
-
export function buildAgentPrompt(renderedTask, outputSchema, continuation, retry) {
|
|
332
|
-
if (retry) {
|
|
333
|
-
return outputSchema ? CONTINUATION_PROMPT + schemaSection(outputSchema) : CONTINUATION_PROMPT;
|
|
334
|
-
}
|
|
335
|
-
if (continuation) {
|
|
336
|
-
return CONTINUATION_PROMPT;
|
|
337
|
-
}
|
|
338
|
-
return outputSchema ? renderedTask + schemaSection(outputSchema) : renderedTask;
|
|
339
|
-
}
|
|
340
|
-
/** Render the exact Agent request prompt that will be sent to acpx. */
|
|
341
|
-
export function renderAgentRequestPrompt(node, context, evaluator, continuation, retry) {
|
|
342
|
-
const renderedTask = evaluator.evaluateTemplate(node.metadata.prompt ?? "", context);
|
|
343
|
-
const outputSchema = node.metadata.output;
|
|
344
|
-
return buildAgentPrompt(renderedTask, outputSchema, continuation, retry);
|
|
345
|
-
}
|
|
346
|
-
/** Render the optional Agent Step session key using the workflow evaluator. */
|
|
347
|
-
export function renderAgentSessionKey(node, context, evaluator) {
|
|
348
|
-
const sessionKey = node.metadata.session_key;
|
|
349
|
-
if (typeof sessionKey !== "string")
|
|
350
|
-
return undefined;
|
|
351
|
-
const rendered = evaluator.evaluateTemplate(sessionKey, context);
|
|
352
|
-
if (rendered.trim().length === 0) {
|
|
353
|
-
throw new Error("session_key must render to a non-empty string");
|
|
354
|
-
}
|
|
355
|
-
return rendered;
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* Extract a JSON value from an agent reply that may wrap JSON in prose and/or
|
|
359
|
-
* Markdown code fences. Three tiers, strictest first:
|
|
360
|
-
* 1. Strict fast path: parse the whole trimmed reply (pure-JSON response).
|
|
361
|
-
* 2. Independent balanced scan: try every `{...}`/`[...]` candidate from each
|
|
362
|
-
* opening brace/bracket so unbalanced prose/code cannot block later JSON.
|
|
363
|
-
* 3. Candidate-local jsonrepair fallback: for each later candidate, try strict
|
|
364
|
-
* parse first, then repair that same candidate before moving earlier.
|
|
365
|
-
* Returns `undefined` when no JSON can be recovered (→ retryable parse failure).
|
|
366
|
-
*/
|
|
367
|
-
export function extractJson(text) {
|
|
368
|
-
const trimmed = text.trim();
|
|
369
|
-
if (!trimmed)
|
|
370
|
-
return undefined;
|
|
371
|
-
// Tier 1: strict fast path.
|
|
372
|
-
try {
|
|
373
|
-
return JSON.parse(trimmed);
|
|
374
|
-
}
|
|
375
|
-
catch {
|
|
376
|
-
// fall through
|
|
377
|
-
}
|
|
378
|
-
// Tier 2/3: latest balanced candidate wins; repair is candidate-local so a
|
|
379
|
-
// malformed final answer is preferred over an earlier strict-JSON draft.
|
|
380
|
-
const candidates = balancedJsonCandidates(text);
|
|
381
|
-
for (let i = candidates.length - 1; i >= 0; i--) {
|
|
382
|
-
const candidate = candidates[i];
|
|
383
|
-
try {
|
|
384
|
-
return JSON.parse(candidate);
|
|
385
|
-
}
|
|
386
|
-
catch {
|
|
387
|
-
// try jsonrepair for this same candidate before moving earlier
|
|
388
|
-
}
|
|
389
|
-
const repaired = repairJsonCandidate(candidate);
|
|
390
|
-
if (repaired !== undefined) {
|
|
391
|
-
return repaired;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
return undefined;
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Collect independently balanced `{...}` / `[...]` substrings from `text`.
|
|
398
|
-
* Each opening brace/bracket is treated as a potential candidate start, so a
|
|
399
|
-
* stray prose/code `{` cannot keep depth open and hide a later final JSON block.
|
|
400
|
-
*/
|
|
401
|
-
function balancedJsonCandidates(text) {
|
|
402
|
-
const out = [];
|
|
403
|
-
for (let i = 0; i < text.length; i++) {
|
|
404
|
-
if (text[i] !== "{" && text[i] !== "[")
|
|
405
|
-
continue;
|
|
406
|
-
const end = balancedCandidateEnd(text, i);
|
|
407
|
-
if (end !== undefined) {
|
|
408
|
-
out.push({ start: i, end, value: text.slice(i, end) });
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
const outer = out.filter((candidate) => !out.some((other) => other !== candidate && other.start < candidate.start && candidate.end < other.end));
|
|
412
|
-
// Source order here is by candidate end position, not start position. This
|
|
413
|
-
// keeps an outer final JSON object ahead of its nested children when iterated
|
|
414
|
-
// backwards, and still lets later independent JSON blocks supersede drafts.
|
|
415
|
-
outer.sort((a, b) => a.end - b.end || a.start - b.start);
|
|
416
|
-
return outer.map((candidate) => candidate.value);
|
|
417
|
-
}
|
|
418
|
-
function balancedCandidateEnd(text, start) {
|
|
419
|
-
const stack = [text[start] === "{" ? "}" : "]"];
|
|
420
|
-
let inString = false;
|
|
421
|
-
let escaped = false;
|
|
422
|
-
for (let i = start + 1; i < text.length; i++) {
|
|
423
|
-
const ch = text[i];
|
|
424
|
-
if (inString) {
|
|
425
|
-
if (escaped)
|
|
426
|
-
escaped = false;
|
|
427
|
-
else if (ch === "\\")
|
|
428
|
-
escaped = true;
|
|
429
|
-
else if (ch === '"')
|
|
430
|
-
inString = false;
|
|
431
|
-
continue;
|
|
432
|
-
}
|
|
433
|
-
if (ch === '"') {
|
|
434
|
-
inString = true;
|
|
435
|
-
continue;
|
|
436
|
-
}
|
|
437
|
-
if (ch === "{" || ch === "[") {
|
|
438
|
-
stack.push(ch === "{" ? "}" : "]");
|
|
439
|
-
}
|
|
440
|
-
else if (ch === "}" || ch === "]") {
|
|
441
|
-
if (stack.length === 0 || ch !== stack[stack.length - 1]) {
|
|
442
|
-
return undefined;
|
|
443
|
-
}
|
|
444
|
-
stack.pop();
|
|
445
|
-
if (stack.length === 0)
|
|
446
|
-
return i + 1;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
return undefined;
|
|
450
|
-
}
|
|
451
|
-
function repairJsonCandidate(candidate) {
|
|
452
|
-
if (!isRepairableJsonCandidate(candidate))
|
|
453
|
-
return undefined;
|
|
454
|
-
try {
|
|
455
|
-
const repaired = JSON.parse(jsonrepair(candidate));
|
|
456
|
-
if (typeof repaired === "object" && repaired !== null)
|
|
457
|
-
return repaired;
|
|
458
|
-
}
|
|
459
|
-
catch {
|
|
460
|
-
// fall through
|
|
461
|
-
}
|
|
462
|
-
return undefined;
|
|
463
|
-
}
|
|
464
|
-
function isRepairableJsonCandidate(candidate) {
|
|
465
|
-
const trimmed = candidate.trim();
|
|
466
|
-
// Keep repair intentionally narrow. jsonrepair can turn prose snippets like
|
|
467
|
-
// `[1-9]` into `["1-9"]`; in this runtime, malformed final outputs we want to
|
|
468
|
-
// save are object-shaped contracts with key/value separators.
|
|
469
|
-
return trimmed.startsWith("{") && trimmed.includes(":");
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Extract a human-readable error message from acpx JSON-RPC error output.
|
|
473
|
-
* acpx writes errors on stdout as JSON-RPC `{"jsonrpc":"2.0","error":{"message":"..."}}`.
|
|
474
|
-
* Returns the `error.message` field, or undefined if the input is not a valid
|
|
475
|
-
* JSON-RPC error.
|
|
476
|
-
*/
|
|
477
|
-
export function extractAcpxError(stdout) {
|
|
478
|
-
if (!stdout)
|
|
479
|
-
return undefined;
|
|
480
|
-
try {
|
|
481
|
-
const parsed = JSON.parse(stdout);
|
|
482
|
-
return typeof parsed?.error?.message === "string" && parsed.error.message.length > 0
|
|
483
|
-
? parsed.error.message
|
|
484
|
-
: undefined;
|
|
485
|
-
}
|
|
486
|
-
catch {
|
|
487
|
-
return undefined;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
/**
|
|
491
|
-
* Filter a raw stdout buffer to lines that are NOT ACP NDJSON protocol
|
|
492
|
-
* messages. NDJSON lines start with '{' and contain "jsonrpc" — these are
|
|
493
|
-
* agent protocol events, not error messages. The remaining lines are
|
|
494
|
-
* likely acpx error output (plain text or JSON-RPC error objects).
|
|
495
|
-
*
|
|
496
|
-
* This is best-effort: when acpx fails, NDJSON is minimal or absent, and
|
|
497
|
-
* the error text dominates. The filter just prevents accidental mixing when
|
|
498
|
-
* a few NDJSON lines happen to be in the buffer tail.
|
|
499
|
-
*/
|
|
500
|
-
export function nonNdjsonLines(raw) {
|
|
501
|
-
if (!raw)
|
|
502
|
-
return "";
|
|
503
|
-
return raw
|
|
504
|
-
.split("\n")
|
|
505
|
-
.filter((line) => {
|
|
506
|
-
const trimmed = line.trim();
|
|
507
|
-
if (!trimmed)
|
|
508
|
-
return false;
|
|
509
|
-
// NDJSON lines start with '{' and contain "jsonrpc" as a protocol marker.
|
|
510
|
-
if (trimmed.startsWith("{") && trimmed.includes('"jsonrpc"'))
|
|
511
|
-
return false;
|
|
512
|
-
return true;
|
|
513
|
-
})
|
|
514
|
-
.join("\n");
|
|
515
|
-
}
|
|
516
|
-
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/executors/agent.ts"],"names":[],"mappings":"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"}
|