@open-mercato/cezar 0.8.0 → 0.9.0-pr470.650

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 (247) hide show
  1. package/README.md +109 -14
  2. package/dist/agent-config/catalog.d.ts +64 -0
  3. package/dist/agent-config/catalog.js +205 -0
  4. package/dist/agent-config/catalog.js.map +1 -0
  5. package/dist/agent-config/files.d.ts +46 -0
  6. package/dist/agent-config/files.js +119 -0
  7. package/dist/agent-config/files.js.map +1 -0
  8. package/dist/agent-config/seed.d.ts +7 -0
  9. package/dist/agent-config/seed.js +90 -0
  10. package/dist/agent-config/seed.js.map +1 -0
  11. package/dist/agent-config/service.d.ts +44 -0
  12. package/dist/agent-config/service.js +71 -0
  13. package/dist/agent-config/service.js.map +1 -0
  14. package/dist/agent-config/validate.d.ts +21 -0
  15. package/dist/agent-config/validate.js +76 -0
  16. package/dist/agent-config/validate.js.map +1 -0
  17. package/dist/config.d.ts +34 -4
  18. package/dist/config.js +97 -2
  19. package/dist/config.js.map +1 -1
  20. package/dist/core/agent-env.js +21 -15
  21. package/dist/core/agent-env.js.map +1 -1
  22. package/dist/core/agent-runner.d.ts +16 -6
  23. package/dist/core/agent-runner.js +15 -3
  24. package/dist/core/agent-runner.js.map +1 -1
  25. package/dist/core/ask.d.ts +184 -0
  26. package/dist/core/ask.js +97 -0
  27. package/dist/core/ask.js.map +1 -0
  28. package/dist/core/backend-detect.d.ts +5 -5
  29. package/dist/core/backend-detect.js +37 -5
  30. package/dist/core/backend-detect.js.map +1 -1
  31. package/dist/core/claude-cli-runner.d.ts +17 -2
  32. package/dist/core/claude-cli-runner.js +8 -3
  33. package/dist/core/claude-cli-runner.js.map +1 -1
  34. package/dist/core/claude-ui-mapper.d.ts +9 -0
  35. package/dist/core/claude-ui-mapper.js +34 -3
  36. package/dist/core/claude-ui-mapper.js.map +1 -1
  37. package/dist/core/codex-app-server-runner.d.ts +15 -3
  38. package/dist/core/codex-app-server-runner.js +158 -127
  39. package/dist/core/codex-app-server-runner.js.map +1 -1
  40. package/dist/core/codex-app-server-transport.d.ts +30 -0
  41. package/dist/core/codex-app-server-transport.js +136 -0
  42. package/dist/core/codex-app-server-transport.js.map +1 -0
  43. package/dist/core/codex-model-catalog.d.ts +10 -0
  44. package/dist/core/codex-model-catalog.js +110 -0
  45. package/dist/core/codex-model-catalog.js.map +1 -0
  46. package/dist/core/codex-ui-mapper.d.ts +47 -2
  47. package/dist/core/codex-ui-mapper.js +247 -29
  48. package/dist/core/codex-ui-mapper.js.map +1 -1
  49. package/dist/core/model-identity.d.ts +113 -0
  50. package/dist/core/model-identity.js +119 -0
  51. package/dist/core/model-identity.js.map +1 -0
  52. package/dist/core/model-presets.d.ts +15 -0
  53. package/dist/core/model-presets.js +43 -0
  54. package/dist/core/model-presets.js.map +1 -0
  55. package/dist/core/opencode-server-runner.d.ts +1 -1
  56. package/dist/core/opencode-server-runner.js +7 -12
  57. package/dist/core/opencode-server-runner.js.map +1 -1
  58. package/dist/core/opencode-ui-mapper.d.ts +11 -7
  59. package/dist/core/opencode-ui-mapper.js +62 -19
  60. package/dist/core/opencode-ui-mapper.js.map +1 -1
  61. package/dist/core/pi-runner.d.ts +40 -0
  62. package/dist/core/pi-runner.js +49 -0
  63. package/dist/core/pi-runner.js.map +1 -0
  64. package/dist/core/process-usage.d.ts +3 -0
  65. package/dist/core/process-usage.js +12 -0
  66. package/dist/core/process-usage.js.map +1 -1
  67. package/dist/core/runner-factory.js +3 -0
  68. package/dist/core/runner-factory.js.map +1 -1
  69. package/dist/core/runner-model-catalog.d.ts +28 -0
  70. package/dist/core/runner-model-catalog.js +62 -0
  71. package/dist/core/runner-model-catalog.js.map +1 -0
  72. package/dist/core/secret-redaction.js.map +1 -1
  73. package/dist/core/tool-display.d.ts +2 -2
  74. package/dist/core/tool-display.js +24 -6
  75. package/dist/core/tool-display.js.map +1 -1
  76. package/dist/core/ui-events.d.ts +29 -2
  77. package/dist/git-worktree.d.ts +37 -4
  78. package/dist/git-worktree.js +175 -12
  79. package/dist/git-worktree.js.map +1 -1
  80. package/dist/handoff.d.ts +2 -2
  81. package/dist/handoff.js +2 -0
  82. package/dist/handoff.js.map +1 -1
  83. package/dist/index.js +55 -5
  84. package/dist/index.js.map +1 -1
  85. package/dist/install-as-command.d.ts +1 -1
  86. package/dist/install-as-command.js.map +1 -1
  87. package/dist/paths.d.ts +32 -2
  88. package/dist/paths.js +47 -2
  89. package/dist/paths.js.map +1 -1
  90. package/dist/runs/auto-name.js.map +1 -1
  91. package/dist/runs/retention.js.map +1 -1
  92. package/dist/runs/review-gate.js.map +1 -1
  93. package/dist/runs/store.d.ts +154 -60
  94. package/dist/runs/store.js +103 -19
  95. package/dist/runs/store.js.map +1 -1
  96. package/dist/runs/task-markers.d.ts +6 -2
  97. package/dist/runs/task-markers.js +25 -4
  98. package/dist/runs/task-markers.js.map +1 -1
  99. package/dist/runs/ui-event-sink.js.map +1 -1
  100. package/dist/server/capabilities.d.ts +22 -6
  101. package/dist/server/capabilities.js +85 -8
  102. package/dist/server/capabilities.js.map +1 -1
  103. package/dist/server/checkout.d.ts +128 -0
  104. package/dist/server/checkout.js +296 -0
  105. package/dist/server/checkout.js.map +1 -0
  106. package/dist/server/forge/github.d.ts +281 -10
  107. package/dist/server/forge/github.js +539 -23
  108. package/dist/server/forge/github.js.map +1 -1
  109. package/dist/server/forge/types.d.ts +48 -1
  110. package/dist/server/fs-browse.d.ts +105 -0
  111. package/dist/server/fs-browse.js +182 -0
  112. package/dist/server/fs-browse.js.map +1 -0
  113. package/dist/server/git-changes.d.ts +12 -3
  114. package/dist/server/git-changes.js +23 -5
  115. package/dist/server/git-changes.js.map +1 -1
  116. package/dist/server/github.d.ts +1 -1
  117. package/dist/server/open-in-app.d.ts +2 -1
  118. package/dist/server/open-in-app.js +1 -0
  119. package/dist/server/open-in-app.js.map +1 -1
  120. package/dist/server/project-context.d.ts +103 -0
  121. package/dist/server/project-context.js +153 -0
  122. package/dist/server/project-context.js.map +1 -0
  123. package/dist/server/server.d.ts +110 -0
  124. package/dist/server/server.js +1557 -215
  125. package/dist/server/server.js.map +1 -1
  126. package/dist/server/wsl.js.map +1 -1
  127. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -1
  128. package/dist/server-install/platforms/ubuntu-vps.js +7 -0
  129. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
  130. package/dist/server-install/state.js.map +1 -1
  131. package/dist/server-install/steps.js +6 -2
  132. package/dist/server-install/steps.js.map +1 -1
  133. package/dist/server-install/types.d.ts +28 -28
  134. package/dist/server-install/ui.js.map +1 -1
  135. package/dist/skills-banner.js.map +1 -1
  136. package/dist/skills-remote.d.ts +10 -4
  137. package/dist/skills-remote.js +31 -14
  138. package/dist/skills-remote.js.map +1 -1
  139. package/dist/skills.d.ts +29 -0
  140. package/dist/skills.js +72 -14
  141. package/dist/skills.js.map +1 -1
  142. package/dist/todos.d.ts +9 -7
  143. package/dist/todos.js +38 -19
  144. package/dist/todos.js.map +1 -1
  145. package/dist/workflows/run.d.ts +145 -10
  146. package/dist/workflows/run.js +608 -66
  147. package/dist/workflows/run.js.map +1 -1
  148. package/dist/workflows/types.d.ts +42 -42
  149. package/dist/workflows/types.js +2 -1
  150. package/dist/workflows/types.js.map +1 -1
  151. package/dist/workspace/config.d.ts +251 -0
  152. package/dist/workspace/config.js +162 -0
  153. package/dist/workspace/config.js.map +1 -0
  154. package/dist/workspace/migrations.d.ts +45 -0
  155. package/dist/workspace/migrations.js +132 -0
  156. package/dist/workspace/migrations.js.map +1 -0
  157. package/dist/workspace/projects-cli.d.ts +23 -0
  158. package/dist/workspace/projects-cli.js +105 -0
  159. package/dist/workspace/projects-cli.js.map +1 -0
  160. package/dist/workspace/projects.d.ts +81 -0
  161. package/dist/workspace/projects.js +214 -0
  162. package/dist/workspace/projects.js.map +1 -0
  163. package/dist/workspace/semaphore.d.ts +77 -0
  164. package/dist/workspace/semaphore.js +57 -0
  165. package/dist/workspace/semaphore.js.map +1 -0
  166. package/dist/workspace/ui-state.d.ts +23 -0
  167. package/dist/workspace/ui-state.js +42 -0
  168. package/dist/workspace/ui-state.js.map +1 -0
  169. package/package.json +3 -2
  170. package/scripts/mock-claude.mjs +136 -2
  171. package/web/dist/assets/arrow-left-CnSdp92h.js +1 -0
  172. package/web/dist/assets/centered-state-NF79blq7.js +43 -0
  173. package/web/dist/assets/{chunk-BO2N2NFS-BN7h-q1E.js → chunk-BO2N2NFS-DtrdTCWa.js} +4 -4
  174. package/web/dist/assets/commit-list-CL8vSWGw.js +1 -0
  175. package/web/dist/assets/compare-variants-mI-MnhuR.js +1 -0
  176. package/web/dist/assets/diff-view-Bhfvnnn9.js +6 -0
  177. package/web/dist/assets/dist-COA_NSud.js +1 -0
  178. package/web/dist/assets/ellipsis-vertical-CNnSLn5a.js +1 -0
  179. package/web/dist/assets/{file-tuE95HNX.js → file-D4GBh1ao.js} +1 -1
  180. package/web/dist/assets/{git-pull-request-BztcgsRZ.js → git-pull-request-DnR8Xh4_.js} +1 -1
  181. package/web/dist/assets/git-toolbar-rVtFyL4t.js +1 -0
  182. package/web/dist/assets/github-_t0ceKcO.js +1 -0
  183. package/web/dist/assets/{highlighted-body-OFNGDK62-CJIHtxqW.js → highlighted-body-OFNGDK62-BuFJwunK.js} +1 -1
  184. package/web/dist/assets/{image-preview-Ca0UgThg.js → image-preview-DEhW0TFz.js} +1 -1
  185. package/web/dist/assets/index-BfXFhAGQ.js +30 -0
  186. package/web/dist/assets/index-Mov2Rrbw.css +2 -0
  187. package/web/dist/assets/lib-DPEZDBUN.js +1 -0
  188. package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +1 -0
  189. package/web/dist/assets/project-router-CBzGUqvS.js +1 -0
  190. package/web/dist/assets/{refresh-cw-B4NW5q60.js → refresh-cw-BT8E96Tm.js} +1 -1
  191. package/web/dist/assets/repo-git-C3dJiX3j.js +1 -0
  192. package/web/dist/assets/{run-diff-BKpV1kGk.js → run-diff-HEZcHwRr.js} +3 -3
  193. package/web/dist/assets/run-header-DldbROhB.js +1 -0
  194. package/web/dist/assets/{search-x-C6xG26dv.js → search-x-BDjaMrzG.js} +1 -1
  195. package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +1 -0
  196. package/web/dist/assets/skills-BIg29xLt.js +1 -0
  197. package/web/dist/assets/{square-terminal-D9l_Xx7B.js → square-terminal-Ckjjn0vb.js} +1 -1
  198. package/web/dist/assets/tab-link-DTQ9FBZY.js +1 -0
  199. package/web/dist/assets/task-changes-DRhQVnFN.js +1 -0
  200. package/web/dist/assets/task-commits-5StODPII.js +1 -0
  201. package/web/dist/assets/task-files-BuylxobG.js +2 -0
  202. package/web/dist/assets/task-thread-DnHR0k7k.js +9 -0
  203. package/web/dist/assets/textarea-Bj_LCreg.js +1 -0
  204. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  205. package/web/dist/assets/{trash-2-De8Z5Y5-.js → trash-2-DAyZ0VSi.js} +1 -1
  206. package/web/dist/assets/{triangle-alert-DJUyRhTV.js → triangle-alert-Uy8rokUh.js} +1 -1
  207. package/web/dist/assets/{upload-yxUM9nk5.js → upload-CDdyPPo_.js} +1 -1
  208. package/web/dist/assets/use-desktop-TyHAXhMR.js +3 -0
  209. package/web/dist/assets/utils-B8s5qIcK.js +1 -0
  210. package/web/dist/assets/workflows-CwDYZLvG.js +11 -0
  211. package/web/dist/assets/zoomable-image-PEDOqyLQ.js +1 -0
  212. package/web/dist/index.html +10 -19
  213. package/web/dist/assets/arrow-left-bEsJ-6jp.js +0 -1
  214. package/web/dist/assets/centered-state-DzJJpXgm.js +0 -43
  215. package/web/dist/assets/command-eBgVGftz.js +0 -1
  216. package/web/dist/assets/compare-variants-DhqGJuHF.js +0 -1
  217. package/web/dist/assets/dialog-Bf1Cpc3n.js +0 -1
  218. package/web/dist/assets/diff-view-Cqc8LRkj.js +0 -4
  219. package/web/dist/assets/dist-M2QYGAcm.js +0 -1
  220. package/web/dist/assets/dist-ZAIqO3UX.js +0 -1
  221. package/web/dist/assets/folder-20ea3OVM.js +0 -1
  222. package/web/dist/assets/git-toolbar-DAlBoSP5.js +0 -1
  223. package/web/dist/assets/github--sfM4X3j.js +0 -1
  224. package/web/dist/assets/highlighter-ZVyRi_Cx.js +0 -3
  225. package/web/dist/assets/index-DlKq8gF4.css +0 -2
  226. package/web/dist/assets/index-h4gyDJyh.js +0 -11
  227. package/web/dist/assets/loader-circle-Bnw4ga19.js +0 -1
  228. package/web/dist/assets/markdown-DxmCMr30.js +0 -1
  229. package/web/dist/assets/mermaid-GHXKKRXX-DghlHZS5.js +0 -1
  230. package/web/dist/assets/prompt-templates-CsGr-FXH.js +0 -15
  231. package/web/dist/assets/repo-git-CHF2oip_.js +0 -1
  232. package/web/dist/assets/run-header-3CGn6FAM.js +0 -1
  233. package/web/dist/assets/skill-detail-DsD4-dGp.js +0 -1
  234. package/web/dist/assets/skill-empty-hint-Cl3ESoPu.js +0 -1
  235. package/web/dist/assets/skills-5kRcjM1J.js +0 -1
  236. package/web/dist/assets/skills-B13iqWAN.js +0 -1
  237. package/web/dist/assets/tab-link-DkVxOa-q.js +0 -1
  238. package/web/dist/assets/task-changes-DtMiVVwO.js +0 -1
  239. package/web/dist/assets/task-commits-VbSLn_tW.js +0 -1
  240. package/web/dist/assets/task-files-qYDBG3Mx.js +0 -2
  241. package/web/dist/assets/task-thread-BfGERKlB.js +0 -7
  242. package/web/dist/assets/tasks-table-C5fwJmZ7.js +0 -1
  243. package/web/dist/assets/use-desktop-6PwFeCW3.js +0 -3
  244. package/web/dist/assets/utils-CzkLr94M.js +0 -1
  245. package/web/dist/assets/workflows-CnTcKlfV.js +0 -11
  246. package/web/dist/assets/x-DaR4ZfE-.js +0 -1
  247. package/web/dist/assets/zoomable-image-B-76XMUw.js +0 -1
@@ -0,0 +1,136 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { buildChildEnv } from './agent-env.js';
3
+ import { EOF_KILL_GRACE_MS, EOF_TERM_GRACE_MS, KILL_GRACE_MS } from './claude-cli-runner.js';
4
+ export function resolveCodexExecutable(override) {
5
+ return override ?? process.env.CEZ_CODEX_BIN ?? 'codex';
6
+ }
7
+ export function buildCodexAppServerEnv(extraEnv) {
8
+ return buildChildEnv({ backend: 'codex', extraEnv });
9
+ }
10
+ /** Spawn the authenticated host's app-server with the same least-privilege env used by runs. */
11
+ export function spawnCodexAppServer(bin, cwd, extraEnv) {
12
+ try {
13
+ return nodeSpawn(bin, ['app-server'], {
14
+ cwd,
15
+ env: buildCodexAppServerEnv(extraEnv),
16
+ });
17
+ }
18
+ catch (error) {
19
+ throw codexSpawnError(error, bin);
20
+ }
21
+ }
22
+ /** Minimal newline-JSON request correlator shared by runs and short-lived discovery. */
23
+ export class CodexAppServerRpc {
24
+ child;
25
+ nextId = 1;
26
+ pending = new Map();
27
+ constructor(child) {
28
+ this.child = child;
29
+ }
30
+ allocateId() {
31
+ return this.nextId++;
32
+ }
33
+ request(method, params) {
34
+ const id = this.allocateId();
35
+ const promise = new Promise((resolve, reject) => {
36
+ this.pending.set(id, { resolve, reject });
37
+ });
38
+ this.write({ id, method, params });
39
+ return promise;
40
+ }
41
+ notify(method, params) {
42
+ this.write({ method, params });
43
+ }
44
+ respond(message) {
45
+ this.write(message);
46
+ }
47
+ dispatchResponse(message) {
48
+ if (typeof message.id !== 'number' || (message.result === undefined && message.error === undefined))
49
+ return false;
50
+ const pending = this.pending.get(message.id);
51
+ if (!pending)
52
+ return false;
53
+ this.pending.delete(message.id);
54
+ if (message.error)
55
+ pending.reject(new Error(codexErrorText(message.error)));
56
+ else
57
+ pending.resolve(message.result ?? {});
58
+ return true;
59
+ }
60
+ async initialize() {
61
+ await this.request('initialize', {
62
+ clientInfo: { name: 'cezar', title: 'cezar', version: '0.1.0' },
63
+ capabilities: { experimentalApi: true },
64
+ });
65
+ this.notify('initialized', {});
66
+ }
67
+ rejectPending(message = 'codex app-server exited') {
68
+ for (const request of this.pending.values())
69
+ request.reject(new Error(message));
70
+ this.pending.clear();
71
+ }
72
+ write(message) {
73
+ if (this.child.stdin.destroyed)
74
+ return;
75
+ try {
76
+ this.child.stdin.write(`${JSON.stringify(message)}\n`);
77
+ }
78
+ catch {
79
+ // The read/exit path owns settlement when stdin disappears.
80
+ }
81
+ }
82
+ }
83
+ export function endCodexAppServer(child, onTimers) {
84
+ try {
85
+ child.stdin.end();
86
+ }
87
+ catch {
88
+ // already gone
89
+ }
90
+ let killTimer;
91
+ const termTimer = setTimeout(() => {
92
+ if (child.exitCode == null && !child.killed)
93
+ child.kill('SIGTERM');
94
+ killTimer = setTimeout(() => {
95
+ if (child.exitCode == null && !child.killed)
96
+ child.kill('SIGKILL');
97
+ }, EOF_KILL_GRACE_MS);
98
+ killTimer.unref?.();
99
+ onTimers?.(termTimer, killTimer);
100
+ }, EOF_TERM_GRACE_MS);
101
+ termTimer.unref?.();
102
+ onTimers?.(termTimer, killTimer);
103
+ }
104
+ export function waitForCodexAppServerExit(child) {
105
+ if (child.exitCode != null)
106
+ return Promise.resolve(child.exitCode);
107
+ return new Promise((resolve) => {
108
+ let done = false;
109
+ const finish = (code) => {
110
+ if (done)
111
+ return;
112
+ done = true;
113
+ clearTimeout(safety);
114
+ resolve(code);
115
+ };
116
+ child.once('close', (code) => finish(code));
117
+ child.once('exit', (code) => finish(code));
118
+ child.once('error', () => finish(child.exitCode ?? null));
119
+ const safety = setTimeout(() => finish(child.exitCode ?? null), EOF_TERM_GRACE_MS + EOF_KILL_GRACE_MS + KILL_GRACE_MS + 5_000);
120
+ safety.unref?.();
121
+ });
122
+ }
123
+ export function codexSpawnError(error, bin) {
124
+ const code = error?.code;
125
+ if (code === 'ENOENT') {
126
+ return new Error(`\`${bin}\` not found on PATH — install the Codex CLI (npm i -g @openai/codex) and run \`codex\` once to log in`);
127
+ }
128
+ return error instanceof Error ? error : new Error(String(error));
129
+ }
130
+ function codexErrorText(error) {
131
+ if (error && typeof error === 'object' && 'message' in error) {
132
+ return String(error.message);
133
+ }
134
+ return typeof error === 'string' ? error : JSON.stringify(error);
135
+ }
136
+ //# sourceMappingURL=codex-app-server-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server-transport.js","sourceRoot":"","sources":["../../src/core/codex-app-server-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ import type { ModelOption } from './runner-model-catalog.js';
3
+ export interface CodexModelDiscoveryOptions {
4
+ cwd: string;
5
+ bin?: string;
6
+ timeoutMs?: number;
7
+ spawn?: (bin: string, cwd: string) => ChildProcessWithoutNullStreams;
8
+ }
9
+ /** Discover the visible catalog exposed by the authenticated host Codex CLI. */
10
+ export declare function discoverCodexModels(options: CodexModelDiscoveryOptions): Promise<ModelOption[]>;
@@ -0,0 +1,110 @@
1
+ import { z } from 'zod';
2
+ import { readNdjson } from './ndjson.js';
3
+ import { CodexAppServerRpc, endCodexAppServer, resolveCodexExecutable, spawnCodexAppServer, } from './codex-app-server-transport.js';
4
+ const modelSchema = z.object({
5
+ model: z.string(),
6
+ displayName: z.string().optional(),
7
+ description: z.string().optional(),
8
+ hidden: z.boolean().optional(),
9
+ }).passthrough();
10
+ const pageSchema = z.object({
11
+ data: z.array(modelSchema),
12
+ nextCursor: z.string().nullable().optional(),
13
+ }).passthrough();
14
+ const DEFAULT_DISCOVERY_TIMEOUT_MS = 5_000;
15
+ const MAX_MODEL_PAGES = 25;
16
+ const MAX_MODELS = 500;
17
+ /** Discover the visible catalog exposed by the authenticated host Codex CLI. */
18
+ export async function discoverCodexModels(options) {
19
+ const child = (options.spawn ?? spawnCodexAppServer)(resolveCodexExecutable(options.bin), options.cwd);
20
+ const rpc = new CodexAppServerRpc(child);
21
+ let readerError;
22
+ const reader = (async () => {
23
+ try {
24
+ for await (const line of readNdjson(child.stdout)) {
25
+ let message;
26
+ try {
27
+ message = JSON.parse(line);
28
+ }
29
+ catch {
30
+ throw new Error('Codex model discovery returned malformed NDJSON');
31
+ }
32
+ rpc.dispatchResponse(message);
33
+ }
34
+ }
35
+ catch (error) {
36
+ readerError = error instanceof Error ? error : new Error(String(error));
37
+ rpc.rejectPending(readerError.message);
38
+ }
39
+ })();
40
+ const exited = new Promise((_, reject) => {
41
+ const fail = (detail) => {
42
+ const error = new Error(detail);
43
+ rpc.rejectPending(error.message);
44
+ reject(error);
45
+ };
46
+ child.once('error', () => fail('Codex model discovery child failed'));
47
+ child.once('exit', (code) => fail(`Codex model discovery child exited (${code ?? 'unknown'})`));
48
+ });
49
+ const timeoutMs = options.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;
50
+ let timeout;
51
+ const deadline = new Promise((_, reject) => {
52
+ timeout = setTimeout(() => {
53
+ const error = new Error('Codex model discovery timed out');
54
+ rpc.rejectPending(error.message);
55
+ reject(error);
56
+ }, timeoutMs);
57
+ timeout.unref?.();
58
+ });
59
+ try {
60
+ return await Promise.race([
61
+ discoverPages(rpc),
62
+ exited,
63
+ deadline,
64
+ ]);
65
+ }
66
+ finally {
67
+ if (timeout)
68
+ clearTimeout(timeout);
69
+ endCodexAppServer(child);
70
+ void reader.catch(() => undefined);
71
+ if (readerError)
72
+ rpc.rejectPending(readerError.message);
73
+ }
74
+ }
75
+ async function discoverPages(rpc) {
76
+ await rpc.initialize();
77
+ const models = [];
78
+ const ids = new Set();
79
+ const cursors = new Set();
80
+ let cursor = null;
81
+ for (let pageNumber = 0; pageNumber < MAX_MODEL_PAGES; pageNumber += 1) {
82
+ const raw = await rpc.request('model/list', { cursor, includeHidden: false });
83
+ const parsed = pageSchema.safeParse(raw);
84
+ if (!parsed.success)
85
+ throw new Error('Codex model discovery returned malformed model data');
86
+ for (const model of parsed.data.data) {
87
+ const id = model.model.trim();
88
+ if (!id || model.hidden || ids.has(id))
89
+ continue;
90
+ if (models.length >= MAX_MODELS)
91
+ throw new Error('Codex model discovery exceeded the size limit');
92
+ ids.add(id);
93
+ models.push({
94
+ id,
95
+ label: model.displayName?.trim() || id,
96
+ description: model.description ?? '',
97
+ });
98
+ }
99
+ const nextCursor = parsed.data.nextCursor ?? null;
100
+ if (nextCursor === null)
101
+ return models;
102
+ if (!nextCursor || cursors.has(nextCursor)) {
103
+ throw new Error('Codex model discovery returned a cursor loop');
104
+ }
105
+ cursors.add(nextCursor);
106
+ cursor = nextCursor;
107
+ }
108
+ throw new Error('Codex model discovery exceeded the page limit');
109
+ }
110
+ //# sourceMappingURL=codex-model-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-model-catalog.js","sourceRoot":"","sources":["../../src/core/codex-model-catalog.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,8 @@
9
9
  * replaying wire-faithful frame sequences live in `__fixtures__/codex/`.
10
10
  *
11
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.
12
+ * responses, server→client requests (handled by the session transport) and
13
+ * unknown methods map to zero events.
14
14
  *
15
15
  * State is explicit and treated as immutable: callers thread the returned
16
16
  * `state` into the next call. Ids are deterministic — codex items and turns
@@ -22,6 +22,19 @@
22
22
  * `completed→completed`, `failed→failed`, `declined→declined`.
23
23
  */
24
24
  import type { UiEvent } from './ui-events.js';
25
+ /** The two reasoning delta channels, accumulated separately — see
26
+ * `CodexUiMapperState.reasonings`. */
27
+ export interface ReasoningAccumulator {
28
+ /** `item/reasoning/textDelta` — the raw chain of thought. */
29
+ readonly text: string;
30
+ /** `item/reasoning/summaryDelta` + `summaryTextDelta` — the condensed summary. */
31
+ readonly summary: string;
32
+ }
33
+ interface CodexCollabTask {
34
+ readonly itemId: string;
35
+ readonly prompt?: string;
36
+ readonly model?: string;
37
+ }
25
38
  export interface CodexUiMapperState {
26
39
  /** True once `session.started` was emitted (thread/started notification or
27
40
  * the runner's `codexSessionStarted` after the thread/start result —
@@ -36,6 +49,21 @@ export interface CodexUiMapperState {
36
49
  /** Accumulated `outputDelta` text per commandExecution item, attached to
37
50
  * the final snapshot when the wire `item/completed` carries no output. */
38
51
  readonly outputs: ReadonlyMap<string, string>;
52
+ /** Accumulated reasoning deltas per reasoning item, attached to the final
53
+ * snapshot when the wire `item/completed` carries no `content`. Deltas are
54
+ * live-only (never persisted), so without this the reasoning text is
55
+ * unrecoverable on replay and the row reads back empty (#528).
56
+ *
57
+ * Kept PER CHANNEL: `item/reasoning/textDelta` streams the raw chain of
58
+ * thought while `summaryDelta`/`summaryTextDelta` stream the condensed
59
+ * summary, and codex emits both when raw reasoning is enabled. One shared
60
+ * bucket would concatenate the two into `"<raw CoT><summary>"` and persist
61
+ * that garble over the clean wire `summary`.
62
+ *
63
+ * Turn-scoped, and reset by `turn/started`: an interrupted item is never
64
+ * completed, so without the reset its text would both leak into a later
65
+ * turn that reuses the id and pin whole chains of thought in memory. */
66
+ readonly reasonings: ReadonlyMap<string, ReasoningAccumulator>;
39
67
  /** True once `turn/plan/updated` has spoken IN THE CURRENT TURN. Both that
40
68
  * notification and the `plan`/`todoList` item arm write `plan.updated`, so
41
69
  * without a precedence rule the last frame wins and a prose plan item would
@@ -46,6 +74,22 @@ export interface CodexUiMapperState {
46
74
  * `turn/plan/updated`), so a latch that outlived its turn would gag the item
47
75
  * arm for the rest of the session and strand the dock on a stale checklist. */
48
76
  readonly planFromNotification: boolean;
77
+ /** The open review-mode item's id, or `null` when review mode is not active.
78
+ *
79
+ * Codex announces review mode as two disjoint frames (`enteredReviewMode`,
80
+ * `exitedReviewMode`) with different ids. Mapped literally that is two
81
+ * childless `task` items — which the Agents dock would read as two separate
82
+ * sub-agents that each did nothing (spec
83
+ * `.ai/specs/2026-07-20-grouped-subagent-display.md` §"Codex-mapper fix",
84
+ * #474). This latch folds the pair into ONE item with a running→completed
85
+ * lifecycle: the entered frame opens it, the exited frame completes that
86
+ * same id. An unpaired exit falls back to its own item, so a stream that
87
+ * starts mid-review still renders. */
88
+ readonly reviewItemId: string | null;
89
+ /** Child thread → stable task item created by a Codex collaboration spawn.
90
+ * Installed 0.144.6 uses `collabAgentToolCall`; newer protocol revisions use
91
+ * `collabToolCall`. Both carry the receiver ids used for child attribution. */
92
+ readonly collabTasks: ReadonlyMap<string, CodexCollabTask>;
49
93
  }
50
94
  export interface CodexUiMapping {
51
95
  events: UiEvent[];
@@ -61,3 +105,4 @@ export declare function createCodexUiState(): CodexUiMapperState;
61
105
  export declare function codexSessionStarted(threadId: string, state: CodexUiMapperState): CodexUiMapping;
62
106
  /** Fold one parsed JSON-RPC frame into v2 events. Never throws. */
63
107
  export declare function mapCodexNotification(frame: unknown, state: CodexUiMapperState): CodexUiMapping;
108
+ export {};