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,178 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export class MultiProvider {
3
+ emitter = new EventEmitter();
4
+ providers;
5
+ unsubscribers = [];
6
+ providerById = new Map();
7
+ threadProvider = new Map();
8
+ started = false;
9
+ constructor(options) {
10
+ this.providers = options.providers;
11
+ for (const provider of this.providers) {
12
+ const id = providerProviderId(provider);
13
+ if (id)
14
+ this.providerById.set(id, provider);
15
+ }
16
+ for (const provider of this.providers) {
17
+ const id = providerProviderId(provider);
18
+ this.unsubscribers.push(provider.onTrace((event) => {
19
+ if (event.threadId && id)
20
+ this.threadProvider.set(event.threadId, id);
21
+ this.emitter.emit('trace', event);
22
+ }), provider.onHistory((threads, replace, source) => {
23
+ if (source) {
24
+ for (const thread of threads) {
25
+ const threadId = record(thread).id;
26
+ if (typeof threadId === 'string')
27
+ this.threadProvider.set(threadId, source);
28
+ }
29
+ }
30
+ this.emitter.emit('history', threads, replace, source);
31
+ }), provider.onError((error) => this.emitter.emit('clientError', error)));
32
+ }
33
+ }
34
+ async start() {
35
+ if (this.started)
36
+ return { provider: 'all', userAgent: 'codex + claude' };
37
+ const errors = [];
38
+ await Promise.all(this.providers.map(async (provider) => {
39
+ try {
40
+ await provider.start();
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ const id = providerProviderId(provider);
45
+ this.emitter.emit('clientError', new Error(`Provider ${id ?? 'unknown'} failed to start: ${message}`));
46
+ errors.push({ id, message });
47
+ }
48
+ }));
49
+ if (errors.length === this.providers.length) {
50
+ throw new Error(`All providers failed to start: ${errors.map((entry) => `${entry.id ?? 'unknown'}: ${entry.message}`).join('; ')}`);
51
+ }
52
+ this.started = true;
53
+ return {
54
+ provider: 'all',
55
+ ...(errors.length ? { userAgent: `codex + claude (${errors.length} provider failed)` } : { userAgent: 'codex + claude' }),
56
+ };
57
+ }
58
+ async stop() {
59
+ this.started = false;
60
+ await Promise.allSettled(this.providers.map((provider) => provider.stop()));
61
+ for (const unsubscribe of this.unsubscribers.splice(0))
62
+ unsubscribe();
63
+ }
64
+ onTrace(listener) {
65
+ this.emitter.on('trace', listener);
66
+ return () => this.emitter.off('trace', listener);
67
+ }
68
+ onHistory(listener) {
69
+ this.emitter.on('history', listener);
70
+ return () => this.emitter.off('history', listener);
71
+ }
72
+ onError(listener) {
73
+ this.emitter.on('clientError', listener);
74
+ return () => this.emitter.off('clientError', listener);
75
+ }
76
+ async startThread(params = {}) {
77
+ const explicit = providerParam(params);
78
+ const provider = this.resolveProvider(explicit);
79
+ if (!provider)
80
+ return Promise.reject(new Error('No providers configured'));
81
+ const result = await provider.startThread(withoutProvider(params));
82
+ const resultRecord = record(result);
83
+ const resultThread = record(resultRecord.thread);
84
+ const threadId = typeof resultThread.id === 'string'
85
+ ? resultThread.id
86
+ : typeof resultRecord.id === 'string'
87
+ ? resultRecord.id
88
+ : undefined;
89
+ const providerId = explicit ?? providerProviderId(provider);
90
+ if (threadId && providerId)
91
+ this.threadProvider.set(threadId, providerId);
92
+ return result;
93
+ }
94
+ async resumeThread(threadId, params = {}) {
95
+ return this.routeThreadAction('resumeThread', threadId, params);
96
+ }
97
+ async startTurn(threadId, text, params = {}) {
98
+ return this.routeThreadAction('startTurn', threadId, text, params);
99
+ }
100
+ async readThread(threadId) {
101
+ const provider = this.providerForThread(threadId);
102
+ if (!provider?.readThread)
103
+ throw Object.assign(new Error('Thread provider does not support subagent details'), { statusCode: 501 });
104
+ return provider.readThread(threadId);
105
+ }
106
+ async syncThread(threadId) {
107
+ const provider = this.providerForThread(threadId);
108
+ if (!provider?.syncThread)
109
+ throw Object.assign(new Error('Thread provider does not support session sync'), { statusCode: 501 });
110
+ return provider.syncThread(threadId);
111
+ }
112
+ routeThreadAction(method, ...args) {
113
+ const params = typeof args.at(-1) === 'object' && args.at(-1) !== null ? args.at(-1) : {};
114
+ const explicit = providerParam(params);
115
+ args[args.length - 1] = withoutProvider(params);
116
+ const provider = this.resolveProvider(explicit);
117
+ if (!provider)
118
+ return Promise.reject(new Error('No providers configured'));
119
+ if (!explicit) {
120
+ const threadId = typeof args[0] === 'string' ? args[0] : undefined;
121
+ const routed = threadId ? this.providerForThread(threadId) : undefined;
122
+ if (routed)
123
+ return callThreadAction(routed, method, args);
124
+ }
125
+ return callThreadAction(provider, method, args);
126
+ }
127
+ resolveProvider(explicit) {
128
+ if (explicit) {
129
+ const provider = this.providerById.get(explicit);
130
+ if (!provider)
131
+ throw Object.assign(new Error(`Unknown provider: ${explicit}`), { statusCode: 400 });
132
+ return provider;
133
+ }
134
+ return this.providers[0];
135
+ }
136
+ providerForThread(threadId) {
137
+ const id = this.threadProvider.get(threadId);
138
+ if (id)
139
+ return this.providerById.get(id);
140
+ return this.providerById.get('codex') ?? this.providerById.get('claude');
141
+ }
142
+ }
143
+ function providerParam(params) {
144
+ const value = params.provider;
145
+ if (value === undefined)
146
+ return undefined;
147
+ if (value === 'codex' || value === 'claude')
148
+ return value;
149
+ throw Object.assign(new Error(`Unknown provider: ${String(value)}`), { statusCode: 400 });
150
+ }
151
+ function providerProviderId(provider) {
152
+ if (provider.providerId)
153
+ return provider.providerId;
154
+ if ('provider' in provider) {
155
+ const declared = provider.provider;
156
+ if (declared === 'codex' || declared === 'claude')
157
+ return declared;
158
+ }
159
+ if (provider.constructor.name.includes('Codex'))
160
+ return 'codex';
161
+ if (provider.constructor.name.includes('Claude'))
162
+ return 'claude';
163
+ return undefined;
164
+ }
165
+ function withoutProvider(params) {
166
+ const { provider: _provider, ...rest } = params;
167
+ return rest;
168
+ }
169
+ function record(value) {
170
+ return value && typeof value === 'object' ? value : {};
171
+ }
172
+ function callThreadAction(provider, method, args) {
173
+ const threadId = args[0];
174
+ if (method === 'resumeThread')
175
+ return provider.resumeThread(threadId, args[1]);
176
+ return provider.startTurn(threadId, args[1], args[2]);
177
+ }
178
+ //# sourceMappingURL=multi-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-provider.js","sourceRoot":"","sources":["../../src/server/multi-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7B,SAAS,CAAkB;IAC3B,aAAa,GAAsB,EAAE,CAAC;IACtC,YAAY,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;IACxD,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,OAA6B;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,EAAE;gBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACzB,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC,CAAC,EACF,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;wBACnC,IAAI,OAAO,QAAQ,KAAK,QAAQ;4BAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACzD,CAAC,CAAC,EACF,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC1E,MAAM,MAAM,GAA2D,EAAE,CAAC;QAC1E,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtD,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,SAAS,qBAAqB,OAAO,EAAE,CAAC,CAAC,CAAC;gBACvG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtI,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,mBAAmB,MAAM,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;SAC1H,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,WAAW,EAAE,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,QAAqC;QAC3C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,QAA+E;QACvF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,QAAgC;QACtC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAkC,EAAE;QACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,YAAY,CAAC,EAAE,KAAK,QAAQ;YAClD,CAAC,CAAC,YAAY,CAAC,EAAE;YACjB,CAAC,CAAC,OAAO,YAAY,CAAC,EAAE,KAAK,QAAQ;gBACnC,CAAC,CAAC,YAAY,CAAC,EAAE;gBACjB,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,UAAU,GAAG,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,QAAQ,IAAI,UAAU;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,SAAkC,EAAE;QACvE,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,IAAY,EAAE,SAAkC,EAAE;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,UAAU;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpI,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,UAAU;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAChI,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEO,iBAAiB,CAAC,MAAoC,EAAE,GAAG,IAAe;QAChF,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;QACrH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,IAAI,MAAM;gBAAE,OAAO,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAEO,eAAe,CAAC,QAAgC;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACpG,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;CACF;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAuB;IACjD,IAAI,QAAQ,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC;IACpD,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAI,QAAmC,CAAC,QAAQ,CAAC;QAC/D,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;IACrE,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAChE,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B;IACtD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAuB,EACvB,MAAoC,EACpC,IAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;IACnC,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC;IAC1G,OAAO,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAW,EAAE,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface NativePathOpenerOptions {
2
+ platform?: NodeJS.Platform;
3
+ run?: (command: string, args: string[]) => Promise<{
4
+ stdout: string;
5
+ }>;
6
+ }
7
+ export declare function openNativePath(pathname: string, options?: NativePathOpenerOptions): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { extname } from 'node:path';
3
+ import { promisify } from 'node:util';
4
+ const execFileAsync = promisify(execFile);
5
+ const BROWSER_DOCUMENTS = new Set(['.html', '.htm', '.xhtml', '.svg']);
6
+ export async function openNativePath(pathname, options = {}) {
7
+ const platform = options.platform ?? process.platform;
8
+ const run = options.run ?? runNativeCommand;
9
+ if (platform === 'darwin') {
10
+ if (BROWSER_DOCUMENTS.has(extname(pathname).toLowerCase())) {
11
+ try {
12
+ const { stdout } = await run('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure']);
13
+ const bundle = macBundleForHttps(stdout);
14
+ if (bundle) {
15
+ await run('open', ['-b', bundle, pathname]);
16
+ return;
17
+ }
18
+ }
19
+ catch {
20
+ // Fall back to the file's registered application when LaunchServices cannot name a browser.
21
+ }
22
+ }
23
+ await run('open', [pathname]);
24
+ return;
25
+ }
26
+ if (platform === 'win32') {
27
+ await run('powershell.exe', ['-NoProfile', '-Command', 'Invoke-Item -LiteralPath $args[0]', pathname]);
28
+ return;
29
+ }
30
+ if (platform === 'linux') {
31
+ await run('xdg-open', [pathname]);
32
+ return;
33
+ }
34
+ throw new Error(`Native path opener is unsupported on ${platform}`);
35
+ }
36
+ async function runNativeCommand(command, args) {
37
+ const { stdout } = await execFileAsync(command, args, { maxBuffer: 1_048_576 });
38
+ return { stdout };
39
+ }
40
+ function macBundleForHttps(plist) {
41
+ const stripped = plist.replace(/LSHandlerPreferredVersions\s*=\s*\{[^}]*\};/g, '');
42
+ const block = /\{[^{}]*LSHandlerURLScheme\s*=\s*"?https"?;[^{}]*\}/.exec(stripped)?.[0];
43
+ return block ? /LSHandlerRoleAll\s*=\s*"?([\w.-]+)"?;/.exec(block)?.[1] : undefined;
44
+ }
45
+ //# sourceMappingURL=native-path-opener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-path-opener.js","sourceRoot":"","sources":["../../src/server/native-path-opener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAOvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,UAAmC,EAAE;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,gBAAgB,CAAC;IAE5C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,0DAA0D,CAAC,CAAC,CAAC;gBAC/G,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4FAA4F;YAC9F,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,mCAAmC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvG,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,IAAc;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAChF,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,qDAAqD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ProviderId, ProviderSelection, TraceEvent } from '../shared/types.js';
2
+ export type TraceInput = Omit<TraceEvent, 'seq' | 'at'> & Partial<Pick<TraceEvent, 'at'>>;
3
+ export interface TraceProviderEvents {
4
+ onTrace(listener: (event: TraceInput) => void): () => void;
5
+ onHistory(listener: (threads: unknown[], replace: boolean, provider?: ProviderId) => void): () => void;
6
+ onError(listener: (error: Error) => void): () => void;
7
+ }
8
+ export interface TraceProviderActions {
9
+ startThread(params?: Record<string, unknown>): Promise<{
10
+ thread?: {
11
+ id?: unknown;
12
+ };
13
+ sessionId?: unknown;
14
+ } | unknown>;
15
+ resumeThread(threadId: string, params?: Record<string, unknown>): Promise<unknown>;
16
+ startTurn(threadId: string, text: string, params?: Record<string, unknown>): Promise<unknown>;
17
+ readThread?(threadId: string): Promise<unknown>;
18
+ syncThread?(threadId: string): Promise<unknown>;
19
+ }
20
+ export interface TraceProvider extends TraceProviderEvents, TraceProviderActions {
21
+ readonly providerId?: ProviderId;
22
+ start(): Promise<{
23
+ provider: ProviderSelection;
24
+ userAgent?: string;
25
+ }>;
26
+ stop(): Promise<void>;
27
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/server/provider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export interface RolloutReaderOptions {
2
+ codexHome?: string;
3
+ }
4
+ export interface RolloutReadResult {
5
+ source: string;
6
+ thread: Record<string, unknown>;
7
+ }
8
+ export declare function readRolloutThread(threadId: string, options?: RolloutReaderOptions): Promise<RolloutReadResult | undefined>;
9
+ export declare function rolloutSourceName(result: RolloutReadResult): string;
@@ -0,0 +1,333 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import { readdir } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { basename, join } from 'node:path';
5
+ import { createInterface } from 'node:readline';
6
+ import { addTokenUsage, normalizeThreadTokenUsage, tokenUsageDelta } from '../shared/trace.js';
7
+ const THREAD_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
8
+ export async function readRolloutThread(threadId, options = {}) {
9
+ if (!THREAD_ID_PATTERN.test(threadId))
10
+ return undefined;
11
+ const codexHome = options.codexHome ?? process.env.CODEX_HOME ?? join(homedir(), '.codex');
12
+ const source = await findRolloutFile(codexHome, threadId);
13
+ if (!source)
14
+ return undefined;
15
+ const turns = new Map();
16
+ let sessionMeta = {};
17
+ let firstTimestamp;
18
+ let lastTimestamp;
19
+ let preview;
20
+ let activeTurnId;
21
+ let mostRecentTurnId;
22
+ let currentModel;
23
+ let latestTokenUsage;
24
+ let previousTotal;
25
+ const toolCalls = new Map();
26
+ const lines = createInterface({ input: createReadStream(source, { encoding: 'utf8' }), crlfDelay: Infinity });
27
+ for await (const line of lines) {
28
+ let entry;
29
+ try {
30
+ const parsed = JSON.parse(line);
31
+ if (!parsed || typeof parsed !== 'object')
32
+ continue;
33
+ entry = parsed;
34
+ }
35
+ catch {
36
+ continue;
37
+ }
38
+ const timestamp = timestampSeconds(entry.timestamp);
39
+ if (timestamp !== undefined) {
40
+ firstTimestamp = firstTimestamp === undefined ? timestamp : Math.min(firstTimestamp, timestamp);
41
+ lastTimestamp = lastTimestamp === undefined ? timestamp : Math.max(lastTimestamp, timestamp);
42
+ }
43
+ const payload = record(entry.payload);
44
+ if (entry.type === 'world_state') {
45
+ currentModel = stringField(record(payload.state).model) ?? currentModel;
46
+ continue;
47
+ }
48
+ if (entry.type === 'response_item') {
49
+ const responseType = stringField(payload.type);
50
+ const callId = stringField(payload.call_id);
51
+ if (!callId)
52
+ continue;
53
+ const toolCall = toolCalls.get(callId) ?? {};
54
+ if (responseType === 'function_call')
55
+ toolCall.arguments = parseJsonValue(payload.arguments);
56
+ if (responseType === 'function_call_output')
57
+ toolCall.result = parseJsonValue(payload.output);
58
+ if (toolCall.item)
59
+ attachToolCallMetadata(toolCall.item, toolCall);
60
+ toolCalls.set(callId, toolCall);
61
+ continue;
62
+ }
63
+ if (entry.type === 'session_meta') {
64
+ sessionMeta = payload;
65
+ continue;
66
+ }
67
+ if (entry.type === 'turn_context') {
68
+ const turnId = stringField(payload.turn_id);
69
+ if (turnId) {
70
+ activeTurnId = turnId;
71
+ mostRecentTurnId = turnId;
72
+ const turn = getOrCreateTurn(turns, turnId);
73
+ turn.model = stringField(payload.model)
74
+ ?? stringField(record(payload.thread_settings).model)
75
+ ?? turn.model
76
+ ?? currentModel;
77
+ currentModel = turn.model ?? currentModel;
78
+ }
79
+ continue;
80
+ }
81
+ if (entry.type !== 'event_msg')
82
+ continue;
83
+ const eventType = stringField(payload.type);
84
+ if (eventType === 'thread_settings_applied') {
85
+ currentModel = stringField(record(payload.thread_settings).model) ?? currentModel;
86
+ continue;
87
+ }
88
+ if (eventType === 'token_count') {
89
+ const tokenUsage = normalizeThreadTokenUsage(payload.info ?? payload.token_usage ?? payload.tokenUsage);
90
+ if (!tokenUsage)
91
+ continue;
92
+ // task_complete normally follows the final token_count, but some rollouts flush usage just after it.
93
+ // Prefer the active turn and otherwise keep that trailing snapshot on the most recently completed turn.
94
+ const usageTurnId = activeTurnId ?? mostRecentTurnId;
95
+ if (usageTurnId) {
96
+ const turn = getOrCreateTurn(turns, usageTurnId);
97
+ turn.tokenUsage = addTokenUsage(turn.tokenUsage, tokenUsageDelta(tokenUsage.total, previousTotal, tokenUsage.last));
98
+ }
99
+ previousTotal = tokenUsage.total;
100
+ latestTokenUsage = tokenUsage;
101
+ continue;
102
+ }
103
+ const turnId = stringField(payload.turn_id);
104
+ if (!eventType || !turnId)
105
+ continue;
106
+ const turn = getOrCreateTurn(turns, turnId);
107
+ turn.model = stringField(payload.model) ?? turn.model ?? currentModel;
108
+ if (eventType === 'task_started') {
109
+ if (activeTurnId && activeTurnId !== turnId) {
110
+ const previousTurn = getOrCreateTurn(turns, activeTurnId);
111
+ if (previousTurn.status === 'inProgress')
112
+ previousTurn.status = 'interrupted';
113
+ }
114
+ activeTurnId = turnId;
115
+ mostRecentTurnId = turnId;
116
+ turn.status = 'inProgress';
117
+ turn.startedAt = numberField(payload.started_at) ?? timestamp ?? turn.startedAt;
118
+ continue;
119
+ }
120
+ if (eventType === 'task_complete' || eventType === 'task_failed') {
121
+ mostRecentTurnId = turnId;
122
+ if (activeTurnId === turnId)
123
+ activeTurnId = undefined;
124
+ turn.status = eventType === 'task_failed' ? 'failed' : 'completed';
125
+ turn.startedAt = numberField(payload.started_at) ?? turn.startedAt;
126
+ turn.completedAt = numberField(payload.completed_at) ?? timestamp ?? turn.completedAt;
127
+ turn.durationMs = numberField(payload.duration_ms) ?? turn.durationMs;
128
+ continue;
129
+ }
130
+ if (eventType !== 'item_completed')
131
+ continue;
132
+ activeTurnId = turnId;
133
+ mostRecentTurnId = turnId;
134
+ const item = normalizeItem(payload.item, payload);
135
+ const itemId = stringField(item.id);
136
+ if (!itemId)
137
+ continue;
138
+ const toolCall = toolCalls.get(itemId);
139
+ if (toolCall) {
140
+ toolCall.item = item;
141
+ attachToolCallMetadata(item, toolCall);
142
+ }
143
+ turn.items.set(itemId, item);
144
+ if (!preview && item.type === 'userMessage')
145
+ preview = itemText(item);
146
+ }
147
+ const historicalTurns = [...turns.values()]
148
+ .filter((turn) => turn.items.size > 0 || turn.startedAt !== undefined || turn.completedAt !== undefined || turn.model !== undefined || turn.tokenUsage !== undefined)
149
+ .map((turn) => ({
150
+ id: turn.id,
151
+ status: turn.status,
152
+ ...(turn.startedAt === undefined ? {} : { startedAt: turn.startedAt }),
153
+ ...(turn.completedAt === undefined ? {} : { completedAt: turn.completedAt }),
154
+ ...(turn.durationMs === undefined ? {} : { durationMs: turn.durationMs }),
155
+ ...(turn.model === undefined ? {} : { model: turn.model }),
156
+ ...(turn.tokenUsage === undefined ? {} : { tokenUsage: turn.tokenUsage }),
157
+ items: [...turn.items.values()],
158
+ }));
159
+ if (!historicalTurns.length)
160
+ return undefined;
161
+ const sessionTimestamp = timestampSeconds(sessionMeta.timestamp);
162
+ const createdAt = sessionTimestamp ?? firstTimestamp ?? historicalTurns[0].startedAt ?? Date.now() / 1_000;
163
+ const updatedAt = lastTimestamp ?? historicalTurns.at(-1)?.completedAt ?? createdAt;
164
+ const allCompleted = historicalTurns.every((turn) => turn.status === 'completed');
165
+ return {
166
+ source,
167
+ thread: {
168
+ id: threadId,
169
+ sessionId: stringField(sessionMeta.session_id),
170
+ preview: truncate(preview ?? `Session ${threadId.slice(0, 8)}`, 160),
171
+ status: { type: allCompleted ? 'idle' : 'active' },
172
+ historySource: 'rollout-file',
173
+ createdAt,
174
+ updatedAt,
175
+ cwd: stringField(sessionMeta.cwd),
176
+ path: source,
177
+ cliVersion: stringField(sessionMeta.cli_version),
178
+ source: sessionMeta.source,
179
+ threadSource: stringField(sessionMeta.thread_source),
180
+ ...(latestTokenUsage === undefined ? {} : { tokenUsage: latestTokenUsage }),
181
+ turns: historicalTurns,
182
+ },
183
+ };
184
+ }
185
+ function attachToolCallMetadata(item, toolCall) {
186
+ if (toolCall.arguments !== undefined)
187
+ item.arguments = toolCall.arguments;
188
+ if (toolCall.result !== undefined)
189
+ item.result = toolCall.result;
190
+ }
191
+ function parseJsonValue(value) {
192
+ if (typeof value !== 'string' || !value)
193
+ return value;
194
+ try {
195
+ return JSON.parse(value);
196
+ }
197
+ catch {
198
+ return value;
199
+ }
200
+ }
201
+ async function findRolloutFile(codexHome, threadId) {
202
+ const suffix = `-${threadId}.jsonl`;
203
+ const sessionRoot = join(codexHome, 'sessions');
204
+ const years = await directories(sessionRoot);
205
+ for (const year of years.sort().reverse()) {
206
+ const months = await directories(join(sessionRoot, year));
207
+ for (const month of months.sort().reverse()) {
208
+ const days = await directories(join(sessionRoot, year, month));
209
+ for (const day of days.sort().reverse()) {
210
+ const directory = join(sessionRoot, year, month, day);
211
+ const match = (await files(directory))
212
+ .filter((name) => name.startsWith('rollout-') && name.endsWith(suffix))
213
+ .sort()
214
+ .at(-1);
215
+ if (match)
216
+ return join(directory, match);
217
+ }
218
+ }
219
+ }
220
+ const archivedRoot = join(codexHome, 'archived_sessions');
221
+ const archived = (await files(archivedRoot))
222
+ .filter((name) => name.startsWith('rollout-') && name.endsWith(suffix))
223
+ .sort()
224
+ .at(-1);
225
+ return archived ? join(archivedRoot, archived) : undefined;
226
+ }
227
+ async function directories(path) {
228
+ try {
229
+ return (await readdir(path, { withFileTypes: true }))
230
+ .filter((entry) => entry.isDirectory())
231
+ .map((entry) => entry.name);
232
+ }
233
+ catch (error) {
234
+ if (isMissing(error))
235
+ return [];
236
+ throw error;
237
+ }
238
+ }
239
+ async function files(path) {
240
+ try {
241
+ return (await readdir(path, { withFileTypes: true }))
242
+ .filter((entry) => entry.isFile())
243
+ .map((entry) => entry.name);
244
+ }
245
+ catch (error) {
246
+ if (isMissing(error))
247
+ return [];
248
+ throw error;
249
+ }
250
+ }
251
+ function getOrCreateTurn(turns, id) {
252
+ let turn = turns.get(id);
253
+ if (!turn) {
254
+ turn = { id, status: 'pending', items: new Map() };
255
+ turns.set(id, turn);
256
+ }
257
+ return turn;
258
+ }
259
+ function normalizeItem(value, event) {
260
+ const item = record(value);
261
+ const type = lowerFirst(stringField(item.type) ?? 'item');
262
+ const startedAtMs = numberField(event.started_at_ms);
263
+ const completedAtMs = numberField(event.completed_at_ms);
264
+ const normalized = {
265
+ ...item,
266
+ type,
267
+ status: stringField(item.status) ?? 'completed',
268
+ };
269
+ if (Array.isArray(item.content)) {
270
+ normalized.content = item.content.map((entry) => {
271
+ const content = record(entry);
272
+ return { ...content, type: lowerFirst(stringField(content.type) ?? 'content') };
273
+ });
274
+ }
275
+ if (startedAtMs !== undefined)
276
+ normalized.startedAt = startedAtMs / 1_000;
277
+ if (completedAtMs !== undefined)
278
+ normalized.completedAt = completedAtMs / 1_000;
279
+ if (startedAtMs !== undefined && completedAtMs !== undefined)
280
+ normalized.durationMs = completedAtMs - startedAtMs;
281
+ copyAlias(normalized, item, 'agent_path', 'agentPath');
282
+ copyAlias(normalized, item, 'agent_thread_id', 'agentThreadId');
283
+ copyAlias(normalized, item, 'exit_code', 'exitCode');
284
+ if (typeof item.summary_text === 'string')
285
+ normalized.summary = [item.summary_text];
286
+ return normalized;
287
+ }
288
+ function copyAlias(target, source, from, to) {
289
+ if (source[from] !== undefined && target[to] === undefined)
290
+ target[to] = source[from];
291
+ }
292
+ function itemText(item) {
293
+ if (typeof item.text === 'string' && item.text.trim())
294
+ return item.text.trim();
295
+ if (!Array.isArray(item.content))
296
+ return undefined;
297
+ for (const value of item.content) {
298
+ const content = record(value);
299
+ if (typeof content.text === 'string' && content.text.trim())
300
+ return content.text.trim();
301
+ }
302
+ return undefined;
303
+ }
304
+ function record(value) {
305
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
306
+ }
307
+ function stringField(value) {
308
+ return typeof value === 'string' && value ? value : undefined;
309
+ }
310
+ function numberField(value) {
311
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
312
+ }
313
+ function timestampSeconds(value) {
314
+ if (typeof value === 'number' && Number.isFinite(value))
315
+ return value;
316
+ if (typeof value !== 'string')
317
+ return undefined;
318
+ const timestamp = Date.parse(value);
319
+ return Number.isNaN(timestamp) ? undefined : timestamp / 1_000;
320
+ }
321
+ function lowerFirst(value) {
322
+ return value ? `${value[0].toLowerCase()}${value.slice(1)}` : value;
323
+ }
324
+ function truncate(value, limit) {
325
+ return value.length > limit ? `${value.slice(0, limit - 3)}...` : value;
326
+ }
327
+ function isMissing(error) {
328
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
329
+ }
330
+ export function rolloutSourceName(result) {
331
+ return basename(result.source);
332
+ }
333
+ //# sourceMappingURL=rollout-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollout-reader.js","sourceRoot":"","sources":["../../src/server/rollout-reader.ts"],"names":[],"mappings":"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"}