smol-symphony 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.
@@ -0,0 +1,439 @@
1
+ // JSON-RPC client for the Codex app-server protocol (SPEC §10).
2
+ //
3
+ // Transport: newline-delimited JSON over stdio. Each line is a JSON object that is either
4
+ // a request, a response, or a notification, as defined by the Codex protocol.
5
+ //
6
+ // This client takes a pre-existing stdio pair (e.g. the streams of a smolvm exec session)
7
+ // and drives the §10 lifecycle: initialize → thread/start → turn/start → process notifications
8
+ // until turn/completed. Approval requests are answered according to the documented high-trust
9
+ // posture (auto-approve). User-input-required, unsupported dynamic tools, and signal exits are
10
+ // surfaced as failures so a run never stalls (§10.5).
11
+ import { log } from '../logging.js';
12
+ export class CodexProtocolError extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = 'CodexProtocolError';
18
+ }
19
+ }
20
+ function nowIso() {
21
+ return new Date().toISOString();
22
+ }
23
+ function summarize(raw, max = 240) {
24
+ let s;
25
+ try {
26
+ s = typeof raw === 'string' ? raw : JSON.stringify(raw);
27
+ }
28
+ catch {
29
+ s = String(raw);
30
+ }
31
+ if (s.length > max)
32
+ s = s.slice(0, max) + '…';
33
+ return s;
34
+ }
35
+ // Extract absolute token totals from a `thread/tokenUsage/updated` notification.
36
+ //
37
+ // The current Codex protocol nests totals under `tokenUsage.total.{inputTokens, outputTokens,
38
+ // totalTokens}` (see ThreadTokenUsageUpdatedNotification schema). We deliberately prefer the
39
+ // `total` breakdown over `last` so accumulation matches §13.5: "prefer absolute thread totals".
40
+ // Older payload shapes (`total_token_usage`, flat `usage`) are accepted as a fallback.
41
+ function extractTokenTotals(params) {
42
+ if (!params || typeof params !== 'object' || Array.isArray(params))
43
+ return null;
44
+ const obj = params;
45
+ const candidates = [];
46
+ const tokenUsage = obj['tokenUsage'];
47
+ if (tokenUsage && typeof tokenUsage === 'object' && !Array.isArray(tokenUsage)) {
48
+ const totalBreakdown = tokenUsage['total'];
49
+ if (totalBreakdown && typeof totalBreakdown === 'object' && !Array.isArray(totalBreakdown)) {
50
+ candidates.push(totalBreakdown);
51
+ }
52
+ }
53
+ const totalTokenUsage = obj['total_token_usage'];
54
+ if (totalTokenUsage && typeof totalTokenUsage === 'object' && !Array.isArray(totalTokenUsage)) {
55
+ candidates.push(totalTokenUsage);
56
+ }
57
+ const usage = obj['usage'];
58
+ if (usage && typeof usage === 'object' && !Array.isArray(usage)) {
59
+ candidates.push(usage);
60
+ }
61
+ candidates.push(obj);
62
+ for (const c of candidates) {
63
+ const inRaw = c['input_tokens'] ?? c['inputTokens'];
64
+ const outRaw = c['output_tokens'] ?? c['outputTokens'];
65
+ const totRaw = c['total_tokens'] ?? c['totalTokens'];
66
+ if (inRaw === undefined && outRaw === undefined && totRaw === undefined)
67
+ continue;
68
+ const inN = Number(inRaw ?? 0);
69
+ const outN = Number(outRaw ?? 0);
70
+ const totN = Number(totRaw ?? inN + outN);
71
+ if (Number.isFinite(totN)) {
72
+ return { input: inN, output: outN, total: totN };
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ export class CodexClient {
78
+ opts;
79
+ nextId = 1;
80
+ pending = new Map();
81
+ notificationHandlers = new Map();
82
+ serverRequestHandlers = new Map();
83
+ buffer = '';
84
+ closed = false;
85
+ threadId = null;
86
+ turnWaiter = null;
87
+ turnTimer = null;
88
+ currentTurnId = null;
89
+ constructor(opts) {
90
+ this.opts = opts;
91
+ this.opts.stdout.setEncoding('utf8');
92
+ this.opts.stdout.on('data', (chunk) => this.onData(chunk));
93
+ this.opts.stdout.on('close', () => this.handleTransportClose('stdout_closed'));
94
+ this.opts.stdout.on('error', (e) => this.handleTransportClose(`stdout_error:${e.message}`));
95
+ this.opts.stdin.on('error', () => {
96
+ /* ignore: pipe errors surface via close */
97
+ });
98
+ this.installDefaultHandlers();
99
+ }
100
+ onData(chunk) {
101
+ this.buffer += chunk;
102
+ let nl;
103
+ while ((nl = this.buffer.indexOf('\n')) >= 0) {
104
+ const line = this.buffer.slice(0, nl).trim();
105
+ this.buffer = this.buffer.slice(nl + 1);
106
+ if (line.length === 0)
107
+ continue;
108
+ let msg;
109
+ try {
110
+ msg = JSON.parse(line);
111
+ }
112
+ catch (err) {
113
+ this.emitRuntime('malformed', `cannot parse: ${err.message}: ${summarize(line)}`);
114
+ continue;
115
+ }
116
+ this.dispatch(msg);
117
+ }
118
+ }
119
+ dispatch(msg) {
120
+ // Response to one of our requests.
121
+ if (msg && 'id' in msg && msg.id !== undefined && (!('method' in msg) || msg.method === undefined)) {
122
+ const id = msg.id;
123
+ const pending = this.pending.get(id);
124
+ if (!pending) {
125
+ this.emitRuntime('other_message', `unmatched response id=${id}`);
126
+ return;
127
+ }
128
+ this.pending.delete(id);
129
+ clearTimeout(pending.timer);
130
+ const asResp = msg;
131
+ if (asResp.error) {
132
+ pending.reject(new CodexProtocolError('response_error', asResp.error.message));
133
+ }
134
+ else {
135
+ pending.resolve((asResp.result ?? null));
136
+ }
137
+ return;
138
+ }
139
+ // Server request — needs response (e.g. approvals, dynamic tools).
140
+ if (msg && 'method' in msg && 'id' in msg && msg.id !== undefined) {
141
+ const method = msg.method;
142
+ const params = (msg.params ?? null);
143
+ const handler = this.serverRequestHandlers.get(method);
144
+ void this.respondToServerRequest(msg.id, method, params, handler);
145
+ return;
146
+ }
147
+ // Notification.
148
+ if (msg && 'method' in msg && msg.method) {
149
+ const method = msg.method;
150
+ const params = (msg.params ?? null);
151
+ const handler = this.notificationHandlers.get(method);
152
+ if (handler)
153
+ handler(params);
154
+ else
155
+ this.emitRuntime('notification', `${method} ${summarize(params)}`);
156
+ return;
157
+ }
158
+ this.emitRuntime('other_message', summarize(msg));
159
+ }
160
+ async respondToServerRequest(id, method, params, handler) {
161
+ try {
162
+ let result;
163
+ if (handler) {
164
+ result = await handler(params);
165
+ }
166
+ else {
167
+ // Unsupported server request: respond with structured error so the session doesn't
168
+ // stall (§10.5 — unsupported dynamic tool calls).
169
+ result = { error: { code: 'unsupported', message: `unsupported method ${method}` } };
170
+ this.emitRuntime('unsupported_tool_call', `${method} ${summarize(params)}`);
171
+ }
172
+ this.writeMessage({ jsonrpc: '2.0', id, result });
173
+ }
174
+ catch (err) {
175
+ this.writeMessage({
176
+ jsonrpc: '2.0',
177
+ id,
178
+ error: { code: -32000, message: err.message },
179
+ });
180
+ }
181
+ }
182
+ installDefaultHandlers() {
183
+ // Approvals — auto-approve under the documented high-trust posture.
184
+ //
185
+ // Method names and decision values come from the Codex v2 protocol:
186
+ // - item/commandExecution/requestApproval → CommandExecutionApprovalDecision
187
+ // - item/fileChange/requestApproval → FileChangeApprovalDecision
188
+ // - item/permissions/requestApproval → PermissionsRequestApprovalDecision
189
+ // All three accept "acceptForSession" so future prompts for the same scope auto-pass.
190
+ const autoApproveSession = async (params) => {
191
+ this.emitRuntime('approval_auto_approved', summarize(params));
192
+ return { decision: 'acceptForSession' };
193
+ };
194
+ this.serverRequestHandlers.set('item/commandExecution/requestApproval', autoApproveSession);
195
+ this.serverRequestHandlers.set('item/fileChange/requestApproval', autoApproveSession);
196
+ this.serverRequestHandlers.set('item/permissions/requestApproval', autoApproveSession);
197
+ // Legacy v1 request names retained for transitional compatibility.
198
+ this.serverRequestHandlers.set('execCommandApproval', autoApproveSession);
199
+ this.serverRequestHandlers.set('applyPatchApproval', autoApproveSession);
200
+ this.serverRequestHandlers.set('fileChangeRequestApproval', autoApproveSession);
201
+ this.serverRequestHandlers.set('commandExecutionRequestApproval', autoApproveSession);
202
+ this.serverRequestHandlers.set('permissionsRequestApproval', autoApproveSession);
203
+ this.serverRequestHandlers.set('mcpServer/elicitation/request', autoApproveSession);
204
+ // User-input requests fail the run instead of stalling (§10.5).
205
+ this.serverRequestHandlers.set('item/tool/requestUserInput', async (params) => {
206
+ this.emitRuntime('turn_input_required', summarize(params));
207
+ this.completeTurn({
208
+ turnId: this.currentTurnId ?? '',
209
+ reason: 'turn_input_required',
210
+ message: summarize(params),
211
+ });
212
+ return { decision: 'reject', reason: 'user input not supported' };
213
+ });
214
+ // Dynamic tool calls — reject unsupported tools without stalling (§10.5).
215
+ this.serverRequestHandlers.set('item/tool/call', async (params) => {
216
+ const supported = new Set(this.opts.supportedTools ?? []);
217
+ const toolName = params && typeof params === 'object' && !Array.isArray(params)
218
+ ? params['name']
219
+ : null;
220
+ if (typeof toolName === 'string' && supported.has(toolName)) {
221
+ // The runtime advertised it but has no in-process implementation yet — still fail
222
+ // gracefully rather than throw. Implementations override this handler to do real work.
223
+ return { isError: true, content: [{ type: 'text', text: `tool ${toolName} not implemented` }] };
224
+ }
225
+ this.emitRuntime('unsupported_tool_call', summarize(params));
226
+ return { isError: true, content: [{ type: 'text', text: `unsupported tool: ${toolName ?? '?'}` }] };
227
+ });
228
+ // Notifications — extract observability signal.
229
+ //
230
+ // Schema notes (Codex v2):
231
+ // thread/started.params = { thread: { id, ... } } — id nested under thread
232
+ // turn/started.params = { threadId, turn: { id, status, ... } }
233
+ // turn/completed.params = { threadId, turn: { id, status: "completed"|"failed"|... } }
234
+ // The turn/completed notification fires for every terminal status. We must look at
235
+ // turn.status to know whether the turn truly succeeded.
236
+ const idOfThread = (params) => {
237
+ if (params && typeof params === 'object' && !Array.isArray(params)) {
238
+ const thread = params['thread'];
239
+ if (thread && typeof thread === 'object' && !Array.isArray(thread)) {
240
+ const id = thread['id'];
241
+ if (typeof id === 'string')
242
+ return id;
243
+ }
244
+ }
245
+ return null;
246
+ };
247
+ const turnFromParams = (params) => {
248
+ if (params && typeof params === 'object' && !Array.isArray(params)) {
249
+ const turn = params['turn'];
250
+ if (turn && typeof turn === 'object' && !Array.isArray(turn)) {
251
+ return turn;
252
+ }
253
+ }
254
+ return null;
255
+ };
256
+ this.notificationHandlers.set('thread/started', (params) => {
257
+ const tid = idOfThread(params);
258
+ if (tid)
259
+ this.threadId = tid;
260
+ this.emitRuntime('session_started', summarize(params));
261
+ });
262
+ this.notificationHandlers.set('turn/started', (params) => {
263
+ const turn = turnFromParams(params);
264
+ const tid = turn ? turn['id'] : null;
265
+ if (typeof tid === 'string')
266
+ this.currentTurnId = tid;
267
+ this.emitRuntime('turn_started', summarize(params));
268
+ });
269
+ this.notificationHandlers.set('turn/completed', (params) => {
270
+ const turn = turnFromParams(params);
271
+ const status = typeof turn?.['status'] === 'string' ? turn['status'] : 'completed';
272
+ const turnId = typeof turn?.['id'] === 'string' ? turn['id'] : this.currentTurnId ?? '';
273
+ if (status === 'completed') {
274
+ this.emitRuntime('turn_completed', summarize(params));
275
+ this.completeTurn({ turnId, reason: 'turn_completed', message: summarize(params) });
276
+ }
277
+ else if (status === 'interrupted') {
278
+ this.emitRuntime('turn_cancelled', summarize(params));
279
+ this.completeTurn({ turnId, reason: 'turn_cancelled', message: summarize(params) });
280
+ }
281
+ else {
282
+ // failed or any other non-completed terminal status
283
+ this.emitRuntime('turn_failed', summarize(params));
284
+ this.completeTurn({ turnId, reason: 'turn_failed', message: summarize(params) });
285
+ }
286
+ });
287
+ this.notificationHandlers.set('thread/tokenUsage/updated', (params) => {
288
+ const totals = extractTokenTotals(params);
289
+ if (totals) {
290
+ this.opts.onTokenUsage({
291
+ input_tokens: totals.input,
292
+ output_tokens: totals.output,
293
+ total_tokens: totals.total,
294
+ });
295
+ }
296
+ this.emitRuntime('thread_tokenUsage_updated', summarize(params));
297
+ });
298
+ this.notificationHandlers.set('account/rateLimits/updated', (params) => {
299
+ this.opts.onRateLimits(params);
300
+ this.emitRuntime('account_rateLimits_updated', summarize(params));
301
+ });
302
+ this.notificationHandlers.set('error', (params) => {
303
+ this.emitRuntime('error_notification', summarize(params));
304
+ });
305
+ }
306
+ handleTransportClose(reason) {
307
+ if (this.closed)
308
+ return;
309
+ this.closed = true;
310
+ const err = new CodexProtocolError('port_exit', reason);
311
+ for (const [, p] of this.pending) {
312
+ clearTimeout(p.timer);
313
+ p.reject(err);
314
+ }
315
+ this.pending.clear();
316
+ if (this.turnWaiter) {
317
+ const w = this.turnWaiter;
318
+ this.turnWaiter = null;
319
+ if (this.turnTimer) {
320
+ clearTimeout(this.turnTimer);
321
+ this.turnTimer = null;
322
+ }
323
+ w.resolve({
324
+ turnId: this.currentTurnId ?? '',
325
+ reason: 'subprocess_exit',
326
+ message: reason,
327
+ });
328
+ }
329
+ }
330
+ emitRuntime(event, message, raw) {
331
+ this.opts.onEvent({ at: nowIso(), event, message }, raw);
332
+ }
333
+ writeMessage(msg) {
334
+ if (this.closed)
335
+ return;
336
+ try {
337
+ this.opts.stdin.write(JSON.stringify(msg) + '\n');
338
+ }
339
+ catch (err) {
340
+ log.warn('codex write failed', { error: err.message });
341
+ }
342
+ }
343
+ async request(method, params) {
344
+ const id = this.nextId++;
345
+ const promise = new Promise((resolve, reject) => {
346
+ const timer = setTimeout(() => {
347
+ if (this.pending.has(id)) {
348
+ this.pending.delete(id);
349
+ reject(new CodexProtocolError('response_timeout', `request ${method} timed out`));
350
+ }
351
+ }, this.opts.readTimeoutMs);
352
+ this.pending.set(id, { resolve, reject, timer });
353
+ });
354
+ this.writeMessage({ jsonrpc: '2.0', id, method, params });
355
+ return (await promise);
356
+ }
357
+ async initialize(params) {
358
+ return this.request('initialize', params);
359
+ }
360
+ async startThread(params) {
361
+ const result = await this.request('thread/start', params);
362
+ // Codex v2 ThreadStartResponse nests the id under `thread.id`.
363
+ if (result && typeof result === 'object' && !Array.isArray(result)) {
364
+ const thread = result['thread'];
365
+ if (thread && typeof thread === 'object' && !Array.isArray(thread)) {
366
+ const id = thread['id'];
367
+ if (typeof id === 'string') {
368
+ this.threadId = id;
369
+ return id;
370
+ }
371
+ }
372
+ // Legacy v1 shape: `{ threadId: "..." }`
373
+ const legacy = result['threadId'];
374
+ if (typeof legacy === 'string') {
375
+ this.threadId = legacy;
376
+ return legacy;
377
+ }
378
+ }
379
+ throw new CodexProtocolError('response_error', 'thread/start did not return a thread id');
380
+ }
381
+ // Send turn/start and resolve when one of the turn-terminating notifications fires (or the
382
+ // subprocess exits, or the turn timeout elapses).
383
+ async runTurn(params) {
384
+ if (this.turnWaiter) {
385
+ throw new CodexProtocolError('turn_in_progress', 'another turn is already in flight');
386
+ }
387
+ const result = new Promise((resolve, reject) => {
388
+ this.turnWaiter = { resolve, reject };
389
+ this.turnTimer = setTimeout(() => {
390
+ if (this.turnWaiter) {
391
+ const w = this.turnWaiter;
392
+ this.turnWaiter = null;
393
+ w.resolve({
394
+ turnId: this.currentTurnId ?? '',
395
+ reason: 'turn_timeout',
396
+ message: `turn exceeded ${this.opts.turnTimeoutMs}ms`,
397
+ });
398
+ }
399
+ }, this.opts.turnTimeoutMs);
400
+ });
401
+ // Fire-and-forget: server will signal completion via a notification.
402
+ try {
403
+ await this.request('turn/start', params);
404
+ }
405
+ catch (err) {
406
+ this.completeTurn({
407
+ turnId: this.currentTurnId ?? '',
408
+ reason: 'turn_failed',
409
+ message: err.message,
410
+ });
411
+ }
412
+ return result;
413
+ }
414
+ completeTurn(r) {
415
+ if (!this.turnWaiter)
416
+ return;
417
+ const w = this.turnWaiter;
418
+ this.turnWaiter = null;
419
+ if (this.turnTimer) {
420
+ clearTimeout(this.turnTimer);
421
+ this.turnTimer = null;
422
+ }
423
+ w.resolve(r);
424
+ }
425
+ async interrupt() {
426
+ if (!this.threadId)
427
+ return;
428
+ try {
429
+ await this.request('turn/interrupt', { threadId: this.threadId });
430
+ }
431
+ catch (err) {
432
+ log.debug('turn/interrupt failed', { error: err.message });
433
+ }
434
+ }
435
+ get currentThreadId() {
436
+ return this.threadId;
437
+ }
438
+ }
439
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agent/codex.ts"],"names":[],"mappings":"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"}