subharness 0.0.5 → 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.
- package/README.md +59 -3
- package/dist/adapters/claude-process.js +8 -1
- package/dist/adapters/claude-process.js.map +1 -1
- package/dist/adapters/claude-tools.d.ts +6 -2
- package/dist/adapters/claude-tools.js +14 -12
- package/dist/adapters/claude-tools.js.map +1 -1
- package/dist/adapters/claude-worker-client.d.ts +49 -0
- package/dist/adapters/claude-worker-client.js +359 -0
- package/dist/adapters/claude-worker-client.js.map +1 -0
- package/dist/adapters/claude-worker-process.d.ts +20 -0
- package/dist/adapters/claude-worker-process.js +76 -0
- package/dist/adapters/claude-worker-process.js.map +1 -0
- package/dist/adapters/claude-worker-protocol.d.ts +38 -0
- package/dist/adapters/claude-worker-protocol.js +2 -0
- package/dist/adapters/claude-worker-protocol.js.map +1 -0
- package/dist/adapters/claude-worker.d.ts +1 -0
- package/dist/adapters/claude-worker.js +126 -0
- package/dist/adapters/claude-worker.js.map +1 -0
- package/dist/adapters/claude.d.ts +16 -6
- package/dist/adapters/claude.js +138 -68
- package/dist/adapters/claude.js.map +1 -1
- package/dist/cli/catalog-worker.js.map +1 -1
- package/dist/cli/dashboard-client.js +19 -30
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/main.js +53 -45
- package/dist/cli/main.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/approval-registry.d.ts +9 -0
- package/dist/runtime/approval-registry.js +143 -4
- package/dist/runtime/approval-registry.js.map +1 -1
- package/dist/runtime/capture.d.ts +22 -0
- package/dist/runtime/capture.js +320 -0
- package/dist/runtime/capture.js.map +1 -0
- package/dist/runtime/catalog.d.ts +39 -0
- package/dist/runtime/catalog.js +84 -0
- package/dist/runtime/catalog.js.map +1 -0
- package/dist/runtime/client.d.ts +2 -1
- package/dist/runtime/client.js +52 -65
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/coordinator.d.ts +44 -7
- package/dist/runtime/coordinator.js +265 -31
- package/dist/runtime/coordinator.js.map +1 -1
- package/dist/runtime/daemon.js +12 -6
- package/dist/runtime/daemon.js.map +1 -1
- package/dist/runtime/dashboard-workspace.js +5 -1
- package/dist/runtime/dashboard-workspace.js.map +1 -1
- package/dist/runtime/definition.d.ts +6 -1
- package/dist/runtime/definition.js +31 -1
- package/dist/runtime/definition.js.map +1 -1
- package/dist/runtime/native-owner.js +7 -1
- package/dist/runtime/native-owner.js.map +1 -1
- package/dist/runtime/pagination.d.ts +9 -0
- package/dist/runtime/pagination.js +36 -0
- package/dist/runtime/pagination.js.map +1 -0
- package/dist/runtime/sdk-observation.d.ts +8 -0
- package/dist/runtime/sdk-observation.js +75 -0
- package/dist/runtime/sdk-observation.js.map +1 -0
- package/dist/runtime/sdk-projection.d.ts +8 -0
- package/dist/runtime/sdk-projection.js +19 -0
- package/dist/runtime/sdk-projection.js.map +1 -0
- package/dist/runtime/sdk-service.d.ts +11 -0
- package/dist/runtime/sdk-service.js +109 -0
- package/dist/runtime/sdk-service.js.map +1 -0
- package/dist/runtime/select-native.d.ts +4 -1
- package/dist/runtime/select-native.js +14 -17
- package/dist/runtime/select-native.js.map +1 -1
- package/dist/runtime/service.d.ts +11 -1
- package/dist/runtime/service.js +178 -3
- package/dist/runtime/service.js.map +1 -1
- package/dist/runtime/session-launcher.js +1 -1
- package/dist/runtime/session-launcher.js.map +1 -1
- package/dist/runtime/snapshots.d.ts +103 -0
- package/dist/runtime/snapshots.js +124 -0
- package/dist/runtime/snapshots.js.map +1 -0
- package/dist/runtime/state.d.ts +26 -0
- package/dist/runtime/state.js +86 -17
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/task-data.d.ts +38 -0
- package/dist/runtime/task-data.js +2 -0
- package/dist/runtime/task-data.js.map +1 -0
- package/dist/runtime/transport.d.ts +13 -0
- package/dist/runtime/transport.js +166 -0
- package/dist/runtime/transport.js.map +1 -0
- package/dist/runtime/types.d.ts +28 -9
- package/dist/runtime/types.js.map +1 -1
- package/dist/runtime/worker-client.js +2 -0
- package/dist/runtime/worker-client.js.map +1 -1
- package/dist/runtime/worker-server.js +105 -24
- package/dist/runtime/worker-server.js.map +1 -1
- package/dist/sdk/connected-types.d.ts +42 -0
- package/dist/sdk/connected-types.js +2 -0
- package/dist/sdk/connected-types.js.map +1 -0
- package/dist/sdk/connected.d.ts +3 -0
- package/dist/sdk/connected.js +232 -0
- package/dist/sdk/connected.js.map +1 -0
- package/dist/sdk/execution-definition.d.ts +3 -0
- package/dist/sdk/execution-definition.js +59 -0
- package/dist/sdk/execution-definition.js.map +1 -0
- package/dist/sdk/execution-driver.d.ts +6 -0
- package/dist/sdk/execution-driver.js +86 -0
- package/dist/sdk/execution-driver.js.map +1 -0
- package/dist/sdk/execution-observation.d.ts +3 -0
- package/dist/sdk/execution-observation.js +35 -0
- package/dist/sdk/execution-observation.js.map +1 -0
- package/dist/sdk/execution-options.d.ts +17 -0
- package/dist/sdk/execution-options.js +115 -0
- package/dist/sdk/execution-options.js.map +1 -0
- package/dist/sdk/execution-types.d.ts +72 -0
- package/dist/sdk/execution-types.js +2 -0
- package/dist/sdk/execution-types.js.map +1 -0
- package/dist/sdk/execution.d.ts +3 -0
- package/dist/sdk/execution.js +3 -0
- package/dist/sdk/execution.js.map +1 -0
- package/dist/sdk/hosted-error.d.ts +3 -0
- package/dist/sdk/hosted-error.js +14 -0
- package/dist/sdk/hosted-error.js.map +1 -0
- package/dist/sdk/hosted.d.ts +23 -0
- package/dist/sdk/hosted.js +204 -0
- package/dist/sdk/hosted.js.map +1 -0
- package/dist/sdk/runner.d.ts +5 -0
- package/dist/sdk/runner.js +107 -0
- package/dist/sdk/runner.js.map +1 -0
- package/dist/sdk/tools.js +4 -1
- package/dist/sdk/tools.js.map +1 -1
- package/package.json +3 -3
- package/sdk/access-config.md +2 -0
- package/sdk/adapter-contract.md +8 -0
- package/sdk/agent.md +1 -1
- package/sdk/approvals.md +2 -0
- package/sdk/completion-notifications.md +2 -0
- package/sdk/distribution.md +4 -2
- package/sdk/examples/chat-tool.ts +126 -0
- package/sdk/execution.md +743 -0
- package/sdk/index.md +45 -21
- package/sdk/message-delivery.md +2 -0
- package/sdk/permissions.md +2 -0
- package/sdk/plugins/sub-agents.md +4 -2
- package/sdk/project-team.md +23 -1
- package/sdk/sessions.md +2 -0
- package/sdk/tools.md +3 -1
- package/sdk/v1-runtime.md +7 -5
- package/dist/cli/catalog.d.ts +0 -26
- package/dist/cli/catalog.js +0 -41
- package/dist/cli/catalog.js.map +0 -1
|
@@ -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 @@
|
|
|
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 {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { parentPort } from "node:worker_threads";
|
|
2
|
+
import { createSdkMcpServer, query, resolveSettings, } from "@anthropic-ai/claude-agent-sdk";
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { ClaudeInput } from "./claude-input.js";
|
|
5
|
+
import { ClaudeRemoteProcess } from "./claude-worker-process.js";
|
|
6
|
+
if (!parentPort)
|
|
7
|
+
throw new Error("Claude worker requires a parent port.");
|
|
8
|
+
const port = parentPort;
|
|
9
|
+
let nextId = 1;
|
|
10
|
+
const pending = new Map();
|
|
11
|
+
const input = new ClaudeInput();
|
|
12
|
+
let native;
|
|
13
|
+
let processProxy;
|
|
14
|
+
function hostRequest(operation, value) {
|
|
15
|
+
const id = nextId++;
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
pending.set(id, { resolve, reject });
|
|
18
|
+
port.postMessage({ type: "host-request", id, operation, value });
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function serializableMetadata(value) {
|
|
22
|
+
const { signal: _signal, ...metadata } = value;
|
|
23
|
+
return metadata;
|
|
24
|
+
}
|
|
25
|
+
function abortableHostRequest(operation, value, signal) {
|
|
26
|
+
const id = nextId++;
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
pending.set(id, { resolve, reject });
|
|
29
|
+
port.postMessage({ type: "host-request", id, operation, value });
|
|
30
|
+
const abort = () => port.postMessage({ type: "event", event: "hostRequestAbort", value: id });
|
|
31
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
32
|
+
if (signal.aborted)
|
|
33
|
+
abort();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function mcpServer(namespace, tools) {
|
|
37
|
+
if (!tools.length)
|
|
38
|
+
return undefined;
|
|
39
|
+
// An explicit empty list enables the MCP tool capability before the worker
|
|
40
|
+
// installs descriptor-driven low-level handlers.
|
|
41
|
+
const server = createSdkMcpServer({ name: namespace, version: "1.0.0", tools: [] });
|
|
42
|
+
server.instance.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
43
|
+
server.instance.server.setRequestHandler(CallToolRequestSchema, async (request) => await hostRequest("toolCall", { name: request.params.name, input: request.params.arguments }));
|
|
44
|
+
return server;
|
|
45
|
+
}
|
|
46
|
+
async function start(value) {
|
|
47
|
+
const server = mcpServer(value.namespace, value.tools);
|
|
48
|
+
const options = value.options;
|
|
49
|
+
const canUseTool = async (toolName, toolInput, metadata) => await abortableHostRequest("approval", { toolName, toolInput, metadata: serializableMetadata(metadata) }, metadata.signal);
|
|
50
|
+
native = query({ prompt: input, options: {
|
|
51
|
+
...options,
|
|
52
|
+
...(server ? { mcpServers: { [value.namespace]: server } } : {}),
|
|
53
|
+
spawnClaudeCodeProcess(spawnOptions) {
|
|
54
|
+
processProxy = new ClaudeRemoteProcess(hostRequest, spawnOptions);
|
|
55
|
+
return processProxy;
|
|
56
|
+
},
|
|
57
|
+
canUseTool,
|
|
58
|
+
onElicitation: async (request, metadata) => await abortableHostRequest("elicitation", { request, metadata: serializableMetadata(metadata) }, metadata.signal),
|
|
59
|
+
stderr: () => { },
|
|
60
|
+
} });
|
|
61
|
+
void (async () => {
|
|
62
|
+
try {
|
|
63
|
+
for await (const message of native)
|
|
64
|
+
port.postMessage({ type: "event", event: "message", value: message });
|
|
65
|
+
port.postMessage({ type: "event", event: "end" });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
port.postMessage({ type: "event", event: "failure", value: "native stream" });
|
|
69
|
+
}
|
|
70
|
+
})();
|
|
71
|
+
}
|
|
72
|
+
async function perform(message) {
|
|
73
|
+
switch (message.operation) {
|
|
74
|
+
case "managedSettings": {
|
|
75
|
+
const settings = await resolveSettings({ cwd: String(message.value), settingSources: ["user", "project", "local"] });
|
|
76
|
+
return settings.sources.filter(source => source.source === "managed").map(source => source.settings);
|
|
77
|
+
}
|
|
78
|
+
case "start":
|
|
79
|
+
await start(message.value);
|
|
80
|
+
return undefined;
|
|
81
|
+
case "accountInfo": return await native.accountInfo();
|
|
82
|
+
case "supportedModels": return await native.supportedModels();
|
|
83
|
+
case "getSettings": return await native.getSettings?.();
|
|
84
|
+
case "setModel": return await native.setModel?.(message.value);
|
|
85
|
+
case "interrupt": return await native.interrupt();
|
|
86
|
+
default: throw new Error("Unknown Claude worker operation.");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
port.on("message", (message) => {
|
|
90
|
+
if (message.type === "host-response") {
|
|
91
|
+
const current = pending.get(message.id);
|
|
92
|
+
if (!current)
|
|
93
|
+
return;
|
|
94
|
+
pending.delete(message.id);
|
|
95
|
+
if (message.ok)
|
|
96
|
+
current.resolve(message.value);
|
|
97
|
+
else
|
|
98
|
+
current.reject(new Error("Claude host bridge failed."));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (message.type === "event") {
|
|
102
|
+
if (message.event === "input")
|
|
103
|
+
input.push(message.value);
|
|
104
|
+
else if (message.event === "inputEnd")
|
|
105
|
+
input.close();
|
|
106
|
+
else if (message.event === "close") {
|
|
107
|
+
input.close();
|
|
108
|
+
native?.close();
|
|
109
|
+
}
|
|
110
|
+
else if (message.event === "processExit") {
|
|
111
|
+
const value = message.value;
|
|
112
|
+
processProxy?.exited(value.code, value.signal);
|
|
113
|
+
}
|
|
114
|
+
else if (message.event === "processError")
|
|
115
|
+
processProxy?.failed();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (message.type !== "request")
|
|
119
|
+
return;
|
|
120
|
+
void perform(message).then(value => port.postMessage({ type: "response", id: message.id, ok: true, value }), error => {
|
|
121
|
+
const settingsUnavailable = message.operation === "getSettings" && error instanceof Error
|
|
122
|
+
&& /^(?:unknown|unsupported) control request(?: subtype)?:\s*get_settings\.?$/iu.test(error.message.trim());
|
|
123
|
+
port.postMessage({ type: "response", id: message.id, ok: false, ...(settingsUnavailable ? { failure: "settings-unavailable" } : {}) });
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=claude-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-worker.js","sourceRoot":"","sources":["../../src/adapters/claude-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport {\n createSdkMcpServer,\n query,\n resolveSettings,\n type CanUseTool,\n type Options,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ClaudeQuery } from \"./claude.ts\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { ClaudeInput } from \"./claude-input.ts\";\nimport { ClaudeRemoteProcess } from \"./claude-worker-process.ts\";\nimport type {\n ClaudeBridgeMessage,\n ClaudeToolDescriptor,\n ClaudeWorkerRequest,\n} from \"./claude-worker-protocol.ts\";\n\nif (!parentPort) throw new Error(\"Claude worker requires a parent port.\");\nconst port = parentPort;\nlet nextId = 1;\nconst pending = new Map<number, {resolve(value: unknown): void; reject(error: Error): void}>();\nconst input = new ClaudeInput<SDKUserMessage>();\nlet native: ClaudeQuery | undefined;\nlet processProxy: ClaudeRemoteProcess | undefined;\n\nfunction hostRequest(operation: string, value?: unknown): Promise<unknown> {\n const id = nextId++;\n return new Promise((resolve, reject) => {\n pending.set(id, {resolve, reject});\n port.postMessage({type:\"host-request\", id, operation, value} satisfies ClaudeBridgeMessage);\n });\n}\n\nfunction serializableMetadata(value: Record<string, unknown>): Record<string, unknown> {\n const {signal: _signal, ...metadata} = value;\n return metadata;\n}\n\nfunction abortableHostRequest(operation: string, value: unknown, signal: AbortSignal): Promise<unknown> {\n const id = nextId++;\n return new Promise((resolve, reject) => {\n pending.set(id, {resolve, reject});\n port.postMessage({type:\"host-request\", id, operation, value} satisfies ClaudeBridgeMessage);\n const abort = () => port.postMessage({type:\"event\", event:\"hostRequestAbort\", value:id} satisfies ClaudeBridgeMessage);\n signal.addEventListener(\"abort\", abort, {once:true});\n if (signal.aborted) abort();\n });\n}\n\nfunction mcpServer(namespace: string, tools: readonly ClaudeToolDescriptor[]) {\n if (!tools.length) return undefined;\n // An explicit empty list enables the MCP tool capability before the worker\n // installs descriptor-driven low-level handlers.\n const server = createSdkMcpServer({name:namespace, version:\"1.0.0\", tools:[]});\n server.instance.server.setRequestHandler(ListToolsRequestSchema, async () => ({tools}));\n server.instance.server.setRequestHandler(CallToolRequestSchema, async request =>\n await hostRequest(\"toolCall\", {name:request.params.name, input:request.params.arguments}) as any);\n return server;\n}\n\nasync function start(value: any): Promise<void> {\n const server = mcpServer(value.namespace, value.tools);\n const options = value.options as Options;\n const canUseTool: CanUseTool = async (toolName, toolInput, metadata) => await abortableHostRequest(\n \"approval\", {toolName, toolInput, metadata:serializableMetadata(metadata as unknown as Record<string, unknown>)}, metadata.signal,\n ) as Awaited<ReturnType<CanUseTool>>;\n native = query({prompt:input, options:{\n ...options,\n ...(server ? {mcpServers:{[value.namespace]:server}} : {}),\n spawnClaudeCodeProcess(spawnOptions) {\n processProxy = new ClaudeRemoteProcess(hostRequest, spawnOptions);\n return processProxy;\n },\n canUseTool,\n onElicitation: async (request, metadata) => await abortableHostRequest(\n \"elicitation\", {request, metadata:serializableMetadata(metadata as unknown as Record<string, unknown>)}, metadata.signal,\n ) as any,\n stderr: () => {},\n }}) as ClaudeQuery;\n void (async () => {\n try {\n for await (const message of native!) port.postMessage({type:\"event\",event:\"message\",value:message} satisfies ClaudeBridgeMessage);\n port.postMessage({type:\"event\",event:\"end\"} satisfies ClaudeBridgeMessage);\n } catch {\n port.postMessage({type:\"event\",event:\"failure\",value:\"native stream\"} satisfies ClaudeBridgeMessage);\n }\n })();\n}\n\nasync function perform(message: ClaudeWorkerRequest): Promise<unknown> {\n switch (message.operation) {\n case \"managedSettings\": {\n const settings = await resolveSettings({cwd:String(message.value), settingSources:[\"user\",\"project\",\"local\"]});\n return settings.sources.filter(source => source.source === \"managed\").map(source => source.settings);\n }\n case \"start\": await start(message.value); return undefined;\n case \"accountInfo\": return await native!.accountInfo();\n case \"supportedModels\": return await native!.supportedModels();\n case \"getSettings\": return await native!.getSettings?.();\n case \"setModel\": return await native!.setModel?.(message.value as string | undefined);\n case \"interrupt\": return await native!.interrupt();\n default: throw new Error(\"Unknown Claude worker operation.\");\n }\n}\n\nport.on(\"message\", (message: ClaudeBridgeMessage) => {\n if (message.type === \"host-response\") {\n const current = pending.get(message.id);\n if (!current) return;\n pending.delete(message.id);\n if (message.ok) current.resolve(message.value); else current.reject(new Error(\"Claude host bridge failed.\"));\n return;\n }\n if (message.type === \"event\") {\n if (message.event === \"input\") input.push(message.value as SDKUserMessage);\n else if (message.event === \"inputEnd\") input.close();\n else if (message.event === \"close\") { input.close(); native?.close(); }\n else if (message.event === \"processExit\") {\n const value = message.value as {code:number|null; signal:NodeJS.Signals|null};\n processProxy?.exited(value.code, value.signal);\n } else if (message.event === \"processError\") processProxy?.failed();\n return;\n }\n if (message.type !== \"request\") return;\n void perform(message).then(\n value => port.postMessage({type:\"response\",id:message.id,ok:true,value} satisfies ClaudeBridgeMessage),\n error => {\n const settingsUnavailable = message.operation === \"getSettings\" && error instanceof Error\n && /^(?:unknown|unsupported) control request(?: subtype)?:\\s*get_settings\\.?$/iu.test(error.message.trim());\n port.postMessage({type:\"response\",id:message.id,ok:false,...(settingsUnavailable ? {failure:\"settings-unavailable\" as const} : {})} satisfies ClaudeBridgeMessage);\n },\n );\n});\n"]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AccountInfo, Options, SDKMessage, SDKUserMessage, Settings, ModelInfo } from "@anthropic-ai/claude-agent-sdk";
|
|
2
2
|
import type { AdapterOptions, NativeSession } from "./types.js";
|
|
3
|
-
|
|
3
|
+
import { claudeTools } from "./claude-tools.js";
|
|
4
|
+
import { ClaudeProcessOwner } from "./claude-process.js";
|
|
5
|
+
import type { ClaudeWorkerFactory } from "./claude-worker-protocol.js";
|
|
6
|
+
export interface ClaudeQuery extends AsyncIterable<SDKMessage> {
|
|
4
7
|
accountInfo(): Promise<AccountInfo>;
|
|
5
8
|
supportedModels(): Promise<ModelInfo[]>;
|
|
6
9
|
interrupt(): Promise<unknown>;
|
|
@@ -8,15 +11,22 @@ interface ClaudeQuery extends AsyncIterable<SDKMessage> {
|
|
|
8
11
|
getSettings?(): Promise<unknown>;
|
|
9
12
|
setModel?(model?: string): Promise<void>;
|
|
10
13
|
}
|
|
14
|
+
export interface ClaudeQueryBridge {
|
|
15
|
+
readonly tools: ReturnType<typeof claudeTools>;
|
|
16
|
+
readonly processOwner: ClaudeProcessOwner;
|
|
17
|
+
}
|
|
11
18
|
export interface ClaudeDependencies {
|
|
12
19
|
query(args: {
|
|
13
20
|
prompt: AsyncIterable<SDKUserMessage>;
|
|
14
21
|
options: Options;
|
|
15
|
-
}): ClaudeQuery
|
|
22
|
+
}, bridge: ClaudeQueryBridge): ClaudeQuery | Promise<ClaudeQuery>;
|
|
16
23
|
executable(env: NodeJS.ProcessEnv): Promise<string>;
|
|
17
24
|
managedSettings(cwd: string): Promise<Settings[]>;
|
|
25
|
+
dispose?(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export interface ClaudeOpenerOptions {
|
|
28
|
+
readonly createWorker?: ClaudeWorkerFactory;
|
|
18
29
|
}
|
|
19
30
|
export declare const openClaude: (options: AdapterOptions) => Promise<NativeSession>;
|
|
20
|
-
/** Dependency injection is internal and replaces only
|
|
21
|
-
export declare function createClaudeOpener(
|
|
22
|
-
export {};
|
|
31
|
+
/** Dependency injection is internal and replaces only private process boundaries in tests. */
|
|
32
|
+
export declare function createClaudeOpener(configuration?: ClaudeDependencies | ClaudeOpenerOptions): (options: AdapterOptions) => Promise<NativeSession>;
|