@netlify/axis 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +977 -0
- package/dist/adapters/base/acp-adapter.d.ts +44 -0
- package/dist/adapters/base/acp-adapter.d.ts.map +1 -0
- package/dist/adapters/base/acp-adapter.js +559 -0
- package/dist/adapters/base/acp-adapter.js.map +1 -0
- package/dist/adapters/base/agent-adapter.d.ts +132 -0
- package/dist/adapters/base/agent-adapter.d.ts.map +1 -0
- package/dist/adapters/base/agent-adapter.js +212 -0
- package/dist/adapters/base/agent-adapter.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +138 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/claude-sdk.d.ts +11 -0
- package/dist/adapters/claude-sdk.d.ts.map +1 -0
- package/dist/adapters/claude-sdk.js +46 -0
- package/dist/adapters/claude-sdk.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +183 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-acp.d.ts +11 -0
- package/dist/adapters/gemini-acp.d.ts.map +1 -0
- package/dist/adapters/gemini-acp.js +60 -0
- package/dist/adapters/gemini-acp.js.map +1 -0
- package/dist/adapters/gemini.d.ts +3 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +222 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/goose.d.ts +3 -0
- package/dist/adapters/goose.d.ts.map +1 -0
- package/dist/adapters/goose.js +9 -0
- package/dist/adapters/goose.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +37 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/utils/mcp.d.ts +23 -0
- package/dist/adapters/utils/mcp.d.ts.map +1 -0
- package/dist/adapters/utils/mcp.js +114 -0
- package/dist/adapters/utils/mcp.js.map +1 -0
- package/dist/adapters/utils/resolve.d.ts +20 -0
- package/dist/adapters/utils/resolve.d.ts.map +1 -0
- package/dist/adapters/utils/resolve.js +48 -0
- package/dist/adapters/utils/resolve.js.map +1 -0
- package/dist/adapters/utils/skills.d.ts +17 -0
- package/dist/adapters/utils/skills.d.ts.map +1 -0
- package/dist/adapters/utils/skills.js +52 -0
- package/dist/adapters/utils/skills.js.map +1 -0
- package/dist/adapters/utils/token-estimator.d.ts +21 -0
- package/dist/adapters/utils/token-estimator.d.ts.map +1 -0
- package/dist/adapters/utils/token-estimator.js +37 -0
- package/dist/adapters/utils/token-estimator.js.map +1 -0
- package/dist/baselines/diff.d.ts +9 -0
- package/dist/baselines/diff.d.ts.map +1 -0
- package/dist/baselines/diff.js +83 -0
- package/dist/baselines/diff.js.map +1 -0
- package/dist/baselines/index.d.ts +3 -0
- package/dist/baselines/index.d.ts.map +1 -0
- package/dist/baselines/index.js +3 -0
- package/dist/baselines/index.js.map +1 -0
- package/dist/baselines/store.d.ts +19 -0
- package/dist/baselines/store.d.ts.map +1 -0
- package/dist/baselines/store.js +104 -0
- package/dist/baselines/store.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +487 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +99 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/validator.d.ts +11 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +203 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/docs-site/_astro/cli.DDWZtG0-.css +1 -0
- package/dist/docs-site/cli/index.html +18 -0
- package/dist/docs-site/configuration/index.html +121 -0
- package/dist/docs-site/content-assets.mjs +1 -0
- package/dist/docs-site/content-modules.mjs +1 -0
- package/dist/docs-site/data-store.json +9 -0
- package/dist/docs-site/index.html +69 -0
- package/dist/docs-site/quickstart/index.html +59 -0
- package/dist/docs-site/running/index.html +87 -0
- package/dist/docs-site/scoring/index.html +135 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/report-ui/index.html +291 -0
- package/dist/report-ui/mock-data.json +298 -0
- package/dist/reports/html.d.ts +7 -0
- package/dist/reports/html.d.ts.map +1 -0
- package/dist/reports/html.js +27 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/reader.d.ts +21 -0
- package/dist/reports/reader.d.ts.map +1 -0
- package/dist/reports/reader.js +110 -0
- package/dist/reports/reader.js.map +1 -0
- package/dist/reports/writer.d.ts +14 -0
- package/dist/reports/writer.d.ts.map +1 -0
- package/dist/reports/writer.js +106 -0
- package/dist/reports/writer.js.map +1 -0
- package/dist/runner/lifecycle.d.ts +10 -0
- package/dist/runner/lifecycle.d.ts.map +1 -0
- package/dist/runner/lifecycle.js +58 -0
- package/dist/runner/lifecycle.js.map +1 -0
- package/dist/runner/runner.d.ts +34 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +330 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/scoring/category-score.d.ts +52 -0
- package/dist/scoring/category-score.d.ts.map +1 -0
- package/dist/scoring/category-score.js +157 -0
- package/dist/scoring/category-score.js.map +1 -0
- package/dist/scoring/composite.d.ts +5 -0
- package/dist/scoring/composite.d.ts.map +1 -0
- package/dist/scoring/composite.js +24 -0
- package/dist/scoring/composite.js.map +1 -0
- package/dist/scoring/deep-eval.d.ts +25 -0
- package/dist/scoring/deep-eval.d.ts.map +1 -0
- package/dist/scoring/deep-eval.js +382 -0
- package/dist/scoring/deep-eval.js.map +1 -0
- package/dist/scoring/goal-achievement.d.ts +5 -0
- package/dist/scoring/goal-achievement.d.ts.map +1 -0
- package/dist/scoring/goal-achievement.js +241 -0
- package/dist/scoring/goal-achievement.js.map +1 -0
- package/dist/scoring/index.d.ts +22 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +115 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/parse-json.d.ts +6 -0
- package/dist/scoring/parse-json.d.ts.map +1 -0
- package/dist/scoring/parse-json.js +18 -0
- package/dist/scoring/parse-json.js.map +1 -0
- package/dist/scoring/sparse-index.d.ts +15 -0
- package/dist/scoring/sparse-index.d.ts.map +1 -0
- package/dist/scoring/sparse-index.js +338 -0
- package/dist/scoring/sparse-index.js.map +1 -0
- package/dist/scoring/triage.d.ts +15 -0
- package/dist/scoring/triage.d.ts.map +1 -0
- package/dist/scoring/triage.js +204 -0
- package/dist/scoring/triage.js.map +1 -0
- package/dist/skills/resolver.d.ts +19 -0
- package/dist/skills/resolver.d.ts.map +1 -0
- package/dist/skills/resolver.js +95 -0
- package/dist/skills/resolver.js.map +1 -0
- package/dist/transcript/categorize.d.ts +24 -0
- package/dist/transcript/categorize.d.ts.map +1 -0
- package/dist/transcript/categorize.js +233 -0
- package/dist/transcript/categorize.js.map +1 -0
- package/dist/transcript/classify.d.ts +7 -0
- package/dist/transcript/classify.d.ts.map +1 -0
- package/dist/transcript/classify.js +32 -0
- package/dist/transcript/classify.js.map +1 -0
- package/dist/transcript/extract.d.ts +24 -0
- package/dist/transcript/extract.d.ts.map +1 -0
- package/dist/transcript/extract.js +266 -0
- package/dist/transcript/extract.js.map +1 -0
- package/dist/transcript/index.d.ts +3 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +2 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/normalize.d.ts +15 -0
- package/dist/transcript/normalize.d.ts.map +1 -0
- package/dist/transcript/normalize.js +160 -0
- package/dist/transcript/normalize.js.map +1 -0
- package/dist/transcript/types.d.ts +92 -0
- package/dist/transcript/types.d.ts.map +1 -0
- package/dist/transcript/types.js +2 -0
- package/dist/transcript/types.js.map +1 -0
- package/dist/transcript/urls.d.ts +10 -0
- package/dist/transcript/urls.d.ts.map +1 -0
- package/dist/transcript/urls.js +31 -0
- package/dist/transcript/urls.js.map +1 -0
- package/dist/types/agent.d.ts +80 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/baseline.d.ts +65 -0
- package/dist/types/baseline.d.ts.map +1 -0
- package/dist/types/baseline.js +2 -0
- package/dist/types/baseline.js.map +1 -0
- package/dist/types/config.d.ts +76 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/output.d.ts +70 -0
- package/dist/types/output.d.ts.map +1 -0
- package/dist/types/output.js +15 -0
- package/dist/types/output.js.map +1 -0
- package/dist/types/report.d.ts +37 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/scenario.d.ts +23 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +2 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/scoring.d.ts +176 -0
- package/dist/types/scoring.d.ts.map +1 -0
- package/dist/types/scoring.js +2 -0
- package/dist/types/scoring.js.map +1 -0
- package/dist/ui/AnimatedTokens.d.ts +29 -0
- package/dist/ui/AnimatedTokens.d.ts.map +1 -0
- package/dist/ui/AnimatedTokens.js +53 -0
- package/dist/ui/AnimatedTokens.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +16 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/LiveDuration.d.ts +20 -0
- package/dist/ui/LiveDuration.d.ts.map +1 -0
- package/dist/ui/LiveDuration.js +31 -0
- package/dist/ui/LiveDuration.js.map +1 -0
- package/dist/ui/LiveStatus.d.ts +7 -0
- package/dist/ui/LiveStatus.d.ts.map +1 -0
- package/dist/ui/LiveStatus.js +52 -0
- package/dist/ui/LiveStatus.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +514 -0
- package/dist/ui/format.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentInput } from "../../types/agent.js";
|
|
2
|
+
import type { SetupContext } from "./agent-adapter.js";
|
|
3
|
+
export type { SetupContext } from "./agent-adapter.js";
|
|
4
|
+
/**
|
|
5
|
+
* A declarative spec for an ACP-based agent adapter. Pass to
|
|
6
|
+
* `createAcpBasedAdapter` to get back an `AgentAdapter` that speaks the
|
|
7
|
+
* Agent Client Protocol over stdio.
|
|
8
|
+
*
|
|
9
|
+
* Much simpler than `AgentAdapterSpec` because ACP handles the protocol —
|
|
10
|
+
* no `streamConfig`, `getResult`, or `initialState`.
|
|
11
|
+
*/
|
|
12
|
+
export interface AcpAdapterSpec {
|
|
13
|
+
/** Adapter name. Used in logs, error messages, and `AgentAdapter.name`. */
|
|
14
|
+
name: string;
|
|
15
|
+
/**
|
|
16
|
+
* CLI binary resolved via `resolveCommand` + npx fallback. Omit if the
|
|
17
|
+
* adapter gets its command from `input.config.command` at runtime.
|
|
18
|
+
*/
|
|
19
|
+
cliCommand?: string;
|
|
20
|
+
/** Build CLI arguments for launching the agent in ACP mode. */
|
|
21
|
+
buildArgs?: (input: AgentInput) => string[];
|
|
22
|
+
/** Execution timeout. Defaults to 10 minutes. */
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
/** Env vars the adapter requires (validated by runner pre-flight). */
|
|
25
|
+
requiredEnv?: () => string[];
|
|
26
|
+
/** Workspace isolation env vars (merged into child env by runner). */
|
|
27
|
+
isolationEnv?: (workspace: string) => Record<string, string>;
|
|
28
|
+
/**
|
|
29
|
+
* Pre-spawn side effects: mkdir, config writers, etc.
|
|
30
|
+
* Runs after env is finalized and before the process is spawned.
|
|
31
|
+
*/
|
|
32
|
+
prepare?: (ctx: SetupContext) => void | Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build an `AgentAdapter` from an ACP-based spec. The returned adapter:
|
|
36
|
+
* - Spawns the agent binary with bidirectional stdio
|
|
37
|
+
* - Runs the ACP lifecycle: initialize → session/new → session/prompt
|
|
38
|
+
* - Maps `session/update` notifications to AXIS `TranscriptEntry[]`
|
|
39
|
+
* - Auto-approves permission requests
|
|
40
|
+
* - Provides filesystem access to the agent workspace
|
|
41
|
+
* - Manages timeout, cleanup, token estimation
|
|
42
|
+
*/
|
|
43
|
+
export declare function createAcpBasedAdapter(spec: AcpAdapterSpec): AgentAdapter;
|
|
44
|
+
//# sourceMappingURL=acp-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/base/acp-adapter.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAKX,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAevD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,EAAE,CAAC;IAE5C,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAE7B,sEAAsE;IACtE,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7D;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAyBD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAqOxE"}
|
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { Readable, Writable } from "node:stream";
|
|
4
|
+
import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION, } from "@agentclientprotocol/sdk";
|
|
5
|
+
import { resolveCommand } from "../utils/resolve.js";
|
|
6
|
+
import { createTokenEstimator } from "../utils/token-estimator.js";
|
|
7
|
+
/** Default timeout for agent execution (10 minutes). */
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
9
|
+
/** Maximum bytes of stderr to buffer before truncating. */
|
|
10
|
+
const MAX_STDERR_BYTES = 100_000;
|
|
11
|
+
/** Grace period between SIGTERM and SIGKILL for non-responsive processes. */
|
|
12
|
+
const SIGTERM_TO_SIGKILL_MS = 5_000;
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Factory
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Build an `AgentAdapter` from an ACP-based spec. The returned adapter:
|
|
18
|
+
* - Spawns the agent binary with bidirectional stdio
|
|
19
|
+
* - Runs the ACP lifecycle: initialize → session/new → session/prompt
|
|
20
|
+
* - Maps `session/update` notifications to AXIS `TranscriptEntry[]`
|
|
21
|
+
* - Auto-approves permission requests
|
|
22
|
+
* - Provides filesystem access to the agent workspace
|
|
23
|
+
* - Manages timeout, cleanup, token estimation
|
|
24
|
+
*/
|
|
25
|
+
export function createAcpBasedAdapter(spec) {
|
|
26
|
+
const timeoutMs = spec.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
27
|
+
// Cached resolved command from ensureInstalled
|
|
28
|
+
let resolved = null;
|
|
29
|
+
async function doResolve() {
|
|
30
|
+
if (!spec.cliCommand)
|
|
31
|
+
return;
|
|
32
|
+
resolved = await resolveCommand(spec.name, spec.cliCommand);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
name: spec.name,
|
|
36
|
+
requiredEnv: spec.requiredEnv,
|
|
37
|
+
isolationEnv: spec.isolationEnv,
|
|
38
|
+
async ensureInstalled(_logger) {
|
|
39
|
+
await doResolve();
|
|
40
|
+
},
|
|
41
|
+
async run(input) {
|
|
42
|
+
// 1. Resolve command
|
|
43
|
+
if (spec.cliCommand && !resolved) {
|
|
44
|
+
await doResolve();
|
|
45
|
+
}
|
|
46
|
+
const command = resolved?.command ?? input.config.command;
|
|
47
|
+
if (!command) {
|
|
48
|
+
throw new Error(`The "${spec.name}" adapter has no command to spawn.`);
|
|
49
|
+
}
|
|
50
|
+
const prefixArgs = resolved?.prefixArgs ?? [];
|
|
51
|
+
// 2. Pre-spawn side effects
|
|
52
|
+
await spec.prepare?.({
|
|
53
|
+
input,
|
|
54
|
+
workingDirectory: input.workingDirectory,
|
|
55
|
+
env: input.env,
|
|
56
|
+
});
|
|
57
|
+
// 3. Build args
|
|
58
|
+
const args = spec.buildArgs?.(input) ?? [];
|
|
59
|
+
const startTime = new Date();
|
|
60
|
+
const estimator = createTokenEstimator(input.onTokenProgress);
|
|
61
|
+
const rawOutput = input.captureRawOutput ? [] : undefined;
|
|
62
|
+
const transcript = [];
|
|
63
|
+
const state = {
|
|
64
|
+
lastAssistantMessage: null,
|
|
65
|
+
pendingChunks: "",
|
|
66
|
+
pendingTimestamp: null,
|
|
67
|
+
resultError: null,
|
|
68
|
+
activeToolCalls: new Map(),
|
|
69
|
+
};
|
|
70
|
+
// 4. Spawn the ACP agent process — keep stdin OPEN for bidirectional JSON-RPC
|
|
71
|
+
const child = spawn(command, [...prefixArgs, ...args], {
|
|
72
|
+
cwd: input.workingDirectory,
|
|
73
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
74
|
+
env: input.env ?? { ...process.env },
|
|
75
|
+
});
|
|
76
|
+
// 5. Cleanup handler for Ctrl-C
|
|
77
|
+
input.registerCleanup?.(() => {
|
|
78
|
+
child.kill("SIGTERM");
|
|
79
|
+
});
|
|
80
|
+
// 6. Register close listener BEFORE reading (ordering matters)
|
|
81
|
+
const exitPromise = new Promise((resolve) => {
|
|
82
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
83
|
+
});
|
|
84
|
+
// 7. Buffer stderr with a size cap
|
|
85
|
+
let stderr = "";
|
|
86
|
+
child.stderr?.on("data", (data) => {
|
|
87
|
+
if (stderr.length < MAX_STDERR_BYTES) {
|
|
88
|
+
stderr += data.toString();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// 8. Timeout → SIGTERM → SIGKILL
|
|
92
|
+
let timedOut = false;
|
|
93
|
+
let killTimer;
|
|
94
|
+
const outerTimer = setTimeout(() => {
|
|
95
|
+
timedOut = true;
|
|
96
|
+
child.kill("SIGTERM");
|
|
97
|
+
killTimer = setTimeout(() => child.kill("SIGKILL"), SIGTERM_TO_SIGKILL_MS);
|
|
98
|
+
}, timeoutMs);
|
|
99
|
+
child.on("close", () => {
|
|
100
|
+
if (killTimer)
|
|
101
|
+
clearTimeout(killTimer);
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
// 9. Wire ACP SDK — convert Node streams to Web Streams for ndJsonStream
|
|
105
|
+
const stdinWeb = Writable.toWeb(child.stdin);
|
|
106
|
+
const stdoutWeb = Readable.toWeb(child.stdout);
|
|
107
|
+
const stream = ndJsonStream(stdinWeb, stdoutWeb);
|
|
108
|
+
// 10. Create ACP client handler
|
|
109
|
+
const client = buildClient(input, state, transcript, estimator, rawOutput);
|
|
110
|
+
const connection = new ClientSideConnection((_agent) => client, stream);
|
|
111
|
+
// 11. Initialize — negotiate protocol version and capabilities
|
|
112
|
+
const initResult = await connection.initialize({
|
|
113
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
114
|
+
clientCapabilities: {
|
|
115
|
+
fs: { readTextFile: true, writeTextFile: true },
|
|
116
|
+
},
|
|
117
|
+
clientInfo: {
|
|
118
|
+
name: "axis",
|
|
119
|
+
version: "0.1.0",
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
rawOutput?.push(JSON.stringify({ type: "initialize_result", ...initResult }));
|
|
123
|
+
// 12. Create session
|
|
124
|
+
const mcpServers = convertMcpServers(input.mcpServers);
|
|
125
|
+
const sessionResult = await connection.newSession({
|
|
126
|
+
cwd: input.workingDirectory,
|
|
127
|
+
mcpServers,
|
|
128
|
+
});
|
|
129
|
+
state.sessionId = sessionResult.sessionId;
|
|
130
|
+
rawOutput?.push(JSON.stringify({ type: "session_result", ...sessionResult }));
|
|
131
|
+
// 13. Add the initial prompt to the transcript and raw output
|
|
132
|
+
transcript.push({
|
|
133
|
+
type: "user",
|
|
134
|
+
timestamp: new Date().toISOString(),
|
|
135
|
+
content: { content: input.prompt },
|
|
136
|
+
});
|
|
137
|
+
rawOutput?.push(JSON.stringify({
|
|
138
|
+
type: "prompt",
|
|
139
|
+
sessionId: sessionResult.sessionId,
|
|
140
|
+
prompt: [{ type: "text", text: input.prompt }],
|
|
141
|
+
}));
|
|
142
|
+
// 14. Send prompt and wait for completion — time just the agent work
|
|
143
|
+
const promptStart = Date.now();
|
|
144
|
+
const promptResult = await connection.prompt({
|
|
145
|
+
sessionId: sessionResult.sessionId,
|
|
146
|
+
prompt: [{ type: "text", text: input.prompt }],
|
|
147
|
+
});
|
|
148
|
+
state.promptDurationMs = Date.now() - promptStart;
|
|
149
|
+
rawOutput?.push(JSON.stringify({ type: "prompt_result", ...promptResult }));
|
|
150
|
+
// 15. Extract token usage from PromptResponse if available
|
|
151
|
+
if (promptResult.usage) {
|
|
152
|
+
state.tokenUsage = {
|
|
153
|
+
input: promptResult.usage.inputTokens,
|
|
154
|
+
output: promptResult.usage.outputTokens,
|
|
155
|
+
...(promptResult.usage.cachedReadTokens != null
|
|
156
|
+
? { cacheReadInput: promptResult.usage.cachedReadTokens }
|
|
157
|
+
: {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// 16. Map stop reason to potential error
|
|
161
|
+
if (promptResult.stopReason === "cancelled") {
|
|
162
|
+
state.resultError = "Agent cancelled";
|
|
163
|
+
}
|
|
164
|
+
else if (promptResult.stopReason === "max_tokens") {
|
|
165
|
+
state.resultError = "Agent hit max tokens limit";
|
|
166
|
+
}
|
|
167
|
+
else if (promptResult.stopReason === "refusal") {
|
|
168
|
+
state.resultError = "Agent refused to continue";
|
|
169
|
+
}
|
|
170
|
+
else if (promptResult.stopReason === "max_turn_requests") {
|
|
171
|
+
state.resultError = "Agent exceeded max turn requests";
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (!timedOut) {
|
|
176
|
+
state.resultError = err instanceof Error ? err.message : String(err);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
clearTimeout(outerTimer);
|
|
181
|
+
// Flush any pending message chunks
|
|
182
|
+
flushPendingChunks(state, transcript);
|
|
183
|
+
// Kill the child process if still running
|
|
184
|
+
try {
|
|
185
|
+
child.kill("SIGTERM");
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// already dead
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// 17. Wait for process exit
|
|
192
|
+
const exitCode = await exitPromise;
|
|
193
|
+
const endTime = new Date();
|
|
194
|
+
// 18. Timeout path
|
|
195
|
+
if (timedOut) {
|
|
196
|
+
return {
|
|
197
|
+
transcript,
|
|
198
|
+
result: null,
|
|
199
|
+
rawOutput,
|
|
200
|
+
metadata: {
|
|
201
|
+
startTime: startTime.toISOString(),
|
|
202
|
+
endTime: endTime.toISOString(),
|
|
203
|
+
durationMs: endTime.getTime() - startTime.getTime(),
|
|
204
|
+
exitCode,
|
|
205
|
+
error: `Agent timed out after ${timeoutMs / 1000}s`,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// 19. Build result
|
|
210
|
+
let error = state.resultError ?? undefined;
|
|
211
|
+
if (!error && exitCode !== 0 && !state.lastAssistantMessage) {
|
|
212
|
+
error = stderr || "Agent process exited with non-zero code";
|
|
213
|
+
}
|
|
214
|
+
const metadata = {
|
|
215
|
+
startTime: startTime.toISOString(),
|
|
216
|
+
endTime: endTime.toISOString(),
|
|
217
|
+
durationMs: state.promptDurationMs ?? endTime.getTime() - startTime.getTime(),
|
|
218
|
+
exitCode,
|
|
219
|
+
tokenUsage: state.tokenUsage,
|
|
220
|
+
totalCostUsd: state.totalCostUsd,
|
|
221
|
+
sessionId: state.sessionId,
|
|
222
|
+
...(error ? { error } : {}),
|
|
223
|
+
};
|
|
224
|
+
return {
|
|
225
|
+
transcript,
|
|
226
|
+
result: state.lastAssistantMessage,
|
|
227
|
+
rawOutput,
|
|
228
|
+
metadata,
|
|
229
|
+
};
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// ACP Client implementation
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
function buildClient(input, state, transcript, estimator, rawOutput) {
|
|
237
|
+
return {
|
|
238
|
+
// Auto-approve all permission requests for headless AXIS execution
|
|
239
|
+
async requestPermission(params) {
|
|
240
|
+
// Prefer allow_always, fall back to the first option
|
|
241
|
+
const allowAlways = params.options.find((o) => o.kind === "allow_always");
|
|
242
|
+
const selected = allowAlways ?? params.options[0];
|
|
243
|
+
return {
|
|
244
|
+
outcome: {
|
|
245
|
+
outcome: "selected",
|
|
246
|
+
optionId: selected.optionId,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
// Handle streaming session updates — the core event mapper
|
|
251
|
+
async sessionUpdate(params) {
|
|
252
|
+
const update = params.update;
|
|
253
|
+
rawOutput?.push(JSON.stringify(update));
|
|
254
|
+
switch (update.sessionUpdate) {
|
|
255
|
+
case "agent_message_chunk":
|
|
256
|
+
handleAgentMessageChunk(update, state, transcript, estimator);
|
|
257
|
+
break;
|
|
258
|
+
case "agent_thought_chunk":
|
|
259
|
+
// Feed to token estimator only — no transcript entry
|
|
260
|
+
feedContentBlock(update.content, estimator);
|
|
261
|
+
break;
|
|
262
|
+
case "tool_call":
|
|
263
|
+
// Flush pending message chunks before tool call
|
|
264
|
+
flushPendingChunks(state, transcript);
|
|
265
|
+
handleToolCall(update, state, transcript, estimator);
|
|
266
|
+
break;
|
|
267
|
+
case "tool_call_update":
|
|
268
|
+
handleToolCallUpdate(update, state, transcript, estimator);
|
|
269
|
+
break;
|
|
270
|
+
case "plan":
|
|
271
|
+
flushPendingChunks(state, transcript);
|
|
272
|
+
handlePlan(update, transcript);
|
|
273
|
+
break;
|
|
274
|
+
case "usage_update":
|
|
275
|
+
handleUsageUpdate(update, state);
|
|
276
|
+
break;
|
|
277
|
+
default:
|
|
278
|
+
// available_commands_update, current_mode_update, etc.
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
// Filesystem access within the workspace
|
|
283
|
+
async readTextFile(params) {
|
|
284
|
+
const content = fs.readFileSync(params.path, "utf-8");
|
|
285
|
+
return { content };
|
|
286
|
+
},
|
|
287
|
+
async writeTextFile(params) {
|
|
288
|
+
// Ensure parent directory exists
|
|
289
|
+
const dir = params.path.substring(0, params.path.lastIndexOf("/"));
|
|
290
|
+
if (dir) {
|
|
291
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
292
|
+
}
|
|
293
|
+
fs.writeFileSync(params.path, params.content, "utf-8");
|
|
294
|
+
return {};
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// Event handlers — map ACP events to TranscriptEntry[]
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
/**
|
|
302
|
+
* Accumulate agent message chunks. Following Gemini's delta pattern,
|
|
303
|
+
* we buffer chunks and flush as a single assistant entry when a
|
|
304
|
+
* non-message event arrives or the stream ends.
|
|
305
|
+
*/
|
|
306
|
+
function handleAgentMessageChunk(update, state, _transcript, estimator) {
|
|
307
|
+
const text = extractTextFromContentBlock(update.content);
|
|
308
|
+
if (!text)
|
|
309
|
+
return;
|
|
310
|
+
if (!state.pendingTimestamp) {
|
|
311
|
+
state.pendingTimestamp = new Date().toISOString();
|
|
312
|
+
}
|
|
313
|
+
state.pendingChunks += text;
|
|
314
|
+
estimator.addText(text);
|
|
315
|
+
}
|
|
316
|
+
/** Flush accumulated message chunks into a single assistant transcript entry. */
|
|
317
|
+
function flushPendingChunks(state, transcript) {
|
|
318
|
+
if (!state.pendingChunks)
|
|
319
|
+
return;
|
|
320
|
+
state.lastAssistantMessage = state.pendingChunks;
|
|
321
|
+
transcript.push({
|
|
322
|
+
type: "assistant",
|
|
323
|
+
timestamp: state.pendingTimestamp ?? new Date().toISOString(),
|
|
324
|
+
content: {
|
|
325
|
+
content: state.pendingChunks,
|
|
326
|
+
text: state.pendingChunks,
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
state.pendingChunks = "";
|
|
330
|
+
state.pendingTimestamp = null;
|
|
331
|
+
}
|
|
332
|
+
/** Handle a new tool call — push tool_use entry. */
|
|
333
|
+
function handleToolCall(update, state, transcript, estimator) {
|
|
334
|
+
state.activeToolCalls.set(update.toolCallId, {
|
|
335
|
+
title: update.title,
|
|
336
|
+
kind: update.kind,
|
|
337
|
+
});
|
|
338
|
+
// Feed text to estimator
|
|
339
|
+
estimator.addText(update.title);
|
|
340
|
+
if (update.rawInput != null) {
|
|
341
|
+
const inputText = typeof update.rawInput === "string" ? update.rawInput : JSON.stringify(update.rawInput);
|
|
342
|
+
estimator.addText(inputText);
|
|
343
|
+
}
|
|
344
|
+
// Build parameters object for extractToolInput compatibility
|
|
345
|
+
const parameters = update.rawInput != null
|
|
346
|
+
? typeof update.rawInput === "object" && !Array.isArray(update.rawInput)
|
|
347
|
+
? update.rawInput
|
|
348
|
+
: { value: update.rawInput }
|
|
349
|
+
: undefined;
|
|
350
|
+
transcript.push({
|
|
351
|
+
type: "tool_use",
|
|
352
|
+
timestamp: new Date().toISOString(),
|
|
353
|
+
content: {
|
|
354
|
+
// extractToolName → content.tool_name (Gemini path)
|
|
355
|
+
tool_name: update.title,
|
|
356
|
+
// extractToolId → content.tool_id
|
|
357
|
+
tool_id: update.toolCallId,
|
|
358
|
+
// extractToolInput → content.parameters (Gemini path)
|
|
359
|
+
parameters,
|
|
360
|
+
// ACP-specific enrichment
|
|
361
|
+
kind: update.kind,
|
|
362
|
+
status: update.status,
|
|
363
|
+
locations: update.locations,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
/** Handle a tool call update — push tool_result or error entry on completion/failure. */
|
|
368
|
+
function handleToolCallUpdate(update, state, transcript, estimator) {
|
|
369
|
+
// Feed output to estimator
|
|
370
|
+
if (update.rawOutput != null) {
|
|
371
|
+
const outputText = typeof update.rawOutput === "string" ? update.rawOutput : JSON.stringify(update.rawOutput);
|
|
372
|
+
estimator.addText(outputText);
|
|
373
|
+
}
|
|
374
|
+
feedToolCallContent(update.content, estimator);
|
|
375
|
+
// ACP bridges send rawInput in intermediate updates (not on the initial tool_call
|
|
376
|
+
// which arrives with rawInput: {}). Backfill the matching tool_use entry's parameters.
|
|
377
|
+
backfillToolUseParameters(update, state, transcript, estimator);
|
|
378
|
+
const status = update.status;
|
|
379
|
+
if (status !== "completed" && status !== "failed")
|
|
380
|
+
return;
|
|
381
|
+
const active = state.activeToolCalls.get(update.toolCallId);
|
|
382
|
+
const title = update.title ?? active?.title ?? update.toolCallId;
|
|
383
|
+
const kind = update.kind ?? active?.kind;
|
|
384
|
+
const resultText = extractToolResultText(update.content, update.rawOutput);
|
|
385
|
+
if (status === "failed") {
|
|
386
|
+
transcript.push({
|
|
387
|
+
type: "error",
|
|
388
|
+
timestamp: new Date().toISOString(),
|
|
389
|
+
content: {
|
|
390
|
+
error: `Tool failed: ${title}`,
|
|
391
|
+
tool_id: update.toolCallId,
|
|
392
|
+
output: resultText,
|
|
393
|
+
kind,
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
transcript.push({
|
|
399
|
+
type: "tool_result",
|
|
400
|
+
timestamp: new Date().toISOString(),
|
|
401
|
+
content: {
|
|
402
|
+
// extractToolId → content.tool_id
|
|
403
|
+
tool_id: update.toolCallId,
|
|
404
|
+
// extractToolResultText → content.output (Gemini/Codex path)
|
|
405
|
+
output: resultText,
|
|
406
|
+
// extractToolName → content.name (for pairing display)
|
|
407
|
+
name: title,
|
|
408
|
+
kind,
|
|
409
|
+
locations: update.locations,
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
state.activeToolCalls.delete(update.toolCallId);
|
|
414
|
+
}
|
|
415
|
+
/** Handle a plan update — push system entry. */
|
|
416
|
+
function handlePlan(update, transcript) {
|
|
417
|
+
transcript.push({
|
|
418
|
+
type: "system",
|
|
419
|
+
timestamp: new Date().toISOString(),
|
|
420
|
+
content: {
|
|
421
|
+
type: "plan",
|
|
422
|
+
entries: update.entries,
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
/** Handle a usage update — capture token/cost data. */
|
|
427
|
+
function handleUsageUpdate(update, state) {
|
|
428
|
+
// UsageUpdate has `size` (context window) and `used` (tokens in context)
|
|
429
|
+
// We capture `used` as input tokens since it's the best approximation
|
|
430
|
+
if (!state.tokenUsage) {
|
|
431
|
+
state.tokenUsage = { input: update.used, output: 0 };
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
state.tokenUsage.input = update.used;
|
|
435
|
+
}
|
|
436
|
+
// Capture cumulative session cost (last value wins — ACP cost is cumulative)
|
|
437
|
+
if (update.cost != null) {
|
|
438
|
+
state.totalCostUsd = update.cost.amount;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Backfill tool_use parameters from intermediate tool_call_update events.
|
|
443
|
+
* ACP bridges send the initial tool_call with rawInput: {} (pending),
|
|
444
|
+
* then a follow-up tool_call_update with the actual rawInput populated.
|
|
445
|
+
*/
|
|
446
|
+
function backfillToolUseParameters(update, state, transcript, estimator) {
|
|
447
|
+
// Only process updates that carry actual rawInput data
|
|
448
|
+
if (update.rawInput == null)
|
|
449
|
+
return;
|
|
450
|
+
const rawInput = update.rawInput;
|
|
451
|
+
if (typeof rawInput === "object" && !Array.isArray(rawInput) && Object.keys(rawInput).length === 0)
|
|
452
|
+
return;
|
|
453
|
+
const parameters = typeof rawInput === "object" && !Array.isArray(rawInput)
|
|
454
|
+
? rawInput
|
|
455
|
+
: { value: rawInput };
|
|
456
|
+
// Feed the actual input to the token estimator
|
|
457
|
+
estimator.addText(JSON.stringify(parameters));
|
|
458
|
+
// Find the matching tool_use entry and update its parameters
|
|
459
|
+
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
460
|
+
const entry = transcript[i];
|
|
461
|
+
if (entry.type === "tool_use" && entry.content.tool_id === update.toolCallId) {
|
|
462
|
+
entry.content.parameters = parameters;
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// Update activeToolCalls with the more descriptive title if present
|
|
467
|
+
if (update.title) {
|
|
468
|
+
const active = state.activeToolCalls.get(update.toolCallId);
|
|
469
|
+
if (active) {
|
|
470
|
+
active.title = update.title;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (update.kind) {
|
|
474
|
+
const active = state.activeToolCalls.get(update.toolCallId);
|
|
475
|
+
if (active) {
|
|
476
|
+
active.kind = update.kind;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// ---------------------------------------------------------------------------
|
|
481
|
+
// Helpers
|
|
482
|
+
// ---------------------------------------------------------------------------
|
|
483
|
+
/** Extract text from a ContentBlock. */
|
|
484
|
+
function extractTextFromContentBlock(block) {
|
|
485
|
+
if (block.type === "text") {
|
|
486
|
+
return block.text;
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
/** Feed a ContentBlock to the token estimator. */
|
|
491
|
+
function feedContentBlock(block, estimator) {
|
|
492
|
+
const text = extractTextFromContentBlock(block);
|
|
493
|
+
if (text) {
|
|
494
|
+
estimator.addText(text);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/** Feed tool call content to the token estimator. */
|
|
498
|
+
function feedToolCallContent(content, estimator) {
|
|
499
|
+
if (!content)
|
|
500
|
+
return;
|
|
501
|
+
for (const block of content) {
|
|
502
|
+
if (block.type === "content") {
|
|
503
|
+
feedContentBlock(block.content, estimator);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
/** Extract human-readable result text from tool call content and rawOutput. */
|
|
508
|
+
function extractToolResultText(content, rawOutput) {
|
|
509
|
+
if (content) {
|
|
510
|
+
const parts = [];
|
|
511
|
+
for (const block of content) {
|
|
512
|
+
if (block.type === "content") {
|
|
513
|
+
if (block.content.type === "text") {
|
|
514
|
+
parts.push(block.content.text);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
else if (block.type === "diff") {
|
|
518
|
+
const diff = block;
|
|
519
|
+
parts.push(`[diff: ${diff.path ?? "unknown"}]`);
|
|
520
|
+
}
|
|
521
|
+
else if (block.type === "terminal") {
|
|
522
|
+
const terminal = block;
|
|
523
|
+
parts.push(`[terminal: ${terminal.terminalId ?? "unknown"}]`);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (parts.length > 0)
|
|
527
|
+
return parts.join("\n");
|
|
528
|
+
}
|
|
529
|
+
if (rawOutput != null) {
|
|
530
|
+
return typeof rawOutput === "string" ? rawOutput : JSON.stringify(rawOutput);
|
|
531
|
+
}
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Convert AXIS MCP server configs to ACP McpServer format.
|
|
536
|
+
* AXIS stores them as Record<name, config>; ACP expects an array with name on each.
|
|
537
|
+
*/
|
|
538
|
+
function convertMcpServers(servers) {
|
|
539
|
+
if (!servers)
|
|
540
|
+
return [];
|
|
541
|
+
return Object.entries(servers).map(([name, config]) => {
|
|
542
|
+
if (config.type === "http") {
|
|
543
|
+
return {
|
|
544
|
+
type: "http",
|
|
545
|
+
name,
|
|
546
|
+
url: config.url,
|
|
547
|
+
headers: config.headers ? Object.entries(config.headers).map(([k, v]) => ({ name: k, value: v })) : [],
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
// stdio
|
|
551
|
+
return {
|
|
552
|
+
name,
|
|
553
|
+
command: config.command,
|
|
554
|
+
args: config.args ?? [],
|
|
555
|
+
env: config.env ? Object.entries(config.env).map(([k, v]) => ({ name: k, value: v })) : [],
|
|
556
|
+
};
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
//# sourceMappingURL=acp-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-adapter.js","sourceRoot":"","sources":["../../../src/adapters/base/acp-adapter.ts"],"names":[],"mappings":"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"}
|