takotrace 0.0.1

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 (60) hide show
  1. package/DEVELOPMENT.md +37 -0
  2. package/PRODUCT.md +33 -0
  3. package/README.md +69 -0
  4. package/README.zh-CN.md +69 -0
  5. package/TECHNICAL_DESIGN.md +46 -0
  6. package/assets/star-takotrace.gif +0 -0
  7. package/assets/takotrace-logo.png +0 -0
  8. package/dist/cli.d.ts +15 -0
  9. package/dist/cli.js +152 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/server/claude-client.d.ts +63 -0
  12. package/dist/server/claude-client.js +512 -0
  13. package/dist/server/claude-client.js.map +1 -0
  14. package/dist/server/codex-client.d.ts +57 -0
  15. package/dist/server/codex-client.js +414 -0
  16. package/dist/server/codex-client.js.map +1 -0
  17. package/dist/server/codex-command.d.ts +15 -0
  18. package/dist/server/codex-command.js +131 -0
  19. package/dist/server/codex-command.js.map +1 -0
  20. package/dist/server/http-server.d.ts +39 -0
  21. package/dist/server/http-server.js +429 -0
  22. package/dist/server/http-server.js.map +1 -0
  23. package/dist/server/index.d.ts +3 -0
  24. package/dist/server/index.js +4 -0
  25. package/dist/server/index.js.map +1 -0
  26. package/dist/server/multi-provider.d.ts +30 -0
  27. package/dist/server/multi-provider.js +178 -0
  28. package/dist/server/multi-provider.js.map +1 -0
  29. package/dist/server/native-path-opener.d.ts +7 -0
  30. package/dist/server/native-path-opener.js +45 -0
  31. package/dist/server/native-path-opener.js.map +1 -0
  32. package/dist/server/provider.d.ts +27 -0
  33. package/dist/server/provider.js +2 -0
  34. package/dist/server/provider.js.map +1 -0
  35. package/dist/server/rollout-reader.d.ts +9 -0
  36. package/dist/server/rollout-reader.js +333 -0
  37. package/dist/server/rollout-reader.js.map +1 -0
  38. package/dist/server/subagent-assignment.d.ts +9 -0
  39. package/dist/server/subagent-assignment.js +146 -0
  40. package/dist/server/subagent-assignment.js.map +1 -0
  41. package/dist/shared/jsonl.d.ts +6 -0
  42. package/dist/shared/jsonl.js +23 -0
  43. package/dist/shared/jsonl.js.map +1 -0
  44. package/dist/shared/store.d.ts +35 -0
  45. package/dist/shared/store.js +351 -0
  46. package/dist/shared/store.js.map +1 -0
  47. package/dist/shared/trace.d.ts +7 -0
  48. package/dist/shared/trace.js +256 -0
  49. package/dist/shared/trace.js.map +1 -0
  50. package/dist/shared/types.d.ts +144 -0
  51. package/dist/shared/types.js +2 -0
  52. package/dist/shared/types.js.map +1 -0
  53. package/dist/web/assets/SequenceDiagram-D2zGAyJN.js +8 -0
  54. package/dist/web/assets/favicon-16-DQXCs6B9.png +0 -0
  55. package/dist/web/assets/favicon-32-By9ik0BF.png +0 -0
  56. package/dist/web/assets/index-D6VA1lK-.css +1 -0
  57. package/dist/web/assets/index-vnUrUuB8.js +84 -0
  58. package/dist/web/assets/takotrace-logo-DtWm9Bax.png +0 -0
  59. package/dist/web/index.html +29 -0
  60. package/package.json +57 -0
@@ -0,0 +1,429 @@
1
+ import { createReadStream, existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
2
+ import { createServer } from 'node:http';
3
+ import { homedir } from 'node:os';
4
+ import { basename, extname, isAbsolute, join, normalize, resolve, sep } from 'node:path';
5
+ import { threadToHistory } from '../shared/trace.js';
6
+ import { publicHistoricalThread, sanitizeRaw, TraceStore } from '../shared/store.js';
7
+ import { openNativePath } from './native-path-opener.js';
8
+ import { resolveSubagentAssignment } from './subagent-assignment.js';
9
+ export class TakoTraceServer {
10
+ store;
11
+ client;
12
+ host;
13
+ port;
14
+ staticDir;
15
+ visualizationDir;
16
+ openPath;
17
+ server;
18
+ providerUnsubscribers = [];
19
+ constructor(client, options = {}) {
20
+ this.client = client;
21
+ this.host = options.host ?? '127.0.0.1';
22
+ this.port = options.port ?? 4317;
23
+ this.staticDir = resolve(options.staticDir ?? join(process.cwd(), 'dist/web'));
24
+ this.visualizationDir = resolve(options.visualizationDir ?? join(homedir(), '.codex/visualizations'));
25
+ this.openPath = options.openPath ?? openNativePath;
26
+ this.store = options.store ?? new TraceStore();
27
+ }
28
+ attachCodex(client) {
29
+ this.attachProvider(client);
30
+ }
31
+ attachProvider(provider) {
32
+ this.providerUnsubscribers.push(provider.onTrace((event) => this.store.add(event)), provider.onHistory((threads, replace, source) => this.store.synchronizeThreads(threads, replace, source)), provider.onError((error) => this.store.setConnection('error', { error: error.message })));
33
+ }
34
+ async listen() {
35
+ if (this.server)
36
+ return this.address();
37
+ this.server = createServer((request, response) => {
38
+ this.route(request, response).catch((error) => sendError(response, 500, error));
39
+ });
40
+ await new Promise((resolveListen, reject) => {
41
+ this.server.once('error', reject);
42
+ this.server.listen(this.port, this.host, () => {
43
+ this.server.off('error', reject);
44
+ resolveListen();
45
+ });
46
+ });
47
+ return this.address();
48
+ }
49
+ async close() {
50
+ for (const unsubscribe of this.providerUnsubscribers.splice(0))
51
+ unsubscribe();
52
+ if (!this.server)
53
+ return;
54
+ const server = this.server;
55
+ this.server = undefined;
56
+ await new Promise((resolveClose, reject) => server.close((error) => error ? reject(error) : resolveClose()));
57
+ }
58
+ address() {
59
+ const address = this.server?.address();
60
+ return { host: this.host, port: address?.port ?? this.port };
61
+ }
62
+ async route(request, response) {
63
+ const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);
64
+ const path = url.pathname;
65
+ if (request.method === 'GET' && path === '/healthz')
66
+ return sendJson(response, 200, { ok: true });
67
+ if (request.method === 'GET' && path === '/api/state')
68
+ return sendJson(response, 200, this.store.publicSnapshot());
69
+ if (request.method === 'GET' && path === '/api/events')
70
+ return this.serveEvents(request, response);
71
+ if ((request.method === 'GET' || request.method === 'HEAD') && path === '/api/visualization') {
72
+ return this.serveVisualization(url.searchParams.get('path'), request, response);
73
+ }
74
+ if ((request.method === 'GET' || request.method === 'HEAD') && path === '/api/source') {
75
+ return this.serveLocalFile(url.searchParams.get('ref'), request, response);
76
+ }
77
+ if (path === '/api/host.openPath') {
78
+ if (request.method !== 'POST')
79
+ return sendError(response, 405, new Error('Method not allowed'));
80
+ return this.openLocalPath(request, response);
81
+ }
82
+ const attachment = path.match(/^\/api\/attachments\/([^/]+)\/([^/]+)\/([^/]+)\/(\d+)$/);
83
+ if ((request.method === 'GET' || request.method === 'HEAD') && attachment) {
84
+ return this.serveAttachment(decodePathSegment(attachment[1]), decodePathSegment(attachment[2]), decodePathSegment(attachment[3]), Number(attachment[4]), request, response);
85
+ }
86
+ const subagentDetail = path.match(/^\/api\/subagents\/([^/]+)$/);
87
+ if (request.method === 'GET' && subagentDetail) {
88
+ return this.serveSubagentDetail(decodePathSegment(subagentDetail[1]), response);
89
+ }
90
+ if (request.method === 'POST' && path === '/api/threads') {
91
+ const body = await readJson(request);
92
+ return sendJson(response, 201, await this.client.startThread(body));
93
+ }
94
+ const resume = path.match(/^\/api\/threads\/([^/]+)\/resume$/);
95
+ if (request.method === 'POST' && resume) {
96
+ const body = await readJson(request);
97
+ return sendJson(response, 200, await this.client.resumeThread(decodeURIComponent(resume[1]), body));
98
+ }
99
+ const turns = path.match(/^\/api\/threads\/([^/]+)\/turns$/);
100
+ if (request.method === 'POST' && turns) {
101
+ const body = await readJson(request);
102
+ const text = body.text;
103
+ if (typeof text !== 'string' || !text.trim())
104
+ return sendError(response, 400, new Error('text must be a non-empty string'));
105
+ const { text: _text, ...params } = body;
106
+ return sendJson(response, 201, await this.client.startTurn(decodeURIComponent(turns[1]), text, params));
107
+ }
108
+ const turnDetail = path.match(/^\/api\/threads\/([^/]+)\/turns\/([^/]+)$/);
109
+ if (request.method === 'GET' && turnDetail) {
110
+ const threadId = decodePathSegment(turnDetail[1]);
111
+ const turnId = decodePathSegment(turnDetail[2]);
112
+ const turn = this.store.getTurn(threadId, turnId);
113
+ return turn ? sendJson(response, 200, { turn }) : sendError(response, 404, new Error('Run not found'));
114
+ }
115
+ const sync = path.match(/^\/api\/threads\/([^/]+)\/sync$/);
116
+ if (request.method === 'POST' && sync) {
117
+ if (!this.client.syncThread)
118
+ return sendError(response, 501, new Error('Session sync is unavailable'));
119
+ await this.client.syncThread(decodeURIComponent(sync[1]));
120
+ return sendJson(response, 200, { ok: true });
121
+ }
122
+ if (request.method === 'GET' || request.method === 'HEAD')
123
+ return this.serveStatic(path, request, response);
124
+ sendError(response, 404, new Error('Not found'));
125
+ }
126
+ async serveSubagentDetail(threadId, response) {
127
+ if (!this.client.readThread) {
128
+ return sendError(response, 501, new Error('Subagent session details are unavailable'));
129
+ }
130
+ let result;
131
+ try {
132
+ result = await this.client.readThread(threadId);
133
+ }
134
+ catch (error) {
135
+ const cause = error instanceof Error ? error : new Error(String(error));
136
+ const notFound = /not[ -]?found|unknown thread/i.test(cause.message);
137
+ const wrapped = Object.assign(new Error(notFound ? 'Subagent session not found' : `Unable to read subagent session: ${cause.message}`), { statusCode: notFound ? 404 : 502 });
138
+ return sendError(response, wrapped.statusCode, wrapped);
139
+ }
140
+ const rawThread = recordValue(result).thread;
141
+ const thread = threadToHistory(rawThread && typeof rawThread === 'object'
142
+ ? { ...recordValue(rawThread), turnsLoaded: true }
143
+ : rawThread);
144
+ if (!thread || thread.id !== threadId) {
145
+ return sendError(response, 404, new Error('Subagent session not found'));
146
+ }
147
+ let parentThread;
148
+ if (thread.parentThreadId) {
149
+ try {
150
+ parentThread = recordValue(await this.client.readThread(thread.parentThreadId)).thread;
151
+ }
152
+ catch {
153
+ // Assignment metadata is optional and must not make an otherwise readable child fail.
154
+ }
155
+ }
156
+ const assignment = resolveSubagentAssignment(threadId, rawThread, parentThread);
157
+ return sendJson(response, 200, {
158
+ thread: publicHistoricalThread(thread),
159
+ assignment: sanitizeRaw(assignment),
160
+ });
161
+ }
162
+ serveEvents(request, response) {
163
+ response.writeHead(200, {
164
+ 'Content-Type': 'text/event-stream',
165
+ 'Cache-Control': 'no-cache, no-transform',
166
+ Connection: 'keep-alive',
167
+ 'X-Accel-Buffering': 'no',
168
+ });
169
+ response.write(': connected\n\n');
170
+ const listener = (event) => {
171
+ const { raw: _raw, ...compact } = event;
172
+ response.write(`id: ${event.seq}\ndata: ${JSON.stringify(compact)}\n\n`);
173
+ };
174
+ const unsubscribe = this.store.subscribe(listener);
175
+ const unsubscribeState = this.store.subscribeState(() => response.write(`data: ${JSON.stringify({ kind: 'snapshot', state: this.store.publicSnapshot() })}\n\n`));
176
+ const heartbeat = setInterval(() => response.write(': heartbeat\n\n'), 15_000);
177
+ heartbeat.unref();
178
+ request.once('close', () => {
179
+ clearInterval(heartbeat);
180
+ unsubscribe();
181
+ unsubscribeState();
182
+ });
183
+ }
184
+ serveStatic(pathname, request, response) {
185
+ const relative = normalize(decodeURIComponent(pathname)).replace(/^([/\\])+/, '');
186
+ let file = resolve(this.staticDir, relative || 'index.html');
187
+ if (file !== this.staticDir && !file.startsWith(`${this.staticDir}${sep}`))
188
+ return sendError(response, 403, new Error('Forbidden'));
189
+ if (!existsSync(file) || statSync(file).isDirectory())
190
+ file = join(this.staticDir, 'index.html');
191
+ if (!existsSync(file) || !statSync(file).isFile())
192
+ return sendError(response, 404, new Error('Web assets not built'));
193
+ response.writeHead(200, { 'Content-Type': MIME_TYPES[extname(file)] ?? 'application/octet-stream' });
194
+ if (request.method === 'HEAD') {
195
+ response.end();
196
+ return;
197
+ }
198
+ createReadStream(file).pipe(response);
199
+ }
200
+ serveVisualization(pathname, request, response) {
201
+ if (!pathname)
202
+ return sendError(response, 400, new Error('Visualization path is required'));
203
+ if (!existsSync(this.visualizationDir))
204
+ return sendError(response, 404, new Error('Visualization not found'));
205
+ const root = realpathSync(this.visualizationDir);
206
+ const requested = resolve(pathname);
207
+ if (!existsSync(requested))
208
+ return sendError(response, 404, new Error('Visualization not found'));
209
+ const file = realpathSync(requested);
210
+ if (!file.startsWith(`${root}${sep}`) || !statSync(file).isFile())
211
+ return sendError(response, 403, new Error('Forbidden'));
212
+ const contentType = VISUALIZATION_MIME_TYPES[extname(file).toLowerCase()];
213
+ if (!contentType)
214
+ return sendError(response, 415, new Error('Unsupported visualization type'));
215
+ response.writeHead(200, { 'Content-Type': contentType, 'Cache-Control': 'private, max-age=60' });
216
+ if (request.method === 'HEAD') {
217
+ response.end();
218
+ return;
219
+ }
220
+ createReadStream(file).pipe(response);
221
+ }
222
+ serveAttachment(threadId, turnId, itemId, contentIndex, request, response) {
223
+ const event = this.store.getTurn(threadId, turnId)?.items.find((item) => item.itemId === itemId);
224
+ const raw = traceItemRaw(event?.raw);
225
+ const content = Array.isArray(raw.content) ? raw.content : [];
226
+ const attachment = recordValue(content[contentIndex]);
227
+ const pathname = (attachment.type === 'localImage' || attachment.type === 'local_image') && typeof attachment.path === 'string'
228
+ ? attachment.path
229
+ : undefined;
230
+ if (!pathname || !existsSync(pathname) || !statSync(pathname).isFile()) {
231
+ return sendError(response, 404, new Error('Attachment not found'));
232
+ }
233
+ const contentType = VISUALIZATION_MIME_TYPES[extname(pathname).toLowerCase()];
234
+ if (!contentType)
235
+ return sendError(response, 415, new Error('Unsupported attachment type'));
236
+ response.writeHead(200, { 'Content-Type': contentType, 'Cache-Control': 'private, max-age=60' });
237
+ if (request.method === 'HEAD') {
238
+ response.end();
239
+ return;
240
+ }
241
+ createReadStream(pathname).pipe(response);
242
+ }
243
+ serveLocalFile(encodedReference, request, response) {
244
+ if (!encodedReference || encodedReference.length > 16_384 || !/^(?:[0-9a-f]{2})+$/i.test(encodedReference)) {
245
+ return sendError(response, 400, new Error('Valid local file reference is required'));
246
+ }
247
+ const reference = Buffer.from(encodedReference, 'hex').toString('utf8');
248
+ const pathname = localFilePath(reference);
249
+ if (!existsSync(pathname))
250
+ return sendError(response, 404, new Error('Local file not found'));
251
+ const file = realpathSync(pathname);
252
+ if (!statSync(file).isFile())
253
+ return sendError(response, 403, new Error('Forbidden'));
254
+ const contentType = LOCAL_FILE_MIME_TYPES[extname(file).toLowerCase()];
255
+ if (!contentType)
256
+ return sendError(response, 415, new Error('Unsupported local file type'));
257
+ const isText = contentType.startsWith('text/plain');
258
+ const isHtml = contentType.startsWith('text/html');
259
+ response.writeHead(200, {
260
+ 'Content-Type': isText ? 'text/html; charset=utf-8' : contentType,
261
+ 'Content-Security-Policy': isHtml
262
+ ? "sandbox allow-scripts; default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; img-src data: blob:; font-src data:; frame-ancestors 'none'"
263
+ : "default-src 'none'; style-src 'unsafe-inline'; frame-ancestors 'none'",
264
+ 'X-Content-Type-Options': 'nosniff',
265
+ 'Cache-Control': 'private, max-age=60',
266
+ });
267
+ if (request.method === 'HEAD') {
268
+ response.end();
269
+ return;
270
+ }
271
+ if (isText) {
272
+ const contents = readFileSync(file, 'utf8');
273
+ response.end(sourceViewerHtml(basename(file), contents));
274
+ return;
275
+ }
276
+ createReadStream(file).pipe(response);
277
+ }
278
+ async openLocalPath(request, response) {
279
+ if (!isTrustedLocalRequest(request))
280
+ return sendError(response, 403, new Error('Forbidden'));
281
+ const body = await readJson(request);
282
+ if (typeof body.path !== 'string' || !body.path.trim()) {
283
+ return sendError(response, 400, new Error('path must be a non-empty string'));
284
+ }
285
+ const referencePath = localFileReferencePath(body.path);
286
+ if (!isAbsolute(referencePath))
287
+ return sendError(response, 400, new Error('path must be absolute'));
288
+ const pathname = resolve(referencePath);
289
+ if (!existsSync(pathname))
290
+ return sendError(response, 404, new Error('Local file not found'));
291
+ const file = realpathSync(pathname);
292
+ if (!statSync(file).isFile())
293
+ return sendError(response, 403, new Error('Forbidden'));
294
+ if (!LOCAL_FILE_MIME_TYPES[extname(file).toLowerCase()]) {
295
+ return sendError(response, 415, new Error('Unsupported local file type'));
296
+ }
297
+ try {
298
+ await this.openPath(file);
299
+ }
300
+ catch (error) {
301
+ throw Object.assign(error instanceof Error ? error : new Error(String(error)), { statusCode: 502 });
302
+ }
303
+ return sendJson(response, 200, { opened: true });
304
+ }
305
+ }
306
+ const MIME_TYPES = {
307
+ '.html': 'text/html; charset=utf-8',
308
+ '.js': 'text/javascript; charset=utf-8',
309
+ '.css': 'text/css; charset=utf-8',
310
+ '.json': 'application/json; charset=utf-8',
311
+ '.svg': 'image/svg+xml',
312
+ '.png': 'image/png',
313
+ '.ico': 'image/x-icon',
314
+ };
315
+ const VISUALIZATION_MIME_TYPES = {
316
+ '.gif': 'image/gif',
317
+ '.jpeg': 'image/jpeg',
318
+ '.jpg': 'image/jpeg',
319
+ '.png': 'image/png',
320
+ '.webp': 'image/webp',
321
+ };
322
+ const LOCAL_FILE_MIME_TYPES = {
323
+ ...VISUALIZATION_MIME_TYPES,
324
+ '.css': 'text/plain; charset=utf-8',
325
+ '.html': 'text/html; charset=utf-8',
326
+ '.js': 'text/plain; charset=utf-8',
327
+ '.json': 'text/plain; charset=utf-8',
328
+ '.md': 'text/plain; charset=utf-8',
329
+ '.pdf': 'application/pdf',
330
+ '.svg': 'image/svg+xml',
331
+ '.ts': 'text/plain; charset=utf-8',
332
+ '.tsx': 'text/plain; charset=utf-8',
333
+ '.txt': 'text/plain; charset=utf-8',
334
+ };
335
+ async function readJson(request) {
336
+ const chunks = [];
337
+ let length = 0;
338
+ for await (const chunk of request) {
339
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
340
+ length += buffer.length;
341
+ if (length > 1_000_000)
342
+ throw Object.assign(new Error('Request body too large'), { statusCode: 413 });
343
+ chunks.push(buffer);
344
+ }
345
+ if (chunks.length === 0)
346
+ return {};
347
+ try {
348
+ const value = JSON.parse(Buffer.concat(chunks).toString('utf8'));
349
+ if (!value || typeof value !== 'object' || Array.isArray(value))
350
+ throw new Error('JSON body must be an object');
351
+ return value;
352
+ }
353
+ catch (error) {
354
+ throw Object.assign(error instanceof Error ? error : new Error(String(error)), { statusCode: 400 });
355
+ }
356
+ }
357
+ function sendJson(response, status, data) {
358
+ if (response.headersSent)
359
+ return;
360
+ response.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });
361
+ response.end(JSON.stringify(data ?? null));
362
+ }
363
+ function sendError(response, fallbackStatus, error) {
364
+ const value = error instanceof Error ? error : new Error(String(error));
365
+ const status = typeof value.statusCode === 'number'
366
+ ? value.statusCode
367
+ : fallbackStatus;
368
+ sendJson(response, status, { error: { message: value.message } });
369
+ }
370
+ function decodePathSegment(value) {
371
+ try {
372
+ return decodeURIComponent(value);
373
+ }
374
+ catch {
375
+ throw Object.assign(new Error('Invalid path encoding'), { statusCode: 400 });
376
+ }
377
+ }
378
+ function recordValue(value) {
379
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
380
+ }
381
+ function traceItemRaw(value) {
382
+ const raw = recordValue(value);
383
+ const item = recordValue(recordValue(raw.params).item);
384
+ return Object.keys(item).length ? item : raw;
385
+ }
386
+ function localFilePath(reference) {
387
+ return resolve(localFileReferencePath(reference));
388
+ }
389
+ function localFileReferencePath(reference) {
390
+ const withLine = reference.match(/^(.*?):(\d+)(?::\d+)?$/);
391
+ return withLine?.[1] && existsSync(withLine[1]) ? withLine[1] : reference;
392
+ }
393
+ function sourceViewerHtml(name, contents) {
394
+ const escape = (value) => value
395
+ .replaceAll('&', '&')
396
+ .replaceAll('<', '&lt;')
397
+ .replaceAll('>', '&gt;')
398
+ .replaceAll('"', '&quot;');
399
+ return `<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width"><meta name="color-scheme" content="light dark"><title>${escape(name)}</title><style>html{color-scheme:light dark}body{margin:0;padding:24px;background:Canvas;color:CanvasText;font:13px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace}pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}</style><pre>${escape(contents)}</pre>`;
400
+ }
401
+ function isTrustedLocalRequest(request) {
402
+ const host = request.headers.host;
403
+ const origin = request.headers.origin;
404
+ if (!host || !origin || request.headers['sec-fetch-site'] === 'cross-site')
405
+ return false;
406
+ let hostUrl;
407
+ try {
408
+ hostUrl = new URL(`http://${host}`);
409
+ }
410
+ catch {
411
+ return false;
412
+ }
413
+ const hostname = hostUrl.hostname;
414
+ const ipv4 = hostname.split('.');
415
+ const loopback = hostname === 'localhost' || hostname === '[::1]'
416
+ || (ipv4.length === 4 && ipv4[0] === '127'
417
+ && ipv4.every((part) => /^\d{1,3}$/.test(part) && Number(part) <= 255));
418
+ const remoteAddress = request.socket.remoteAddress ?? '';
419
+ const localPeer = remoteAddress === '::1' || remoteAddress.startsWith('127.') || remoteAddress.startsWith('::ffff:127.');
420
+ if (!loopback || !localPeer)
421
+ return false;
422
+ try {
423
+ return new URL(origin).origin === hostUrl.origin;
424
+ }
425
+ catch {
426
+ return false;
427
+ }
428
+ }
429
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { CodexClient } from './codex-client.js';
2
+ export { ClaudeClient } from './claude-client.js';
3
+ export { TakoTraceServer } from './http-server.js';
@@ -0,0 +1,4 @@
1
+ export { CodexClient } from './codex-client.js';
2
+ export { ClaudeClient } from './claude-client.js';
3
+ export { TakoTraceServer } from './http-server.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ProviderId, ProviderSelection } from '../shared/types.js';
2
+ import type { TraceInput, TraceProvider } from './provider.js';
3
+ export interface MultiProviderOptions {
4
+ providers: TraceProvider[];
5
+ }
6
+ export declare class MultiProvider implements TraceProvider {
7
+ private readonly emitter;
8
+ private readonly providers;
9
+ private readonly unsubscribers;
10
+ private readonly providerById;
11
+ private readonly threadProvider;
12
+ private started;
13
+ constructor(options: MultiProviderOptions);
14
+ start(): Promise<{
15
+ provider: ProviderSelection;
16
+ userAgent?: string;
17
+ }>;
18
+ stop(): Promise<void>;
19
+ onTrace(listener: (event: TraceInput) => void): () => void;
20
+ onHistory(listener: (threads: unknown[], replace: boolean, provider?: ProviderId) => void): () => void;
21
+ onError(listener: (error: Error) => void): () => void;
22
+ startThread(params?: Record<string, unknown>): Promise<unknown>;
23
+ resumeThread(threadId: string, params?: Record<string, unknown>): Promise<unknown>;
24
+ startTurn(threadId: string, text: string, params?: Record<string, unknown>): Promise<unknown>;
25
+ readThread(threadId: string): Promise<unknown>;
26
+ syncThread(threadId: string): Promise<unknown>;
27
+ private routeThreadAction;
28
+ private resolveProvider;
29
+ private providerForThread;
30
+ }