oh-my-codex 0.21.7 → 0.21.8

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 (59) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +14 -0
  4. package/dist/cli/__tests__/doctor-state-root-binding.test.js +17 -2
  5. package/dist/cli/__tests__/doctor-state-root-binding.test.js.map +1 -1
  6. package/dist/cli/__tests__/session-export.test.d.ts +2 -0
  7. package/dist/cli/__tests__/session-export.test.d.ts.map +1 -0
  8. package/dist/cli/__tests__/session-export.test.js +166 -0
  9. package/dist/cli/__tests__/session-export.test.js.map +1 -0
  10. package/dist/cli/doctor.js +1 -1
  11. package/dist/cli/doctor.js.map +1 -1
  12. package/dist/cli/index.d.ts +1 -1
  13. package/dist/cli/index.d.ts.map +1 -1
  14. package/dist/cli/index.js +1 -0
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/session-export.d.ts +9 -0
  17. package/dist/cli/session-export.d.ts.map +1 -0
  18. package/dist/cli/session-export.js +76 -0
  19. package/dist/cli/session-export.js.map +1 -0
  20. package/dist/cli/session-search.d.ts.map +1 -1
  21. package/dist/cli/session-search.js +7 -0
  22. package/dist/cli/session-search.js.map +1 -1
  23. package/dist/runtime/__tests__/bridge.test.js +79 -0
  24. package/dist/runtime/__tests__/bridge.test.js.map +1 -1
  25. package/dist/runtime/bridge.d.ts +1 -0
  26. package/dist/runtime/bridge.d.ts.map +1 -1
  27. package/dist/runtime/bridge.js +17 -4
  28. package/dist/runtime/bridge.js.map +1 -1
  29. package/dist/scripts/__tests__/ralplan-advisory-hook.test.js +39 -0
  30. package/dist/scripts/__tests__/ralplan-advisory-hook.test.js.map +1 -1
  31. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  32. package/dist/scripts/codex-native-hook.js +8 -3
  33. package/dist/scripts/codex-native-hook.js.map +1 -1
  34. package/dist/session-history/__tests__/export.test.d.ts +2 -0
  35. package/dist/session-history/__tests__/export.test.d.ts.map +1 -0
  36. package/dist/session-history/__tests__/export.test.js +225 -0
  37. package/dist/session-history/__tests__/export.test.js.map +1 -0
  38. package/dist/session-history/export.d.ts +31 -0
  39. package/dist/session-history/export.d.ts.map +1 -0
  40. package/dist/session-history/export.js +225 -0
  41. package/dist/session-history/export.js.map +1 -0
  42. package/dist/session-history/search.d.ts +1 -0
  43. package/dist/session-history/search.d.ts.map +1 -1
  44. package/dist/session-history/search.js +1 -1
  45. package/dist/session-history/search.js.map +1 -1
  46. package/dist/team/__tests__/state.test.js +33 -0
  47. package/dist/team/__tests__/state.test.js.map +1 -1
  48. package/dist/team/__tests__/worker-bootstrap.test.js +100 -1
  49. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  50. package/dist/team/state.d.ts.map +1 -1
  51. package/dist/team/state.js +3 -2
  52. package/dist/team/state.js.map +1 -1
  53. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  54. package/dist/team/worker-bootstrap.js +74 -18
  55. package/dist/team/worker-bootstrap.js.map +1 -1
  56. package/package.json +1 -1
  57. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  58. package/src/scripts/__tests__/ralplan-advisory-hook.test.ts +40 -0
  59. package/src/scripts/codex-native-hook.ts +8 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.test.d.ts","sourceRoot":"","sources":["../../../src/session-history/__tests__/export.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,225 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { exportSessionHistory, renderSessionMarkdown } from '../export.js';
7
+ const timestamp = '2026-10-04T10:00:00.000Z';
8
+ async function writeTranscript(home, id, records, archived = false) {
9
+ const directory = join(home, archived ? 'archived_sessions' : 'sessions/2026/10/04');
10
+ await mkdir(directory, { recursive: true });
11
+ const path = join(directory, `rollout-${id}.jsonl`);
12
+ const meta = { type: 'session_meta', payload: { id, timestamp, cwd: '/project' } };
13
+ await writeFile(path, [meta, ...records].map((record) => JSON.stringify(record)).join('\n') + '\n');
14
+ return path;
15
+ }
16
+ function message(role, text, channel) {
17
+ return { type: 'response_item', timestamp, payload: { type: 'message', role, channel, content: [{ type: 'output_text', text }] } };
18
+ }
19
+ describe('exportSessionHistory', () => {
20
+ it('exports canonical messages once, preserves repeated turns, and excludes instructions and reasoning', async () => {
21
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-'));
22
+ try {
23
+ const path = await writeTranscript(home, 'session-a', [
24
+ message('system', 'system secret'),
25
+ message('developer', 'developer secret'),
26
+ { type: 'event_msg', payload: { type: 'user_message', message: 'Hello' } },
27
+ message('user', 'Hello'),
28
+ message('assistant', 'analysis secret', 'analysis'),
29
+ { type: 'response_item', payload: { type: 'reasoning', summary: 'reasoning secret' } },
30
+ message('assistant', '你好\n\nFinal answer', 'final'),
31
+ { type: 'event_msg', payload: { type: 'agent_message', message: '你好\n\nFinal answer' } },
32
+ message('user', 'Hello'),
33
+ ]);
34
+ const before = await readFile(path, 'utf-8');
35
+ const document = await exportSessionHistory({ session: 'session-a', codexHomeDir: home });
36
+ assert.equal(document.schema_version, 1);
37
+ assert.equal(document.session_id, 'session-a');
38
+ assert.equal(document.started_at, timestamp);
39
+ assert.equal(document.cwd, '/project');
40
+ assert.equal(document.archived, false);
41
+ assert.equal(document.skipped_records, 0);
42
+ assert.deepEqual(document.entries.map((entry) => entry.text), ['Hello', '你好\n\nFinal answer', 'Hello']);
43
+ assert.deepEqual(document.entries.map((entry) => entry.line_number), [5, 8, 10]);
44
+ assert.equal(document.entries[0].timestamp, timestamp);
45
+ assert.doesNotMatch(JSON.stringify(document), /secret/);
46
+ assert.equal(await readFile(path, 'utf-8'), before);
47
+ }
48
+ finally {
49
+ await rm(home, { recursive: true, force: true });
50
+ }
51
+ });
52
+ it('supports event-only transcripts and omits tools unless requested', async () => {
53
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-events-'));
54
+ try {
55
+ await writeTranscript(home, 'event-session', [
56
+ { type: 'event_msg', payload: { type: 'user_message', message: 'Question' } },
57
+ { type: 'response_item', payload: { type: 'function_call', name: 'exec', call_id: 'call-1', channel: 'analysis', arguments: '{"cmd":"test"}' } },
58
+ { type: 'response_item', payload: { type: 'function_call_output', call_id: 'call-1', output: 'Result' } },
59
+ { type: 'event_msg', payload: { type: 'agent_message', message: 'hidden', channel: 'analysis' } },
60
+ { type: 'event_msg', payload: { type: 'agent_message', message: 'Answer' } },
61
+ ]);
62
+ const ordinary = await exportSessionHistory({ session: 'event-session', codexHomeDir: home });
63
+ assert.deepEqual(ordinary.entries.map((entry) => entry.text), ['Question', 'Answer']);
64
+ const withTools = await exportSessionHistory({ session: 'event-session', codexHomeDir: home, includeTools: true });
65
+ assert.deepEqual(withTools.entries.map((entry) => entry.kind), ['message', 'tool_call', 'tool_output', 'message']);
66
+ assert.deepEqual(withTools.entries[2], {
67
+ kind: 'tool_output', name: 'exec', call_id: 'call-1', text: 'Result', timestamp: null, line_number: 4,
68
+ });
69
+ }
70
+ finally {
71
+ await rm(home, { recursive: true, force: true });
72
+ }
73
+ });
74
+ it('exports custom tools, structured output, and unmatched outputs without inventing names', async () => {
75
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-tools-'));
76
+ try {
77
+ await writeTranscript(home, 'tool-session', [
78
+ { type: 'response_item', payload: { type: 'custom_tool_call', name: 'patch', call_id: 'patch-1', input: '*** patch ***' } },
79
+ { type: 'response_item', payload: { type: 'custom_tool_call_output', call_id: 'patch-1', output: { changed: ['a.ts'] } } },
80
+ { type: 'response_item', payload: { type: 'function_call_output', output: 'orphaned' } },
81
+ ]);
82
+ const document = await exportSessionHistory({ session: 'tool-session', codexHomeDir: home, includeTools: true });
83
+ assert.equal(document.entries.length, 3);
84
+ assert.equal(document.entries[0].text, '*** patch ***');
85
+ assert.deepEqual(JSON.parse(document.entries[1].text), { changed: ['a.ts'] });
86
+ const orphaned = document.entries[2];
87
+ assert.equal(orphaned.kind, 'tool_output');
88
+ if (orphaned.kind !== 'tool_output')
89
+ throw new Error('Expected output');
90
+ assert.equal(orphaned.call_id, null);
91
+ assert.equal(orphaned.name, null);
92
+ }
93
+ finally {
94
+ await rm(home, { recursive: true, force: true });
95
+ }
96
+ });
97
+ it('exports an archived session by a unique prefix and gives exact IDs precedence', async () => {
98
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-archive-'));
99
+ try {
100
+ await writeTranscript(home, 'abc', [message('user', 'active')]);
101
+ await writeTranscript(home, 'abcd-archived', [message('user', 'archived')], true);
102
+ const exact = await exportSessionHistory({ session: 'abc', codexHomeDir: home });
103
+ assert.equal(exact.archived, false);
104
+ assert.equal(exact.entries[0].text, 'active');
105
+ const archived = await exportSessionHistory({ session: 'abcd', codexHomeDir: home });
106
+ assert.equal(archived.session_id, 'abcd-archived');
107
+ assert.equal(archived.archived, true);
108
+ await assert.rejects(exportSessionHistory({ session: 'ab', codexHomeDir: home }), /Multiple transcripts/);
109
+ await assert.rejects(exportSessionHistory({ session: 'absent', codexHomeDir: home }), /No local session/);
110
+ await assert.rejects(exportSessionHistory({ session: ' ', codexHomeDir: home }), /Missing session id/);
111
+ }
112
+ finally {
113
+ await rm(home, { recursive: true, force: true });
114
+ }
115
+ });
116
+ it('reports duplicate IDs across homes and supports explicit source selection', async () => {
117
+ const root = await mkdtemp(join(tmpdir(), 'omx-export-homes-'));
118
+ try {
119
+ const first = join(root, 'first');
120
+ const second = join(root, 'second');
121
+ await writeTranscript(first, 'same-id', [message('user', 'first')]);
122
+ await writeTranscript(second, 'same-id', [message('user', 'second')]);
123
+ await assert.rejects(exportSessionHistory({ session: 'same-id', codexHomeDirs: [first, second] }), /Multiple transcripts/);
124
+ const selected = await exportSessionHistory({ session: 'same-id', codexHomeDir: second });
125
+ assert.equal(selected.entries[0].text, 'second');
126
+ const repeatedHome = await exportSessionHistory({ session: 'same-id', codexHomeDirs: [first, first] });
127
+ assert.equal(repeatedHome.entries[0].text, 'first');
128
+ }
129
+ finally {
130
+ await rm(root, { recursive: true, force: true });
131
+ }
132
+ });
133
+ it('ignores missing metadata, does not guess IDs from filenames, and tolerates a partial tail', async () => {
134
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-malformed-'));
135
+ try {
136
+ const path = await writeTranscript(home, 'valid-id', [message('assistant', 'still readable')]);
137
+ await writeFile(path, `${await readFile(path, 'utf-8')}\ninvalid\nnull\n{"unfinished":`, 'utf-8');
138
+ const directory = join(home, 'sessions');
139
+ await writeFile(join(directory, 'rollout-pretend-id.jsonl'), '{"type":"event_msg"}\n');
140
+ await writeFile(join(directory, 'rollout-empty.jsonl'), '');
141
+ await assert.rejects(exportSessionHistory({ session: 'pretend-id', codexHomeDir: home }), /No local session/);
142
+ const document = await exportSessionHistory({ session: 'valid-id', codexHomeDir: home });
143
+ assert.equal(document.skipped_records, 3);
144
+ assert.equal(document.entries[0].text, 'still readable');
145
+ assert.match(renderSessionMarkdown(document), /Skipped malformed records: 3/);
146
+ }
147
+ finally {
148
+ await rm(home, { recursive: true, force: true });
149
+ }
150
+ });
151
+ it('uses text and media placeholders without exporting binary data or arbitrary content fields', async () => {
152
+ const home = await mkdtemp(join(tmpdir(), 'omx-export-media-'));
153
+ try {
154
+ await writeTranscript(home, 'media-session', [{
155
+ type: 'response_item', payload: { type: 'message', role: 'user', content: [
156
+ { type: 'input_text', text: 'Describe this' },
157
+ { type: 'input_image', image_url: 'data:image/png;base64,private-bytes' },
158
+ { type: 'input_audio', data: 'private-audio' },
159
+ { type: 'unknown', instructions: 'private-instructions' },
160
+ ] },
161
+ }]);
162
+ const document = await exportSessionHistory({ session: 'media-session', codexHomeDir: home });
163
+ assert.equal(document.entries[0].text, 'Describe this\n[Image]\n[Audio]');
164
+ assert.doesNotMatch(JSON.stringify(document), /private-/);
165
+ }
166
+ finally {
167
+ await rm(home, { recursive: true, force: true });
168
+ }
169
+ });
170
+ it('discovers associated project runtime homes when no explicit home is supplied', async () => {
171
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-export-runtime-'));
172
+ const previousHome = process.env.CODEX_HOME;
173
+ try {
174
+ process.env.CODEX_HOME = join(cwd, 'empty-home');
175
+ const runtimeHome = join(cwd, '.omx', 'runtime', 'codex-home', 'omx-runtime-export');
176
+ await writeTranscript(runtimeHome, 'runtime-session', [message('assistant', 'runtime answer')]);
177
+ const document = await exportSessionHistory({ session: 'runtime-session', cwd });
178
+ assert.equal(document.entries[0].text, 'runtime answer');
179
+ }
180
+ finally {
181
+ if (previousHome === undefined)
182
+ delete process.env.CODEX_HOME;
183
+ else
184
+ process.env.CODEX_HOME = previousHome;
185
+ await rm(cwd, { recursive: true, force: true });
186
+ }
187
+ });
188
+ it('does not follow symlinked rollout files', { skip: process.platform === 'win32' }, async () => {
189
+ const root = await mkdtemp(join(tmpdir(), 'omx-export-symlink-'));
190
+ try {
191
+ const home = join(root, 'home');
192
+ const outside = await writeTranscript(join(root, 'outside'), 'outside-session', [message('user', 'outside')]);
193
+ await mkdir(join(home, 'sessions'), { recursive: true });
194
+ await symlink(outside, join(home, 'sessions', 'rollout-linked.jsonl'));
195
+ await assert.rejects(exportSessionHistory({ session: 'outside-session', codexHomeDir: home }), /No local session/);
196
+ }
197
+ finally {
198
+ await rm(root, { recursive: true, force: true });
199
+ }
200
+ });
201
+ });
202
+ describe('renderSessionMarkdown', () => {
203
+ it('preserves message formatting and fences tool output containing backticks', () => {
204
+ const markdown = renderSessionMarkdown({
205
+ schema_version: 1, session_id: 'id`value', cwd: '/a\n# title', started_at: null,
206
+ archived: true, skipped_records: 0,
207
+ entries: [
208
+ { kind: 'message', role: 'assistant', timestamp: null, line_number: 2, text: 'A paragraph.\n\n```js\nanswer();\n```' },
209
+ { kind: 'tool_output', name: 'exec', call_id: 'call-1', timestamp, line_number: 3, text: '```\nquoted code\n```' },
210
+ ],
211
+ });
212
+ assert.match(markdown, /Session: `` id`value ``/);
213
+ assert.match(markdown, /Project: ` \/a # title `/);
214
+ assert.match(markdown, /A paragraph\.\n\n```js\nanswer\(\);\n```/);
215
+ assert.match(markdown, /````\n```\nquoted code\n```\n````/);
216
+ assert.match(markdown, /Archived: yes/);
217
+ });
218
+ it('renders empty sessions explicitly', () => {
219
+ assert.match(renderSessionMarkdown({
220
+ schema_version: 1, session_id: 'empty', cwd: null, started_at: null,
221
+ archived: false, skipped_records: 0, entries: [],
222
+ }), /No exportable messages/);
223
+ });
224
+ });
225
+ //# sourceMappingURL=export.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.test.js","sourceRoot":"","sources":["../../../src/session-history/__tests__/export.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type SessionSearchOptions } from './search.js';
2
+ export interface SessionExportOptions extends Pick<SessionSearchOptions, 'cwd' | 'codexHomeDir' | 'codexHomeDirs'> {
3
+ session: string;
4
+ includeTools?: boolean;
5
+ }
6
+ interface EntryLocation {
7
+ timestamp: string | null;
8
+ line_number: number;
9
+ text: string;
10
+ }
11
+ export type SessionExportEntry = EntryLocation & ({
12
+ kind: 'message';
13
+ role: 'user' | 'assistant';
14
+ } | {
15
+ kind: 'tool_call' | 'tool_output';
16
+ name: string | null;
17
+ call_id: string | null;
18
+ });
19
+ export interface SessionExportDocument {
20
+ schema_version: 1;
21
+ session_id: string;
22
+ started_at: string | null;
23
+ cwd: string | null;
24
+ archived: boolean;
25
+ skipped_records: number;
26
+ entries: SessionExportEntry[];
27
+ }
28
+ export declare function exportSessionHistory(options: SessionExportOptions): Promise<SessionExportDocument>;
29
+ export declare function renderSessionMarkdown(document: SessionExportDocument): string;
30
+ export {};
31
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/session-history/export.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuD,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAI7G,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,cAAc,GAAG,eAAe,CAAC;IAChH,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,CAC7C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,WAAW,GAAG,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CACrF,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,CAAC,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAuGD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAkExG;AAaD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CA4B7E"}
@@ -0,0 +1,225 @@
1
+ import { createReadStream } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createInterface } from 'node:readline';
4
+ import { listRolloutFiles, resolveSessionSearchCodexHomeDirs } from './search.js';
5
+ function asObject(value) {
6
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
7
+ ? value : null;
8
+ }
9
+ function asString(value) {
10
+ return typeof value === 'string' && value !== '' ? value : null;
11
+ }
12
+ function parseRecord(line) {
13
+ try {
14
+ return asObject(JSON.parse(line));
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ async function* readLines(path) {
21
+ const stream = createReadStream(path, 'utf-8');
22
+ const reader = createInterface({ input: stream, crlfDelay: Infinity });
23
+ try {
24
+ for await (const line of reader)
25
+ yield line;
26
+ }
27
+ finally {
28
+ reader.close();
29
+ stream.destroy();
30
+ }
31
+ }
32
+ async function readTranscriptMeta(path, archived) {
33
+ try {
34
+ for await (const line of readLines(path)) {
35
+ const record = parseRecord(line);
36
+ const payload = asObject(record?.payload);
37
+ const id = asString(payload?.id);
38
+ if (record?.type !== 'session_meta' || !id)
39
+ return null;
40
+ return {
41
+ path, id, archived,
42
+ startedAt: asString(payload?.timestamp) ?? asString(record.timestamp),
43
+ cwd: asString(payload?.cwd),
44
+ };
45
+ }
46
+ }
47
+ catch (error) {
48
+ // A running Codex instance can move a transcript into the archive during discovery.
49
+ if (error.code !== 'ENOENT')
50
+ throw error;
51
+ }
52
+ return null;
53
+ }
54
+ async function resolveTranscript(options) {
55
+ const selector = options.session.trim();
56
+ if (!selector)
57
+ throw new Error('Missing session id. Use an exact id or a unique prefix.');
58
+ const matches = [];
59
+ const homes = await resolveSessionSearchCodexHomeDirs(options);
60
+ for (const home of homes) {
61
+ for (const archived of [false, true]) {
62
+ const files = await listRolloutFiles(join(home, archived ? 'archived_sessions' : 'sessions'));
63
+ for (const file of files) {
64
+ const meta = await readTranscriptMeta(file, archived);
65
+ if (meta?.id.startsWith(selector))
66
+ matches.push(meta);
67
+ }
68
+ }
69
+ }
70
+ const exact = matches.filter((match) => match.id === selector);
71
+ const candidates = exact.length > 0 ? exact : matches;
72
+ if (candidates.length === 0)
73
+ throw new Error(`No local session matches "${selector}".`);
74
+ if (candidates.length > 1) {
75
+ const ids = [...new Set(candidates.map((match) => match.id))].sort().join(', ');
76
+ throw new Error(`Multiple transcripts match "${selector}" (${ids}). Use a full session id and --codex-home to narrow the source.`);
77
+ }
78
+ return candidates[0];
79
+ }
80
+ function messageText(content) {
81
+ if (typeof content === 'string')
82
+ return content;
83
+ if (!Array.isArray(content))
84
+ return '';
85
+ return content.flatMap((item) => {
86
+ const block = asObject(item);
87
+ if (!block)
88
+ return typeof item === 'string' ? [item] : [];
89
+ if (block.type === 'input_text' || block.type === 'output_text' || block.type === 'text') {
90
+ return typeof block.text === 'string' ? [block.text] : [];
91
+ }
92
+ if (block.type === 'input_image' || block.type === 'image')
93
+ return ['[Image]'];
94
+ if (block.type === 'input_audio' || block.type === 'audio')
95
+ return ['[Audio]'];
96
+ return [];
97
+ }).join('\n');
98
+ }
99
+ function toolText(value) {
100
+ if (typeof value === 'string')
101
+ return value;
102
+ if (value === undefined)
103
+ return '';
104
+ return JSON.stringify(value, null, 2);
105
+ }
106
+ export async function exportSessionHistory(options) {
107
+ const transcript = await resolveTranscript(options);
108
+ const messages = [];
109
+ const eventMessages = [];
110
+ const tools = [];
111
+ const toolNames = new Map();
112
+ let lineNumber = 0;
113
+ let skippedRecords = 0;
114
+ for await (const line of readLines(transcript.path)) {
115
+ lineNumber += 1;
116
+ if (line.trim() === '')
117
+ continue;
118
+ const record = parseRecord(line);
119
+ if (lineNumber === 1 && (record?.type !== 'session_meta' || asObject(record.payload)?.id !== transcript.id)) {
120
+ throw new Error('The selected transcript changed during export. Try again.');
121
+ }
122
+ if (!record) {
123
+ skippedRecords += 1;
124
+ continue;
125
+ }
126
+ const payload = asObject(record.payload);
127
+ if (!payload)
128
+ continue;
129
+ const location = { timestamp: asString(record.timestamp), line_number: lineNumber };
130
+ if (record.type === 'response_item' && payload.type === 'message') {
131
+ if (payload.role !== 'user' && payload.role !== 'assistant')
132
+ continue;
133
+ if (payload.channel === 'analysis')
134
+ continue;
135
+ const text = messageText(payload.content);
136
+ if (text)
137
+ messages.push({ ...location, kind: 'message', role: payload.role, text });
138
+ }
139
+ else if (record.type === 'event_msg' && (payload.type === 'user_message' || payload.type === 'agent_message')) {
140
+ if (payload.channel === 'analysis')
141
+ continue;
142
+ const text = asString(payload.message);
143
+ if (text)
144
+ eventMessages.push({
145
+ ...location, kind: 'message', role: payload.type === 'user_message' ? 'user' : 'assistant', text,
146
+ });
147
+ }
148
+ else if (record.type === 'response_item' && options.includeTools) {
149
+ const callId = asString(payload.call_id);
150
+ if (payload.type === 'function_call' || payload.type === 'custom_tool_call') {
151
+ const name = asString(payload.name);
152
+ if (callId && name)
153
+ toolNames.set(callId, name);
154
+ tools.push({
155
+ ...location, kind: 'tool_call', name, call_id: callId,
156
+ text: toolText(payload.type === 'custom_tool_call' ? payload.input : payload.arguments),
157
+ });
158
+ }
159
+ else if (payload.type === 'function_call_output' || payload.type === 'custom_tool_call_output') {
160
+ tools.push({
161
+ ...location, kind: 'tool_output', call_id: callId,
162
+ name: callId ? toolNames.get(callId) ?? null : null,
163
+ text: toolText(payload.output),
164
+ });
165
+ }
166
+ }
167
+ }
168
+ // Codex writes event messages as well as response items for the same turn.
169
+ // Prefer response messages; event-only transcripts use the older event form.
170
+ const entries = [...(messages.length > 0 ? messages : eventMessages), ...tools]
171
+ .sort((left, right) => left.line_number - right.line_number);
172
+ return {
173
+ schema_version: 1,
174
+ session_id: transcript.id,
175
+ started_at: transcript.startedAt,
176
+ cwd: transcript.cwd,
177
+ archived: transcript.archived,
178
+ skipped_records: skippedRecords,
179
+ entries,
180
+ };
181
+ }
182
+ function codeDelimiter(text, minimum) {
183
+ const runs = text.match(/`+/g) ?? [];
184
+ return '`'.repeat(runs.reduce((length, run) => Math.max(length, run.length + 1), minimum));
185
+ }
186
+ function inlineCode(value) {
187
+ const text = value.replace(/[\r\n]/g, ' ');
188
+ const delimiter = codeDelimiter(text, 1);
189
+ return `${delimiter} ${text} ${delimiter}`;
190
+ }
191
+ export function renderSessionMarkdown(document) {
192
+ const lines = [
193
+ '# Session export', '',
194
+ `- Session: ${inlineCode(document.session_id)}`,
195
+ `- Started: ${inlineCode(document.started_at ?? 'unknown')}`,
196
+ `- Project: ${inlineCode(document.cwd ?? 'unknown')}`,
197
+ `- Archived: ${document.archived ? 'yes' : 'no'}`,
198
+ ];
199
+ if (document.skipped_records > 0) {
200
+ lines.push(`- Skipped malformed records: ${document.skipped_records}`);
201
+ }
202
+ if (document.entries.length === 0)
203
+ lines.push('', '_No exportable messages._');
204
+ for (const entry of document.entries) {
205
+ const title = entry.kind === 'message'
206
+ ? (entry.role === 'user' ? 'User' : 'Assistant')
207
+ : (entry.kind === 'tool_call' ? 'Tool call' : 'Tool output');
208
+ lines.push('', `## ${title}`, '');
209
+ if (entry.timestamp)
210
+ lines.push(`Time: ${inlineCode(entry.timestamp)}`, '');
211
+ if (entry.kind === 'message') {
212
+ lines.push(entry.text);
213
+ }
214
+ else {
215
+ if (entry.name)
216
+ lines.push(`Tool: ${inlineCode(entry.name)}`, '');
217
+ if (entry.call_id)
218
+ lines.push(`Call: ${inlineCode(entry.call_id)}`, '');
219
+ const fence = codeDelimiter(entry.text, 3);
220
+ lines.push(fence, entry.text, fence);
221
+ }
222
+ }
223
+ return `${lines.join('\n')}\n`;
224
+ }
225
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/session-history/export.ts"],"names":[],"mappings":"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"}
@@ -34,5 +34,6 @@ export interface SessionSearchSourceReport {
34
34
  }
35
35
  export declare function resolveSessionSearchCodexHomeDirs(options?: Pick<SessionSearchOptions, 'cwd' | 'codexHomeDir' | 'codexHomeDirs'>): Promise<string[]>;
36
36
  export declare function parseSinceSpec(value: string | undefined, now?: number): number | null;
37
+ export declare function listRolloutFiles(root: string): Promise<string[]>;
37
38
  export declare function searchSessionHistory(options: SessionSearchOptions): Promise<SessionSearchReport>;
38
39
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/session-history/search.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAkBD,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAkDD,wBAAsB,iCAAiC,CAAC,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,cAAc,GAAG,eAAe,CAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7J;AAUD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAsBzF;AAiSD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDtG"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/session-history/search.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAkBD,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAkDD,wBAAsB,iCAAiC,CAAC,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,cAAc,GAAG,eAAe,CAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7J;AAUD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAsBzF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBtE;AAwQD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDtG"}
@@ -92,7 +92,7 @@ export function parseSinceSpec(value, now = Date.now()) {
92
92
  return timestamp;
93
93
  throw new Error(`Invalid --since value "${value}". Use formats like 7d, 24h, or 2026-03-10.`);
94
94
  }
95
- async function listRolloutFiles(root) {
95
+ export async function listRolloutFiles(root) {
96
96
  if (!existsSync(root))
97
97
  return [];
98
98
  const files = [];