@pat-lewczuk/cezar 0.1.2 → 0.1.4

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 (164) hide show
  1. package/README.md +249 -45
  2. package/dist/config.d.ts +8 -0
  3. package/dist/config.js +6 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/core/agent-runner.d.ts +44 -2
  6. package/dist/core/agent-runner.js +8 -2
  7. package/dist/core/agent-runner.js.map +1 -1
  8. package/dist/core/backend-detect.d.ts +6 -4
  9. package/dist/core/backend-detect.js +44 -4
  10. package/dist/core/backend-detect.js.map +1 -1
  11. package/dist/core/claude-cli-runner.d.ts +3 -25
  12. package/dist/core/claude-cli-runner.js +2 -19
  13. package/dist/core/claude-cli-runner.js.map +1 -1
  14. package/dist/core/claude-ui-mapper.d.ts +57 -0
  15. package/dist/core/claude-ui-mapper.js +370 -0
  16. package/dist/core/claude-ui-mapper.js.map +1 -0
  17. package/dist/core/codex-app-server-runner.d.ts +29 -0
  18. package/dist/core/codex-app-server-runner.js +452 -0
  19. package/dist/core/codex-app-server-runner.js.map +1 -0
  20. package/dist/core/codex-ui-mapper.d.ts +53 -0
  21. package/dist/core/codex-ui-mapper.js +411 -0
  22. package/dist/core/codex-ui-mapper.js.map +1 -0
  23. package/dist/core/ndjson.d.ts +6 -0
  24. package/dist/core/ndjson.js +23 -0
  25. package/dist/core/ndjson.js.map +1 -0
  26. package/dist/core/opencode-server-runner.d.ts +30 -0
  27. package/dist/core/opencode-server-runner.js +451 -0
  28. package/dist/core/opencode-server-runner.js.map +1 -0
  29. package/dist/core/opencode-ui-mapper.d.ts +105 -0
  30. package/dist/core/opencode-ui-mapper.js +578 -0
  31. package/dist/core/opencode-ui-mapper.js.map +1 -0
  32. package/dist/core/process-usage.d.ts +63 -0
  33. package/dist/core/process-usage.js +181 -0
  34. package/dist/core/process-usage.js.map +1 -0
  35. package/dist/core/runner-factory.d.ts +8 -0
  36. package/dist/core/runner-factory.js +22 -0
  37. package/dist/core/runner-factory.js.map +1 -0
  38. package/dist/core/tool-display.d.ts +27 -0
  39. package/dist/core/tool-display.js +150 -0
  40. package/dist/core/tool-display.js.map +1 -0
  41. package/dist/core/ui-events.d.ts +294 -0
  42. package/dist/core/ui-events.js +25 -0
  43. package/dist/core/ui-events.js.map +1 -0
  44. package/dist/index.js +0 -0
  45. package/dist/pack-check.d.ts +17 -0
  46. package/dist/pack-check.js +27 -0
  47. package/dist/pack-check.js.map +1 -0
  48. package/dist/planner.js +7 -3
  49. package/dist/planner.js.map +1 -1
  50. package/dist/runs/store.d.ts +5 -0
  51. package/dist/runs/store.js +3 -0
  52. package/dist/runs/store.js.map +1 -1
  53. package/dist/runs/title-summary.d.ts +15 -0
  54. package/dist/runs/title-summary.js +84 -0
  55. package/dist/runs/title-summary.js.map +1 -0
  56. package/dist/runs/ui-event-sink.d.ts +81 -0
  57. package/dist/runs/ui-event-sink.js +210 -0
  58. package/dist/runs/ui-event-sink.js.map +1 -0
  59. package/dist/server/capabilities.d.ts +18 -0
  60. package/dist/server/capabilities.js +23 -0
  61. package/dist/server/capabilities.js.map +1 -0
  62. package/dist/server/forge/github.d.ts +39 -0
  63. package/dist/server/forge/github.js +369 -0
  64. package/dist/server/forge/github.js.map +1 -0
  65. package/dist/server/forge/index.d.ts +24 -0
  66. package/dist/server/forge/index.js +45 -0
  67. package/dist/server/forge/index.js.map +1 -0
  68. package/dist/server/forge/types.d.ts +80 -0
  69. package/dist/server/forge/types.js +2 -0
  70. package/dist/server/forge/types.js.map +1 -0
  71. package/dist/server/git-changes.d.ts +182 -0
  72. package/dist/server/git-changes.js +424 -0
  73. package/dist/server/git-changes.js.map +1 -0
  74. package/dist/server/open-in-app.d.ts +19 -0
  75. package/dist/server/open-in-app.js +134 -0
  76. package/dist/server/open-in-app.js.map +1 -0
  77. package/dist/server/server.js +34 -10
  78. package/dist/server/server.js.map +1 -1
  79. package/dist/server/static-ui.d.ts +49 -0
  80. package/dist/server/static-ui.js +92 -0
  81. package/dist/server/static-ui.js.map +1 -0
  82. package/dist/update-check.d.ts +12 -0
  83. package/dist/update-check.js +41 -0
  84. package/dist/update-check.js.map +1 -0
  85. package/dist/workflows/run.d.ts +3 -0
  86. package/dist/workflows/run.js +22 -7
  87. package/dist/workflows/run.js.map +1 -1
  88. package/dist/workflows/types.d.ts +16 -0
  89. package/dist/workflows/types.js +3 -1
  90. package/dist/workflows/types.js.map +1 -1
  91. package/package.json +1 -1
  92. package/web/app/node_modules/.vite/vitest/ca84d1343b96baa8137c943ed1860e522cacb238/results.json +1 -0
  93. package/web/app/src/components/app-shell-container.tsx +76 -0
  94. package/web/app.js +145 -18
  95. package/web/dist/assets/arrow-left-BE957rJs.js +1 -0
  96. package/web/dist/assets/bundle-mjs-DLPpRFyl.js +1 -0
  97. package/web/dist/assets/chunk-BO2N2NFS-f5igTtpB.js +131 -0
  98. package/web/dist/assets/compare-variants-D6fPL9cS.js +1 -0
  99. package/web/dist/assets/core-BuMqAF_1.js +12 -0
  100. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  101. package/web/dist/assets/dialog-BEgEWFDS.js +1 -0
  102. package/web/dist/assets/diff-view-CctnJHWe.js +4 -0
  103. package/web/dist/assets/diff-woXpYk--.js +1 -0
  104. package/web/dist/assets/dist-CW7M_Jhs.js +1 -0
  105. package/web/dist/assets/ellipsis-vertical-DJPAfccS.js +1 -0
  106. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  107. package/web/dist/assets/folder-RbRLfIX-.js +1 -0
  108. package/web/dist/assets/git-pull-request-DJkAMT0f.js +1 -0
  109. package/web/dist/assets/git-toolbar-D8OPPqBP.js +1 -0
  110. package/web/dist/assets/github-BYIHwIJB.js +1 -0
  111. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  112. package/web/dist/assets/highlighted-body-OFNGDK62-DGHHie_q.js +1 -0
  113. package/web/dist/assets/highlighter-BKVEsACy.js +3 -0
  114. package/web/dist/assets/html-BY76lXLH.js +1 -0
  115. package/web/dist/assets/index-9qG98Orw.js +11 -0
  116. package/web/dist/assets/index-Bz_r8Jt3.css +2 -0
  117. package/web/dist/assets/input-BRsSo4xH.js +1 -0
  118. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  119. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  120. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  121. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  122. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  123. package/web/dist/assets/json-qhed-kSA.js +1 -0
  124. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  125. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  126. package/web/dist/assets/lib-CNGa3Dig.js +1 -0
  127. package/web/dist/assets/loader-circle-BV3DO9mE.js +1 -0
  128. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  129. package/web/dist/assets/markdown-CR_HLGTs.js +1 -0
  130. package/web/dist/assets/mermaid-GHXKKRXX-DM2VsGBG.js +1 -0
  131. package/web/dist/assets/open-mercato-toBr6SOa.svg +11 -0
  132. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  133. package/web/dist/assets/react-dom-Ddtik4qM.js +1 -0
  134. package/web/dist/assets/refresh-cw-DCa-Rlwz.js +1 -0
  135. package/web/dist/assets/repo-git-XTqlVOl2.js +1 -0
  136. package/web/dist/assets/run-diff-C7mfxj7f.js +3 -0
  137. package/web/dist/assets/run-header-CfVeY3uM.js +1 -0
  138. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  139. package/web/dist/assets/search-x-CoCyl7zT.js +1 -0
  140. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  141. package/web/dist/assets/skill-detail-C9cniyId.js +1 -0
  142. package/web/dist/assets/skills-DXgY1uXJ.js +1 -0
  143. package/web/dist/assets/skills-ynuO5oCr.js +1 -0
  144. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  145. package/web/dist/assets/square-terminal-B6PZX4Qp.js +1 -0
  146. package/web/dist/assets/tab-link-phWEqSBy.js +1 -0
  147. package/web/dist/assets/task-changes-DYwnPnTN.js +1 -0
  148. package/web/dist/assets/task-commits-DZzxEzbn.js +1 -0
  149. package/web/dist/assets/task-files-FOAAz2FB.js +2 -0
  150. package/web/dist/assets/task-thread-Bncxe8Os.js +5 -0
  151. package/web/dist/assets/toaster-BS2E1bhz.js +43 -0
  152. package/web/dist/assets/trash-2-CDtxmmc8.js +1 -0
  153. package/web/dist/assets/triangle-alert-6su4Js5O.js +1 -0
  154. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  155. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  156. package/web/dist/assets/upload-Bp7hQxll.js +1 -0
  157. package/web/dist/assets/use-desktop-eHm2iTXX.js +3 -0
  158. package/web/dist/assets/utils-rQGbOrwc.js +1 -0
  159. package/web/dist/assets/workflows-Dg2wQg6i.js +11 -0
  160. package/web/dist/assets/x-Br_jIDBw.js +1 -0
  161. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  162. package/web/dist/index.html +67 -0
  163. package/web/index.html +1 -0
  164. package/web/style.css +28 -8
@@ -0,0 +1,452 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { AUTO_END_DELAY_MS, DEFAULT_RUN_TIMEOUT_MS, EOF_KILL_GRACE_MS, EOF_TERM_GRACE_MS, KILL_GRACE_MS, } from './claude-cli-runner.js';
3
+ import { readNdjson } from './ndjson.js';
4
+ /**
5
+ * `AgentRunner` over `codex app-server` — the same JSONL transport the VS Code
6
+ * extension and desktop app use (JSON-RPC 2.0, newline-delimited, over
7
+ * stdin/stdout). One long-lived process per session gives Codex the same
8
+ * multi-turn shape as the Claude runner: `turn/start` for a new turn,
9
+ * `turn/steer` for a mid-turn follow-up, `turn/interrupt` to cancel, and
10
+ * `thread/resume` to reopen a stored thread for "Continue".
11
+ *
12
+ * Auth = the host's logged-in ChatGPT/Codex session (or CODEX_API_KEY). The
13
+ * agent runs autonomously via `sandbox: workspace-write` + `approvalPolicy:
14
+ * never` — Codex has no per-tool allowlist, so `spec.allowedTools` is ignored.
15
+ */
16
+ export class CodexAppServerRunner {
17
+ backend = 'codex';
18
+ bin;
19
+ timeoutMs;
20
+ lastSession = null;
21
+ constructor(opts = {}) {
22
+ this.bin = opts.bin ?? process.env.CEZ_CODEX_BIN ?? 'codex';
23
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_RUN_TIMEOUT_MS;
24
+ }
25
+ run(spec, onEvent) {
26
+ return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
27
+ }
28
+ async interrupt() {
29
+ this.lastSession?.interrupt();
30
+ }
31
+ startSession(spec, onEvent, opts = {}) {
32
+ const session = new CodexSession(this.bin, this.timeoutMs, spec, onEvent, opts);
33
+ this.lastSession = session;
34
+ return session;
35
+ }
36
+ }
37
+ /** One live `codex app-server` process driving a single thread. */
38
+ class CodexSession {
39
+ bin;
40
+ spec;
41
+ onEvent;
42
+ opts;
43
+ result;
44
+ child;
45
+ stdinOpen = true;
46
+ threadId;
47
+ activeTurnId;
48
+ nextId = 1;
49
+ pending = new Map();
50
+ toolCalls = [];
51
+ textChunks = [];
52
+ /** agentMessage item ids that streamed deltas — so `item/completed` for the
53
+ * same item doesn't re-emit the full text on top of the deltas. */
54
+ streamedItems = new Set();
55
+ tokensUsed = 0;
56
+ ready;
57
+ autoEndTimer;
58
+ eofTermTimer;
59
+ eofKillTimer;
60
+ spawnFailed = null;
61
+ timedOut = false;
62
+ constructor(bin, timeoutMs, spec, onEvent, opts) {
63
+ this.bin = bin;
64
+ this.spec = spec;
65
+ this.onEvent = onEvent;
66
+ this.opts = opts;
67
+ try {
68
+ this.child = nodeSpawn(bin, ['app-server'], {
69
+ cwd: spec.cwd,
70
+ env: { ...process.env, ...spec.env },
71
+ });
72
+ }
73
+ catch (err) {
74
+ throw wrapSpawnError(err, bin);
75
+ }
76
+ this.child.on('error', (err) => {
77
+ this.spawnFailed = wrapSpawnError(err, bin);
78
+ });
79
+ const stderrChunks = [];
80
+ this.child.stderr.setEncoding('utf8');
81
+ this.child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
82
+ // Optional wall-clock kill switch (disabled for interactive sessions).
83
+ const limitMs = spec.timeoutMs ?? timeoutMs;
84
+ let killTimer;
85
+ let deadline;
86
+ if (limitMs > 0) {
87
+ deadline = setTimeout(() => {
88
+ this.timedOut = true;
89
+ this.interrupt();
90
+ this.child.stdout.destroy();
91
+ killTimer = setTimeout(() => {
92
+ if (this.child.exitCode == null && !this.child.killed)
93
+ this.child.kill('SIGKILL');
94
+ }, KILL_GRACE_MS);
95
+ killTimer.unref?.();
96
+ }, limitMs);
97
+ deadline.unref?.();
98
+ }
99
+ // Handshake → thread → first turn. Kicked off concurrently with the read
100
+ // loop below (which resolves the request() promises this awaits).
101
+ this.ready = this.bootstrap();
102
+ this.result = (async () => {
103
+ try {
104
+ for await (const line of readNdjson(this.child.stdout)) {
105
+ if (this.timedOut)
106
+ break;
107
+ let msg;
108
+ try {
109
+ msg = JSON.parse(line);
110
+ }
111
+ catch {
112
+ continue; // not JSON-RPC — skip
113
+ }
114
+ this.dispatch(msg);
115
+ }
116
+ }
117
+ catch (err) {
118
+ if (!this.timedOut)
119
+ throw err;
120
+ }
121
+ finally {
122
+ if (deadline)
123
+ clearTimeout(deadline);
124
+ if (killTimer)
125
+ clearTimeout(killTimer);
126
+ if (this.autoEndTimer)
127
+ clearTimeout(this.autoEndTimer);
128
+ this.stdinOpen = false;
129
+ }
130
+ const exitCode = await waitForExit(this.child);
131
+ if (this.eofTermTimer)
132
+ clearTimeout(this.eofTermTimer);
133
+ if (this.eofKillTimer)
134
+ clearTimeout(this.eofKillTimer);
135
+ for (const p of this.pending.values())
136
+ p.reject(new Error('codex app-server exited'));
137
+ this.pending.clear();
138
+ if (this.spawnFailed)
139
+ throw this.spawnFailed;
140
+ const text = this.textChunks.join('\n').trim();
141
+ const base = {
142
+ text,
143
+ toolCalls: this.toolCalls,
144
+ tokensUsed: this.tokensUsed,
145
+ sessionId: this.threadId ?? spec.sessionId,
146
+ };
147
+ if (this.timedOut) {
148
+ const mins = Math.round((limitMs / 60_000) * 10) / 10;
149
+ this.emit({ type: 'error', message: `codex app-server timed out after ${mins}m and was killed` });
150
+ this.emit({ type: 'done' });
151
+ return base;
152
+ }
153
+ if (exitCode !== 0 && exitCode !== null) {
154
+ const stderr = stderrChunks.join('').trim();
155
+ const detail = stderr ? ` — ${stderr.split('\n').slice(-3).join(' | ')}` : '';
156
+ const message = `codex app-server exited with code ${exitCode}${detail}`;
157
+ this.emit({ type: 'error', message });
158
+ throw new Error(message);
159
+ }
160
+ this.emit({ type: 'done' });
161
+ return base;
162
+ })();
163
+ }
164
+ get open() {
165
+ return this.stdinOpen;
166
+ }
167
+ sendMessage(content) {
168
+ if (!this.stdinOpen)
169
+ return false;
170
+ if (this.autoEndTimer) {
171
+ clearTimeout(this.autoEndTimer);
172
+ this.autoEndTimer = undefined;
173
+ }
174
+ const text = textOf(content);
175
+ if (!text)
176
+ return true;
177
+ // Wait for the thread to exist, then steer the live turn or start a new one.
178
+ void this.ready
179
+ .then(() => this.startOrSteerTurn(text))
180
+ .catch((err) => {
181
+ const message = err instanceof Error ? err.message : String(err);
182
+ this.emit({ type: 'note', message: `codex: turn failed: ${message}` });
183
+ });
184
+ return true;
185
+ }
186
+ end() {
187
+ if (!this.stdinOpen)
188
+ return;
189
+ this.stdinOpen = false;
190
+ try {
191
+ this.child.stdin.end();
192
+ }
193
+ catch {
194
+ // already gone
195
+ }
196
+ this.eofTermTimer = setTimeout(() => {
197
+ if (this.child.exitCode == null && !this.child.killed)
198
+ this.child.kill('SIGTERM');
199
+ this.eofKillTimer = setTimeout(() => {
200
+ if (this.child.exitCode == null && !this.child.killed)
201
+ this.child.kill('SIGKILL');
202
+ }, EOF_KILL_GRACE_MS);
203
+ this.eofKillTimer.unref?.();
204
+ }, EOF_TERM_GRACE_MS);
205
+ this.eofTermTimer.unref?.();
206
+ }
207
+ interrupt() {
208
+ this.stdinOpen = false;
209
+ // Best-effort graceful cancel of the in-flight turn, then hard stop.
210
+ if (this.threadId && this.activeTurnId) {
211
+ void this.request('turn/interrupt', { threadId: this.threadId, turnId: this.activeTurnId }).catch(() => undefined);
212
+ }
213
+ if (!this.child.killed)
214
+ this.child.kill('SIGTERM');
215
+ }
216
+ // ---- protocol -----------------------------------------------------------
217
+ async bootstrap() {
218
+ await this.request('initialize', {
219
+ clientInfo: { name: 'cezar', title: 'cezar', version: '0.1.0' },
220
+ capabilities: { experimentalApi: true },
221
+ });
222
+ this.notify('initialized', {});
223
+ const overrides = {
224
+ model: this.spec.model,
225
+ cwd: this.spec.cwd,
226
+ sandbox: 'workspace-write',
227
+ approvalPolicy: 'never',
228
+ };
229
+ if (this.spec.resume && this.spec.sessionId) {
230
+ await this.request('thread/resume', { threadId: this.spec.sessionId, ...clean(overrides) });
231
+ this.threadId = this.spec.sessionId;
232
+ }
233
+ else {
234
+ const res = await this.request('thread/start', clean(overrides));
235
+ this.threadId = threadIdOf(res) ?? this.spec.sessionId;
236
+ }
237
+ if (this.threadId)
238
+ this.emit({ type: 'session', sessionId: this.threadId });
239
+ // Seed the first turn. The system prompt (skill body + handoff contract)
240
+ // has no dedicated app-server field, so it rides along as a leading block
241
+ // of the opening message.
242
+ const first = this.spec.systemPrompt
243
+ ? `${this.spec.systemPrompt}\n\n---\n\n${this.spec.userPrompt}`
244
+ : this.spec.userPrompt;
245
+ await this.startOrSteerTurn(first);
246
+ }
247
+ async startOrSteerTurn(text) {
248
+ if (!this.threadId)
249
+ return;
250
+ const input = [{ type: 'text', text, text_elements: [] }];
251
+ if (this.activeTurnId) {
252
+ await this.request('turn/steer', {
253
+ threadId: this.threadId,
254
+ input,
255
+ expectedTurnId: this.activeTurnId,
256
+ });
257
+ return;
258
+ }
259
+ const res = await this.request('turn/start', { threadId: this.threadId, input });
260
+ this.activeTurnId = turnIdOf(res) ?? this.activeTurnId;
261
+ }
262
+ request(method, params) {
263
+ const id = this.nextId++;
264
+ const promise = new Promise((resolve, reject) => {
265
+ this.pending.set(id, { resolve, reject });
266
+ });
267
+ this.write({ id, method, params });
268
+ return promise;
269
+ }
270
+ notify(method, params) {
271
+ this.write({ method, params });
272
+ }
273
+ write(obj) {
274
+ if (this.child.stdin.destroyed)
275
+ return;
276
+ try {
277
+ this.child.stdin.write(`${JSON.stringify(obj)}\n`);
278
+ }
279
+ catch {
280
+ // stdin gone — the read loop will settle the session
281
+ }
282
+ }
283
+ dispatch(msg) {
284
+ if (typeof msg.id === 'number' && (msg.result !== undefined || msg.error !== undefined)) {
285
+ const p = this.pending.get(msg.id);
286
+ if (!p)
287
+ return;
288
+ this.pending.delete(msg.id);
289
+ if (msg.error)
290
+ p.reject(new Error(errorText(msg.error)));
291
+ else
292
+ p.resolve(msg.result ?? {});
293
+ return;
294
+ }
295
+ if (typeof msg.method === 'string')
296
+ this.handleNotification(msg.method, msg.params ?? {});
297
+ }
298
+ handleNotification(method, params) {
299
+ switch (method) {
300
+ case 'turn/started': {
301
+ this.activeTurnId = turnIdOf(params) ?? this.activeTurnId;
302
+ break;
303
+ }
304
+ case 'item/agentMessage/delta': {
305
+ const delta = typeof params.delta === 'string' ? params.delta : '';
306
+ if (delta) {
307
+ const itemId = stringField(params, 'itemId');
308
+ if (itemId)
309
+ this.streamedItems.add(itemId);
310
+ this.textChunks.push(delta);
311
+ this.emit({ type: 'text', text: delta });
312
+ }
313
+ break;
314
+ }
315
+ case 'item/started': {
316
+ const item = params.item ?? {};
317
+ const type = stringField(item, 'type');
318
+ // Only tool-like items become tool events; message/reasoning stream as text.
319
+ if (type && !NON_TOOL_ITEMS.has(type)) {
320
+ const id = stringField(item, 'id') ?? `item-${this.nextId++}`;
321
+ this.toolCalls.push({ id, name: type, input: item });
322
+ this.emit({ type: 'tool-call', id, tool: type, input: item });
323
+ }
324
+ break;
325
+ }
326
+ case 'item/completed': {
327
+ const item = params.item ?? {};
328
+ const type = stringField(item, 'type');
329
+ const id = stringField(item, 'id') ?? '';
330
+ if (type === 'agentMessage') {
331
+ // Some turns only send the final item (no deltas) → emit it then.
332
+ if (!id || !this.streamedItems.has(id)) {
333
+ const text = typeof item.text === 'string' ? item.text : '';
334
+ if (text) {
335
+ this.textChunks.push(text);
336
+ this.emit({ type: 'text', text });
337
+ }
338
+ }
339
+ }
340
+ else if (type && !NON_TOOL_ITEMS.has(type) && id) {
341
+ this.emit({
342
+ type: 'tool-result',
343
+ toolCallId: id,
344
+ result: safeStringify(item),
345
+ isError: /error|failed/i.test(stringField(item, 'status') ?? ''),
346
+ });
347
+ }
348
+ break;
349
+ }
350
+ case 'thread/tokenUsage/updated': {
351
+ const total = tokenTotal(params);
352
+ if (total > 0) {
353
+ this.tokensUsed = total;
354
+ this.emit({ type: 'token-usage', tokensUsed: this.tokensUsed });
355
+ }
356
+ break;
357
+ }
358
+ case 'turn/completed': {
359
+ this.activeTurnId = undefined;
360
+ this.emit({ type: 'turn-end' });
361
+ if (this.opts.autoEndAfterFirstTurn && this.stdinOpen && !this.autoEndTimer) {
362
+ this.autoEndTimer = setTimeout(() => this.end(), AUTO_END_DELAY_MS);
363
+ this.autoEndTimer.unref?.();
364
+ }
365
+ break;
366
+ }
367
+ default:
368
+ break;
369
+ }
370
+ }
371
+ emit(event) {
372
+ this.onEvent?.(event);
373
+ }
374
+ }
375
+ /** ThreadItem `type`s that are conversation text, not tool activity. */
376
+ const NON_TOOL_ITEMS = new Set(['agentMessage', 'userMessage', 'reasoning', 'plan']);
377
+ function textOf(content) {
378
+ return content
379
+ .filter((b) => b.type === 'text')
380
+ .map((b) => b.text)
381
+ .join('\n')
382
+ .trim();
383
+ }
384
+ /** Drop undefined values so we never send `"model": null` to the server. */
385
+ function clean(obj) {
386
+ const out = {};
387
+ for (const [k, v] of Object.entries(obj)) {
388
+ if (v !== undefined && v !== null)
389
+ out[k] = v;
390
+ }
391
+ return out;
392
+ }
393
+ function stringField(obj, key) {
394
+ const v = obj[key];
395
+ return typeof v === 'string' ? v : undefined;
396
+ }
397
+ function threadIdOf(res) {
398
+ const thread = res.thread;
399
+ return typeof thread?.id === 'string' ? thread.id : stringField(res, 'threadId');
400
+ }
401
+ function turnIdOf(obj) {
402
+ const turn = obj.turn;
403
+ return typeof turn?.id === 'string' ? turn.id : stringField(obj, 'turnId');
404
+ }
405
+ /** Cumulative tokens from a `thread/tokenUsage/updated` notification:
406
+ * `params.tokenUsage.total.totalTokens`. */
407
+ function tokenTotal(params) {
408
+ const usage = params.tokenUsage;
409
+ const total = usage?.total?.totalTokens;
410
+ return typeof total === 'number' ? total : 0;
411
+ }
412
+ function errorText(error) {
413
+ if (error && typeof error === 'object' && 'message' in error) {
414
+ return String(error.message);
415
+ }
416
+ return typeof error === 'string' ? error : JSON.stringify(error);
417
+ }
418
+ function safeStringify(value) {
419
+ try {
420
+ return JSON.stringify(value);
421
+ }
422
+ catch {
423
+ return String(value);
424
+ }
425
+ }
426
+ function waitForExit(child) {
427
+ if (child.exitCode != null)
428
+ return Promise.resolve(child.exitCode);
429
+ return new Promise((resolve) => {
430
+ let done = false;
431
+ const fin = (code) => {
432
+ if (done)
433
+ return;
434
+ done = true;
435
+ clearTimeout(safety);
436
+ resolve(code);
437
+ };
438
+ child.once('close', (code) => fin(code));
439
+ child.once('exit', (code) => fin(code));
440
+ child.once('error', () => fin(child.exitCode ?? null));
441
+ const safety = setTimeout(() => fin(child.exitCode ?? null), EOF_TERM_GRACE_MS + EOF_KILL_GRACE_MS + KILL_GRACE_MS + 5_000);
442
+ safety.unref?.();
443
+ });
444
+ }
445
+ function wrapSpawnError(err, bin) {
446
+ const code = err?.code;
447
+ if (code === 'ENOENT') {
448
+ return new Error(`\`${bin}\` not found on PATH — install the Codex CLI (npm i -g @openai/codex) and run \`codex\` once to log in`);
449
+ }
450
+ return err instanceof Error ? err : new Error(String(err));
451
+ }
452
+ //# sourceMappingURL=codex-app-server-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server-runner.js","sourceRoot":"","sources":["../../src/core/codex-app-server-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure codex app-server JSON-RPC → protocol-v2 mapper. `mapCodexNotification`
3
+ * folds one parsed JSONL frame into `UiEvent`s plus the next mapper state;
4
+ * the runner calls it ALONGSIDE the v1 path (v1 events keep flowing
5
+ * unchanged).
6
+ *
7
+ * Contract: `.ai/analysis/cockpit-ui-redesign/agent-event-protocols.md` §3
8
+ * (wire format) and §7.1 "Codex (app-server)" (the mapping). Golden fixtures
9
+ * replaying wire-faithful frame sequences live in `__fixtures__/codex/`.
10
+ *
11
+ * Robustness rule: input is untrusted wire data — the mapper never throws;
12
+ * responses, server→client requests (approval prompts — reserved for the
13
+ * `permission.*` events later) and unknown methods map to zero events.
14
+ *
15
+ * State is explicit and treated as immutable: callers thread the returned
16
+ * `state` into the next call. Ids are deterministic — codex items and turns
17
+ * carry stable wire ids which are reused verbatim (`turn_<n>` is minted only
18
+ * when a turn frame arrives without one) — so replaying a stored transcript
19
+ * reproduces the exact event sequence.
20
+ *
21
+ * Status map (§7.1, kills v1's regex-on-status hack): `inProgress→running`,
22
+ * `completed→completed`, `failed→failed`, `declined→declined`.
23
+ */
24
+ import type { UiEvent } from './ui-events.js';
25
+ export interface CodexUiMapperState {
26
+ /** True once `session.started` was emitted (thread/started notification or
27
+ * the runner's `codexSessionStarted` after the thread/start result —
28
+ * whichever lands first wins; the other is deduplicated). */
29
+ readonly sessionStarted: boolean;
30
+ /** Fallback counter for turn frames that arrive without a wire turn id. */
31
+ readonly turnSeq: number;
32
+ readonly currentTurnId: string | null;
33
+ /** Item ids already introduced — a delta for an unknown id synthesizes an
34
+ * `item.started` first so consumers always have something to upsert. */
35
+ readonly knownItems: ReadonlySet<string>;
36
+ /** Accumulated `outputDelta` text per commandExecution item, attached to
37
+ * the final snapshot when the wire `item/completed` carries no output. */
38
+ readonly outputs: ReadonlyMap<string, string>;
39
+ }
40
+ export interface CodexUiMapping {
41
+ events: UiEvent[];
42
+ state: CodexUiMapperState;
43
+ }
44
+ export declare function createCodexUiState(): CodexUiMapperState;
45
+ /**
46
+ * Codex confirms the thread via the `thread/start`/`thread/resume` RESULT
47
+ * (a response frame the mapper cannot attribute), so the runner calls this
48
+ * once the thread id is known. Deduplicated against the `thread/started`
49
+ * notification — whichever arrives first emits `session.started`.
50
+ */
51
+ export declare function codexSessionStarted(threadId: string, state: CodexUiMapperState): CodexUiMapping;
52
+ /** Fold one parsed JSON-RPC frame into v2 events. Never throws. */
53
+ export declare function mapCodexNotification(frame: unknown, state: CodexUiMapperState): CodexUiMapping;