@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.
- package/README.md +109 -14
- package/dist/agent-config/catalog.d.ts +64 -0
- package/dist/agent-config/catalog.js +205 -0
- package/dist/agent-config/catalog.js.map +1 -0
- package/dist/agent-config/files.d.ts +46 -0
- package/dist/agent-config/files.js +119 -0
- package/dist/agent-config/files.js.map +1 -0
- package/dist/agent-config/seed.d.ts +7 -0
- package/dist/agent-config/seed.js +90 -0
- package/dist/agent-config/seed.js.map +1 -0
- package/dist/agent-config/service.d.ts +44 -0
- package/dist/agent-config/service.js +71 -0
- package/dist/agent-config/service.js.map +1 -0
- package/dist/agent-config/validate.d.ts +21 -0
- package/dist/agent-config/validate.js +76 -0
- package/dist/agent-config/validate.js.map +1 -0
- package/dist/config.d.ts +34 -4
- package/dist/config.js +97 -2
- package/dist/config.js.map +1 -1
- package/dist/core/agent-env.js +21 -15
- package/dist/core/agent-env.js.map +1 -1
- package/dist/core/agent-runner.d.ts +16 -6
- package/dist/core/agent-runner.js +15 -3
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/ask.d.ts +184 -0
- package/dist/core/ask.js +97 -0
- package/dist/core/ask.js.map +1 -0
- package/dist/core/backend-detect.d.ts +5 -5
- package/dist/core/backend-detect.js +37 -5
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +17 -2
- package/dist/core/claude-cli-runner.js +8 -3
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +9 -0
- package/dist/core/claude-ui-mapper.js +34 -3
- package/dist/core/claude-ui-mapper.js.map +1 -1
- package/dist/core/codex-app-server-runner.d.ts +15 -3
- package/dist/core/codex-app-server-runner.js +158 -127
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +30 -0
- package/dist/core/codex-app-server-transport.js +136 -0
- package/dist/core/codex-app-server-transport.js.map +1 -0
- package/dist/core/codex-model-catalog.d.ts +10 -0
- package/dist/core/codex-model-catalog.js +110 -0
- package/dist/core/codex-model-catalog.js.map +1 -0
- package/dist/core/codex-ui-mapper.d.ts +47 -2
- package/dist/core/codex-ui-mapper.js +247 -29
- package/dist/core/codex-ui-mapper.js.map +1 -1
- package/dist/core/model-identity.d.ts +113 -0
- package/dist/core/model-identity.js +119 -0
- package/dist/core/model-identity.js.map +1 -0
- package/dist/core/model-presets.d.ts +15 -0
- package/dist/core/model-presets.js +43 -0
- package/dist/core/model-presets.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +1 -1
- package/dist/core/opencode-server-runner.js +7 -12
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/opencode-ui-mapper.d.ts +11 -7
- package/dist/core/opencode-ui-mapper.js +62 -19
- package/dist/core/opencode-ui-mapper.js.map +1 -1
- package/dist/core/pi-runner.d.ts +40 -0
- package/dist/core/pi-runner.js +49 -0
- package/dist/core/pi-runner.js.map +1 -0
- package/dist/core/process-usage.d.ts +3 -0
- package/dist/core/process-usage.js +12 -0
- package/dist/core/process-usage.js.map +1 -1
- package/dist/core/runner-factory.js +3 -0
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-model-catalog.d.ts +28 -0
- package/dist/core/runner-model-catalog.js +62 -0
- package/dist/core/runner-model-catalog.js.map +1 -0
- package/dist/core/secret-redaction.js.map +1 -1
- package/dist/core/tool-display.d.ts +2 -2
- package/dist/core/tool-display.js +24 -6
- package/dist/core/tool-display.js.map +1 -1
- package/dist/core/ui-events.d.ts +29 -2
- package/dist/git-worktree.d.ts +37 -4
- package/dist/git-worktree.js +175 -12
- package/dist/git-worktree.js.map +1 -1
- package/dist/handoff.d.ts +2 -2
- package/dist/handoff.js +2 -0
- package/dist/handoff.js.map +1 -1
- package/dist/index.js +55 -5
- package/dist/index.js.map +1 -1
- package/dist/install-as-command.d.ts +1 -1
- package/dist/install-as-command.js.map +1 -1
- package/dist/paths.d.ts +32 -2
- package/dist/paths.js +47 -2
- package/dist/paths.js.map +1 -1
- package/dist/runs/auto-name.js.map +1 -1
- package/dist/runs/retention.js.map +1 -1
- package/dist/runs/review-gate.js.map +1 -1
- package/dist/runs/store.d.ts +154 -60
- package/dist/runs/store.js +103 -19
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/task-markers.d.ts +6 -2
- package/dist/runs/task-markers.js +25 -4
- package/dist/runs/task-markers.js.map +1 -1
- package/dist/runs/ui-event-sink.js.map +1 -1
- package/dist/server/capabilities.d.ts +22 -6
- package/dist/server/capabilities.js +85 -8
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/checkout.d.ts +128 -0
- package/dist/server/checkout.js +296 -0
- package/dist/server/checkout.js.map +1 -0
- package/dist/server/forge/github.d.ts +281 -10
- package/dist/server/forge/github.js +539 -23
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/types.d.ts +48 -1
- package/dist/server/fs-browse.d.ts +105 -0
- package/dist/server/fs-browse.js +182 -0
- package/dist/server/fs-browse.js.map +1 -0
- package/dist/server/git-changes.d.ts +12 -3
- package/dist/server/git-changes.js +23 -5
- package/dist/server/git-changes.js.map +1 -1
- package/dist/server/github.d.ts +1 -1
- package/dist/server/open-in-app.d.ts +2 -1
- package/dist/server/open-in-app.js +1 -0
- package/dist/server/open-in-app.js.map +1 -1
- package/dist/server/project-context.d.ts +103 -0
- package/dist/server/project-context.js +153 -0
- package/dist/server/project-context.js.map +1 -0
- package/dist/server/server.d.ts +110 -0
- package/dist/server/server.js +1557 -215
- package/dist/server/server.js.map +1 -1
- package/dist/server/wsl.js.map +1 -1
- package/dist/server-install/platforms/macosx-ngrok.js.map +1 -1
- package/dist/server-install/platforms/ubuntu-vps.js +7 -0
- package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
- package/dist/server-install/state.js.map +1 -1
- package/dist/server-install/steps.js +6 -2
- package/dist/server-install/steps.js.map +1 -1
- package/dist/server-install/types.d.ts +28 -28
- package/dist/server-install/ui.js.map +1 -1
- package/dist/skills-banner.js.map +1 -1
- package/dist/skills-remote.d.ts +10 -4
- package/dist/skills-remote.js +31 -14
- package/dist/skills-remote.js.map +1 -1
- package/dist/skills.d.ts +29 -0
- package/dist/skills.js +72 -14
- package/dist/skills.js.map +1 -1
- package/dist/todos.d.ts +9 -7
- package/dist/todos.js +38 -19
- package/dist/todos.js.map +1 -1
- package/dist/workflows/run.d.ts +145 -10
- package/dist/workflows/run.js +608 -66
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +42 -42
- package/dist/workflows/types.js +2 -1
- package/dist/workflows/types.js.map +1 -1
- package/dist/workspace/config.d.ts +251 -0
- package/dist/workspace/config.js +162 -0
- package/dist/workspace/config.js.map +1 -0
- package/dist/workspace/migrations.d.ts +45 -0
- package/dist/workspace/migrations.js +132 -0
- package/dist/workspace/migrations.js.map +1 -0
- package/dist/workspace/projects-cli.d.ts +23 -0
- package/dist/workspace/projects-cli.js +105 -0
- package/dist/workspace/projects-cli.js.map +1 -0
- package/dist/workspace/projects.d.ts +81 -0
- package/dist/workspace/projects.js +214 -0
- package/dist/workspace/projects.js.map +1 -0
- package/dist/workspace/semaphore.d.ts +77 -0
- package/dist/workspace/semaphore.js +57 -0
- package/dist/workspace/semaphore.js.map +1 -0
- package/dist/workspace/ui-state.d.ts +23 -0
- package/dist/workspace/ui-state.js +42 -0
- package/dist/workspace/ui-state.js.map +1 -0
- package/package.json +3 -2
- package/scripts/mock-claude.mjs +136 -2
- package/web/dist/assets/arrow-left-CnSdp92h.js +1 -0
- package/web/dist/assets/centered-state-NF79blq7.js +43 -0
- package/web/dist/assets/{chunk-BO2N2NFS-BN7h-q1E.js → chunk-BO2N2NFS-DtrdTCWa.js} +4 -4
- package/web/dist/assets/commit-list-CL8vSWGw.js +1 -0
- package/web/dist/assets/compare-variants-mI-MnhuR.js +1 -0
- package/web/dist/assets/diff-view-Bhfvnnn9.js +6 -0
- package/web/dist/assets/dist-COA_NSud.js +1 -0
- package/web/dist/assets/ellipsis-vertical-CNnSLn5a.js +1 -0
- package/web/dist/assets/{file-tuE95HNX.js → file-D4GBh1ao.js} +1 -1
- package/web/dist/assets/{git-pull-request-BztcgsRZ.js → git-pull-request-DnR8Xh4_.js} +1 -1
- package/web/dist/assets/git-toolbar-rVtFyL4t.js +1 -0
- package/web/dist/assets/github-_t0ceKcO.js +1 -0
- package/web/dist/assets/{highlighted-body-OFNGDK62-CJIHtxqW.js → highlighted-body-OFNGDK62-BuFJwunK.js} +1 -1
- package/web/dist/assets/{image-preview-Ca0UgThg.js → image-preview-DEhW0TFz.js} +1 -1
- package/web/dist/assets/index-BfXFhAGQ.js +30 -0
- package/web/dist/assets/index-Mov2Rrbw.css +2 -0
- package/web/dist/assets/lib-DPEZDBUN.js +1 -0
- package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +1 -0
- package/web/dist/assets/project-router-CBzGUqvS.js +1 -0
- package/web/dist/assets/{refresh-cw-B4NW5q60.js → refresh-cw-BT8E96Tm.js} +1 -1
- package/web/dist/assets/repo-git-C3dJiX3j.js +1 -0
- package/web/dist/assets/{run-diff-BKpV1kGk.js → run-diff-HEZcHwRr.js} +3 -3
- package/web/dist/assets/run-header-DldbROhB.js +1 -0
- package/web/dist/assets/{search-x-C6xG26dv.js → search-x-BDjaMrzG.js} +1 -1
- package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +1 -0
- package/web/dist/assets/skills-BIg29xLt.js +1 -0
- package/web/dist/assets/{square-terminal-D9l_Xx7B.js → square-terminal-Ckjjn0vb.js} +1 -1
- package/web/dist/assets/tab-link-DTQ9FBZY.js +1 -0
- package/web/dist/assets/task-changes-DRhQVnFN.js +1 -0
- package/web/dist/assets/task-commits-5StODPII.js +1 -0
- package/web/dist/assets/task-files-BuylxobG.js +2 -0
- package/web/dist/assets/task-thread-DnHR0k7k.js +9 -0
- package/web/dist/assets/textarea-Bj_LCreg.js +1 -0
- package/web/dist/assets/toml-CcmNWLt0.js +1 -0
- package/web/dist/assets/{trash-2-De8Z5Y5-.js → trash-2-DAyZ0VSi.js} +1 -1
- package/web/dist/assets/{triangle-alert-DJUyRhTV.js → triangle-alert-Uy8rokUh.js} +1 -1
- package/web/dist/assets/{upload-yxUM9nk5.js → upload-CDdyPPo_.js} +1 -1
- package/web/dist/assets/use-desktop-TyHAXhMR.js +3 -0
- package/web/dist/assets/utils-B8s5qIcK.js +1 -0
- package/web/dist/assets/workflows-CwDYZLvG.js +11 -0
- package/web/dist/assets/zoomable-image-PEDOqyLQ.js +1 -0
- package/web/dist/index.html +10 -19
- package/web/dist/assets/arrow-left-bEsJ-6jp.js +0 -1
- package/web/dist/assets/centered-state-DzJJpXgm.js +0 -43
- package/web/dist/assets/command-eBgVGftz.js +0 -1
- package/web/dist/assets/compare-variants-DhqGJuHF.js +0 -1
- package/web/dist/assets/dialog-Bf1Cpc3n.js +0 -1
- package/web/dist/assets/diff-view-Cqc8LRkj.js +0 -4
- package/web/dist/assets/dist-M2QYGAcm.js +0 -1
- package/web/dist/assets/dist-ZAIqO3UX.js +0 -1
- package/web/dist/assets/folder-20ea3OVM.js +0 -1
- package/web/dist/assets/git-toolbar-DAlBoSP5.js +0 -1
- package/web/dist/assets/github--sfM4X3j.js +0 -1
- package/web/dist/assets/highlighter-ZVyRi_Cx.js +0 -3
- package/web/dist/assets/index-DlKq8gF4.css +0 -2
- package/web/dist/assets/index-h4gyDJyh.js +0 -11
- package/web/dist/assets/loader-circle-Bnw4ga19.js +0 -1
- package/web/dist/assets/markdown-DxmCMr30.js +0 -1
- package/web/dist/assets/mermaid-GHXKKRXX-DghlHZS5.js +0 -1
- package/web/dist/assets/prompt-templates-CsGr-FXH.js +0 -15
- package/web/dist/assets/repo-git-CHF2oip_.js +0 -1
- package/web/dist/assets/run-header-3CGn6FAM.js +0 -1
- package/web/dist/assets/skill-detail-DsD4-dGp.js +0 -1
- package/web/dist/assets/skill-empty-hint-Cl3ESoPu.js +0 -1
- package/web/dist/assets/skills-5kRcjM1J.js +0 -1
- package/web/dist/assets/skills-B13iqWAN.js +0 -1
- package/web/dist/assets/tab-link-DkVxOa-q.js +0 -1
- package/web/dist/assets/task-changes-DtMiVVwO.js +0 -1
- package/web/dist/assets/task-commits-VbSLn_tW.js +0 -1
- package/web/dist/assets/task-files-qYDBG3Mx.js +0 -2
- package/web/dist/assets/task-thread-BfGERKlB.js +0 -7
- package/web/dist/assets/tasks-table-C5fwJmZ7.js +0 -1
- package/web/dist/assets/use-desktop-6PwFeCW3.js +0 -3
- package/web/dist/assets/utils-CzkLr94M.js +0 -1
- package/web/dist/assets/workflows-CnTcKlfV.js +0 -11
- package/web/dist/assets/x-DaR4ZfE-.js +0 -1
- 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 (
|
|
13
|
-
*
|
|
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 {};
|