@voxagent/bridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/audio/source.d.ts +23 -0
- package/dist/audio/source.d.ts.map +1 -0
- package/dist/audio/source.js +69 -0
- package/dist/audio/source.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +171 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +62 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/drivers/claude.d.ts +36 -0
- package/dist/drivers/claude.d.ts.map +1 -0
- package/dist/drivers/claude.js +445 -0
- package/dist/drivers/claude.js.map +1 -0
- package/dist/drivers/codex.d.ts +56 -0
- package/dist/drivers/codex.d.ts.map +1 -0
- package/dist/drivers/codex.js +652 -0
- package/dist/drivers/codex.js.map +1 -0
- package/dist/drivers/index.d.ts +34 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +18 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/types.d.ts +81 -0
- package/dist/drivers/types.d.ts.map +1 -0
- package/dist/drivers/types.js +11 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +36 -0
- package/dist/logging.js.map +1 -0
- package/dist/pair.d.ts +25 -0
- package/dist/pair.d.ts.map +1 -0
- package/dist/pair.js +41 -0
- package/dist/pair.js.map +1 -0
- package/dist/permissions.d.ts +67 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +221 -0
- package/dist/permissions.js.map +1 -0
- package/dist/protocol.d.ts +181 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +63 -0
- package/dist/protocol.js.map +1 -0
- package/dist/room.d.ts +52 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +401 -0
- package/dist/room.js.map +1 -0
- package/dist/tts/elevenlabs.d.ts +43 -0
- package/dist/tts/elevenlabs.d.ts.map +1 -0
- package/dist/tts/elevenlabs.js +268 -0
- package/dist/tts/elevenlabs.js.map +1 -0
- package/dist/tts/index.d.ts +22 -0
- package/dist/tts/index.d.ts.map +1 -0
- package/dist/tts/index.js +23 -0
- package/dist/tts/index.js.map +1 -0
- package/dist/tts/openai.d.ts +35 -0
- package/dist/tts/openai.d.ts.map +1 -0
- package/dist/tts/openai.js +270 -0
- package/dist/tts/openai.js.map +1 -0
- package/dist/tts/types.d.ts +28 -0
- package/dist/tts/types.d.ts.map +1 -0
- package/dist/tts/types.js +5 -0
- package/dist/tts/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Claude Code driver — drives `@anthropic-ai/claude-agent-sdk`.
|
|
3
|
+
*
|
|
4
|
+
* Translates the SDK's `SDKMessage` and `SDKStreamEvent` outputs into our
|
|
5
|
+
* normalized `DriverEvent` stream.
|
|
6
|
+
*
|
|
7
|
+
* Streaming details (per SDK reference):
|
|
8
|
+
* - With `includePartialMessages: true`, every Anthropic API event is
|
|
9
|
+
* emitted as a `stream_event` SDKMessage.
|
|
10
|
+
* - Text deltas: `content_block_delta` with `delta.type === 'text_delta'`.
|
|
11
|
+
* - Tool start: `content_block_start` where `content_block.type === 'tool_use'`.
|
|
12
|
+
* - Tool input streaming: `content_block_delta` with `input_json_delta`.
|
|
13
|
+
* - Tool end: `content_block_stop`.
|
|
14
|
+
* - Tool results / progress: surface via `user` messages with tool_result
|
|
15
|
+
* blocks (post-execution); we use these to flag success/error + payload.
|
|
16
|
+
* - Run end: `result` SDKMessage; subtype `success` / `error_*` / `interrupted`.
|
|
17
|
+
*/
|
|
18
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
19
|
+
import { homedir } from 'node:os';
|
|
20
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { randomUUID } from 'node:crypto';
|
|
23
|
+
import { log } from '../logging.js';
|
|
24
|
+
const BRIDGE_VERSION = '0.1.0';
|
|
25
|
+
export class ClaudeDriver {
|
|
26
|
+
options;
|
|
27
|
+
backend = 'claude';
|
|
28
|
+
/** Most recent Claude Code session ID, used to keep room context across turns. */
|
|
29
|
+
sessionId = null;
|
|
30
|
+
/** Currently active query handle, used for `interrupt()`. */
|
|
31
|
+
activeQuery = null;
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
}
|
|
35
|
+
async capabilities(cwd) {
|
|
36
|
+
const [skills, plugins, mcpServers] = await Promise.all([
|
|
37
|
+
this.discoverSkills(cwd),
|
|
38
|
+
this.discoverPlugins(),
|
|
39
|
+
this.discoverMcpServers(),
|
|
40
|
+
]);
|
|
41
|
+
return {
|
|
42
|
+
backend: 'claude',
|
|
43
|
+
skills,
|
|
44
|
+
plugins,
|
|
45
|
+
mcpServers,
|
|
46
|
+
cwd,
|
|
47
|
+
bridgeVersion: BRIDGE_VERSION,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async *run(input, signal) {
|
|
51
|
+
const runId = randomUUID();
|
|
52
|
+
const startedAtMs = Date.now();
|
|
53
|
+
yield { type: 'run_start', runId, startedAtMs };
|
|
54
|
+
const openTools = new Map();
|
|
55
|
+
let finalText = '';
|
|
56
|
+
let runEnded = false;
|
|
57
|
+
// Permission strategy:
|
|
58
|
+
// - fullAccess=true → bypassPermissions, no broker is consulted.
|
|
59
|
+
// - fullAccess=false + a resolver → permissionMode 'default' so every
|
|
60
|
+
// tool call routes through canUseTool, where the resolver auto-allows
|
|
61
|
+
// reads + writes inside the workspace and asks the room for the rest.
|
|
62
|
+
// - fullAccess=false without a resolver → fall back to acceptEdits
|
|
63
|
+
// (legacy behavior for callers that haven't wired the broker yet).
|
|
64
|
+
const resolver = this.options.permissionResolver;
|
|
65
|
+
const useBroker = !this.options.fullAccess && Boolean(resolver);
|
|
66
|
+
const queryOptions = {
|
|
67
|
+
includePartialMessages: true,
|
|
68
|
+
cwd: input.cwd,
|
|
69
|
+
permissionMode: this.options.fullAccess
|
|
70
|
+
? 'bypassPermissions'
|
|
71
|
+
: useBroker
|
|
72
|
+
? 'default'
|
|
73
|
+
: 'acceptEdits',
|
|
74
|
+
settingSources: ['user', 'project'],
|
|
75
|
+
...(this.options.model ? { model: this.options.model } : {}),
|
|
76
|
+
...(this.sessionId ? { resume: this.sessionId } : {}),
|
|
77
|
+
...(input.systemPromptAddendum
|
|
78
|
+
? { systemPrompt: { type: 'preset', preset: 'claude_code', append: input.systemPromptAddendum } }
|
|
79
|
+
: {}),
|
|
80
|
+
...(useBroker && resolver
|
|
81
|
+
? {
|
|
82
|
+
canUseTool: async (toolName, toolInput) => {
|
|
83
|
+
const result = await resolver.decide({
|
|
84
|
+
runId,
|
|
85
|
+
toolName,
|
|
86
|
+
toolInput,
|
|
87
|
+
});
|
|
88
|
+
if (result.decision === 'allow') {
|
|
89
|
+
return { behavior: 'allow', updatedInput: toolInput };
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
behavior: 'deny',
|
|
93
|
+
message: result.message ?? 'Denied by host.',
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
};
|
|
99
|
+
let iter;
|
|
100
|
+
try {
|
|
101
|
+
iter = query({
|
|
102
|
+
prompt: input.prompt,
|
|
103
|
+
options: queryOptions,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
yield {
|
|
108
|
+
type: 'run_end',
|
|
109
|
+
runId,
|
|
110
|
+
reason: 'error',
|
|
111
|
+
message: error instanceof Error ? error.message : String(error),
|
|
112
|
+
totalLatencyMs: Date.now() - startedAtMs,
|
|
113
|
+
};
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.activeQuery = iter;
|
|
117
|
+
const onAbort = () => {
|
|
118
|
+
iter.interrupt().catch((error) => {
|
|
119
|
+
log.warn('claude_query_interrupt_failed', {
|
|
120
|
+
message: error instanceof Error ? error.message : String(error),
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
if (signal.aborted)
|
|
125
|
+
onAbort();
|
|
126
|
+
else
|
|
127
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
128
|
+
try {
|
|
129
|
+
for await (const message of iter) {
|
|
130
|
+
if (message.type === 'system' && message.subtype === 'init') {
|
|
131
|
+
this.sessionId = message.session_id ?? this.sessionId;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (message.type === 'stream_event') {
|
|
135
|
+
const events = handleStreamEvent(message, runId, openTools);
|
|
136
|
+
for (const event of events)
|
|
137
|
+
yield event;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (message.type === 'assistant') {
|
|
141
|
+
// Bundled assistant message arrives at end of turn even when streaming.
|
|
142
|
+
// Capture final text for the text_done event.
|
|
143
|
+
const text = extractAssistantText(message);
|
|
144
|
+
if (text)
|
|
145
|
+
finalText = text;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (message.type === 'user') {
|
|
149
|
+
// Tool results arrive as user messages with tool_result blocks.
|
|
150
|
+
const toolResults = extractToolResults(message);
|
|
151
|
+
for (const result of toolResults) {
|
|
152
|
+
// Find an open tool by matching tool_use_id (fallback: most-recent open).
|
|
153
|
+
const matchedKey = findOpenToolKey(openTools, result.toolUseId);
|
|
154
|
+
const open = matchedKey !== null ? openTools.get(matchedKey) : null;
|
|
155
|
+
const latencyMs = open ? Date.now() - open.startedAtMs : undefined;
|
|
156
|
+
yield {
|
|
157
|
+
type: 'tool_use_end',
|
|
158
|
+
runId,
|
|
159
|
+
toolUseId: result.toolUseId,
|
|
160
|
+
status: result.isError ? 'error' : 'success',
|
|
161
|
+
output: result.content,
|
|
162
|
+
...(latencyMs !== undefined ? { latencyMs } : {}),
|
|
163
|
+
};
|
|
164
|
+
if (matchedKey !== null)
|
|
165
|
+
openTools.delete(matchedKey);
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (message.type === 'result') {
|
|
170
|
+
const reason = undefined;
|
|
171
|
+
let resultReason = 'completed';
|
|
172
|
+
let resultMessage;
|
|
173
|
+
if (message.subtype === 'success') {
|
|
174
|
+
resultReason = 'completed';
|
|
175
|
+
if (message.result)
|
|
176
|
+
finalText = message.result;
|
|
177
|
+
}
|
|
178
|
+
else if (message.subtype === 'error_max_turns') {
|
|
179
|
+
resultReason = 'error';
|
|
180
|
+
resultMessage = 'Max turns reached.';
|
|
181
|
+
}
|
|
182
|
+
else if (message.subtype === 'error_during_execution') {
|
|
183
|
+
resultReason = 'error';
|
|
184
|
+
resultMessage = 'Error during execution.';
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
resultReason = signal.aborted ? 'interrupted' : 'error';
|
|
188
|
+
}
|
|
189
|
+
this.sessionId = message.session_id ?? this.sessionId;
|
|
190
|
+
// Emit text_done before run_end if we have buffered text.
|
|
191
|
+
if (finalText) {
|
|
192
|
+
yield { type: 'text_done', runId, text: finalText };
|
|
193
|
+
}
|
|
194
|
+
yield {
|
|
195
|
+
type: 'run_end',
|
|
196
|
+
runId,
|
|
197
|
+
reason: resultReason,
|
|
198
|
+
...(resultMessage ? { message: resultMessage } : {}),
|
|
199
|
+
totalLatencyMs: Date.now() - startedAtMs,
|
|
200
|
+
};
|
|
201
|
+
runEnded = true;
|
|
202
|
+
// Avoid unused tag.
|
|
203
|
+
void reason;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
210
|
+
if (signal.aborted) {
|
|
211
|
+
if (!runEnded) {
|
|
212
|
+
yield {
|
|
213
|
+
type: 'run_end',
|
|
214
|
+
runId,
|
|
215
|
+
reason: 'interrupted',
|
|
216
|
+
totalLatencyMs: Date.now() - startedAtMs,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
log.error('claude_driver_run_failed', { message });
|
|
222
|
+
if (!runEnded) {
|
|
223
|
+
yield {
|
|
224
|
+
type: 'run_end',
|
|
225
|
+
runId,
|
|
226
|
+
reason: 'error',
|
|
227
|
+
message,
|
|
228
|
+
totalLatencyMs: Date.now() - startedAtMs,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
signal.removeEventListener('abort', onAbort);
|
|
235
|
+
this.activeQuery = null;
|
|
236
|
+
}
|
|
237
|
+
if (!runEnded) {
|
|
238
|
+
// Defensive: ensure we always emit run_end even if the SDK exited without `result`.
|
|
239
|
+
if (finalText)
|
|
240
|
+
yield { type: 'text_done', runId, text: finalText };
|
|
241
|
+
yield {
|
|
242
|
+
type: 'run_end',
|
|
243
|
+
runId,
|
|
244
|
+
reason: signal.aborted ? 'interrupted' : 'completed',
|
|
245
|
+
totalLatencyMs: Date.now() - startedAtMs,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async close() {
|
|
250
|
+
if (this.activeQuery) {
|
|
251
|
+
try {
|
|
252
|
+
await this.activeQuery.interrupt();
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// best-effort
|
|
256
|
+
}
|
|
257
|
+
this.activeQuery = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async discoverSkills(cwd) {
|
|
261
|
+
const found = new Set();
|
|
262
|
+
const candidates = [
|
|
263
|
+
join(homedir(), '.claude', 'skills'),
|
|
264
|
+
join(cwd, '.claude', 'skills'),
|
|
265
|
+
];
|
|
266
|
+
for (const dir of candidates) {
|
|
267
|
+
try {
|
|
268
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
269
|
+
for (const entry of entries) {
|
|
270
|
+
if (!entry.isDirectory())
|
|
271
|
+
continue;
|
|
272
|
+
const skillDir = join(dir, entry.name);
|
|
273
|
+
// SKILL.md presence is the marker
|
|
274
|
+
try {
|
|
275
|
+
const skillFile = join(skillDir, 'SKILL.md');
|
|
276
|
+
const stats = await stat(skillFile);
|
|
277
|
+
if (stats.isFile())
|
|
278
|
+
found.add(entry.name);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// skip
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// skip missing dir
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return [...found].sort();
|
|
290
|
+
}
|
|
291
|
+
async discoverPlugins() {
|
|
292
|
+
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
293
|
+
try {
|
|
294
|
+
const text = await readFile(settingsPath, 'utf-8');
|
|
295
|
+
const parsed = JSON.parse(text);
|
|
296
|
+
if (Array.isArray(parsed.plugins)) {
|
|
297
|
+
return parsed.plugins.filter((value) => typeof value === 'string').sort();
|
|
298
|
+
}
|
|
299
|
+
if (parsed.plugins && typeof parsed.plugins === 'object') {
|
|
300
|
+
return Object.keys(parsed.plugins).sort();
|
|
301
|
+
}
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async discoverMcpServers() {
|
|
309
|
+
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
310
|
+
try {
|
|
311
|
+
const text = await readFile(settingsPath, 'utf-8');
|
|
312
|
+
const parsed = JSON.parse(text);
|
|
313
|
+
if (parsed.mcpServers && typeof parsed.mcpServers === 'object') {
|
|
314
|
+
return Object.keys(parsed.mcpServers).sort();
|
|
315
|
+
}
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
return [];
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function extractAssistantText(message) {
|
|
324
|
+
const blocks = message.message?.content;
|
|
325
|
+
if (!Array.isArray(blocks))
|
|
326
|
+
return '';
|
|
327
|
+
return blocks
|
|
328
|
+
.filter((block) => block.type === 'text' && typeof block.text === 'string')
|
|
329
|
+
.map((block) => block.text)
|
|
330
|
+
.join('');
|
|
331
|
+
}
|
|
332
|
+
function extractToolResults(message) {
|
|
333
|
+
const blocks = message.message?.content;
|
|
334
|
+
if (!Array.isArray(blocks))
|
|
335
|
+
return [];
|
|
336
|
+
return blocks
|
|
337
|
+
.filter((block) => block.type === 'tool_result' && typeof block.tool_use_id === 'string')
|
|
338
|
+
.map((block) => ({
|
|
339
|
+
toolUseId: block.tool_use_id,
|
|
340
|
+
isError: block.is_error === true,
|
|
341
|
+
content: block.content,
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
function findOpenToolKey(map, toolUseId) {
|
|
345
|
+
for (const [key, value] of map.entries()) {
|
|
346
|
+
if (value.toolUseId === toolUseId)
|
|
347
|
+
return key;
|
|
348
|
+
}
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
function handleStreamEvent(message, runId, openTools) {
|
|
352
|
+
const event = message.event;
|
|
353
|
+
if (!event || typeof event !== 'object')
|
|
354
|
+
return [];
|
|
355
|
+
const eventType = event.type;
|
|
356
|
+
if (eventType === 'content_block_start') {
|
|
357
|
+
const index = event.index ?? -1;
|
|
358
|
+
const block = event.content_block;
|
|
359
|
+
if (block && block.type === 'tool_use') {
|
|
360
|
+
const toolUseId = typeof block.id === 'string' && block.id.length > 0 ? block.id : `tool_${runId}_${index}`;
|
|
361
|
+
const name = typeof block.name === 'string' ? block.name : 'unknown';
|
|
362
|
+
const initialInput = block.input;
|
|
363
|
+
const hasInlineInput = initialInput !== undefined &&
|
|
364
|
+
initialInput !== null &&
|
|
365
|
+
!(typeof initialInput === 'object' && Object.keys(initialInput).length === 0);
|
|
366
|
+
const open = {
|
|
367
|
+
toolUseId,
|
|
368
|
+
name,
|
|
369
|
+
inputJsonBuffer: '',
|
|
370
|
+
// Set when we actually emit `tool_use_start` so the latency clock
|
|
371
|
+
// matches the visible "started at" timestamp in the UI. For the
|
|
372
|
+
// streaming-input path we set it later in `content_block_stop`.
|
|
373
|
+
startedAtMs: hasInlineInput ? Date.now() : 0,
|
|
374
|
+
startEmitted: hasInlineInput,
|
|
375
|
+
};
|
|
376
|
+
openTools.set(index, open);
|
|
377
|
+
// Common case: input streams in via input_json_delta — defer the start
|
|
378
|
+
// event until content_block_stop so it carries the parsed input.
|
|
379
|
+
if (!hasInlineInput)
|
|
380
|
+
return [];
|
|
381
|
+
return [
|
|
382
|
+
{
|
|
383
|
+
type: 'tool_use_start',
|
|
384
|
+
runId,
|
|
385
|
+
toolUseId,
|
|
386
|
+
name,
|
|
387
|
+
input: initialInput,
|
|
388
|
+
},
|
|
389
|
+
];
|
|
390
|
+
}
|
|
391
|
+
return [];
|
|
392
|
+
}
|
|
393
|
+
if (eventType === 'content_block_delta') {
|
|
394
|
+
const index = event.index ?? -1;
|
|
395
|
+
const delta = event.delta;
|
|
396
|
+
if (!delta || typeof delta !== 'object')
|
|
397
|
+
return [];
|
|
398
|
+
if (delta.type === 'text_delta' && typeof delta.text === 'string') {
|
|
399
|
+
return [{ type: 'text_delta', runId, delta: delta.text }];
|
|
400
|
+
}
|
|
401
|
+
if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {
|
|
402
|
+
return [{ type: 'thinking_delta', runId, delta: delta.thinking }];
|
|
403
|
+
}
|
|
404
|
+
if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {
|
|
405
|
+
const open = openTools.get(index);
|
|
406
|
+
if (open) {
|
|
407
|
+
open.inputJsonBuffer += delta.partial_json;
|
|
408
|
+
}
|
|
409
|
+
return [];
|
|
410
|
+
}
|
|
411
|
+
return [];
|
|
412
|
+
}
|
|
413
|
+
if (eventType === 'content_block_stop') {
|
|
414
|
+
const index = event.index ?? -1;
|
|
415
|
+
const open = openTools.get(index);
|
|
416
|
+
if (open && !open.startEmitted) {
|
|
417
|
+
// Streaming-input case: now that the content block is closed and we
|
|
418
|
+
// have the full input JSON, emit the deferred `tool_use_start` with
|
|
419
|
+
// the parsed payload so the UI shows the real input on first render.
|
|
420
|
+
let parsedInput = {};
|
|
421
|
+
try {
|
|
422
|
+
parsedInput =
|
|
423
|
+
open.inputJsonBuffer.length > 0 ? JSON.parse(open.inputJsonBuffer) : {};
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
parsedInput = { _raw: open.inputJsonBuffer };
|
|
427
|
+
}
|
|
428
|
+
open.startEmitted = true;
|
|
429
|
+
// Start the latency clock here — same instant the UI sees the tool begin.
|
|
430
|
+
open.startedAtMs = Date.now();
|
|
431
|
+
return [
|
|
432
|
+
{
|
|
433
|
+
type: 'tool_use_start',
|
|
434
|
+
runId,
|
|
435
|
+
toolUseId: open.toolUseId,
|
|
436
|
+
name: open.name,
|
|
437
|
+
input: parsedInput,
|
|
438
|
+
},
|
|
439
|
+
];
|
|
440
|
+
}
|
|
441
|
+
return [];
|
|
442
|
+
}
|
|
443
|
+
return [];
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/drivers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Codex driver — drives `codex app-server` over line-delimited JSON-RPC 2.0.
|
|
3
|
+
*
|
|
4
|
+
* Why app-server instead of `codex exec --json`:
|
|
5
|
+
* `exec --json` does not support pause/resume approvals — when an action
|
|
6
|
+
* would normally trigger a prompt, exec mode treats it as a hard failure.
|
|
7
|
+
* The app-server transport (`codex app-server`, default stdio) is a proper
|
|
8
|
+
* JSON-RPC 2.0 channel where Codex sends server-initiated approval
|
|
9
|
+
* requests (`item/commandExecution/requestApproval`,
|
|
10
|
+
* `item/fileChange/requestApproval`) that we respond to via the same
|
|
11
|
+
* JSON-RPC envelope. That lets us route approvals through the bridge's
|
|
12
|
+
* PermissionBroker to a meeting-side Allow / Deny modal.
|
|
13
|
+
*
|
|
14
|
+
* Lifecycle:
|
|
15
|
+
* - One long-lived `codex app-server` subprocess per CodexDriver instance.
|
|
16
|
+
* Spawned lazily on the first run() so capabilities() stays cheap.
|
|
17
|
+
* - `initialize` request once, `thread/start` on the first run, then
|
|
18
|
+
* `turn/start` for each subsequent run() call (threadId reused so Codex
|
|
19
|
+
* keeps conversation context across turns).
|
|
20
|
+
* - On run abort: `turn/interrupt` for the active turn.
|
|
21
|
+
* - On close(): SIGTERM the process and reject pending requests.
|
|
22
|
+
*
|
|
23
|
+
* The streaming JSON-RPC types and notification methods are taken from
|
|
24
|
+
* `codex app-server generate-ts` output (see /tmp/codex-protocol).
|
|
25
|
+
*/
|
|
26
|
+
import type { CapabilitiesInfo } from '../protocol.js';
|
|
27
|
+
import type { DriverOptions } from './index.js';
|
|
28
|
+
import type { AgentDriver, DriverEvent, DriverRunInput } from './types.js';
|
|
29
|
+
export declare class CodexDriver implements AgentDriver {
|
|
30
|
+
private readonly options;
|
|
31
|
+
readonly backend: "codex";
|
|
32
|
+
private proc;
|
|
33
|
+
private threadId;
|
|
34
|
+
private nextRequestId;
|
|
35
|
+
private pending;
|
|
36
|
+
private activeTurn;
|
|
37
|
+
private rxBuffer;
|
|
38
|
+
private serverStartFailed;
|
|
39
|
+
constructor(options?: DriverOptions);
|
|
40
|
+
capabilities(cwd: string): Promise<CapabilitiesInfo>;
|
|
41
|
+
run(input: DriverRunInput, signal: AbortSignal): AsyncIterable<DriverEvent>;
|
|
42
|
+
close(): Promise<void>;
|
|
43
|
+
private ensureServer;
|
|
44
|
+
private onStdout;
|
|
45
|
+
private dispatch;
|
|
46
|
+
private handleResponse;
|
|
47
|
+
private handleServerRequest;
|
|
48
|
+
private handleApproval;
|
|
49
|
+
private handleNotification;
|
|
50
|
+
private handleItemStarted;
|
|
51
|
+
private handleItemCompleted;
|
|
52
|
+
private sendRequest;
|
|
53
|
+
private sendResponse;
|
|
54
|
+
private discoverMcpServers;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/drivers/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyJ3E,qBAAa,WAAY,YAAW,WAAW;IAWjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,QAAQ,CAAC,OAAO,EAAG,OAAO,CAAU;IAEpC,OAAO,CAAC,IAAI,CAA+C;IAC3D,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAA0F;IACzG,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,iBAAiB,CAAS;gBAEL,OAAO,GAAE,aAAkB;IAElD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAYnD,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;IAiJ5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,YAAY;IA+C1B,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,mBAAmB;YAeb,cAAc;IA2B5B,OAAO,CAAC,kBAAkB;IAwG1B,OAAO,CAAC,iBAAiB;IAmDzB,OAAO,CAAC,mBAAmB;IAyE3B,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,YAAY;YAeN,kBAAkB;CAejC"}
|