subharness 0.0.4 → 0.0.7

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 (303) hide show
  1. package/README.md +95 -9
  2. package/dist/adapters/claude-process.d.ts +3 -0
  3. package/dist/adapters/claude-process.js +19 -2
  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-tools.d.ts +6 -2
  9. package/dist/adapters/claude-tools.js +14 -12
  10. package/dist/adapters/claude-tools.js.map +1 -1
  11. package/dist/adapters/claude-worker-client.d.ts +49 -0
  12. package/dist/adapters/claude-worker-client.js +359 -0
  13. package/dist/adapters/claude-worker-client.js.map +1 -0
  14. package/dist/adapters/claude-worker-process.d.ts +20 -0
  15. package/dist/adapters/claude-worker-process.js +76 -0
  16. package/dist/adapters/claude-worker-process.js.map +1 -0
  17. package/dist/adapters/claude-worker-protocol.d.ts +38 -0
  18. package/dist/adapters/claude-worker-protocol.js +2 -0
  19. package/dist/adapters/claude-worker-protocol.js.map +1 -0
  20. package/dist/adapters/claude-worker.d.ts +1 -0
  21. package/dist/adapters/claude-worker.js +126 -0
  22. package/dist/adapters/claude-worker.js.map +1 -0
  23. package/dist/adapters/claude.d.ts +16 -6
  24. package/dist/adapters/claude.js +164 -75
  25. package/dist/adapters/claude.js.map +1 -1
  26. package/dist/adapters/codex.js +4 -1
  27. package/dist/adapters/codex.js.map +1 -1
  28. package/dist/adapters/copilot-permissions.d.ts +26 -0
  29. package/dist/adapters/copilot-permissions.js +121 -0
  30. package/dist/adapters/copilot-permissions.js.map +1 -0
  31. package/dist/adapters/copilot-tools.d.ts +12 -0
  32. package/dist/adapters/copilot-tools.js +61 -0
  33. package/dist/adapters/copilot-tools.js.map +1 -0
  34. package/dist/adapters/copilot.d.ts +108 -0
  35. package/dist/adapters/copilot.js +819 -0
  36. package/dist/adapters/copilot.js.map +1 -0
  37. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  38. package/dist/adapters/cursor-cli-approvals.js +83 -0
  39. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  40. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  41. package/dist/adapters/cursor-cli-model.js +64 -0
  42. package/dist/adapters/cursor-cli-model.js.map +1 -0
  43. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  44. package/dist/adapters/cursor-cli-session.js +316 -0
  45. package/dist/adapters/cursor-cli-session.js.map +1 -0
  46. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  47. package/dist/adapters/cursor-cli-tools.js +181 -0
  48. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  49. package/dist/adapters/cursor-cli.d.ts +2 -0
  50. package/dist/adapters/cursor-cli.js +306 -0
  51. package/dist/adapters/cursor-cli.js.map +1 -0
  52. package/dist/adapters/cursor-model.d.ts +7 -0
  53. package/dist/adapters/cursor-model.js +67 -0
  54. package/dist/adapters/cursor-model.js.map +1 -0
  55. package/dist/adapters/cursor-rpc.d.ts +42 -0
  56. package/dist/adapters/cursor-rpc.js +271 -0
  57. package/dist/adapters/cursor-rpc.js.map +1 -0
  58. package/dist/adapters/cursor-session.d.ts +4 -0
  59. package/dist/adapters/cursor-session.js +327 -0
  60. package/dist/adapters/cursor-session.js.map +1 -0
  61. package/dist/adapters/cursor-startup.d.ts +16 -0
  62. package/dist/adapters/cursor-startup.js +74 -0
  63. package/dist/adapters/cursor-startup.js.map +1 -0
  64. package/dist/adapters/cursor-tools.d.ts +11 -0
  65. package/dist/adapters/cursor-tools.js +49 -0
  66. package/dist/adapters/cursor-tools.js.map +1 -0
  67. package/dist/adapters/cursor.d.ts +6 -0
  68. package/dist/adapters/cursor.js +17 -0
  69. package/dist/adapters/cursor.js.map +1 -0
  70. package/dist/adapters/fx-auth.d.ts +12 -2
  71. package/dist/adapters/fx-auth.js +51 -61
  72. package/dist/adapters/fx-auth.js.map +1 -1
  73. package/dist/adapters/fx-profile.d.ts +8 -0
  74. package/dist/adapters/fx-profile.js +101 -0
  75. package/dist/adapters/fx-profile.js.map +1 -0
  76. package/dist/adapters/fx-rpc.d.ts +2 -0
  77. package/dist/adapters/fx-rpc.js +30 -4
  78. package/dist/adapters/fx-rpc.js.map +1 -1
  79. package/dist/adapters/fx-status.d.ts +2 -0
  80. package/dist/adapters/fx-status.js +96 -0
  81. package/dist/adapters/fx-status.js.map +1 -0
  82. package/dist/adapters/fx.js +28 -12
  83. package/dist/adapters/fx.js.map +1 -1
  84. package/dist/adapters/opencode-access.d.ts +13 -0
  85. package/dist/adapters/opencode-access.js +76 -0
  86. package/dist/adapters/opencode-access.js.map +1 -0
  87. package/dist/adapters/opencode-config.d.ts +11 -0
  88. package/dist/adapters/opencode-config.js +238 -0
  89. package/dist/adapters/opencode-config.js.map +1 -0
  90. package/dist/adapters/opencode-http.d.ts +28 -0
  91. package/dist/adapters/opencode-http.js +297 -0
  92. package/dist/adapters/opencode-http.js.map +1 -0
  93. package/dist/adapters/opencode-tools.d.ts +19 -0
  94. package/dist/adapters/opencode-tools.js +127 -0
  95. package/dist/adapters/opencode-tools.js.map +1 -0
  96. package/dist/adapters/opencode.d.ts +2 -0
  97. package/dist/adapters/opencode.js +569 -0
  98. package/dist/adapters/opencode.js.map +1 -0
  99. package/dist/adapters/rpc.d.ts +3 -0
  100. package/dist/adapters/rpc.js +45 -4
  101. package/dist/adapters/rpc.js.map +1 -1
  102. package/dist/adapters/types.d.ts +5 -0
  103. package/dist/adapters/types.js.map +1 -1
  104. package/dist/approvals/types.d.ts +1 -1
  105. package/dist/approvals/types.js.map +1 -1
  106. package/dist/cli/args.d.ts +1 -1
  107. package/dist/cli/args.js +4 -1
  108. package/dist/cli/args.js.map +1 -1
  109. package/dist/cli/catalog-worker.js.map +1 -1
  110. package/dist/cli/dashboard-client.js +20 -31
  111. package/dist/cli/dashboard-client.js.map +1 -1
  112. package/dist/cli/dashboard-controller.d.ts +7 -0
  113. package/dist/cli/dashboard-controller.js +27 -0
  114. package/dist/cli/dashboard-controller.js.map +1 -0
  115. package/dist/cli/dashboard-detail-view.d.ts +1 -1
  116. package/dist/cli/dashboard-detail-view.js +3 -4
  117. package/dist/cli/dashboard-detail-view.js.map +1 -1
  118. package/dist/cli/dashboard-history-view.js.map +1 -1
  119. package/dist/cli/dashboard-input.d.ts +1 -1
  120. package/dist/cli/dashboard-input.js +11 -1
  121. package/dist/cli/dashboard-input.js.map +1 -1
  122. package/dist/cli/dashboard-layout.js +3 -3
  123. package/dist/cli/dashboard-layout.js.map +1 -1
  124. package/dist/cli/dashboard-renderer.js.map +1 -1
  125. package/dist/cli/dashboard-style.js +2 -2
  126. package/dist/cli/dashboard-style.js.map +1 -1
  127. package/dist/cli/dashboard.d.ts +2 -2
  128. package/dist/cli/dashboard.js +7 -32
  129. package/dist/cli/dashboard.js.map +1 -1
  130. package/dist/cli/help.d.ts +1 -1
  131. package/dist/cli/help.js +30 -12
  132. package/dist/cli/help.js.map +1 -1
  133. package/dist/cli/main.js +55 -43
  134. package/dist/cli/main.js.map +1 -1
  135. package/dist/config/access-provenance.d.ts +10 -0
  136. package/dist/config/access-provenance.js +31 -0
  137. package/dist/config/access-provenance.js.map +1 -0
  138. package/dist/config/access.d.ts +12 -2
  139. package/dist/config/access.js +125 -27
  140. package/dist/config/access.js.map +1 -1
  141. package/dist/config/loader.js +1 -0
  142. package/dist/config/loader.js.map +1 -1
  143. package/dist/config/oidc.js +4 -2
  144. package/dist/config/oidc.js.map +1 -1
  145. package/dist/config/project.js +2 -1
  146. package/dist/config/project.js.map +1 -1
  147. package/dist/config/resolve-access.js +24 -10
  148. package/dist/config/resolve-access.js.map +1 -1
  149. package/dist/errors.d.ts +2 -2
  150. package/dist/errors.js.map +1 -1
  151. package/dist/index.d.ts +8 -2
  152. package/dist/index.js +4 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/process-diagnostics.d.ts +2 -0
  155. package/dist/process-diagnostics.js +11 -0
  156. package/dist/process-diagnostics.js.map +1 -0
  157. package/dist/runtime/access-errors.d.ts +4 -0
  158. package/dist/runtime/access-errors.js +25 -0
  159. package/dist/runtime/access-errors.js.map +1 -0
  160. package/dist/runtime/approval-registry.d.ts +9 -0
  161. package/dist/runtime/approval-registry.js +144 -5
  162. package/dist/runtime/approval-registry.js.map +1 -1
  163. package/dist/runtime/capture.d.ts +22 -0
  164. package/dist/runtime/capture.js +320 -0
  165. package/dist/runtime/capture.js.map +1 -0
  166. package/dist/runtime/catalog.d.ts +39 -0
  167. package/dist/runtime/catalog.js +84 -0
  168. package/dist/runtime/catalog.js.map +1 -0
  169. package/dist/runtime/client.d.ts +2 -1
  170. package/dist/runtime/client.js +74 -47
  171. package/dist/runtime/client.js.map +1 -1
  172. package/dist/runtime/coordinator.d.ts +44 -7
  173. package/dist/runtime/coordinator.js +265 -31
  174. package/dist/runtime/coordinator.js.map +1 -1
  175. package/dist/runtime/daemon.js +12 -6
  176. package/dist/runtime/daemon.js.map +1 -1
  177. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  178. package/dist/runtime/dashboard-sanitize.js +7 -0
  179. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  180. package/dist/runtime/dashboard-workspace.js +5 -1
  181. package/dist/runtime/dashboard-workspace.js.map +1 -1
  182. package/dist/runtime/dashboard.d.ts +1 -1
  183. package/dist/runtime/dashboard.js +2 -3
  184. package/dist/runtime/dashboard.js.map +1 -1
  185. package/dist/runtime/definition.d.ts +6 -1
  186. package/dist/runtime/definition.js +42 -2
  187. package/dist/runtime/definition.js.map +1 -1
  188. package/dist/runtime/native-owner.js +7 -1
  189. package/dist/runtime/native-owner.js.map +1 -1
  190. package/dist/runtime/pagination.d.ts +9 -0
  191. package/dist/runtime/pagination.js +36 -0
  192. package/dist/runtime/pagination.js.map +1 -0
  193. package/dist/runtime/sdk-observation.d.ts +8 -0
  194. package/dist/runtime/sdk-observation.js +75 -0
  195. package/dist/runtime/sdk-observation.js.map +1 -0
  196. package/dist/runtime/sdk-projection.d.ts +8 -0
  197. package/dist/runtime/sdk-projection.js +19 -0
  198. package/dist/runtime/sdk-projection.js.map +1 -0
  199. package/dist/runtime/sdk-service.d.ts +11 -0
  200. package/dist/runtime/sdk-service.js +109 -0
  201. package/dist/runtime/sdk-service.js.map +1 -0
  202. package/dist/runtime/select-native.d.ts +4 -1
  203. package/dist/runtime/select-native.js +28 -13
  204. package/dist/runtime/select-native.js.map +1 -1
  205. package/dist/runtime/service.d.ts +11 -1
  206. package/dist/runtime/service.js +178 -3
  207. package/dist/runtime/service.js.map +1 -1
  208. package/dist/runtime/session-launcher.js +1 -1
  209. package/dist/runtime/session-launcher.js.map +1 -1
  210. package/dist/runtime/snapshots.d.ts +103 -0
  211. package/dist/runtime/snapshots.js +124 -0
  212. package/dist/runtime/snapshots.js.map +1 -0
  213. package/dist/runtime/state.d.ts +26 -0
  214. package/dist/runtime/state.js +86 -17
  215. package/dist/runtime/state.js.map +1 -1
  216. package/dist/runtime/task-data.d.ts +38 -0
  217. package/dist/runtime/task-data.js +2 -0
  218. package/dist/runtime/task-data.js.map +1 -0
  219. package/dist/runtime/transport.d.ts +13 -0
  220. package/dist/runtime/transport.js +166 -0
  221. package/dist/runtime/transport.js.map +1 -0
  222. package/dist/runtime/types.d.ts +28 -9
  223. package/dist/runtime/types.js.map +1 -1
  224. package/dist/runtime/worker-client.js +40 -13
  225. package/dist/runtime/worker-client.js.map +1 -1
  226. package/dist/runtime/worker-server.js +105 -24
  227. package/dist/runtime/worker-server.js.map +1 -1
  228. package/dist/sdk/connected-types.d.ts +42 -0
  229. package/dist/sdk/connected-types.js +2 -0
  230. package/dist/sdk/connected-types.js.map +1 -0
  231. package/dist/sdk/connected.d.ts +3 -0
  232. package/dist/sdk/connected.js +232 -0
  233. package/dist/sdk/connected.js.map +1 -0
  234. package/dist/sdk/definitions.d.ts +4 -1
  235. package/dist/sdk/definitions.js +16 -2
  236. package/dist/sdk/definitions.js.map +1 -1
  237. package/dist/sdk/execution-definition.d.ts +3 -0
  238. package/dist/sdk/execution-definition.js +59 -0
  239. package/dist/sdk/execution-definition.js.map +1 -0
  240. package/dist/sdk/execution-driver.d.ts +6 -0
  241. package/dist/sdk/execution-driver.js +86 -0
  242. package/dist/sdk/execution-driver.js.map +1 -0
  243. package/dist/sdk/execution-observation.d.ts +3 -0
  244. package/dist/sdk/execution-observation.js +35 -0
  245. package/dist/sdk/execution-observation.js.map +1 -0
  246. package/dist/sdk/execution-options.d.ts +17 -0
  247. package/dist/sdk/execution-options.js +115 -0
  248. package/dist/sdk/execution-options.js.map +1 -0
  249. package/dist/sdk/execution-types.d.ts +72 -0
  250. package/dist/sdk/execution-types.js +2 -0
  251. package/dist/sdk/execution-types.js.map +1 -0
  252. package/dist/sdk/execution.d.ts +3 -0
  253. package/dist/sdk/execution.js +3 -0
  254. package/dist/sdk/execution.js.map +1 -0
  255. package/dist/sdk/hosted-error.d.ts +3 -0
  256. package/dist/sdk/hosted-error.js +14 -0
  257. package/dist/sdk/hosted-error.js.map +1 -0
  258. package/dist/sdk/hosted.d.ts +23 -0
  259. package/dist/sdk/hosted.js +204 -0
  260. package/dist/sdk/hosted.js.map +1 -0
  261. package/dist/sdk/permission-validation.js +10 -1
  262. package/dist/sdk/permission-validation.js.map +1 -1
  263. package/dist/sdk/runner.d.ts +5 -0
  264. package/dist/sdk/runner.js +107 -0
  265. package/dist/sdk/runner.js.map +1 -0
  266. package/dist/sdk/tools.js +4 -1
  267. package/dist/sdk/tools.js.map +1 -1
  268. package/dist/sdk/types.d.ts +29 -1
  269. package/dist/sdk/types.js.map +1 -1
  270. package/package.json +6 -3
  271. package/sdk/access-config.md +60 -4
  272. package/sdk/adapter-contract.md +13 -3
  273. package/sdk/additional-harnesses.md +43 -0
  274. package/sdk/agent-skill.md +2 -2
  275. package/sdk/agent.md +6 -4
  276. package/sdk/approvals.md +5 -1
  277. package/sdk/authentication.md +1 -1
  278. package/sdk/cli/dashboard-design.md +6 -0
  279. package/sdk/cli/index.md +9 -6
  280. package/sdk/cli/output.md +3 -1
  281. package/sdk/completion-notifications.md +2 -0
  282. package/sdk/config.md +1 -1
  283. package/sdk/copilot.md +53 -0
  284. package/sdk/cursor.md +68 -0
  285. package/sdk/diagnostics.md +29 -0
  286. package/sdk/distribution.md +5 -3
  287. package/sdk/evals.md +1 -1
  288. package/sdk/examples/chat-tool.ts +126 -0
  289. package/sdk/execution.md +743 -0
  290. package/sdk/fx.md +50 -5
  291. package/sdk/harnesses.md +13 -13
  292. package/sdk/index.md +45 -20
  293. package/sdk/message-delivery.md +2 -0
  294. package/sdk/opencode.md +57 -0
  295. package/sdk/permissions.md +6 -2
  296. package/sdk/plugins/sub-agents.md +4 -2
  297. package/sdk/project-team.md +25 -1
  298. package/sdk/sessions.md +2 -0
  299. package/sdk/tools.md +4 -2
  300. package/sdk/v1-runtime.md +8 -6
  301. package/dist/cli/catalog.d.ts +0 -26
  302. package/dist/cli/catalog.js +0 -41
  303. package/dist/cli/catalog.js.map +0 -1
@@ -0,0 +1,359 @@
1
+ import { access } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { delimiter, join } from "node:path";
4
+ import { Worker } from "node:worker_threads";
5
+ import { AgentError } from "../errors.js";
6
+ export class ClaudeWorkerMessageStream {
7
+ values = [];
8
+ waiting = [];
9
+ ended = false;
10
+ failure;
11
+ push(value) {
12
+ if (this.failure || this.ended)
13
+ return;
14
+ const next = this.waiting.shift();
15
+ if (next)
16
+ next.resolve({ value, done: false });
17
+ else
18
+ this.values.push(value);
19
+ }
20
+ end() {
21
+ if (this.failure || this.ended)
22
+ return;
23
+ this.ended = true;
24
+ for (const next of this.waiting.splice(0))
25
+ next.resolve({ value: undefined, done: true });
26
+ }
27
+ fail(error) {
28
+ if (this.failure)
29
+ return;
30
+ this.failure = error;
31
+ this.values.length = 0;
32
+ for (const next of this.waiting.splice(0))
33
+ next.reject(error);
34
+ }
35
+ [Symbol.asyncIterator]() {
36
+ return { next: () => {
37
+ if (this.failure)
38
+ return Promise.reject(this.failure);
39
+ if (this.values.length)
40
+ return Promise.resolve({ value: this.values.shift(), done: false });
41
+ if (this.ended)
42
+ return Promise.resolve({ value: undefined, done: true });
43
+ return new Promise((resolve, reject) => this.waiting.push({ resolve, reject }));
44
+ } };
45
+ }
46
+ }
47
+ function stdinFailure() {
48
+ return new Error("Claude Code stdin bridge failed.");
49
+ }
50
+ export function writeClaudeProcessInput(stream, chunk) {
51
+ if (stream.destroyed || stream.closed || stream.writableEnded)
52
+ return Promise.reject(stdinFailure());
53
+ return new Promise((resolve, reject) => {
54
+ let settled = false;
55
+ const cleanup = () => {
56
+ stream.off("drain", drained);
57
+ stream.off("close", failed);
58
+ stream.off("error", failed);
59
+ };
60
+ const done = (operation) => {
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ cleanup();
65
+ operation();
66
+ };
67
+ const drained = () => done(resolve);
68
+ const failed = () => done(() => reject(stdinFailure()));
69
+ stream.once("drain", drained);
70
+ stream.once("close", failed);
71
+ stream.once("error", failed);
72
+ try {
73
+ if (stream.write(chunk))
74
+ drained();
75
+ }
76
+ catch {
77
+ failed();
78
+ }
79
+ });
80
+ }
81
+ export function endClaudeProcessInput(stream) {
82
+ if (stream.destroyed || stream.closed)
83
+ return Promise.reject(stdinFailure());
84
+ return new Promise((resolve, reject) => {
85
+ let settled = false;
86
+ const cleanup = () => {
87
+ stream.off("close", failed);
88
+ stream.off("error", failed);
89
+ };
90
+ const done = (operation) => {
91
+ if (settled)
92
+ return;
93
+ settled = true;
94
+ cleanup();
95
+ operation();
96
+ };
97
+ const finished = () => done(resolve);
98
+ const failed = () => done(() => reject(stdinFailure()));
99
+ stream.once("close", failed);
100
+ stream.once("error", failed);
101
+ try {
102
+ stream.end(finished);
103
+ }
104
+ catch {
105
+ failed();
106
+ }
107
+ });
108
+ }
109
+ function copiedEnvironment(env) {
110
+ return Object.fromEntries(Object.entries(env).filter((entry) => entry[1] !== undefined));
111
+ }
112
+ async function executable(env) {
113
+ for (const directory of (env.PATH ?? "").split(delimiter)) {
114
+ const file = join(directory, "claude");
115
+ try {
116
+ await access(file, constants.X_OK);
117
+ return file;
118
+ }
119
+ catch { /* Try the next PATH entry. */ }
120
+ }
121
+ throw new AgentError("HARNESS_UNAVAILABLE", "Install Claude Code and make claude available on PATH.");
122
+ }
123
+ export class ClaudeWorkerClient {
124
+ worker;
125
+ pending = new Map();
126
+ hostRequests = new Map();
127
+ messages = new ClaudeWorkerMessageStream();
128
+ nextId = 1;
129
+ terminalFailure;
130
+ expectedExit = false;
131
+ disposed;
132
+ bridge;
133
+ processOwner;
134
+ spawnAbort;
135
+ spawned;
136
+ canUseTool;
137
+ onElicitation;
138
+ constructor(env, options = {}) {
139
+ const moduleUrl = new URL(`./claude-worker.${import.meta.url.endsWith(".ts") ? "ts" : "js"}`, import.meta.url);
140
+ const factory = options.createWorker ?? ((url, workerOptions) => new Worker(url, workerOptions));
141
+ this.worker = factory(moduleUrl, { env: copiedEnvironment(env) });
142
+ this.worker.on("message", message => {
143
+ void this.onMessage(message).catch(() => this.fail("message"));
144
+ });
145
+ this.worker.on("error", () => this.fail("worker"));
146
+ this.worker.on("exit", code => {
147
+ if (!this.expectedExit)
148
+ this.fail("worker", code);
149
+ });
150
+ }
151
+ dependencies = {
152
+ executable,
153
+ managedSettings: async (cwd) => await this.request("managedSettings", cwd),
154
+ query: async ({ prompt, options }, bridge) => {
155
+ this.bridge = bridge;
156
+ this.processOwner = bridge.processOwner;
157
+ this.canUseTool = options.canUseTool;
158
+ this.onElicitation = options.onElicitation;
159
+ const { spawnClaudeCodeProcess: _spawn, canUseTool: _canUseTool, onElicitation: _onElicitation, stderr: _stderr, mcpServers: _mcpServers, ...workerOptions } = options;
160
+ await this.request("start", {
161
+ options: workerOptions,
162
+ namespace: bridge.tools.namespace,
163
+ tools: bridge.tools.descriptors,
164
+ });
165
+ void this.forwardInput(prompt);
166
+ return this.queryProxy();
167
+ },
168
+ dispose: async () => await this.dispose(),
169
+ };
170
+ async forwardInput(prompt) {
171
+ try {
172
+ for await (const message of prompt)
173
+ this.postEvent("input", message);
174
+ this.postEvent("inputEnd");
175
+ }
176
+ catch {
177
+ this.fail("input");
178
+ }
179
+ }
180
+ queryProxy() {
181
+ return {
182
+ [Symbol.asyncIterator]: () => this.messages[Symbol.asyncIterator](),
183
+ accountInfo: async () => await this.request("accountInfo"),
184
+ supportedModels: async () => await this.request("supportedModels"),
185
+ getSettings: async () => await this.request("getSettings"),
186
+ setModel: async (model) => { await this.request("setModel", model); },
187
+ interrupt: async () => await this.request("interrupt"),
188
+ close: () => this.postEvent("close"),
189
+ };
190
+ }
191
+ request(operation, value) {
192
+ if (this.terminalFailure)
193
+ return Promise.reject(this.terminalFailure);
194
+ const id = this.nextId++;
195
+ return new Promise((resolve, reject) => {
196
+ this.pending.set(id, { operation, resolve, reject });
197
+ try {
198
+ this.worker.postMessage({ type: "request", id, operation, value });
199
+ }
200
+ catch {
201
+ this.fail(operation);
202
+ reject(this.terminalFailure);
203
+ }
204
+ });
205
+ }
206
+ postEvent(event, value) {
207
+ if (this.terminalFailure)
208
+ return;
209
+ try {
210
+ this.worker.postMessage({ type: "event", event, value });
211
+ }
212
+ catch {
213
+ this.fail(event);
214
+ }
215
+ }
216
+ async onMessage(message) {
217
+ if (message.type === "response") {
218
+ const current = this.pending.get(message.id);
219
+ if (!current)
220
+ return;
221
+ this.pending.delete(message.id);
222
+ if (message.ok)
223
+ current.resolve(message.value);
224
+ else if (message.failure === "settings-unavailable")
225
+ current.reject(new Error("Unsupported control request: get_settings."));
226
+ else
227
+ current.reject(new Error(`Claude Code ${current.operation} failed.`));
228
+ return;
229
+ }
230
+ if (message.type === "host-request") {
231
+ const controller = new AbortController();
232
+ this.hostRequests.set(message.id, controller);
233
+ try {
234
+ const value = await this.handleHostRequest(message, controller.signal);
235
+ this.postHostResponse(message.id, true, value);
236
+ }
237
+ catch {
238
+ this.postHostResponse(message.id, false);
239
+ }
240
+ finally {
241
+ this.hostRequests.delete(message.id);
242
+ }
243
+ return;
244
+ }
245
+ if (message.type !== "event")
246
+ return;
247
+ if (message.event === "message")
248
+ this.messages.push(message.value);
249
+ else if (message.event === "end")
250
+ this.messages.end();
251
+ else if (message.event === "failure")
252
+ this.fail(typeof message.value === "string" ? message.value : "worker");
253
+ else if (message.event === "hostRequestAbort")
254
+ this.hostRequests.get(Number(message.value))?.abort();
255
+ }
256
+ postHostResponse(id, ok, value) {
257
+ if (this.terminalFailure)
258
+ return;
259
+ try {
260
+ this.worker.postMessage({ type: "host-response", id, ok, value });
261
+ }
262
+ catch {
263
+ this.fail("host response");
264
+ }
265
+ }
266
+ async handleHostRequest(message, signal) {
267
+ const value = message.value;
268
+ switch (message.operation) {
269
+ case "toolCall": return await this.bridge.tools.call(value.name, value.input);
270
+ case "approval": return await this.canUseTool(value.toolName, value.toolInput, { ...value.metadata, signal });
271
+ case "elicitation": return await this.onElicitation(value.request, { ...value.metadata, signal });
272
+ case "processSpawn": {
273
+ this.spawnAbort = new AbortController();
274
+ this.spawned = this.processOwner.spawn({ ...value, signal: this.spawnAbort.signal });
275
+ this.spawned.once("exit", (code, exitSignal) => this.postEvent("processExit", { code, signal: exitSignal }));
276
+ this.spawned.once("error", () => this.postEvent("processError"));
277
+ return undefined;
278
+ }
279
+ case "processAbort":
280
+ this.spawnAbort?.abort();
281
+ return undefined;
282
+ case "processWrite":
283
+ await this.writeProcess(Buffer.from(value));
284
+ return undefined;
285
+ case "processEnd":
286
+ await this.endProcessInput();
287
+ return undefined;
288
+ case "processRead": return await this.readProcess();
289
+ case "processKill": return this.spawned.kill(value);
290
+ default: throw new Error("Unknown Claude host bridge operation.");
291
+ }
292
+ }
293
+ async writeProcess(chunk) {
294
+ await writeClaudeProcessInput(this.spawned.stdin, chunk);
295
+ }
296
+ async endProcessInput() {
297
+ await endClaudeProcessInput(this.spawned.stdin);
298
+ }
299
+ async readProcess() {
300
+ const stream = this.spawned.stdout;
301
+ const chunk = stream.read();
302
+ if (chunk)
303
+ return chunk;
304
+ if (stream.readableEnded)
305
+ return null;
306
+ return await new Promise((resolve, reject) => {
307
+ const cleanup = () => {
308
+ stream.off("readable", readable);
309
+ stream.off("end", ended);
310
+ stream.off("close", closed);
311
+ stream.off("error", failed);
312
+ };
313
+ const finish = (value) => { cleanup(); resolve(value); };
314
+ const readable = () => {
315
+ const available = stream.read();
316
+ if (available)
317
+ finish(available);
318
+ else if (stream.readableEnded)
319
+ finish(null);
320
+ };
321
+ const ended = () => finish(null);
322
+ const closed = () => stream.readableEnded ? finish(null) : failed();
323
+ const failed = () => { cleanup(); reject(new Error("Claude Code stdout bridge failed.")); };
324
+ stream.on("readable", readable);
325
+ stream.once("end", ended);
326
+ stream.once("close", closed);
327
+ stream.once("error", failed);
328
+ readable();
329
+ });
330
+ }
331
+ fail(operation, exitCode) {
332
+ const suffix = exitCode === undefined ? "" : ` (exit code ${exitCode})`;
333
+ this.terminate(new AgentError("HARNESS_FAILED", `Claude Code ${operation} bridge failed${suffix}.`));
334
+ }
335
+ terminate(error) {
336
+ if (this.terminalFailure)
337
+ return;
338
+ this.terminalFailure = error;
339
+ this.messages.fail(error);
340
+ for (const current of this.pending.values())
341
+ current.reject(error);
342
+ this.pending.clear();
343
+ for (const controller of this.hostRequests.values())
344
+ controller.abort();
345
+ }
346
+ async dispose() {
347
+ if (!this.disposed) {
348
+ this.expectedExit = true;
349
+ this.terminate(new AgentError("HARNESS_FAILED", "Claude Code worker closed."));
350
+ this.disposed = this.worker.terminate().then(() => undefined).catch(() => {
351
+ this.disposed = undefined;
352
+ this.expectedExit = false;
353
+ throw new AgentError("HARNESS_FAILED", "Claude Code worker cleanup failed.");
354
+ });
355
+ }
356
+ return await this.disposed;
357
+ }
358
+ }
359
+ //# sourceMappingURL=claude-worker-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-worker-client.js","sourceRoot":"","sources":["../../src/adapters/claude-worker-client.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 type { Writable } from \"node:stream\";\nimport { Worker } from \"node:worker_threads\";\nimport type {\n AccountInfo,\n ModelInfo,\n Options,\n SDKMessage,\n SDKUserMessage,\n Settings,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { AgentError } from \"../errors.js\";\nimport type { ClaudeDependencies, ClaudeQuery, ClaudeQueryBridge } from \"./claude.js\";\nimport { ClaudeProcessOwner } from \"./claude-process.js\";\nimport type {\n ClaudeBridgeMessage,\n ClaudeHostRequest,\n ClaudeWorkerFactory,\n} from \"./claude-worker-protocol.js\";\n\nexport class ClaudeWorkerMessageStream<T> implements AsyncIterable<T> {\n private readonly values: T[] = [];\n private readonly waiting: Array<{resolve(value: IteratorResult<T>): void; reject(error: unknown): void}> = [];\n private ended = false;\n private failure?: unknown;\n\n push(value: T): void {\n if (this.failure || this.ended) return;\n const next = this.waiting.shift();\n if (next) next.resolve({value,done:false}); else this.values.push(value);\n }\n end(): void {\n if (this.failure || this.ended) return;\n this.ended = true;\n for (const next of this.waiting.splice(0)) next.resolve({value:undefined,done:true});\n }\n fail(error: unknown): void {\n if (this.failure) return;\n this.failure = error;\n this.values.length = 0;\n for (const next of this.waiting.splice(0)) next.reject(error);\n }\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {next: () => {\n if (this.failure) return Promise.reject(this.failure);\n if (this.values.length) return Promise.resolve({value:this.values.shift()!,done:false});\n if (this.ended) return Promise.resolve({value:undefined,done:true});\n return new Promise((resolve,reject) => this.waiting.push({resolve,reject}));\n }};\n }\n}\n\nfunction stdinFailure(): Error {\n return new Error(\"Claude Code stdin bridge failed.\");\n}\n\nexport function writeClaudeProcessInput(stream: Writable, chunk: Buffer): Promise<void> {\n if (stream.destroyed || stream.closed || stream.writableEnded) return Promise.reject(stdinFailure());\n return new Promise((resolve,reject) => {\n let settled = false;\n const cleanup = () => {\n stream.off(\"drain\",drained);\n stream.off(\"close\",failed);\n stream.off(\"error\",failed);\n };\n const done = (operation: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n operation();\n };\n const drained = () => done(resolve);\n const failed = () => done(() => reject(stdinFailure()));\n stream.once(\"drain\",drained);\n stream.once(\"close\",failed);\n stream.once(\"error\",failed);\n try { if (stream.write(chunk)) drained(); }\n catch { failed(); }\n });\n}\n\nexport function endClaudeProcessInput(stream: Writable): Promise<void> {\n if (stream.destroyed || stream.closed) return Promise.reject(stdinFailure());\n return new Promise((resolve,reject) => {\n let settled = false;\n const cleanup = () => {\n stream.off(\"close\",failed);\n stream.off(\"error\",failed);\n };\n const done = (operation: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n operation();\n };\n const finished = () => done(resolve);\n const failed = () => done(() => reject(stdinFailure()));\n stream.once(\"close\",failed);\n stream.once(\"error\",failed);\n try { stream.end(finished); }\n catch { failed(); }\n });\n}\n\nfunction copiedEnvironment(env: NodeJS.ProcessEnv): Record<string, string> {\n return Object.fromEntries(Object.entries(env).filter((entry): entry is [string,string] => entry[1] !== undefined));\n}\n\nasync function executable(env: NodeJS.ProcessEnv): Promise<string> {\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\nexport interface ClaudeWorkerClientOptions {\n readonly createWorker?: ClaudeWorkerFactory;\n}\n\nexport class ClaudeWorkerClient {\n private readonly worker: Worker;\n private readonly pending = new Map<number, {operation:string; resolve(value: unknown): void; reject(error: unknown): void}>();\n private readonly hostRequests = new Map<number, AbortController>();\n private readonly messages = new ClaudeWorkerMessageStream<SDKMessage>();\n private nextId = 1;\n private terminalFailure?: AgentError;\n private expectedExit = false;\n private disposed?: Promise<void>;\n private bridge?: ClaudeQueryBridge;\n private processOwner?: ClaudeProcessOwner;\n private spawnAbort?: AbortController;\n private spawned?: ReturnType<ClaudeProcessOwner[\"spawn\"]>;\n private canUseTool?: NonNullable<Options[\"canUseTool\"]>;\n private onElicitation?: NonNullable<Options[\"onElicitation\"]>;\n\n constructor(env: NodeJS.ProcessEnv, options: ClaudeWorkerClientOptions = {}) {\n const moduleUrl = new URL(`./claude-worker.${import.meta.url.endsWith(\".ts\") ? \"ts\" : \"js\"}`, import.meta.url);\n const factory = options.createWorker ?? ((url, workerOptions) => new Worker(url, workerOptions));\n this.worker = factory(moduleUrl, {env:copiedEnvironment(env)});\n this.worker.on(\"message\", message => {\n void this.onMessage(message as ClaudeBridgeMessage).catch(() => this.fail(\"message\"));\n });\n this.worker.on(\"error\", () => this.fail(\"worker\"));\n this.worker.on(\"exit\", code => {\n if (!this.expectedExit) this.fail(\"worker\", code);\n });\n }\n\n readonly dependencies: ClaudeDependencies = {\n executable,\n managedSettings: async cwd => await this.request(\"managedSettings\", cwd) as Settings[],\n query: async ({prompt,options}, bridge) => {\n this.bridge = bridge;\n this.processOwner = bridge.processOwner;\n this.canUseTool = options.canUseTool;\n this.onElicitation = options.onElicitation;\n const {\n spawnClaudeCodeProcess: _spawn,\n canUseTool: _canUseTool,\n onElicitation: _onElicitation,\n stderr: _stderr,\n mcpServers: _mcpServers,\n ...workerOptions\n } = options;\n await this.request(\"start\", {\n options:workerOptions,\n namespace:bridge.tools.namespace,\n tools:bridge.tools.descriptors,\n });\n void this.forwardInput(prompt);\n return this.queryProxy();\n },\n dispose: async () => await this.dispose(),\n };\n\n private async forwardInput(prompt: AsyncIterable<SDKUserMessage>): Promise<void> {\n try {\n for await (const message of prompt) this.postEvent(\"input\", message);\n this.postEvent(\"inputEnd\");\n } catch { this.fail(\"input\"); }\n }\n\n private queryProxy(): ClaudeQuery {\n return {\n [Symbol.asyncIterator]: () => this.messages[Symbol.asyncIterator](),\n accountInfo: async () => await this.request(\"accountInfo\") as AccountInfo,\n supportedModels: async () => await this.request(\"supportedModels\") as ModelInfo[],\n getSettings: async () => await this.request(\"getSettings\"),\n setModel: async model => { await this.request(\"setModel\", model); },\n interrupt: async () => await this.request(\"interrupt\"),\n close: () => this.postEvent(\"close\"),\n };\n }\n\n private request(operation: string, value?: unknown): Promise<unknown> {\n if (this.terminalFailure) return Promise.reject(this.terminalFailure);\n const id = this.nextId++;\n return new Promise((resolve,reject) => {\n this.pending.set(id,{operation,resolve,reject});\n try { this.worker.postMessage({type:\"request\",id,operation,value} satisfies ClaudeBridgeMessage); }\n catch {\n this.fail(operation);\n reject(this.terminalFailure);\n }\n });\n }\n\n private postEvent(event: string, value?: unknown): void {\n if (this.terminalFailure) return;\n try { this.worker.postMessage({type:\"event\",event,value} satisfies ClaudeBridgeMessage); }\n catch { this.fail(event); }\n }\n\n private async onMessage(message: ClaudeBridgeMessage): Promise<void> {\n if (message.type === \"response\") {\n const current = this.pending.get(message.id);\n if (!current) return;\n this.pending.delete(message.id);\n if (message.ok) current.resolve(message.value);\n else if (message.failure === \"settings-unavailable\") current.reject(new Error(\"Unsupported control request: get_settings.\"));\n else current.reject(new Error(`Claude Code ${current.operation} failed.`));\n return;\n }\n if (message.type === \"host-request\") {\n const controller = new AbortController();\n this.hostRequests.set(message.id,controller);\n try {\n const value = await this.handleHostRequest(message,controller.signal);\n this.postHostResponse(message.id,true,value);\n } catch {\n this.postHostResponse(message.id,false);\n } finally { this.hostRequests.delete(message.id); }\n return;\n }\n if (message.type !== \"event\") return;\n if (message.event === \"message\") this.messages.push(message.value as SDKMessage);\n else if (message.event === \"end\") this.messages.end();\n else if (message.event === \"failure\") this.fail(typeof message.value === \"string\" ? message.value : \"worker\");\n else if (message.event === \"hostRequestAbort\") this.hostRequests.get(Number(message.value))?.abort();\n }\n\n private postHostResponse(id: number, ok: boolean, value?: unknown): void {\n if (this.terminalFailure) return;\n try { this.worker.postMessage({type:\"host-response\",id,ok,value} satisfies ClaudeBridgeMessage); }\n catch { this.fail(\"host response\"); }\n }\n\n private async handleHostRequest(message: ClaudeHostRequest, signal: AbortSignal): Promise<unknown> {\n const value = message.value as any;\n switch (message.operation) {\n case \"toolCall\": return await this.bridge!.tools.call(value.name,value.input);\n case \"approval\": return await this.canUseTool!(value.toolName,value.toolInput,{...value.metadata,signal});\n case \"elicitation\": return await this.onElicitation!(value.request,{...value.metadata,signal});\n case \"processSpawn\": {\n this.spawnAbort = new AbortController();\n this.spawned = this.processOwner!.spawn({...value,signal:this.spawnAbort.signal});\n this.spawned.once(\"exit\",(code,exitSignal) => this.postEvent(\"processExit\",{code,signal:exitSignal}));\n this.spawned.once(\"error\",() => this.postEvent(\"processError\"));\n return undefined;\n }\n case \"processAbort\": this.spawnAbort?.abort(); return undefined;\n case \"processWrite\": await this.writeProcess(Buffer.from(value as Uint8Array)); return undefined;\n case \"processEnd\": await this.endProcessInput(); return undefined;\n case \"processRead\": return await this.readProcess();\n case \"processKill\": return this.spawned!.kill(value as NodeJS.Signals);\n default: throw new Error(\"Unknown Claude host bridge operation.\");\n }\n }\n\n private async writeProcess(chunk: Buffer): Promise<void> {\n await writeClaudeProcessInput(this.spawned!.stdin,chunk);\n }\n\n private async endProcessInput(): Promise<void> {\n await endClaudeProcessInput(this.spawned!.stdin);\n }\n\n private async readProcess(): Promise<Buffer | null> {\n const stream = this.spawned!.stdout;\n const chunk = stream.read() as Buffer | null;\n if (chunk) return chunk;\n if (stream.readableEnded) return null;\n return await new Promise<Buffer | null>((resolve,reject) => {\n const cleanup = () => {\n stream.off(\"readable\",readable);\n stream.off(\"end\",ended);\n stream.off(\"close\",closed);\n stream.off(\"error\",failed);\n };\n const finish = (value: Buffer | null) => { cleanup(); resolve(value); };\n const readable = () => {\n const available = stream.read() as Buffer | null;\n if (available) finish(available);\n else if (stream.readableEnded) finish(null);\n };\n const ended = () => finish(null);\n const closed = () => stream.readableEnded ? finish(null) : failed();\n const failed = () => { cleanup(); reject(new Error(\"Claude Code stdout bridge failed.\")); };\n stream.on(\"readable\",readable);\n stream.once(\"end\",ended);\n stream.once(\"close\",closed);\n stream.once(\"error\",failed);\n readable();\n });\n }\n\n private fail(operation: string, exitCode?: number): void {\n const suffix = exitCode === undefined ? \"\" : ` (exit code ${exitCode})`;\n this.terminate(new AgentError(\"HARNESS_FAILED\",`Claude Code ${operation} bridge failed${suffix}.`));\n }\n\n private terminate(error: AgentError): void {\n if (this.terminalFailure) return;\n this.terminalFailure = error;\n this.messages.fail(error);\n for (const current of this.pending.values()) current.reject(error);\n this.pending.clear();\n for (const controller of this.hostRequests.values()) controller.abort();\n }\n\n async dispose(): Promise<void> {\n if (!this.disposed) {\n this.expectedExit = true;\n this.terminate(new AgentError(\"HARNESS_FAILED\",\"Claude Code worker closed.\"));\n this.disposed = this.worker.terminate().then(() => undefined).catch(() => {\n this.disposed = undefined;\n this.expectedExit = false;\n throw new AgentError(\"HARNESS_FAILED\",\"Claude Code worker cleanup failed.\");\n });\n }\n return await this.disposed;\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { Readable, Writable } from "node:stream";
3
+ import type { SpawnedProcess, SpawnOptions } from "@anthropic-ai/claude-agent-sdk";
4
+ type Request = (operation: string, value?: unknown) => Promise<unknown>;
5
+ /** Worker-side synchronous process facade backed by host-owned I/O RPC. */
6
+ export declare class ClaudeRemoteProcess extends EventEmitter implements SpawnedProcess {
7
+ readonly stdin: Writable;
8
+ readonly stdout: Readable;
9
+ killed: boolean;
10
+ exitCode: number | null;
11
+ signalCode: NodeJS.Signals | null;
12
+ private pulling;
13
+ private readonly request;
14
+ constructor(request: Request, options: SpawnOptions);
15
+ private pull;
16
+ kill(signal: NodeJS.Signals): boolean;
17
+ exited(code: number | null, signal: NodeJS.Signals | null): void;
18
+ failed(): void;
19
+ }
20
+ export {};
@@ -0,0 +1,76 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { Readable, Writable } from "node:stream";
3
+ /** Worker-side synchronous process facade backed by host-owned I/O RPC. */
4
+ export class ClaudeRemoteProcess extends EventEmitter {
5
+ stdin;
6
+ stdout;
7
+ killed = false;
8
+ exitCode = null;
9
+ signalCode = null;
10
+ pulling = false;
11
+ request;
12
+ constructor(request, options) {
13
+ super();
14
+ this.request = request;
15
+ const ready = request("processSpawn", {
16
+ command: options.command,
17
+ args: options.args,
18
+ cwd: options.cwd,
19
+ env: options.env,
20
+ });
21
+ options.signal.addEventListener("abort", () => {
22
+ void ready.then(() => request("processAbort")).catch(() => this.failed());
23
+ }, { once: true });
24
+ this.stdin = new Writable({
25
+ write: (chunk, _encoding, callback) => {
26
+ void ready.then(() => request("processWrite", Buffer.from(chunk)))
27
+ .then(() => callback(), () => callback(new Error("Claude Code stdin bridge failed.")));
28
+ },
29
+ final: callback => {
30
+ void ready.then(() => request("processEnd"))
31
+ .then(() => callback(), () => callback(new Error("Claude Code stdin bridge failed.")));
32
+ },
33
+ });
34
+ this.stdout = new Readable({
35
+ read: () => { void this.pull(ready); },
36
+ });
37
+ void ready.catch(() => this.failed());
38
+ }
39
+ async pull(ready) {
40
+ if (this.pulling || this.stdout.readableEnded)
41
+ return;
42
+ this.pulling = true;
43
+ let continueReading = false;
44
+ try {
45
+ await ready;
46
+ const chunk = await this.request("processRead");
47
+ continueReading = chunk !== null && this.stdout.push(Buffer.from(chunk));
48
+ if (chunk === null)
49
+ this.stdout.push(null);
50
+ }
51
+ catch {
52
+ this.stdout.destroy(new Error("Claude Code stdout bridge failed."));
53
+ }
54
+ finally {
55
+ this.pulling = false;
56
+ if (continueReading)
57
+ void this.pull(ready);
58
+ }
59
+ }
60
+ kill(signal) {
61
+ if (this.exitCode !== null || this.signalCode !== null)
62
+ return false;
63
+ this.killed = true;
64
+ void this.request("processKill", signal).catch(() => this.failed());
65
+ return true;
66
+ }
67
+ exited(code, signal) {
68
+ this.exitCode = code;
69
+ this.signalCode = signal;
70
+ this.emit("exit", code, signal);
71
+ }
72
+ failed() {
73
+ this.emit("error", new Error("Claude Code process bridge failed."));
74
+ }
75
+ }
76
+ //# sourceMappingURL=claude-worker-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-worker-process.js","sourceRoot":"","sources":["../../src/adapters/claude-worker-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { Readable, Writable } from \"node:stream\";\nimport type { SpawnedProcess, SpawnOptions } from \"@anthropic-ai/claude-agent-sdk\";\n\ntype Request = (operation: string, value?: unknown) => Promise<unknown>;\n\n/** Worker-side synchronous process facade backed by host-owned I/O RPC. */\nexport class ClaudeRemoteProcess extends EventEmitter implements SpawnedProcess {\n readonly stdin: Writable;\n readonly stdout: Readable;\n killed = false;\n exitCode: number | null = null;\n signalCode: NodeJS.Signals | null = null;\n private pulling = false;\n private readonly request: Request;\n\n constructor(request: Request, options: SpawnOptions) {\n super();\n this.request = request;\n const ready = request(\"processSpawn\", {\n command: options.command,\n args: options.args,\n cwd: options.cwd,\n env: options.env,\n });\n options.signal.addEventListener(\"abort\", () => {\n void ready.then(() => request(\"processAbort\")).catch(() => this.failed());\n }, {once: true});\n this.stdin = new Writable({\n write: (chunk, _encoding, callback) => {\n void ready.then(() => request(\"processWrite\", Buffer.from(chunk)))\n .then(() => callback(), () => callback(new Error(\"Claude Code stdin bridge failed.\")));\n },\n final: callback => {\n void ready.then(() => request(\"processEnd\"))\n .then(() => callback(), () => callback(new Error(\"Claude Code stdin bridge failed.\")));\n },\n });\n this.stdout = new Readable({\n read: () => { void this.pull(ready); },\n });\n void ready.catch(() => this.failed());\n }\n\n private async pull(ready: Promise<unknown>): Promise<void> {\n if (this.pulling || this.stdout.readableEnded) return;\n this.pulling = true;\n let continueReading = false;\n try {\n await ready;\n const chunk = await this.request(\"processRead\") as Uint8Array | null;\n continueReading = chunk !== null && this.stdout.push(Buffer.from(chunk));\n if (chunk === null) this.stdout.push(null);\n } catch {\n this.stdout.destroy(new Error(\"Claude Code stdout bridge failed.\"));\n } finally {\n this.pulling = false;\n if (continueReading) void this.pull(ready);\n }\n }\n\n kill(signal: NodeJS.Signals): boolean {\n if (this.exitCode !== null || this.signalCode !== null) return false;\n this.killed = true;\n void this.request(\"processKill\", signal).catch(() => this.failed());\n return true;\n }\n\n exited(code: number | null, signal: NodeJS.Signals | null): void {\n this.exitCode = code;\n this.signalCode = signal;\n this.emit(\"exit\", code, signal);\n }\n\n failed(): void {\n this.emit(\"error\", new Error(\"Claude Code process bridge failed.\"));\n }\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import type { Worker, WorkerOptions } from "node:worker_threads";
2
+ export interface ClaudeToolDescriptor {
3
+ readonly name: string;
4
+ readonly description: string;
5
+ readonly inputSchema: Record<string, unknown>;
6
+ }
7
+ export type ClaudeWorkerFactory = (moduleUrl: URL, options: WorkerOptions) => Worker;
8
+ export type ClaudeWorkerRequest = {
9
+ readonly type: "request";
10
+ readonly id: number;
11
+ readonly operation: string;
12
+ readonly value?: unknown;
13
+ };
14
+ export type ClaudeWorkerResponse = {
15
+ readonly type: "response";
16
+ readonly id: number;
17
+ readonly ok: boolean;
18
+ readonly value?: unknown;
19
+ readonly failure?: "settings-unavailable";
20
+ };
21
+ export type ClaudeHostRequest = {
22
+ readonly type: "host-request";
23
+ readonly id: number;
24
+ readonly operation: string;
25
+ readonly value?: unknown;
26
+ };
27
+ export type ClaudeHostResponse = {
28
+ readonly type: "host-response";
29
+ readonly id: number;
30
+ readonly ok: boolean;
31
+ readonly value?: unknown;
32
+ };
33
+ export type ClaudeWorkerEvent = {
34
+ readonly type: "event";
35
+ readonly event: string;
36
+ readonly value?: unknown;
37
+ };
38
+ export type ClaudeBridgeMessage = ClaudeWorkerRequest | ClaudeWorkerResponse | ClaudeHostRequest | ClaudeHostResponse | ClaudeWorkerEvent;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-worker-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-worker-protocol.js","sourceRoot":"","sources":["../../src/adapters/claude-worker-protocol.ts"],"names":[],"mappings":"","sourcesContent":["import type { Worker, WorkerOptions } from \"node:worker_threads\";\n\nexport interface ClaudeToolDescriptor {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Record<string, unknown>;\n}\n\nexport type ClaudeWorkerFactory = (moduleUrl: URL, options: WorkerOptions) => Worker;\n\nexport type ClaudeWorkerRequest = {\n readonly type: \"request\";\n readonly id: number;\n readonly operation: string;\n readonly value?: unknown;\n};\n\nexport type ClaudeWorkerResponse = {\n readonly type: \"response\";\n readonly id: number;\n readonly ok: boolean;\n readonly value?: unknown;\n readonly failure?: \"settings-unavailable\";\n};\n\nexport type ClaudeHostRequest = {\n readonly type: \"host-request\";\n readonly id: number;\n readonly operation: string;\n readonly value?: unknown;\n};\n\nexport type ClaudeHostResponse = {\n readonly type: \"host-response\";\n readonly id: number;\n readonly ok: boolean;\n readonly value?: unknown;\n};\n\nexport type ClaudeWorkerEvent = {\n readonly type: \"event\";\n readonly event: string;\n readonly value?: unknown;\n};\n\nexport type ClaudeBridgeMessage = ClaudeWorkerRequest | ClaudeWorkerResponse\n | ClaudeHostRequest | ClaudeHostResponse | ClaudeWorkerEvent;\n"]}
@@ -0,0 +1 @@
1
+ export {};