@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.
Files changed (230) hide show
  1. package/README.md +977 -0
  2. package/dist/adapters/base/acp-adapter.d.ts +44 -0
  3. package/dist/adapters/base/acp-adapter.d.ts.map +1 -0
  4. package/dist/adapters/base/acp-adapter.js +559 -0
  5. package/dist/adapters/base/acp-adapter.js.map +1 -0
  6. package/dist/adapters/base/agent-adapter.d.ts +132 -0
  7. package/dist/adapters/base/agent-adapter.d.ts.map +1 -0
  8. package/dist/adapters/base/agent-adapter.js +212 -0
  9. package/dist/adapters/base/agent-adapter.js.map +1 -0
  10. package/dist/adapters/claude-code.d.ts +3 -0
  11. package/dist/adapters/claude-code.d.ts.map +1 -0
  12. package/dist/adapters/claude-code.js +138 -0
  13. package/dist/adapters/claude-code.js.map +1 -0
  14. package/dist/adapters/claude-sdk.d.ts +11 -0
  15. package/dist/adapters/claude-sdk.d.ts.map +1 -0
  16. package/dist/adapters/claude-sdk.js +46 -0
  17. package/dist/adapters/claude-sdk.js.map +1 -0
  18. package/dist/adapters/codex.d.ts +3 -0
  19. package/dist/adapters/codex.d.ts.map +1 -0
  20. package/dist/adapters/codex.js +183 -0
  21. package/dist/adapters/codex.js.map +1 -0
  22. package/dist/adapters/gemini-acp.d.ts +11 -0
  23. package/dist/adapters/gemini-acp.d.ts.map +1 -0
  24. package/dist/adapters/gemini-acp.js +60 -0
  25. package/dist/adapters/gemini-acp.js.map +1 -0
  26. package/dist/adapters/gemini.d.ts +3 -0
  27. package/dist/adapters/gemini.d.ts.map +1 -0
  28. package/dist/adapters/gemini.js +222 -0
  29. package/dist/adapters/gemini.js.map +1 -0
  30. package/dist/adapters/goose.d.ts +3 -0
  31. package/dist/adapters/goose.d.ts.map +1 -0
  32. package/dist/adapters/goose.js +9 -0
  33. package/dist/adapters/goose.js.map +1 -0
  34. package/dist/adapters/registry.d.ts +7 -0
  35. package/dist/adapters/registry.d.ts.map +1 -0
  36. package/dist/adapters/registry.js +37 -0
  37. package/dist/adapters/registry.js.map +1 -0
  38. package/dist/adapters/utils/mcp.d.ts +23 -0
  39. package/dist/adapters/utils/mcp.d.ts.map +1 -0
  40. package/dist/adapters/utils/mcp.js +114 -0
  41. package/dist/adapters/utils/mcp.js.map +1 -0
  42. package/dist/adapters/utils/resolve.d.ts +20 -0
  43. package/dist/adapters/utils/resolve.d.ts.map +1 -0
  44. package/dist/adapters/utils/resolve.js +48 -0
  45. package/dist/adapters/utils/resolve.js.map +1 -0
  46. package/dist/adapters/utils/skills.d.ts +17 -0
  47. package/dist/adapters/utils/skills.d.ts.map +1 -0
  48. package/dist/adapters/utils/skills.js +52 -0
  49. package/dist/adapters/utils/skills.js.map +1 -0
  50. package/dist/adapters/utils/token-estimator.d.ts +21 -0
  51. package/dist/adapters/utils/token-estimator.d.ts.map +1 -0
  52. package/dist/adapters/utils/token-estimator.js +37 -0
  53. package/dist/adapters/utils/token-estimator.js.map +1 -0
  54. package/dist/baselines/diff.d.ts +9 -0
  55. package/dist/baselines/diff.d.ts.map +1 -0
  56. package/dist/baselines/diff.js +83 -0
  57. package/dist/baselines/diff.js.map +1 -0
  58. package/dist/baselines/index.d.ts +3 -0
  59. package/dist/baselines/index.d.ts.map +1 -0
  60. package/dist/baselines/index.js +3 -0
  61. package/dist/baselines/index.js.map +1 -0
  62. package/dist/baselines/store.d.ts +19 -0
  63. package/dist/baselines/store.d.ts.map +1 -0
  64. package/dist/baselines/store.js +104 -0
  65. package/dist/baselines/store.js.map +1 -0
  66. package/dist/cli.d.ts +3 -0
  67. package/dist/cli.d.ts.map +1 -0
  68. package/dist/cli.js +487 -0
  69. package/dist/cli.js.map +1 -0
  70. package/dist/config/loader.d.ts +8 -0
  71. package/dist/config/loader.d.ts.map +1 -0
  72. package/dist/config/loader.js +99 -0
  73. package/dist/config/loader.js.map +1 -0
  74. package/dist/config/validator.d.ts +11 -0
  75. package/dist/config/validator.d.ts.map +1 -0
  76. package/dist/config/validator.js +203 -0
  77. package/dist/config/validator.js.map +1 -0
  78. package/dist/docs-site/_astro/cli.DDWZtG0-.css +1 -0
  79. package/dist/docs-site/cli/index.html +18 -0
  80. package/dist/docs-site/configuration/index.html +121 -0
  81. package/dist/docs-site/content-assets.mjs +1 -0
  82. package/dist/docs-site/content-modules.mjs +1 -0
  83. package/dist/docs-site/data-store.json +9 -0
  84. package/dist/docs-site/index.html +69 -0
  85. package/dist/docs-site/quickstart/index.html +59 -0
  86. package/dist/docs-site/running/index.html +87 -0
  87. package/dist/docs-site/scoring/index.html +135 -0
  88. package/dist/index.d.ts +19 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +15 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/report-ui/index.html +291 -0
  93. package/dist/report-ui/mock-data.json +298 -0
  94. package/dist/reports/html.d.ts +7 -0
  95. package/dist/reports/html.d.ts.map +1 -0
  96. package/dist/reports/html.js +27 -0
  97. package/dist/reports/html.js.map +1 -0
  98. package/dist/reports/reader.d.ts +21 -0
  99. package/dist/reports/reader.d.ts.map +1 -0
  100. package/dist/reports/reader.js +110 -0
  101. package/dist/reports/reader.js.map +1 -0
  102. package/dist/reports/writer.d.ts +14 -0
  103. package/dist/reports/writer.d.ts.map +1 -0
  104. package/dist/reports/writer.js +106 -0
  105. package/dist/reports/writer.js.map +1 -0
  106. package/dist/runner/lifecycle.d.ts +10 -0
  107. package/dist/runner/lifecycle.d.ts.map +1 -0
  108. package/dist/runner/lifecycle.js +58 -0
  109. package/dist/runner/lifecycle.js.map +1 -0
  110. package/dist/runner/runner.d.ts +34 -0
  111. package/dist/runner/runner.d.ts.map +1 -0
  112. package/dist/runner/runner.js +330 -0
  113. package/dist/runner/runner.js.map +1 -0
  114. package/dist/scoring/category-score.d.ts +52 -0
  115. package/dist/scoring/category-score.d.ts.map +1 -0
  116. package/dist/scoring/category-score.js +157 -0
  117. package/dist/scoring/category-score.js.map +1 -0
  118. package/dist/scoring/composite.d.ts +5 -0
  119. package/dist/scoring/composite.d.ts.map +1 -0
  120. package/dist/scoring/composite.js +24 -0
  121. package/dist/scoring/composite.js.map +1 -0
  122. package/dist/scoring/deep-eval.d.ts +25 -0
  123. package/dist/scoring/deep-eval.d.ts.map +1 -0
  124. package/dist/scoring/deep-eval.js +382 -0
  125. package/dist/scoring/deep-eval.js.map +1 -0
  126. package/dist/scoring/goal-achievement.d.ts +5 -0
  127. package/dist/scoring/goal-achievement.d.ts.map +1 -0
  128. package/dist/scoring/goal-achievement.js +241 -0
  129. package/dist/scoring/goal-achievement.js.map +1 -0
  130. package/dist/scoring/index.d.ts +22 -0
  131. package/dist/scoring/index.d.ts.map +1 -0
  132. package/dist/scoring/index.js +115 -0
  133. package/dist/scoring/index.js.map +1 -0
  134. package/dist/scoring/parse-json.d.ts +6 -0
  135. package/dist/scoring/parse-json.d.ts.map +1 -0
  136. package/dist/scoring/parse-json.js +18 -0
  137. package/dist/scoring/parse-json.js.map +1 -0
  138. package/dist/scoring/sparse-index.d.ts +15 -0
  139. package/dist/scoring/sparse-index.d.ts.map +1 -0
  140. package/dist/scoring/sparse-index.js +338 -0
  141. package/dist/scoring/sparse-index.js.map +1 -0
  142. package/dist/scoring/triage.d.ts +15 -0
  143. package/dist/scoring/triage.d.ts.map +1 -0
  144. package/dist/scoring/triage.js +204 -0
  145. package/dist/scoring/triage.js.map +1 -0
  146. package/dist/skills/resolver.d.ts +19 -0
  147. package/dist/skills/resolver.d.ts.map +1 -0
  148. package/dist/skills/resolver.js +95 -0
  149. package/dist/skills/resolver.js.map +1 -0
  150. package/dist/transcript/categorize.d.ts +24 -0
  151. package/dist/transcript/categorize.d.ts.map +1 -0
  152. package/dist/transcript/categorize.js +233 -0
  153. package/dist/transcript/categorize.js.map +1 -0
  154. package/dist/transcript/classify.d.ts +7 -0
  155. package/dist/transcript/classify.d.ts.map +1 -0
  156. package/dist/transcript/classify.js +32 -0
  157. package/dist/transcript/classify.js.map +1 -0
  158. package/dist/transcript/extract.d.ts +24 -0
  159. package/dist/transcript/extract.d.ts.map +1 -0
  160. package/dist/transcript/extract.js +266 -0
  161. package/dist/transcript/extract.js.map +1 -0
  162. package/dist/transcript/index.d.ts +3 -0
  163. package/dist/transcript/index.d.ts.map +1 -0
  164. package/dist/transcript/index.js +2 -0
  165. package/dist/transcript/index.js.map +1 -0
  166. package/dist/transcript/normalize.d.ts +15 -0
  167. package/dist/transcript/normalize.d.ts.map +1 -0
  168. package/dist/transcript/normalize.js +160 -0
  169. package/dist/transcript/normalize.js.map +1 -0
  170. package/dist/transcript/types.d.ts +92 -0
  171. package/dist/transcript/types.d.ts.map +1 -0
  172. package/dist/transcript/types.js +2 -0
  173. package/dist/transcript/types.js.map +1 -0
  174. package/dist/transcript/urls.d.ts +10 -0
  175. package/dist/transcript/urls.d.ts.map +1 -0
  176. package/dist/transcript/urls.js +31 -0
  177. package/dist/transcript/urls.js.map +1 -0
  178. package/dist/types/agent.d.ts +80 -0
  179. package/dist/types/agent.d.ts.map +1 -0
  180. package/dist/types/agent.js +2 -0
  181. package/dist/types/agent.js.map +1 -0
  182. package/dist/types/baseline.d.ts +65 -0
  183. package/dist/types/baseline.d.ts.map +1 -0
  184. package/dist/types/baseline.js +2 -0
  185. package/dist/types/baseline.js.map +1 -0
  186. package/dist/types/config.d.ts +76 -0
  187. package/dist/types/config.d.ts.map +1 -0
  188. package/dist/types/config.js +2 -0
  189. package/dist/types/config.js.map +1 -0
  190. package/dist/types/index.d.ts +8 -0
  191. package/dist/types/index.d.ts.map +1 -0
  192. package/dist/types/index.js +8 -0
  193. package/dist/types/index.js.map +1 -0
  194. package/dist/types/output.d.ts +70 -0
  195. package/dist/types/output.d.ts.map +1 -0
  196. package/dist/types/output.js +15 -0
  197. package/dist/types/output.js.map +1 -0
  198. package/dist/types/report.d.ts +37 -0
  199. package/dist/types/report.d.ts.map +1 -0
  200. package/dist/types/report.js +2 -0
  201. package/dist/types/report.js.map +1 -0
  202. package/dist/types/scenario.d.ts +23 -0
  203. package/dist/types/scenario.d.ts.map +1 -0
  204. package/dist/types/scenario.js +2 -0
  205. package/dist/types/scenario.js.map +1 -0
  206. package/dist/types/scoring.d.ts +176 -0
  207. package/dist/types/scoring.d.ts.map +1 -0
  208. package/dist/types/scoring.js +2 -0
  209. package/dist/types/scoring.js.map +1 -0
  210. package/dist/ui/AnimatedTokens.d.ts +29 -0
  211. package/dist/ui/AnimatedTokens.d.ts.map +1 -0
  212. package/dist/ui/AnimatedTokens.js +53 -0
  213. package/dist/ui/AnimatedTokens.js.map +1 -0
  214. package/dist/ui/App.d.ts +6 -0
  215. package/dist/ui/App.d.ts.map +1 -0
  216. package/dist/ui/App.js +16 -0
  217. package/dist/ui/App.js.map +1 -0
  218. package/dist/ui/LiveDuration.d.ts +20 -0
  219. package/dist/ui/LiveDuration.d.ts.map +1 -0
  220. package/dist/ui/LiveDuration.js +31 -0
  221. package/dist/ui/LiveDuration.js.map +1 -0
  222. package/dist/ui/LiveStatus.d.ts +7 -0
  223. package/dist/ui/LiveStatus.d.ts.map +1 -0
  224. package/dist/ui/LiveStatus.js +52 -0
  225. package/dist/ui/LiveStatus.js.map +1 -0
  226. package/dist/ui/format.d.ts +29 -0
  227. package/dist/ui/format.d.ts.map +1 -0
  228. package/dist/ui/format.js +514 -0
  229. package/dist/ui/format.js.map +1 -0
  230. 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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"}