subharness 0.0.4 → 0.0.5

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 (188) hide show
  1. package/README.md +36 -6
  2. package/dist/adapters/claude-process.d.ts +3 -0
  3. package/dist/adapters/claude-process.js +11 -1
  4. package/dist/adapters/claude-process.js.map +1 -1
  5. package/dist/adapters/claude-result.d.ts +2 -0
  6. package/dist/adapters/claude-result.js +22 -0
  7. package/dist/adapters/claude-result.js.map +1 -0
  8. package/dist/adapters/claude.js +30 -11
  9. package/dist/adapters/claude.js.map +1 -1
  10. package/dist/adapters/codex.js +4 -1
  11. package/dist/adapters/codex.js.map +1 -1
  12. package/dist/adapters/copilot-permissions.d.ts +26 -0
  13. package/dist/adapters/copilot-permissions.js +121 -0
  14. package/dist/adapters/copilot-permissions.js.map +1 -0
  15. package/dist/adapters/copilot-tools.d.ts +12 -0
  16. package/dist/adapters/copilot-tools.js +61 -0
  17. package/dist/adapters/copilot-tools.js.map +1 -0
  18. package/dist/adapters/copilot.d.ts +108 -0
  19. package/dist/adapters/copilot.js +819 -0
  20. package/dist/adapters/copilot.js.map +1 -0
  21. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  22. package/dist/adapters/cursor-cli-approvals.js +83 -0
  23. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  24. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  25. package/dist/adapters/cursor-cli-model.js +64 -0
  26. package/dist/adapters/cursor-cli-model.js.map +1 -0
  27. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  28. package/dist/adapters/cursor-cli-session.js +316 -0
  29. package/dist/adapters/cursor-cli-session.js.map +1 -0
  30. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  31. package/dist/adapters/cursor-cli-tools.js +181 -0
  32. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  33. package/dist/adapters/cursor-cli.d.ts +2 -0
  34. package/dist/adapters/cursor-cli.js +306 -0
  35. package/dist/adapters/cursor-cli.js.map +1 -0
  36. package/dist/adapters/cursor-model.d.ts +7 -0
  37. package/dist/adapters/cursor-model.js +67 -0
  38. package/dist/adapters/cursor-model.js.map +1 -0
  39. package/dist/adapters/cursor-rpc.d.ts +42 -0
  40. package/dist/adapters/cursor-rpc.js +271 -0
  41. package/dist/adapters/cursor-rpc.js.map +1 -0
  42. package/dist/adapters/cursor-session.d.ts +4 -0
  43. package/dist/adapters/cursor-session.js +327 -0
  44. package/dist/adapters/cursor-session.js.map +1 -0
  45. package/dist/adapters/cursor-startup.d.ts +16 -0
  46. package/dist/adapters/cursor-startup.js +74 -0
  47. package/dist/adapters/cursor-startup.js.map +1 -0
  48. package/dist/adapters/cursor-tools.d.ts +11 -0
  49. package/dist/adapters/cursor-tools.js +49 -0
  50. package/dist/adapters/cursor-tools.js.map +1 -0
  51. package/dist/adapters/cursor.d.ts +6 -0
  52. package/dist/adapters/cursor.js +17 -0
  53. package/dist/adapters/cursor.js.map +1 -0
  54. package/dist/adapters/fx-auth.d.ts +12 -2
  55. package/dist/adapters/fx-auth.js +51 -61
  56. package/dist/adapters/fx-auth.js.map +1 -1
  57. package/dist/adapters/fx-profile.d.ts +8 -0
  58. package/dist/adapters/fx-profile.js +101 -0
  59. package/dist/adapters/fx-profile.js.map +1 -0
  60. package/dist/adapters/fx-rpc.d.ts +2 -0
  61. package/dist/adapters/fx-rpc.js +30 -4
  62. package/dist/adapters/fx-rpc.js.map +1 -1
  63. package/dist/adapters/fx-status.d.ts +2 -0
  64. package/dist/adapters/fx-status.js +96 -0
  65. package/dist/adapters/fx-status.js.map +1 -0
  66. package/dist/adapters/fx.js +28 -12
  67. package/dist/adapters/fx.js.map +1 -1
  68. package/dist/adapters/opencode-access.d.ts +13 -0
  69. package/dist/adapters/opencode-access.js +76 -0
  70. package/dist/adapters/opencode-access.js.map +1 -0
  71. package/dist/adapters/opencode-config.d.ts +11 -0
  72. package/dist/adapters/opencode-config.js +238 -0
  73. package/dist/adapters/opencode-config.js.map +1 -0
  74. package/dist/adapters/opencode-http.d.ts +28 -0
  75. package/dist/adapters/opencode-http.js +297 -0
  76. package/dist/adapters/opencode-http.js.map +1 -0
  77. package/dist/adapters/opencode-tools.d.ts +19 -0
  78. package/dist/adapters/opencode-tools.js +127 -0
  79. package/dist/adapters/opencode-tools.js.map +1 -0
  80. package/dist/adapters/opencode.d.ts +2 -0
  81. package/dist/adapters/opencode.js +569 -0
  82. package/dist/adapters/opencode.js.map +1 -0
  83. package/dist/adapters/rpc.d.ts +3 -0
  84. package/dist/adapters/rpc.js +45 -4
  85. package/dist/adapters/rpc.js.map +1 -1
  86. package/dist/adapters/types.d.ts +5 -0
  87. package/dist/adapters/types.js.map +1 -1
  88. package/dist/approvals/types.d.ts +1 -1
  89. package/dist/approvals/types.js.map +1 -1
  90. package/dist/cli/args.d.ts +1 -1
  91. package/dist/cli/args.js +4 -1
  92. package/dist/cli/args.js.map +1 -1
  93. package/dist/cli/dashboard-client.js +1 -1
  94. package/dist/cli/dashboard-client.js.map +1 -1
  95. package/dist/cli/dashboard-controller.d.ts +7 -0
  96. package/dist/cli/dashboard-controller.js +27 -0
  97. package/dist/cli/dashboard-controller.js.map +1 -0
  98. package/dist/cli/dashboard-detail-view.d.ts +1 -1
  99. package/dist/cli/dashboard-detail-view.js +3 -4
  100. package/dist/cli/dashboard-detail-view.js.map +1 -1
  101. package/dist/cli/dashboard-history-view.js.map +1 -1
  102. package/dist/cli/dashboard-input.d.ts +1 -1
  103. package/dist/cli/dashboard-input.js +11 -1
  104. package/dist/cli/dashboard-input.js.map +1 -1
  105. package/dist/cli/dashboard-layout.js +3 -3
  106. package/dist/cli/dashboard-layout.js.map +1 -1
  107. package/dist/cli/dashboard-renderer.js.map +1 -1
  108. package/dist/cli/dashboard-style.js +2 -2
  109. package/dist/cli/dashboard-style.js.map +1 -1
  110. package/dist/cli/dashboard.d.ts +2 -2
  111. package/dist/cli/dashboard.js +7 -32
  112. package/dist/cli/dashboard.js.map +1 -1
  113. package/dist/cli/help.d.ts +1 -1
  114. package/dist/cli/help.js +30 -12
  115. package/dist/cli/help.js.map +1 -1
  116. package/dist/cli/main.js +5 -1
  117. package/dist/cli/main.js.map +1 -1
  118. package/dist/config/access-provenance.d.ts +10 -0
  119. package/dist/config/access-provenance.js +31 -0
  120. package/dist/config/access-provenance.js.map +1 -0
  121. package/dist/config/access.d.ts +12 -2
  122. package/dist/config/access.js +125 -27
  123. package/dist/config/access.js.map +1 -1
  124. package/dist/config/loader.js +1 -0
  125. package/dist/config/loader.js.map +1 -1
  126. package/dist/config/oidc.js +4 -2
  127. package/dist/config/oidc.js.map +1 -1
  128. package/dist/config/project.js +2 -1
  129. package/dist/config/project.js.map +1 -1
  130. package/dist/config/resolve-access.js +24 -10
  131. package/dist/config/resolve-access.js.map +1 -1
  132. package/dist/index.d.ts +2 -2
  133. package/dist/index.js +1 -1
  134. package/dist/index.js.map +1 -1
  135. package/dist/process-diagnostics.d.ts +2 -0
  136. package/dist/process-diagnostics.js +11 -0
  137. package/dist/process-diagnostics.js.map +1 -0
  138. package/dist/runtime/access-errors.d.ts +4 -0
  139. package/dist/runtime/access-errors.js +25 -0
  140. package/dist/runtime/access-errors.js.map +1 -0
  141. package/dist/runtime/approval-registry.js +1 -1
  142. package/dist/runtime/approval-registry.js.map +1 -1
  143. package/dist/runtime/client.js +54 -14
  144. package/dist/runtime/client.js.map +1 -1
  145. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  146. package/dist/runtime/dashboard-sanitize.js +7 -0
  147. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  148. package/dist/runtime/dashboard.d.ts +1 -1
  149. package/dist/runtime/dashboard.js +2 -3
  150. package/dist/runtime/dashboard.js.map +1 -1
  151. package/dist/runtime/definition.js +11 -1
  152. package/dist/runtime/definition.js.map +1 -1
  153. package/dist/runtime/select-native.js +26 -8
  154. package/dist/runtime/select-native.js.map +1 -1
  155. package/dist/runtime/worker-client.js +38 -13
  156. package/dist/runtime/worker-client.js.map +1 -1
  157. package/dist/sdk/definitions.d.ts +4 -1
  158. package/dist/sdk/definitions.js +16 -2
  159. package/dist/sdk/definitions.js.map +1 -1
  160. package/dist/sdk/permission-validation.js +10 -1
  161. package/dist/sdk/permission-validation.js.map +1 -1
  162. package/dist/sdk/types.d.ts +29 -1
  163. package/dist/sdk/types.js.map +1 -1
  164. package/package.json +4 -1
  165. package/sdk/access-config.md +58 -4
  166. package/sdk/adapter-contract.md +5 -3
  167. package/sdk/additional-harnesses.md +43 -0
  168. package/sdk/agent-skill.md +2 -2
  169. package/sdk/agent.md +5 -3
  170. package/sdk/approvals.md +3 -1
  171. package/sdk/authentication.md +1 -1
  172. package/sdk/cli/dashboard-design.md +6 -0
  173. package/sdk/cli/index.md +9 -6
  174. package/sdk/cli/output.md +3 -1
  175. package/sdk/config.md +1 -1
  176. package/sdk/copilot.md +53 -0
  177. package/sdk/cursor.md +68 -0
  178. package/sdk/diagnostics.md +29 -0
  179. package/sdk/distribution.md +1 -1
  180. package/sdk/evals.md +1 -1
  181. package/sdk/fx.md +50 -5
  182. package/sdk/harnesses.md +13 -13
  183. package/sdk/index.md +3 -2
  184. package/sdk/opencode.md +57 -0
  185. package/sdk/permissions.md +4 -2
  186. package/sdk/project-team.md +2 -0
  187. package/sdk/tools.md +1 -1
  188. package/sdk/v1-runtime.md +3 -3
package/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  <a href="https://github.com/vercel-labs/subharness/blob/main/LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/License-Apache--2.0-blue.svg?style=for-the-badge&amp;labelColor=000000" height="28"></a>
7
7
  </p>
8
8
 
9
- Stay with your favorite coding agent. Ask it to delegate tasks across Codex, Claude Code, and fx, and bring results back to one conversation. The main agent uses the local `subharness` CLI to start independent native sessions, check their status, read complete responses, and report the results.
9
+ Stay with your favorite coding agent. Ask it to delegate tasks across Codex, Claude Code, fx, OpenCode, GitHub Copilot, and Cursor, and bring results back to one conversation. The main agent uses the local `subharness` CLI to start independent native sessions, check their status, read complete responses, and report the results.
10
10
 
11
- TypeScript definitions are optional. Add them when your coding agent needs reusable specialists with shared instructions, tools, or harness alternatives. Codex and Claude Code use eligible native subscription logins or explicitly configured API access; fx uses an explicitly configured Vercel AI Gateway connection.
11
+ TypeScript definitions are optional. Add them when your coding agent needs reusable specialists with shared instructions, tools, or harness alternatives. Codex and Claude Code use eligible native subscription logins or explicitly configured API access. fx, OpenCode, and GitHub Copilot accept explicitly configured native logins, direct API keys, or Vercel AI Gateway access. Cursor uses an explicitly configured native CLI login or Cursor API key.
12
12
 
13
13
  The library coordinates sessions, queues, and subagents. Harnesses own model execution, native tools, and context. You supply the working directory and any sandbox or worktree isolation.
14
14
 
@@ -56,10 +56,13 @@ You can also invoke a harness manually:
56
56
  subharness run claude "Review the current diff."
57
57
  subharness run codex --cwd /path/to/worktree "Implement the documented feature."
58
58
  subharness run fx --model "provider/model" "Compare the proposed implementations."
59
+ subharness run opencode --model "creator/model" "Inspect the current implementation."
60
+ subharness run copilot --model "creator/model" "Review the current diff."
61
+ subharness run cursor --model "CURSOR_MODEL_ID" "Implement the documented change."
59
62
  subharness run claude --help
60
63
  ```
61
64
 
62
- Replace `provider/model` with an available Gateway model identifier. fx requires an explicit Gateway connection as described under Access below. Without `--model`, a direct target uses a verifiable native default for the authorized connection and retains that model for follow-ups. If the default cannot be resolved, the command asks for an explicit model. `--effort` uses the selected harness's supported values. These options do not override a TypeScript specialist.
65
+ Replace `provider/model` or `creator/model` with an available Gateway model identifier. fx, OpenCode, and Copilot require an explicit compatible connection as described under Access below. Non-Gateway routes use their documented native model identifiers. Cursor requires explicit subscription or Cursor API-key access. OpenCode, Copilot, and Cursor require `--model` and reject `--effort`. Codex, Claude Code, and fx use a verifiable native default when possible and accept their documented effort values. These options do not override a TypeScript specialist.
63
66
 
64
67
  Prompts can be one quoted argument, `--prompt`, or a UTF-8 file. `--prompt-file -` reads piped stdin explicitly. Exactly one prompt source is accepted, with a 1 MiB limit.
65
68
 
@@ -94,7 +97,7 @@ export default agent({
94
97
  });
95
98
  ```
96
99
 
97
- Replace the model placeholders with identifiers available through your native harnesses. Each file default-exports one definition. Global definitions live in `~/.subharness/agents/`; repository and global names never silently override one another. The bare targets `codex`, `claude`, and `fx` are reserved for harnesses; a specialist with one of those names requires a scope qualifier such as `repo:claude`.
100
+ Replace the model placeholders with identifiers available through your native harnesses. Each file default-exports one definition. Global definitions live in `~/.subharness/agents/`; repository and global names never silently override one another. The bare targets `codex`, `claude`, `fx`, `opencode`, `copilot`, and `cursor` are reserved for harnesses; a specialist with one of those names requires a scope qualifier such as `repo:claude`.
98
101
 
99
102
  ## Run and follow up
100
103
 
@@ -114,7 +117,7 @@ Long prompts can use `--prompt-file`. Output is compact text by default; `--form
114
117
 
115
118
  ## Access
116
119
 
117
- No project configuration is needed when an eligible native subscription login is available. Login remains with the native harness. Ambient API keys do not silently enable paid fallback.
120
+ Codex and Claude Code need no personal access configuration when an eligible native subscription login is available. Other harnesses require an explicit connection. Login remains with the native harness. Ambient API keys do not silently enable paid fallback.
118
121
 
119
122
  Personal access preferences can be placed in the ignored `.subharness/agents.local.json`. Linked worktrees read that file from the main checkout, while their agent definitions come from the selected worktree.
120
123
 
@@ -129,7 +132,7 @@ Personal access preferences can be placed in the ignored `.subharness/agents.loc
129
132
 
130
133
  Only credential references belong in that file. [Access configuration](sdk/access-config.md) also describes direct API keys, project OIDC, explicit connection fallback, and token-lifetime limits.
131
134
 
132
- For [fx](sdk/fx.md), select a Gateway connection explicitly:
135
+ For [fx](sdk/fx.md), select a connection explicitly. This example uses Gateway:
133
136
 
134
137
  ```json
135
138
  {
@@ -141,6 +144,33 @@ For [fx](sdk/fx.md), select a Gateway connection explicitly:
141
144
 
142
145
  Use `fx({ model: "google/gemini-3.8-flash" })` in the agent's `harness` field. Native fx must select the supplied environment credential instead of a saved login. Gateway model and provider restrictions remain effective; catalog availability alone does not establish access for a particular team.
143
146
 
147
+ OpenCode and Copilot use the same explicit Gateway connection types under their own access keys. Cursor accepts an explicit `subscription` connection for the current `cursor-agent login`, or an `api-key` connection that defaults to `CURSOR_API_KEY`. This example selects the local login:
148
+
149
+ ```json
150
+ {
151
+ "access": {
152
+ "opencode": [{ "type": "vercel-api-key" }],
153
+ "copilot": [{ "type": "vercel-oidc", "project": ".", "envFile": ".env.local" }],
154
+ "cursor": [{ "type": "subscription" }]
155
+ }
156
+ }
157
+ ```
158
+
159
+ Gateway is optional for OpenCode and Copilot. For example, select direct Anthropic access in OpenCode and a native GitHub login in Copilot:
160
+
161
+ ```json
162
+ {
163
+ "access": {
164
+ "opencode": [{ "type": "api-key", "provider": "anthropic", "env": "ANTHROPIC_API_KEY" }],
165
+ "copilot": [{ "type": "subscription" }]
166
+ }
167
+ }
168
+ ```
169
+
170
+ Copilot also supports explicit GitHub tokens and OpenAI, Anthropic, or Azure BYOK keys. fx supports its own saved Vercel, Codex, or Grok login and keys for native named Chat Completions connections. Model identifiers and required setup depend on the selected route.
171
+
172
+ See the [OpenCode](sdk/opencode.md), [Copilot](sdk/copilot.md), and [Cursor](sdk/cursor.md) adapter contracts for native behavior.
173
+
144
174
  ## Tools and delegation
145
175
 
146
176
  Agents can expose validated [custom tools](sdk/tools.md) and declare [subagents](sdk/plugins/sub-agents.md). A managed parent invokes its child with the same CLI:
@@ -4,7 +4,10 @@ export declare class ClaudeProcessOwner {
4
4
  private child?;
5
5
  private exited?;
6
6
  private closing?;
7
+ private exitCode;
8
+ private exitSignal;
7
9
  readonly spawn: (options: SpawnOptions) => SpawnedProcess;
10
+ exitDescription(): string;
8
11
  close(): Promise<void>;
9
12
  private stop;
10
13
  }
@@ -1,5 +1,6 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { AgentError } from '../errors.js';
3
+ import { processExitDescription } from '../process-diagnostics.js';
3
4
  const gracefulExitMs = 2_000;
4
5
  const terminatedExitMs = 5_000;
5
6
  const killedExitMs = 1_000;
@@ -14,6 +15,8 @@ export class ClaudeProcessOwner {
14
15
  child;
15
16
  exited;
16
17
  closing;
18
+ exitCode;
19
+ exitSignal;
17
20
  spawn = (options) => {
18
21
  if (this.child)
19
22
  throw new AgentError('HARNESS_FAILED', 'Claude Code attempted to start more than one native process.');
@@ -26,12 +29,19 @@ export class ClaudeProcessOwner {
26
29
  });
27
30
  this.child = child;
28
31
  this.exited = new Promise(resolve => {
29
- child.once('exit', () => resolve());
32
+ child.once('exit', (code, signal) => {
33
+ this.exitCode = code;
34
+ this.exitSignal = signal;
35
+ resolve();
36
+ });
30
37
  child.once('error', () => { if (child.pid === undefined)
31
38
  resolve(); });
32
39
  });
33
40
  return child;
34
41
  };
42
+ exitDescription() {
43
+ return processExitDescription(this.exitCode, this.exitSignal);
44
+ }
35
45
  close() {
36
46
  return this.closing ??= this.stop();
37
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude-process.js","sourceRoot":"","sources":["../../src/adapters/claude-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA4B,MAAM,oBAAoB,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,SAAS,WAAW,CAAC,MAAqB,EAAE,OAAe;IACzD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,kBAAkB;IACrB,KAAK,CAA+C;IACpD,MAAM,CAAiB;IACvB,OAAO,CAAiB;IAEvB,KAAK,GAAG,CAAC,OAAqB,EAAkB,EAAE;QACzD,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,8DAA8D,CAAC,CAAC;QACtH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAC,OAAO,CAAC,IAAI,EAAC;YAC/C,GAAG,EAAC,OAAO,CAAC,GAAG;YACf,GAAG,EAAC,OAAO,CAAC,GAAG;YACf,MAAM,EAAC,OAAO,CAAC,MAAM;YACrB,KAAK,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,CAAC;YAC9B,WAAW,EAAC,IAAI;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAClC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QAC9B,IAAI,CAAC;YAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,sCAAsC,CAAC,CAAC;QAC3E,IAAI,MAAM,WAAW,CAAC,MAAM,EAAC,cAAc,CAAC;YAAE,OAAO;QACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,MAAM,WAAW,CAAC,MAAM,EAAC,gBAAgB,CAAC;YAAE,OAAO;QACvD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,MAAM,WAAW,CAAC,MAAM,EAAC,YAAY,CAAC;YAAE,OAAO;QACnD,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,yDAAyD,CAAC,CAAC;IACnG,CAAC;CACF","sourcesContent":["import { spawn, type ChildProcessByStdio } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\nimport type { SpawnedProcess, SpawnOptions } from '@anthropic-ai/claude-agent-sdk';\nimport { AgentError } from '../errors.js';\n\nconst gracefulExitMs = 2_000;\nconst terminatedExitMs = 5_000;\nconst killedExitMs = 1_000;\n\nfunction exitsWithin(exited: Promise<void>, timeout: number): Promise<boolean> {\n return new Promise(resolve => {\n const timer = setTimeout(() => resolve(false),timeout);\n exited.then(() => { clearTimeout(timer); resolve(true); });\n });\n}\n\n/** Retains the concrete SDK subprocess until its termination is confirmed. */\nexport class ClaudeProcessOwner {\n private child?: ChildProcessByStdio<Writable,Readable,null>;\n private exited?: Promise<void>;\n private closing?: Promise<void>;\n\n readonly spawn = (options: SpawnOptions): SpawnedProcess => {\n if (this.child) throw new AgentError('HARNESS_FAILED','Claude Code attempted to start more than one native process.');\n const child = spawn(options.command,options.args,{\n cwd:options.cwd,\n env:options.env,\n signal:options.signal,\n stdio:['pipe','pipe','ignore'],\n windowsHide:true,\n });\n this.child = child;\n this.exited = new Promise(resolve => {\n child.once('exit',() => resolve());\n child.once('error',() => { if (child.pid === undefined) resolve(); });\n });\n return child;\n };\n\n close(): Promise<void> {\n return this.closing ??= this.stop();\n }\n\n private async stop(): Promise<void> {\n const child = this.child;\n const exited = this.exited;\n if (!child || !exited) return;\n try { child.stdin.end(); } catch { /* Continue to bounded termination. */ }\n if (await exitsWithin(exited,gracefulExitMs)) return;\n child.kill('SIGTERM');\n if (await exitsWithin(exited,terminatedExitMs)) return;\n child.kill('SIGKILL');\n if (await exitsWithin(exited,killedExitMs)) return;\n throw new AgentError('HARNESS_FAILED','Claude Code process termination could not be confirmed.');\n }\n}\n"]}
1
+ {"version":3,"file":"claude-process.js","sourceRoot":"","sources":["../../src/adapters/claude-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcessByStdio } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\nimport type { SpawnedProcess, SpawnOptions } from '@anthropic-ai/claude-agent-sdk';\nimport { AgentError } from '../errors.js';\nimport { processExitDescription } from '../process-diagnostics.js';\n\nconst gracefulExitMs = 2_000;\nconst terminatedExitMs = 5_000;\nconst killedExitMs = 1_000;\n\nfunction exitsWithin(exited: Promise<void>, timeout: number): Promise<boolean> {\n return new Promise(resolve => {\n const timer = setTimeout(() => resolve(false),timeout);\n exited.then(() => { clearTimeout(timer); resolve(true); });\n });\n}\n\n/** Retains the concrete SDK subprocess until its termination is confirmed. */\nexport class ClaudeProcessOwner {\n private child?: ChildProcessByStdio<Writable,Readable,null>;\n private exited?: Promise<void>;\n private closing?: Promise<void>;\n private exitCode: unknown;\n private exitSignal: unknown;\n\n readonly spawn = (options: SpawnOptions): SpawnedProcess => {\n if (this.child) throw new AgentError('HARNESS_FAILED','Claude Code attempted to start more than one native process.');\n const child = spawn(options.command,options.args,{\n cwd:options.cwd,\n env:options.env,\n signal:options.signal,\n stdio:['pipe','pipe','ignore'],\n windowsHide:true,\n });\n this.child = child;\n this.exited = new Promise(resolve => {\n child.once('exit',(code,signal) => {\n this.exitCode = code;\n this.exitSignal = signal;\n resolve();\n });\n child.once('error',() => { if (child.pid === undefined) resolve(); });\n });\n return child;\n };\n\n exitDescription(): string {\n return processExitDescription(this.exitCode,this.exitSignal);\n }\n\n close(): Promise<void> {\n return this.closing ??= this.stop();\n }\n\n private async stop(): Promise<void> {\n const child = this.child;\n const exited = this.exited;\n if (!child || !exited) return;\n try { child.stdin.end(); } catch { /* Continue to bounded termination. */ }\n if (await exitsWithin(exited,gracefulExitMs)) return;\n child.kill('SIGTERM');\n if (await exitsWithin(exited,terminatedExitMs)) return;\n child.kill('SIGKILL');\n if (await exitsWithin(exited,killedExitMs)) return;\n throw new AgentError('HARNESS_FAILED','Claude Code process termination could not be confirmed.');\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { AgentError } from "../errors.js";
2
+ export declare function claudeResultFailure(subtype: unknown): AgentError;
@@ -0,0 +1,22 @@
1
+ import { AgentError } from "../errors.js";
2
+ export function claudeResultFailure(subtype) {
3
+ let message;
4
+ switch (subtype) {
5
+ case "error_max_turns":
6
+ message = "Claude Code reached its native turn limit.";
7
+ break;
8
+ case "error_max_budget_usd":
9
+ message = "Claude Code reached its native budget limit.";
10
+ break;
11
+ case "error_max_structured_output_retries":
12
+ message = "Claude Code exhausted its native structured-output retries.";
13
+ break;
14
+ case "error_during_execution":
15
+ message = "Claude Code reported an error during execution.";
16
+ break;
17
+ default:
18
+ message = "Claude Code could not complete the turn.";
19
+ }
20
+ return new AgentError("HARNESS_ERROR", message);
21
+ }
22
+ //# sourceMappingURL=claude-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-result.js","sourceRoot":"","sources":["../../src/adapters/claude-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,OAAe,CAAC;IACpB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,iBAAiB;YACpB,OAAO,GAAG,4CAA4C,CAAC;YACvD,MAAM;QACR,KAAK,sBAAsB;YACzB,OAAO,GAAG,8CAA8C,CAAC;YACzD,MAAM;QACR,KAAK,qCAAqC;YACxC,OAAO,GAAG,6DAA6D,CAAC;YACxE,MAAM;QACR,KAAK,wBAAwB;YAC3B,OAAO,GAAG,iDAAiD,CAAC;YAC5D,MAAM;QACR;YACE,OAAO,GAAG,0CAA0C,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { AgentError } from \"../errors.js\";\n\nexport function claudeResultFailure(subtype: unknown): AgentError {\n let message: string;\n switch (subtype) {\n case \"error_max_turns\":\n message = \"Claude Code reached its native turn limit.\";\n break;\n case \"error_max_budget_usd\":\n message = \"Claude Code reached its native budget limit.\";\n break;\n case \"error_max_structured_output_retries\":\n message = \"Claude Code exhausted its native structured-output retries.\";\n break;\n case \"error_during_execution\":\n message = \"Claude Code reported an error during execution.\";\n break;\n default:\n message = \"Claude Code could not complete the turn.\";\n }\n return new AgentError(\"HARNESS_ERROR\", message);\n}\n"]}
@@ -13,6 +13,7 @@ import { ClaudeSettingsUnavailable, claudeDefaultUnavailable, readClaudeAppliedS
13
13
  import { NativeApprovals } from "./approval-lifetime.js";
14
14
  import { claudeApproval } from "./claude-approvals.js";
15
15
  import { ClaudeProcessOwner } from "./claude-process.js";
16
+ import { claudeResultFailure } from "./claude-result.js";
16
17
  const dependencies = {
17
18
  query,
18
19
  async managedSettings(cwd) {
@@ -122,6 +123,7 @@ export function createClaudeOpener(deps) {
122
123
  } });
123
124
  }
124
125
  catch {
126
+ const exit = processOwner.exitDescription();
125
127
  input.close();
126
128
  try {
127
129
  await processOwner.close();
@@ -129,20 +131,24 @@ export function createClaudeOpener(deps) {
129
131
  finally {
130
132
  await config.cleanup();
131
133
  }
132
- throw new AgentError("HARNESS_UNAVAILABLE", "Claude Code could not start.");
134
+ throw new AgentError("HARNESS_UNAVAILABLE", `Claude Code could not start${exit}.`);
133
135
  }
134
136
  const expectedModels = new Set();
135
137
  let retainedModel;
138
+ let startupPhase = "account inspection";
136
139
  try {
137
- verifyClaudeAccess(await native.accountInfo(), options.access);
140
+ const account = await native.accountInfo();
141
+ verifyClaudeAccess(account, options.access);
142
+ startupPhase = "model catalog retrieval";
138
143
  const models = await native.supportedModels();
139
144
  if (options.harness.model) {
140
145
  addCatalogEquivalentModels(expectedModels, models, options.harness.model);
141
146
  verifyClaudeOptions(models, options);
147
+ startupPhase = "model settings validation";
142
148
  try {
143
149
  const applied = await readClaudeAppliedSettings(native);
144
150
  if (!expectedModels.has(applied.model))
145
- throw new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested.");
151
+ throw new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested during startup settings validation.");
146
152
  verifyAppliedClaudeEffort(applied.effort, options.harness.effort);
147
153
  retainedModel = applied.model;
148
154
  expectedModels.add(applied.model);
@@ -153,6 +159,7 @@ export function createClaudeOpener(deps) {
153
159
  }
154
160
  }
155
161
  else {
162
+ startupPhase = "model settings validation";
156
163
  if (!native.getSettings || !native.setModel)
157
164
  throw claudeDefaultUnavailable();
158
165
  let selected;
@@ -164,9 +171,13 @@ export function createClaudeOpener(deps) {
164
171
  throw claudeDefaultUnavailable();
165
172
  throw error;
166
173
  }
174
+ startupPhase = "model catalog retrieval";
167
175
  verifyClaudeOptions(models, options, selected.model);
176
+ startupPhase = "model settings validation";
168
177
  verifyAppliedClaudeEffort(selected.effort, options.harness.effort);
178
+ startupPhase = "model catalog retrieval";
169
179
  addCatalogEquivalentModels(expectedModels, models, selected.model);
180
+ startupPhase = "model settings validation";
170
181
  try {
171
182
  await native.setModel(selected.model);
172
183
  }
@@ -182,16 +193,20 @@ export function createClaudeOpener(deps) {
182
193
  throw claudeDefaultUnavailable();
183
194
  throw error;
184
195
  }
185
- if (!expectedModels.has(pinned.model))
186
- throw claudeDefaultUnavailable();
196
+ if (!expectedModels.has(pinned.model)) {
197
+ throw new AgentError("INVALID_CONFIG", "Claude Code changed the selected native default during startup settings validation. Supply --model <model>.");
198
+ }
187
199
  verifyAppliedClaudeEffort(pinned.effort, options.harness.effort);
188
200
  retainedModel = pinned.model;
201
+ startupPhase = "model catalog retrieval";
189
202
  addCatalogEquivalentModels(expectedModels, models, pinned.model);
203
+ startupPhase = "model settings validation";
190
204
  }
191
205
  if (inputFailure)
192
206
  throw inputFailure;
193
207
  }
194
208
  catch (error) {
209
+ const exit = processOwner.exitDescription();
195
210
  input.close();
196
211
  native.close();
197
212
  try {
@@ -202,18 +217,19 @@ export function createClaudeOpener(deps) {
202
217
  }
203
218
  if (error instanceof AgentError)
204
219
  throw error;
205
- throw new AgentError("ACCESS_UNAVAILABLE", "Claude Code authentication could not be verified.");
220
+ throw new AgentError("HARNESS_FAILED", `Claude Code ${startupPhase} failed${exit}.`);
206
221
  }
207
222
  let closed = false;
208
223
  let preflight;
209
224
  let sessionFailure;
225
+ let exitObservedBeforeClose;
210
226
  let active;
211
227
  const reading = (async () => {
212
228
  try {
213
229
  for await (const message of native) {
214
230
  if (message.type === "system" && message.subtype === "init") {
215
231
  if (!expectedModels.has(message.model)) {
216
- sessionFailure = new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested.");
232
+ sessionFailure = new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested during native initialization.");
217
233
  }
218
234
  else if (permissionMode !== undefined && message.permissionMode !== permissionMode) {
219
235
  sessionFailure = new AgentError("INVALID_CONFIG", "Claude Code reported a different permission mode than requested.");
@@ -244,7 +260,7 @@ export function createClaudeOpener(deps) {
244
260
  current.resolve(message.result);
245
261
  }
246
262
  else
247
- current.reject(new AgentError("HARNESS_ERROR", "Claude Code could not complete the turn."));
263
+ current.reject(claudeResultFailure(message.subtype));
248
264
  }
249
265
  }
250
266
  catch {
@@ -253,11 +269,13 @@ export function createClaudeOpener(deps) {
253
269
  finally {
254
270
  acceptingApprovals = false;
255
271
  approvals.clear();
256
- const code = closed ? "SESSION_CLOSED" : "HARNESS_ERROR";
272
+ const explicitClose = exitObservedBeforeClose !== undefined;
273
+ const code = explicitClose ? "SESSION_CLOSED" : "HARNESS_ERROR";
257
274
  closed = true;
258
275
  input.close();
259
276
  await tools.drain();
260
- active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, "The Claude Code process stopped before completing the turn."));
277
+ const exit = explicitClose ? exitObservedBeforeClose : processOwner.exitDescription();
278
+ active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, `The Claude Code process stopped${exit} before completing the turn.`));
261
279
  active?.stop();
262
280
  active = undefined;
263
281
  try {
@@ -294,7 +312,7 @@ export function createClaudeOpener(deps) {
294
312
  throw error;
295
313
  }
296
314
  if (!expectedModels.has(applied.model))
297
- throw new AgentError("INVALID_CONFIG", "Claude Code changed the retained session model before submission.");
315
+ throw new AgentError("INVALID_CONFIG", "Claude Code changed the model during retained-session validation before submission.");
298
316
  verifyAppliedClaudeEffort(applied.effort, options.harness.effort);
299
317
  }
300
318
  if (closed)
@@ -341,6 +359,7 @@ export function createClaudeOpener(deps) {
341
359
  },
342
360
  async resume() { throw new AgentError("RECOVERY_UNSUPPORTED", "Claude Code cannot retry failed execution without replaying input."); },
343
361
  async close() {
362
+ exitObservedBeforeClose ??= processOwner.exitDescription();
344
363
  closed = true;
345
364
  acceptingApprovals = false;
346
365
  approvals.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { query, resolveSettings, type AccountInfo, type Options, type SDKMessage, type SDKUserMessage, type Settings, type ModelInfo } from \"@anthropic-ai/claude-agent-sdk\";\nimport { AgentError } from \"../errors.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\nimport { privateClaudeConfig } from \"./claude-config.js\";\nimport { claudeTools } from \"./claude-tools.js\";\nimport { ClaudeInput } from \"./claude-input.js\";\nimport { claudeDelegationPermissions } from \"./claude-permissions.js\";\nimport { claudeSettings, verifyClaudeAccess, verifyClaudePolicy, verifyClaudeOptions } from \"./claude-auth.js\";\nimport { ClaudeSettingsUnavailable, claudeDefaultUnavailable, readClaudeAppliedSettings, verifyAppliedClaudeEffort } from \"./claude-settings.js\";\nimport { NativeApprovals } from \"./approval-lifetime.js\";\nimport { claudeApproval } from \"./claude-approvals.js\";\nimport { ClaudeProcessOwner } from \"./claude-process.js\";\n\ninterface ClaudeQuery extends AsyncIterable<SDKMessage> {\n accountInfo(): Promise<AccountInfo>;\n supportedModels(): Promise<ModelInfo[]>;\n interrupt(): Promise<unknown>;\n close(): void;\n getSettings?(): Promise<unknown>;\n setModel?(model?: string): Promise<void>;\n}\nexport interface ClaudeDependencies {\n query(args: {prompt: AsyncIterable<SDKUserMessage>; options: Options}): ClaudeQuery;\n executable(env: NodeJS.ProcessEnv): Promise<string>;\n managedSettings(cwd: string): Promise<Settings[]>;\n}\n\nconst dependencies: ClaudeDependencies = {\n query,\n async managedSettings(cwd) {\n const settings = await resolveSettings({cwd, settingSources:[\"user\", \"project\", \"local\"]});\n return settings.sources.filter(source => source.source === \"managed\").map(source => source.settings);\n },\n async executable(env) {\n for (const directory of (env.PATH ?? \"\").split(delimiter)) {\n const file = join(directory, \"claude\");\n try { await access(file, constants.X_OK); return file; } catch { /* Try the next PATH entry. */ }\n }\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Install Claude Code and make claude available on PATH.\");\n },\n};\n\nfunction addCatalogEquivalentModels(expected: Set<string>, models: ModelInfo[], selected: string): void {\n expected.add(selected);\n for (const model of models) {\n if (model.value !== selected && model.resolvedModel !== selected) continue;\n expected.add(model.value);\n if (model.resolvedModel) expected.add(model.resolvedModel);\n }\n}\n\nexport const openClaude = createClaudeOpener(dependencies);\n\n/** Dependency injection is internal and replaces only the external SDK boundary in tests. */\nexport function createClaudeOpener(deps: ClaudeDependencies) {\n return async (options: AdapterOptions): Promise<NativeSession> => {\n if (options.harness.kind !== \"claudeCode\") throw new AgentError(\"INVALID_CONFIG\", \"Claude Code received configuration for a different harness.\");\n const permissionMode = options.harness.permissionMode;\n const settings = claudeSettings(options);\n const executable = await deps.executable(options.env);\n verifyClaudePolicy(await deps.managedSettings(options.cwd), settings.settings as Settings);\n const tools = claudeTools(options.agent);\n const allowedTools = [\n ...(options.harness.allowedTools ?? []),\n ...(tools.config.allowedTools ?? []),\n ...claudeDelegationPermissions(options),\n ];\n const config = await privateClaudeConfig(settings.settings as Settings);\n const input = new ClaudeInput<SDKUserMessage>();\n const processOwner = new ClaudeProcessOwner();\n let inputFailure: AgentError | undefined;\n const approvals = new NativeApprovals();\n let acceptingApprovals = false;\n const requireInput = (toolName?: string) => {\n acceptingApprovals = false;\n approvals.clear();\n tools.stopAdmission();\n const subject = toolName && /^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(toolName)\n ? `approval for native tool ${toolName}`\n : \"interactive input\";\n inputFailure = new AgentError(\"INPUT_REQUIRED\", `Claude Code needs ${subject}. Configure its native permissions before retrying.`);\n };\n let native: ClaudeQuery;\n try { native = deps.query({prompt: input, options: {\n pathToClaudeCodeExecutable: executable,\n spawnClaudeCodeProcess: processOwner.spawn,\n cwd: options.cwd,\n ...settings,\n ...tools.config,\n ...(allowedTools.length ? {allowedTools} : {}),\n ...(options.harness.disallowedTools !== undefined ? {disallowedTools:[...options.harness.disallowedTools]} : {}),\n ...(permissionMode !== undefined ? {permissionMode} : {}),\n ...(permissionMode === \"bypassPermissions\" ? {allowDangerouslySkipPermissions:true} : {}),\n settings: config.path,\n stderr: () => {},\n ...(options.harness.model ? {model: options.harness.model} : {}),\n systemPrompt: options.agent.instructions\n ? {type: \"preset\", preset: \"claude_code\", append: options.agent.instructions}\n : {type: \"preset\", preset: \"claude_code\"},\n settingSources: [\"user\", \"project\", \"local\"],\n canUseTool: async (toolName, toolInput, metadata) => {\n if (options.onApproval && acceptingApprovals && toolName !== \"AskUserQuestion\") {\n try {\n const answer = await claudeApproval(approvals, options.onApproval, toolName, toolInput, metadata);\n if (!acceptingApprovals || metadata.signal.aborted) return {behavior:\"deny\",message:\"The permission request is no longer pending.\"};\n return answer;\n }\n catch (error) {\n if (error instanceof AgentError && error.code === \"REQUEST_EXPIRED\") return {behavior:\"deny\",message:\"The permission request is no longer pending.\"};\n }\n }\n requireInput(toolName);\n return {behavior: \"deny\", message: inputFailure!.message, interrupt: true};\n },\n onElicitation: async () => {\n acceptingApprovals = false;\n approvals.clear();\n requireInput();\n try { await native.interrupt(); } catch { native.close(); }\n return {action: \"decline\"};\n },\n }}); }\n catch {\n input.close();\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Claude Code could not start.\");\n }\n const expectedModels = new Set<string>();\n let retainedModel: string | undefined;\n try {\n verifyClaudeAccess(await native.accountInfo(), options.access);\n const models = await native.supportedModels();\n if (options.harness.model) {\n addCatalogEquivalentModels(expectedModels, models, options.harness.model);\n verifyClaudeOptions(models, options);\n try {\n const applied = await readClaudeAppliedSettings(native);\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n retainedModel = applied.model;\n expectedModels.add(applied.model);\n } catch (error) {\n if (!(error instanceof ClaudeSettingsUnavailable)) throw error;\n }\n } else {\n if (!native.getSettings || !native.setModel) throw claudeDefaultUnavailable();\n let selected;\n try { selected = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n verifyClaudeOptions(models, options, selected.model);\n verifyAppliedClaudeEffort(selected.effort, options.harness.effort);\n addCatalogEquivalentModels(expectedModels, models, selected.model);\n try { await native.setModel(selected.model); } catch { throw claudeDefaultUnavailable(); }\n let pinned;\n try { pinned = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n if (!expectedModels.has(pinned.model)) throw claudeDefaultUnavailable();\n verifyAppliedClaudeEffort(pinned.effort, options.harness.effort);\n retainedModel = pinned.model;\n addCatalogEquivalentModels(expectedModels, models, pinned.model);\n }\n if (inputFailure) throw inputFailure;\n }\n catch (error) {\n input.close();\n native.close();\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"ACCESS_UNAVAILABLE\", \"Claude Code authentication could not be verified.\");\n }\n let closed = false;\n let preflight: {\n cancellation: Promise<never>;\n cancel(error: AgentError): void;\n stopped: Promise<void>;\n stop(): void;\n } | undefined;\n let sessionFailure: AgentError | undefined;\n let active: {\n resolve(text: string): void; reject(error: unknown): void;\n stopped: Promise<void>; stop(): void; interrupted: boolean;\n } | undefined;\n const reading = (async () => {\n try {\n for await (const message of native) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n if (!expectedModels.has(message.model)) {\n sessionFailure = new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested.\");\n } else if (permissionMode !== undefined && message.permissionMode !== permissionMode) {\n sessionFailure = new AgentError(\"INVALID_CONFIG\", \"Claude Code reported a different permission mode than requested.\");\n }\n if (sessionFailure) {\n tools.stopAdmission();\n native.close();\n break;\n }\n }\n if (message.type !== \"result\" || !active) continue;\n const current = active;\n acceptingApprovals = false;\n approvals.clear();\n await tools.drain();\n active = undefined;\n current.stop();\n if (inputFailure) current.reject(inputFailure);\n else if (current.interrupted) current.reject(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted.\"));\n else if (message.subtype === \"success\" && !message.is_error) {\n if (Buffer.byteLength(message.result, \"utf8\") > 1024 * 1024) {\n current.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"The Claude Code response exceeds 1 MiB.\"));\n } else current.resolve(message.result);\n }\n else current.reject(new AgentError(\"HARNESS_ERROR\", \"Claude Code could not complete the turn.\"));\n }\n } catch {\n // Native diagnostics may contain credentials; return a stable safe message.\n } finally {\n acceptingApprovals = false;\n approvals.clear();\n const code = closed ? \"SESSION_CLOSED\" : \"HARNESS_ERROR\";\n closed = true;\n input.close();\n await tools.drain();\n active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, \"The Claude Code process stopped before completing the turn.\"));\n active?.stop();\n active = undefined;\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n }\n })();\n return {\n async turn(prompt) {\n if (closed) return Promise.reject(sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\"));\n if (active || preflight) return Promise.reject(new AgentError(\"SESSION_BUSY\", \"A native turn is already active.\"));\n let cancel!: (error: AgentError) => void, stop!: () => void;\n const currentPreflight = {\n cancellation: new Promise<never>((_resolve, reject) => { cancel = reject; }),\n cancel(error: AgentError) { cancel(error); },\n stopped: new Promise<void>(resolve => { stop = resolve; }),\n stop() { stop(); },\n };\n preflight = currentPreflight;\n try {\n if (native.getSettings && retainedModel) {\n let applied;\n try { applied = await Promise.race([readClaudeAppliedSettings(native), currentPreflight.cancellation]); }\n catch (error) {\n if (error instanceof ClaudeSettingsUnavailable) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code could not verify the retained session model before submission.\");\n throw error;\n }\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code changed the retained session model before submission.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n }\n if (closed) throw sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\");\n } finally {\n if (preflight === currentPreflight) preflight = undefined;\n currentPreflight.stop();\n }\n return await new Promise((resolve, reject) => {\n inputFailure = undefined;\n tools.start();\n let stop!: () => void;\n const stopped = new Promise<void>(resolve => { stop = resolve; });\n active = {resolve, reject, stopped, stop, interrupted:false};\n acceptingApprovals = true;\n input.push({type:\"user\",message:{role:\"user\",content:prompt},parent_tool_use_id:null,uuid:randomUUID()});\n });\n },\n async steer() { throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"Claude Code does not expose verified active steering.\"); },\n async interrupt() {\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted before submission.\"));\n await pending.stopped;\n return;\n }\n const current = active;\n if (!current) return;\n current.interrupted = true;\n acceptingApprovals = false;\n approvals.clear();\n tools.stopAdmission();\n try { await native.interrupt(); }\n catch {\n current.interrupted = false;\n throw new AgentError(\"CANCEL_FAILED\", \"Claude Code did not confirm interruption.\");\n }\n await current.stopped;\n },\n async resume() { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"Claude Code cannot retry failed execution without replaying input.\"); },\n async close() {\n closed = true;\n acceptingApprovals = false;\n approvals.clear();\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"SESSION_CLOSED\", \"The native session closed before submission.\"));\n await pending.stopped;\n }\n tools.stopAdmission();\n input.close();\n native.close();\n const stopping = processOwner.close();\n try { await reading; }\n finally { await stopping; }\n },\n };\n };\n}\n"]}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { query, resolveSettings, type AccountInfo, type Options, type SDKMessage, type SDKUserMessage, type Settings, type ModelInfo } from \"@anthropic-ai/claude-agent-sdk\";\nimport { AgentError } from \"../errors.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\nimport { privateClaudeConfig } from \"./claude-config.js\";\nimport { claudeTools } from \"./claude-tools.js\";\nimport { ClaudeInput } from \"./claude-input.js\";\nimport { claudeDelegationPermissions } from \"./claude-permissions.js\";\nimport { claudeSettings, verifyClaudeAccess, verifyClaudePolicy, verifyClaudeOptions } from \"./claude-auth.js\";\nimport { ClaudeSettingsUnavailable, claudeDefaultUnavailable, readClaudeAppliedSettings, verifyAppliedClaudeEffort } from \"./claude-settings.js\";\nimport { NativeApprovals } from \"./approval-lifetime.js\";\nimport { claudeApproval } from \"./claude-approvals.js\";\nimport { ClaudeProcessOwner } from \"./claude-process.js\";\nimport { claudeResultFailure } from \"./claude-result.js\";\n\ninterface ClaudeQuery extends AsyncIterable<SDKMessage> {\n accountInfo(): Promise<AccountInfo>;\n supportedModels(): Promise<ModelInfo[]>;\n interrupt(): Promise<unknown>;\n close(): void;\n getSettings?(): Promise<unknown>;\n setModel?(model?: string): Promise<void>;\n}\nexport interface ClaudeDependencies {\n query(args: {prompt: AsyncIterable<SDKUserMessage>; options: Options}): ClaudeQuery;\n executable(env: NodeJS.ProcessEnv): Promise<string>;\n managedSettings(cwd: string): Promise<Settings[]>;\n}\n\nconst dependencies: ClaudeDependencies = {\n query,\n async managedSettings(cwd) {\n const settings = await resolveSettings({cwd, settingSources:[\"user\", \"project\", \"local\"]});\n return settings.sources.filter(source => source.source === \"managed\").map(source => source.settings);\n },\n async executable(env) {\n for (const directory of (env.PATH ?? \"\").split(delimiter)) {\n const file = join(directory, \"claude\");\n try { await access(file, constants.X_OK); return file; } catch { /* Try the next PATH entry. */ }\n }\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Install Claude Code and make claude available on PATH.\");\n },\n};\n\nfunction addCatalogEquivalentModels(expected: Set<string>, models: ModelInfo[], selected: string): void {\n expected.add(selected);\n for (const model of models) {\n if (model.value !== selected && model.resolvedModel !== selected) continue;\n expected.add(model.value);\n if (model.resolvedModel) expected.add(model.resolvedModel);\n }\n}\n\nexport const openClaude = createClaudeOpener(dependencies);\n\n/** Dependency injection is internal and replaces only the external SDK boundary in tests. */\nexport function createClaudeOpener(deps: ClaudeDependencies) {\n return async (options: AdapterOptions): Promise<NativeSession> => {\n if (options.harness.kind !== \"claudeCode\") throw new AgentError(\"INVALID_CONFIG\", \"Claude Code received configuration for a different harness.\");\n const permissionMode = options.harness.permissionMode;\n const settings = claudeSettings(options);\n const executable = await deps.executable(options.env);\n verifyClaudePolicy(await deps.managedSettings(options.cwd), settings.settings as Settings);\n const tools = claudeTools(options.agent);\n const allowedTools = [\n ...(options.harness.allowedTools ?? []),\n ...(tools.config.allowedTools ?? []),\n ...claudeDelegationPermissions(options),\n ];\n const config = await privateClaudeConfig(settings.settings as Settings);\n const input = new ClaudeInput<SDKUserMessage>();\n const processOwner = new ClaudeProcessOwner();\n let inputFailure: AgentError | undefined;\n const approvals = new NativeApprovals();\n let acceptingApprovals = false;\n const requireInput = (toolName?: string) => {\n acceptingApprovals = false;\n approvals.clear();\n tools.stopAdmission();\n const subject = toolName && /^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(toolName)\n ? `approval for native tool ${toolName}`\n : \"interactive input\";\n inputFailure = new AgentError(\"INPUT_REQUIRED\", `Claude Code needs ${subject}. Configure its native permissions before retrying.`);\n };\n let native: ClaudeQuery;\n try { native = deps.query({prompt: input, options: {\n pathToClaudeCodeExecutable: executable,\n spawnClaudeCodeProcess: processOwner.spawn,\n cwd: options.cwd,\n ...settings,\n ...tools.config,\n ...(allowedTools.length ? {allowedTools} : {}),\n ...(options.harness.disallowedTools !== undefined ? {disallowedTools:[...options.harness.disallowedTools]} : {}),\n ...(permissionMode !== undefined ? {permissionMode} : {}),\n ...(permissionMode === \"bypassPermissions\" ? {allowDangerouslySkipPermissions:true} : {}),\n settings: config.path,\n stderr: () => {},\n ...(options.harness.model ? {model: options.harness.model} : {}),\n systemPrompt: options.agent.instructions\n ? {type: \"preset\", preset: \"claude_code\", append: options.agent.instructions}\n : {type: \"preset\", preset: \"claude_code\"},\n settingSources: [\"user\", \"project\", \"local\"],\n canUseTool: async (toolName, toolInput, metadata) => {\n if (options.onApproval && acceptingApprovals && toolName !== \"AskUserQuestion\") {\n try {\n const answer = await claudeApproval(approvals, options.onApproval, toolName, toolInput, metadata);\n if (!acceptingApprovals || metadata.signal.aborted) return {behavior:\"deny\",message:\"The permission request is no longer pending.\"};\n return answer;\n }\n catch (error) {\n if (error instanceof AgentError && error.code === \"REQUEST_EXPIRED\") return {behavior:\"deny\",message:\"The permission request is no longer pending.\"};\n }\n }\n requireInput(toolName);\n return {behavior: \"deny\", message: inputFailure!.message, interrupt: true};\n },\n onElicitation: async () => {\n acceptingApprovals = false;\n approvals.clear();\n requireInput();\n try { await native.interrupt(); } catch { native.close(); }\n return {action: \"decline\"};\n },\n }}); }\n catch {\n const exit = processOwner.exitDescription();\n input.close();\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n throw new AgentError(\"HARNESS_UNAVAILABLE\", `Claude Code could not start${exit}.`);\n }\n const expectedModels = new Set<string>();\n let retainedModel: string | undefined;\n let startupPhase: \"account inspection\" | \"model catalog retrieval\" | \"model settings validation\" = \"account inspection\";\n try {\n const account = await native.accountInfo();\n verifyClaudeAccess(account, options.access);\n startupPhase = \"model catalog retrieval\";\n const models = await native.supportedModels();\n if (options.harness.model) {\n addCatalogEquivalentModels(expectedModels, models, options.harness.model);\n verifyClaudeOptions(models, options);\n startupPhase = \"model settings validation\";\n try {\n const applied = await readClaudeAppliedSettings(native);\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested during startup settings validation.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n retainedModel = applied.model;\n expectedModels.add(applied.model);\n } catch (error) {\n if (!(error instanceof ClaudeSettingsUnavailable)) throw error;\n }\n } else {\n startupPhase = \"model settings validation\";\n if (!native.getSettings || !native.setModel) throw claudeDefaultUnavailable();\n let selected;\n try { selected = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n startupPhase = \"model catalog retrieval\";\n verifyClaudeOptions(models, options, selected.model);\n startupPhase = \"model settings validation\";\n verifyAppliedClaudeEffort(selected.effort, options.harness.effort);\n startupPhase = \"model catalog retrieval\";\n addCatalogEquivalentModels(expectedModels, models, selected.model);\n startupPhase = \"model settings validation\";\n try { await native.setModel(selected.model); } catch { throw claudeDefaultUnavailable(); }\n let pinned;\n try { pinned = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n if (!expectedModels.has(pinned.model)) {\n throw new AgentError(\"INVALID_CONFIG\", \"Claude Code changed the selected native default during startup settings validation. Supply --model <model>.\");\n }\n verifyAppliedClaudeEffort(pinned.effort, options.harness.effort);\n retainedModel = pinned.model;\n startupPhase = \"model catalog retrieval\";\n addCatalogEquivalentModels(expectedModels, models, pinned.model);\n startupPhase = \"model settings validation\";\n }\n if (inputFailure) throw inputFailure;\n }\n catch (error) {\n const exit = processOwner.exitDescription();\n input.close();\n native.close();\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_FAILED\", `Claude Code ${startupPhase} failed${exit}.`);\n }\n let closed = false;\n let preflight: {\n cancellation: Promise<never>;\n cancel(error: AgentError): void;\n stopped: Promise<void>;\n stop(): void;\n } | undefined;\n let sessionFailure: AgentError | undefined;\n let exitObservedBeforeClose: string | undefined;\n let active: {\n resolve(text: string): void; reject(error: unknown): void;\n stopped: Promise<void>; stop(): void; interrupted: boolean;\n } | undefined;\n const reading = (async () => {\n try {\n for await (const message of native) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n if (!expectedModels.has(message.model)) {\n sessionFailure = new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested during native initialization.\");\n } else if (permissionMode !== undefined && message.permissionMode !== permissionMode) {\n sessionFailure = new AgentError(\"INVALID_CONFIG\", \"Claude Code reported a different permission mode than requested.\");\n }\n if (sessionFailure) {\n tools.stopAdmission();\n native.close();\n break;\n }\n }\n if (message.type !== \"result\" || !active) continue;\n const current = active;\n acceptingApprovals = false;\n approvals.clear();\n await tools.drain();\n active = undefined;\n current.stop();\n if (inputFailure) current.reject(inputFailure);\n else if (current.interrupted) current.reject(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted.\"));\n else if (message.subtype === \"success\" && !message.is_error) {\n if (Buffer.byteLength(message.result, \"utf8\") > 1024 * 1024) {\n current.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"The Claude Code response exceeds 1 MiB.\"));\n } else current.resolve(message.result);\n }\n else current.reject(claudeResultFailure(message.subtype));\n }\n } catch {\n // Native diagnostics may contain credentials; return a stable safe message.\n } finally {\n acceptingApprovals = false;\n approvals.clear();\n const explicitClose = exitObservedBeforeClose !== undefined;\n const code = explicitClose ? \"SESSION_CLOSED\" : \"HARNESS_ERROR\";\n closed = true;\n input.close();\n await tools.drain();\n const exit = explicitClose ? exitObservedBeforeClose : processOwner.exitDescription();\n active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, `The Claude Code process stopped${exit} before completing the turn.`));\n active?.stop();\n active = undefined;\n try { await processOwner.close(); }\n finally { await config.cleanup(); }\n }\n })();\n return {\n async turn(prompt) {\n if (closed) return Promise.reject(sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\"));\n if (active || preflight) return Promise.reject(new AgentError(\"SESSION_BUSY\", \"A native turn is already active.\"));\n let cancel!: (error: AgentError) => void, stop!: () => void;\n const currentPreflight = {\n cancellation: new Promise<never>((_resolve, reject) => { cancel = reject; }),\n cancel(error: AgentError) { cancel(error); },\n stopped: new Promise<void>(resolve => { stop = resolve; }),\n stop() { stop(); },\n };\n preflight = currentPreflight;\n try {\n if (native.getSettings && retainedModel) {\n let applied;\n try { applied = await Promise.race([readClaudeAppliedSettings(native), currentPreflight.cancellation]); }\n catch (error) {\n if (error instanceof ClaudeSettingsUnavailable) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code could not verify the retained session model before submission.\");\n throw error;\n }\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code changed the model during retained-session validation before submission.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n }\n if (closed) throw sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\");\n } finally {\n if (preflight === currentPreflight) preflight = undefined;\n currentPreflight.stop();\n }\n return await new Promise((resolve, reject) => {\n inputFailure = undefined;\n tools.start();\n let stop!: () => void;\n const stopped = new Promise<void>(resolve => { stop = resolve; });\n active = {resolve, reject, stopped, stop, interrupted:false};\n acceptingApprovals = true;\n input.push({type:\"user\",message:{role:\"user\",content:prompt},parent_tool_use_id:null,uuid:randomUUID()});\n });\n },\n async steer() { throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"Claude Code does not expose verified active steering.\"); },\n async interrupt() {\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted before submission.\"));\n await pending.stopped;\n return;\n }\n const current = active;\n if (!current) return;\n current.interrupted = true;\n acceptingApprovals = false;\n approvals.clear();\n tools.stopAdmission();\n try { await native.interrupt(); }\n catch {\n current.interrupted = false;\n throw new AgentError(\"CANCEL_FAILED\", \"Claude Code did not confirm interruption.\");\n }\n await current.stopped;\n },\n async resume() { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"Claude Code cannot retry failed execution without replaying input.\"); },\n async close() {\n exitObservedBeforeClose ??= processOwner.exitDescription();\n closed = true;\n acceptingApprovals = false;\n approvals.clear();\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"SESSION_CLOSED\", \"The native session closed before submission.\"));\n await pending.stopped;\n }\n tools.stopAdmission();\n input.close();\n native.close();\n const stopping = processOwner.close();\n try { await reading; }\n finally { await stopping; }\n },\n };\n };\n}\n"]}
@@ -90,7 +90,10 @@ class CodexSession {
90
90
  current.items.set(p.item.id, p.item);
91
91
  if (message.method === "item/tool/call" && message.id !== undefined) {
92
92
  if (!current.acceptingTools) {
93
- this.rpc.send({ id: message.id, result: { success: false, contentItems: [{ type: "inputText", text: "The task is not accepting tool calls." }] } });
93
+ try {
94
+ this.rpc.send({ id: message.id, result: { success: false, contentItems: [{ type: "inputText", text: "The task is not accepting tool calls." }] } });
95
+ }
96
+ catch { /* A closing native turn no longer accepts its rejected tool-call result. */ }
94
97
  return;
95
98
  }
96
99
  const call = this.toolCall(message.id, p);