@edukors/ai-cli 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +162 -2
  3. package/dist/cli/main.d.ts +2 -0
  4. package/dist/cli/main.js +256 -0
  5. package/dist/cli/main.js.map +1 -0
  6. package/dist/constants.d.ts +2 -0
  7. package/dist/constants.js +3 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/diagnostics.d.ts +28 -0
  10. package/dist/diagnostics.js +35 -0
  11. package/dist/diagnostics.js.map +1 -0
  12. package/dist/engine.d.ts +157 -0
  13. package/dist/engine.js +395 -0
  14. package/dist/engine.js.map +1 -0
  15. package/dist/errors.d.ts +27 -0
  16. package/dist/errors.js +59 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/events.d.ts +95 -0
  19. package/dist/events.js +8 -0
  20. package/dist/events.js.map +1 -0
  21. package/dist/host/main.d.ts +2 -0
  22. package/dist/host/main.js +30 -0
  23. package/dist/host/main.js.map +1 -0
  24. package/dist/host/stdio.d.ts +34 -0
  25. package/dist/host/stdio.js +254 -0
  26. package/dist/host/stdio.js.map +1 -0
  27. package/dist/index.d.ts +34 -0
  28. package/dist/index.js +21 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mcp/config.d.ts +19 -0
  31. package/dist/mcp/config.js +63 -0
  32. package/dist/mcp/config.js.map +1 -0
  33. package/dist/mcp/external.d.ts +55 -0
  34. package/dist/mcp/external.js +129 -0
  35. package/dist/mcp/external.js.map +1 -0
  36. package/dist/mcp/toolServer.d.ts +30 -0
  37. package/dist/mcp/toolServer.js +102 -0
  38. package/dist/mcp/toolServer.js.map +1 -0
  39. package/dist/platform/discovery.d.ts +23 -0
  40. package/dist/platform/discovery.js +64 -0
  41. package/dist/platform/discovery.js.map +1 -0
  42. package/dist/platform/env.d.ts +12 -0
  43. package/dist/platform/env.js +104 -0
  44. package/dist/platform/env.js.map +1 -0
  45. package/dist/platform/login.d.ts +16 -0
  46. package/dist/platform/login.js +42 -0
  47. package/dist/platform/login.js.map +1 -0
  48. package/dist/platform/paths.d.ts +19 -0
  49. package/dist/platform/paths.js +46 -0
  50. package/dist/platform/paths.js.map +1 -0
  51. package/dist/platform/process.d.ts +55 -0
  52. package/dist/platform/process.js +186 -0
  53. package/dist/platform/process.js.map +1 -0
  54. package/dist/provider.d.ts +156 -0
  55. package/dist/provider.js +2 -0
  56. package/dist/provider.js.map +1 -0
  57. package/dist/providers/claude/adapter.d.ts +43 -0
  58. package/dist/providers/claude/adapter.js +398 -0
  59. package/dist/providers/claude/adapter.js.map +1 -0
  60. package/dist/providers/claude/events.d.ts +36 -0
  61. package/dist/providers/claude/events.js +90 -0
  62. package/dist/providers/claude/events.js.map +1 -0
  63. package/dist/providers/codex/adapter.d.ts +28 -0
  64. package/dist/providers/codex/adapter.js +497 -0
  65. package/dist/providers/codex/adapter.js.map +1 -0
  66. package/dist/providers/codex/rpc.d.ts +17 -0
  67. package/dist/providers/codex/rpc.js +75 -0
  68. package/dist/providers/codex/rpc.js.map +1 -0
  69. package/dist/providers.d.ts +9 -0
  70. package/dist/providers.js +15 -0
  71. package/dist/providers.js.map +1 -0
  72. package/dist/redact.d.ts +7 -0
  73. package/dist/redact.js +48 -0
  74. package/dist/redact.js.map +1 -0
  75. package/dist/registry/lock.d.ts +18 -0
  76. package/dist/registry/lock.js +83 -0
  77. package/dist/registry/lock.js.map +1 -0
  78. package/dist/registry/registry.d.ts +38 -0
  79. package/dist/registry/registry.js +119 -0
  80. package/dist/registry/registry.js.map +1 -0
  81. package/dist/session.d.ts +126 -0
  82. package/dist/session.js +333 -0
  83. package/dist/session.js.map +1 -0
  84. package/dist/settings.d.ts +8 -0
  85. package/dist/settings.js +7 -0
  86. package/dist/settings.js.map +1 -0
  87. package/dist/skills.d.ts +24 -0
  88. package/dist/skills.js +91 -0
  89. package/dist/skills.js.map +1 -0
  90. package/dist/testing/fakeProvider.d.ts +22 -0
  91. package/dist/testing/fakeProvider.js +266 -0
  92. package/dist/testing/fakeProvider.js.map +1 -0
  93. package/dist/testing/index.d.ts +2 -0
  94. package/dist/testing/index.js +2 -0
  95. package/dist/testing/index.js.map +1 -0
  96. package/dist/tools.d.ts +45 -0
  97. package/dist/tools.js +32 -0
  98. package/dist/tools.js.map +1 -0
  99. package/dist/version.d.ts +2 -0
  100. package/dist/version.js +3 -0
  101. package/dist/version.js.map +1 -0
  102. package/fixtures/fake-ai.mjs +230 -0
  103. package/fixtures/fake-claude.mjs +62 -0
  104. package/fixtures/fake-codex.mjs +281 -0
  105. package/fixtures/fake-mcp-server.mjs +14 -0
  106. package/package.json +74 -4
@@ -0,0 +1,497 @@
1
+ import { AiCliError, toAiCliError } from "../../errors.js";
2
+ import { fromWindows } from "../../events.js";
3
+ import { startToolBridge, TOOL_SERVER_NAME } from "../../mcp/toolServer.js";
4
+ import { compareVersions, findExecutable, readVersion } from "../../platform/discovery.js";
5
+ import { buildEnv } from "../../platform/env.js";
6
+ import { runLoginCommand } from "../../platform/login.js";
7
+ import { ManagedProcess, runCommand } from "../../platform/process.js";
8
+ import { VERSION } from "../../version.js";
9
+ import { listSkills, READ_SKILL_TOOL, readSkillFile, readSkillSpec, skillsInstructions } from "../../skills.js";
10
+ import { attachRpc } from "./rpc.js";
11
+ /** The version this adapter's protocol use was checked against (docs/compatibility.md). */
12
+ const MIN_VERSION = "0.164.0";
13
+ const TOKEN_VAR = "EDUKORS_MCP_TOKEN";
14
+ /** The address `codex login` prints for signing in when the browser does not open. */
15
+ const LOGIN_URL = /https:\/\/\S+\/oauth\/authorize\S*/;
16
+ const WINDOW_NAMES = { 300: "five_hour", 10080: "seven_day" };
17
+ /** Every window of every limit, from 0 to 1; the most used one leads. */
18
+ export function codexLimits(read) {
19
+ const snapshots = read?.rateLimitsByLimitId && typeof read.rateLimitsByLimitId === "object" ? Object.values(read.rateLimitsByLimitId) : read?.rateLimits ? [read.rateLimits] : [];
20
+ const windows = [];
21
+ for (const snap of snapshots)
22
+ for (const [slot, w] of [["primary", snap?.primary], ["secondary", snap?.secondary]]) {
23
+ if (!w || typeof w.usedPercent !== "number")
24
+ continue;
25
+ const span = WINDOW_NAMES[w.windowDurationMins] ?? (w.windowDurationMins ? `${w.windowDurationMins}min` : slot);
26
+ const name = snapshots.length > 1 && snap?.limitId ? `${snap.limitId}:${span}` : span;
27
+ windows.push({ name, used: Math.max(0, Math.min(1, w.usedPercent / 100)), ...(typeof w.resetsAt === "number" ? { resetsAt: new Date(w.resetsAt * 1000).toISOString() } : {}) });
28
+ }
29
+ return windows.length ? fromWindows(windows) : null;
30
+ }
31
+ /** Codex's turn errors, as stable codes. */
32
+ export function codexError(error) {
33
+ const info = error?.codexErrorInfo;
34
+ const kind = typeof info === "string" ? info : info && typeof info === "object" ? Object.keys(info)[0] : undefined;
35
+ const meta = { providerCode: kind ?? "unknown", detail: String(error?.message ?? "").slice(0, 300) };
36
+ switch (kind) {
37
+ case "usageLimitExceeded":
38
+ case "rateLimitExceeded":
39
+ return new AiCliError("RATE_LIMITED", "Codex's usage limit was reached", { meta });
40
+ case "unauthorized":
41
+ return new AiCliError("ACCOUNT_EXPIRED", "Codex needs to be signed in again", { meta });
42
+ case "serverOverloaded":
43
+ case "internalServerError":
44
+ case "httpConnectionFailed":
45
+ return new AiCliError("PROVIDER_ERROR", "Codex is temporarily unavailable", { meta, retryable: true });
46
+ default:
47
+ return new AiCliError("PROVIDER_ERROR", "Codex could not complete the request", { meta });
48
+ }
49
+ }
50
+ const tomlString = (value) => JSON.stringify(value);
51
+ export function createCodexProvider(options = {}) {
52
+ const minVersion = options.minVersion ?? MIN_VERSION;
53
+ const startupTimeoutMs = options.startupTimeoutMs ?? 30_000;
54
+ const env = (context, extra = {}) => buildEnv({ set: { ...options.env, CODEX_HOME: context.homeDir, ...extra } });
55
+ const cli = (context, args, timeoutMs = 20_000) => runCommand({ file: context.detection.executable, args, env: env(context), timeoutMs, ...(context.signal ? { signal: context.signal } : {}) });
56
+ const capabilities = {
57
+ login: "browser",
58
+ accountStatus: true,
59
+ // Expected from CODEX_HOME holding auth.json; verified with live accounts before release.
60
+ multiAccount: true,
61
+ logout: true,
62
+ persistentSessions: true,
63
+ models: true,
64
+ efforts: true,
65
+ usage: true,
66
+ tools: true,
67
+ questions: true,
68
+ liveOptions: true,
69
+ };
70
+ /** A short-lived app server, for questions that need no conversation. */
71
+ async function withAppServer(context, fn) {
72
+ const proc = new ManagedProcess({ file: context.detection.executable, args: ["app-server"], env: env(context), cwd: context.homeDir });
73
+ try {
74
+ const rpc = attachRpc(proc, {}, context.log);
75
+ await initialize(rpc, startupTimeoutMs);
76
+ return await fn(rpc);
77
+ }
78
+ catch (e) {
79
+ throw toAiCliError(e, "PROVIDER_ERROR");
80
+ }
81
+ finally {
82
+ await proc.terminate(1_000);
83
+ }
84
+ }
85
+ return {
86
+ id: "codex",
87
+ displayName: "Codex",
88
+ installUrl: "https://developers.openai.com/codex/cli/",
89
+ async detect(log) {
90
+ const path = await findExecutable({
91
+ names: ["codex"],
92
+ envVar: "EDUKORS_CODEX",
93
+ ...(options.executable ? { override: options.executable } : {}),
94
+ ...(options.searchEnv ? { env: options.searchEnv } : {}),
95
+ });
96
+ if (!path)
97
+ return { providerId: "codex", status: "missing" };
98
+ const version = await readVersion(path, ["--version"], buildEnv({ set: { ...options.env } }));
99
+ if (!version) {
100
+ log.warn("could not read the Codex version", { path });
101
+ return { providerId: "codex", status: "error", executable: path, detail: "unrecognized version output" };
102
+ }
103
+ if (compareVersions(version, minVersion) < 0)
104
+ return { providerId: "codex", status: "incompatible", executable: path, version, requiredVersion: minVersion };
105
+ return { providerId: "codex", status: "ready", executable: path, version };
106
+ },
107
+ capabilities: () => capabilities,
108
+ async connectAccount(context) {
109
+ // Opens the browser and waits for the ChatGPT sign-in; the address it prints
110
+ // completes in the browser too, so there is no code to paste back.
111
+ const result = await runLoginCommand({ file: context.detection.executable, args: ["login"], env: env(context) }, context, { urlPattern: LOGIN_URL, acceptsCode: false });
112
+ if (result.timedOut)
113
+ throw new AiCliError("TIMEOUT", "sign-in did not finish in time");
114
+ if (result.code !== 0)
115
+ throw new AiCliError("LOGIN_FAILED", "Codex sign-in failed", { meta: { detail: (result.stderr.trim() || result.stdout.trim()).slice(-300) } });
116
+ return this.accountStatus(context);
117
+ },
118
+ async accountStatus(context) {
119
+ // The app server names the account (`codex login status` does not); the CLI is the fallback.
120
+ try {
121
+ const read = await withAppServer(context, (rpc) => rpc.request("account/read", { refreshToken: false }, 15_000));
122
+ const account = read?.account;
123
+ if (!account)
124
+ return { state: "disconnected" };
125
+ const identity = typeof account.email === "string" && account.email ? account.email : account.type === "apiKey" ? "API key" : undefined;
126
+ return { state: "connected", ...(identity ? { identity } : {}) };
127
+ }
128
+ catch (e) {
129
+ context.log.debug("codex account/read failed; asking the CLI", e);
130
+ }
131
+ const result = await cli(context, ["login", "status"]);
132
+ const said = `${result.stdout}\n${result.stderr}`;
133
+ if (result.code === 0)
134
+ return { state: "connected" };
135
+ if (/not logged in/i.test(said))
136
+ return { state: "disconnected" };
137
+ return { state: "unknown", detail: said.trim().slice(-200) };
138
+ },
139
+ async logout(context) {
140
+ const result = await cli(context, ["logout"]);
141
+ if (result.code !== 0 && !/not logged in/i.test(result.stdout + result.stderr))
142
+ throw new AiCliError("PROVIDER_ERROR", "Codex sign-out failed");
143
+ },
144
+ listModels: (context) => withAppServer(context, async (rpc) => {
145
+ const list = await rpc.request("model/list", { limit: 50 }, 30_000);
146
+ const items = Array.isArray(list?.data) ? list.data : [];
147
+ return items
148
+ .filter((m) => !m?.hidden && (m?.id || m?.model))
149
+ .map((m) => {
150
+ const efforts = Array.isArray(m.supportedReasoningEfforts) ? m.supportedReasoningEfforts.map((e) => String(e?.reasoningEffort ?? e)).filter(Boolean) : [];
151
+ return { id: String(m.id ?? m.model), label: String(m.displayName ?? m.id ?? m.model), ...(efforts.length ? { efforts } : {}), ...(m.isDefault ? { default: true } : {}) };
152
+ });
153
+ }),
154
+ readUsage: (context) => withAppServer(context, async (rpc) => {
155
+ const limits = codexLimits(await rpc.request("account/rateLimits/read", null, 30_000));
156
+ return limits ? { ...limits, observedAt: new Date().toISOString() } : null;
157
+ }),
158
+ openSession: (context, hooks) => CodexSession.open(context, hooks, env, startupTimeoutMs),
159
+ };
160
+ }
161
+ async function initialize(rpc, timeoutMs) {
162
+ await rpc.request("initialize", { clientInfo: { name: "edukors-ai-cli", title: "EDUKORS", version: VERSION }, capabilities: { experimentalApi: true } }, timeoutMs);
163
+ rpc.notify("initialized", {});
164
+ }
165
+ class CodexSession {
166
+ proc;
167
+ bridge;
168
+ log;
169
+ hooks;
170
+ resumeId;
171
+ rpc;
172
+ pending = null;
173
+ /** Sinks of recent turns by Codex turn id: late output goes to its own (dead) sink. */
174
+ sinks = new Map();
175
+ options;
176
+ closing = false;
177
+ /** The servers this session serves through its bridge; any other is declined. */
178
+ bridged = new Set();
179
+ /** Added to Codex's own instructions (unlike baseInstructions, which replaces them). */
180
+ developerInstructions = "";
181
+ constructor(proc, bridge, log, hooks, options) {
182
+ this.proc = proc;
183
+ this.bridge = bridge;
184
+ this.log = log;
185
+ this.hooks = hooks;
186
+ this.options = { ...options };
187
+ }
188
+ static async open(context, hooks, env, startupTimeoutMs) {
189
+ let session = null;
190
+ const idle = Promise.resolve({ content: "No request is active.", isError: true });
191
+ // Codex reads native skills with shell commands, which an editor session refuses:
192
+ // the application's skills are served by the library instead (read_skill).
193
+ const skills = context.skillsDir ? listSkills(context.skillsDir) : [];
194
+ const ownTools = [...context.tools];
195
+ if (skills.length) {
196
+ if (ownTools.some((t) => t.name === READ_SKILL_TOOL))
197
+ context.log.warn(`the application has a tool named ${READ_SKILL_TOOL}; skills are not offered`);
198
+ else
199
+ ownTools.push(readSkillSpec);
200
+ }
201
+ const callOwn = async (name, args) => {
202
+ const pending = session?.pending;
203
+ if (!pending)
204
+ return idle;
205
+ if (name !== READ_SKILL_TOOL || !context.skillsDir || ownTools.length === context.tools.length)
206
+ return pending.sink.callTool(name, args);
207
+ pending.sink.activity("reading");
208
+ const { skill, file } = (args ?? {});
209
+ try {
210
+ return { content: readSkillFile(context.skillsDir, String(skill ?? ""), typeof file === "string" && file ? file : undefined) };
211
+ }
212
+ catch (e) {
213
+ return { content: e instanceof Error ? e.message : String(e), isError: true };
214
+ }
215
+ };
216
+ // The application's tools and each of the user's servers, all behind the one bridge.
217
+ const served = [
218
+ ...(ownTools.length ? [{ name: TOOL_SERVER_NAME, tools: ownTools, call: callOwn }] : []),
219
+ ...context.externalServers.map((server) => ({
220
+ name: server.name,
221
+ tools: server.tools,
222
+ call: (name, args) => (session?.pending ? session.pending.sink.callExternal(server.name, name, args) : idle),
223
+ })),
224
+ ];
225
+ const bridge = served.length ? await startToolBridge(served, context.log) : null;
226
+ const args = ["app-server"];
227
+ for (const { name } of served)
228
+ args.push("-c", `mcp_servers.${name}.url=${tomlString(bridge.urlFor(name))}`, "-c", `mcp_servers.${name}.bearer_token_env_var=${tomlString(TOKEN_VAR)}`);
229
+ const proc = new ManagedProcess({ file: context.detection.executable, args, env: env(context, bridge ? { [TOKEN_VAR]: bridge.token } : {}), cwd: context.workDir });
230
+ session = new CodexSession(proc, bridge, context.log, hooks, context.options);
231
+ session.bridged = new Set(served.map((s) => s.name));
232
+ session.developerInstructions = ownTools.includes(readSkillSpec) ? skillsInstructions(skills) : "";
233
+ try {
234
+ await session.start(context, startupTimeoutMs);
235
+ }
236
+ catch (e) {
237
+ await session.close();
238
+ const error = toAiCliError(e, "PROVIDER_START_FAILED");
239
+ if (error.code === "PROVIDER_CRASHED")
240
+ throw new AiCliError("PROVIDER_START_FAILED", "Codex exited during startup", { meta: { stderr: proc.stderr.toString().slice(-300) } });
241
+ throw error;
242
+ }
243
+ void proc.exited.then((info) => session.exited(info.code, info.signal));
244
+ return session;
245
+ }
246
+ async start(context, timeoutMs) {
247
+ this.rpc = attachRpc(this.proc, { onNotification: (m, p) => this.onNotification(m, p), onRequest: (m, p) => this.onRequest(m, p) }, this.log);
248
+ await initialize(this.rpc, timeoutMs);
249
+ const read = await this.rpc.request("account/read", { refreshToken: false }, timeoutMs);
250
+ if (!read?.account)
251
+ throw new AiCliError("ACCOUNT_DISCONNECTED", "Codex is not signed in on this account");
252
+ await this.disableSkills(context.workDir);
253
+ const common = {
254
+ approvalPolicy: "untrusted",
255
+ sandbox: "read-only",
256
+ ...(context.instructions ? { baseInstructions: context.instructions } : {}),
257
+ ...(this.developerInstructions ? { developerInstructions: this.developerInstructions } : {}),
258
+ ...(context.options.model ? { model: context.options.model } : {}),
259
+ };
260
+ const thread = context.resumeId
261
+ ? await this.rpc.request("thread/resume", { threadId: context.resumeId, ...common }, 60_000)
262
+ : await this.rpc.request("thread/start", { cwd: context.workDir, ...common }, 60_000);
263
+ const id = thread?.thread?.id;
264
+ if (typeof id !== "string" || !id)
265
+ throw new AiCliError("PROVIDER_PROTOCOL", "Codex opened no thread");
266
+ this.resumeId = id;
267
+ }
268
+ /**
269
+ * Codex finds skills on its own (bundled ones, downloaded plugins', the
270
+ * user's ~/.agents) and reads them with shell commands. None belongs in an
271
+ * editor session: every one is switched off, in the account's own config.
272
+ */
273
+ async disableSkills(cwd) {
274
+ try {
275
+ await this.rpc.request("skills/extraRoots/set", { extraRoots: [] }, 30_000);
276
+ const list = await this.rpc.request("skills/list", { cwds: [cwd], forceReload: true }, 30_000);
277
+ const skills = (Array.isArray(list?.data) ? list.data : []).flatMap((e) => (Array.isArray(e?.skills) ? e.skills : []));
278
+ for (const skill of skills)
279
+ if (skill?.path && skill.enabled !== false)
280
+ await this.rpc.request("skills/config/write", { path: String(skill.path), enabled: false }, 30_000);
281
+ }
282
+ catch (e) {
283
+ this.log.debug("codex skills not adjusted", e);
284
+ }
285
+ }
286
+ async send(input, sink) {
287
+ if (this.pending)
288
+ throw new AiCliError("SESSION_BUSY", "a turn is already running");
289
+ const text = input.context ? `${input.text}\n\n<document>\n${input.context}\n</document>` : input.text;
290
+ const done = new Promise((resolve, reject) => {
291
+ this.pending = { requestId: input.requestId, turnId: null, sink, error: null, thinking: false, resolve, reject };
292
+ });
293
+ try {
294
+ const started = await this.rpc.request("turn/start", {
295
+ threadId: this.resumeId,
296
+ input: [{ type: "text", text }],
297
+ ...(this.options.model ? { model: this.options.model } : {}),
298
+ ...(this.options.effort ? { effort: this.options.effort } : {}),
299
+ }, 60_000);
300
+ const turnId = started?.turn?.id;
301
+ // Set by the executor above, which TypeScript does not follow.
302
+ const current = this.pending;
303
+ if (typeof turnId === "string" && current?.requestId === input.requestId)
304
+ this.adopt(turnId);
305
+ }
306
+ catch (e) {
307
+ this.settle((p) => p.reject(toAiCliError(e, "PROVIDER_ERROR")));
308
+ }
309
+ return done;
310
+ }
311
+ async interrupt() {
312
+ const turnId = this.pending?.turnId;
313
+ if (!turnId)
314
+ return;
315
+ await this.rpc.request("turn/interrupt", { threadId: this.resumeId, turnId }, 30_000).catch((e) => this.log.warn("codex interrupt failed", e));
316
+ }
317
+ /** Model and effort go with each turn, so they apply from the next request. */
318
+ async updateOptions(options) {
319
+ this.options = { ...this.options, ...options };
320
+ }
321
+ async close() {
322
+ if (this.closing)
323
+ return;
324
+ this.closing = true;
325
+ await this.proc.terminate(1_000);
326
+ await this.bridge?.close();
327
+ this.settle((p) => p.reject(new AiCliError("SESSION_CLOSED", "the session was closed")));
328
+ }
329
+ adopt(turnId) {
330
+ const pending = this.pending;
331
+ if (!pending || pending.turnId)
332
+ return;
333
+ pending.turnId = turnId;
334
+ this.sinks.set(turnId, pending.sink);
335
+ if (this.sinks.size > 8)
336
+ this.sinks.delete(this.sinks.keys().next().value);
337
+ }
338
+ /**
339
+ * The sink for a turn: the current one, or the dead sink of an older turn.
340
+ * A request's turn comes only from `turn/started` or the `turn/start`
341
+ * answer: after a resume, Codex replays notifications of older turns.
342
+ */
343
+ sinkFor(turnId) {
344
+ return typeof turnId === "string" ? this.sinks.get(turnId) : undefined;
345
+ }
346
+ onNotification(method, params) {
347
+ if (params?.threadId && params.threadId !== this.resumeId)
348
+ return;
349
+ const turnId = params?.turnId ?? params?.turn?.id;
350
+ const isCurrent = () => this.pending?.turnId === turnId;
351
+ switch (method) {
352
+ case "turn/started":
353
+ if (typeof turnId === "string")
354
+ this.adopt(turnId);
355
+ return;
356
+ case "item/agentMessage/delta":
357
+ if (typeof params.delta === "string")
358
+ this.sinkFor(turnId)?.text(params.delta);
359
+ return;
360
+ case "item/reasoning/summaryTextDelta":
361
+ case "item/reasoning/textDelta": {
362
+ const sink = this.sinkFor(turnId);
363
+ if (sink && this.pending && isCurrent() && !this.pending.thinking) {
364
+ this.pending.thinking = true;
365
+ sink.activity("thinking");
366
+ }
367
+ return;
368
+ }
369
+ case "item/completed": {
370
+ // Codex 0.164 asks the user in an async message and sleeps until a reply steers the turn.
371
+ const item = params?.item;
372
+ if (item?.type === "agentMessage" && Array.isArray(item.questions) && item.questions.length && isCurrent())
373
+ void this.answerAsync(turnId, item.questions);
374
+ return;
375
+ }
376
+ case "item/started": {
377
+ const type = params?.item?.type;
378
+ if (type === "mcpToolCall" || type === "dynamicToolCall")
379
+ this.sinkFor(turnId)?.activity("applying");
380
+ else if (type === "webSearch")
381
+ this.sinkFor(turnId)?.activity("researching");
382
+ return;
383
+ }
384
+ case "thread/tokenUsage/updated": {
385
+ const last = params?.tokenUsage?.last;
386
+ if (last)
387
+ this.sinkFor(turnId)?.usage({ inputTokens: last.inputTokens, outputTokens: last.outputTokens, cachedInputTokens: last.cachedInputTokens });
388
+ return;
389
+ }
390
+ case "account/rateLimits/updated": {
391
+ const limits = codexLimits(params);
392
+ if (limits && this.pending?.turnId)
393
+ this.sinks.get(this.pending.turnId)?.usage(limits);
394
+ return;
395
+ }
396
+ case "error":
397
+ if (isCurrent() && params?.willRetry === false && this.pending)
398
+ this.pending.error = codexError(params.error);
399
+ return;
400
+ case "turn/completed": {
401
+ if (!isCurrent())
402
+ return;
403
+ const status = params?.turn?.status;
404
+ if (status === "completed")
405
+ this.settle((p) => p.resolve("completed"));
406
+ else if (status === "interrupted")
407
+ this.settle((p) => p.resolve("cancelled"));
408
+ else
409
+ this.settle((p) => p.reject(p.error ?? codexError(params?.turn?.error)));
410
+ return;
411
+ }
412
+ }
413
+ }
414
+ async onRequest(method, params) {
415
+ switch (method) {
416
+ // No shell and no file writes in an editor session: declined, and Codex is told so.
417
+ case "item/commandExecution/requestApproval":
418
+ case "item/fileChange/requestApproval":
419
+ return { decision: "decline" };
420
+ case "execCommandApproval":
421
+ case "applyPatchApproval":
422
+ return { decision: "denied" };
423
+ case "item/permissions/requestApproval":
424
+ return { permissions: {} };
425
+ // Codex asks before calling an MCP server; the application's tools decide for themselves.
426
+ case "mcpServer/elicitation/request":
427
+ return { action: this.bridged.has(String(params?.serverName)) ? "accept" : "decline" };
428
+ case "item/tool/requestUserInput":
429
+ return this.askUser(params);
430
+ case "item/tool/call":
431
+ return { contentItems: [{ type: "inputText", text: "This tool is not available here." }], success: false };
432
+ default:
433
+ throw new Error(`unsupported request: ${method}`);
434
+ }
435
+ }
436
+ /** Puts an async message's questions to the user and steers the sleeping turn with the answers. */
437
+ async answerAsync(turnId, questions) {
438
+ const sink = this.sinkFor(turnId);
439
+ if (!sink)
440
+ return;
441
+ const answers = [];
442
+ try {
443
+ for (const q of questions) {
444
+ const prompt = String(q?.title ?? "");
445
+ if (!prompt)
446
+ continue;
447
+ const options = (Array.isArray(q.options) ? q.options : []).map(String).filter(Boolean);
448
+ const answer = await sink.ask({ prompt, ...(options.length ? { options } : {}) });
449
+ answers.push(questions.length > 1 ? `${prompt} ${answer}` : answer);
450
+ }
451
+ }
452
+ catch {
453
+ return; // Cancelled: the interruption ends the turn.
454
+ }
455
+ if (this.pending?.turnId !== turnId || !answers.length)
456
+ return;
457
+ await this.rpc
458
+ .request("turn/steer", { threadId: this.resumeId, expectedTurnId: turnId, input: [{ type: "text", text: answers.join("\n") }] }, 30_000)
459
+ .catch((e) => this.log.warn("codex did not take the answer", e));
460
+ }
461
+ async askUser(params) {
462
+ const sink = this.sinkFor(params?.turnId);
463
+ const answers = {};
464
+ for (const q of Array.isArray(params?.questions) ? params.questions : []) {
465
+ const id = String(q?.id ?? "");
466
+ if (!id)
467
+ continue;
468
+ answers[id] = { answers: [] };
469
+ if (!sink)
470
+ continue;
471
+ const options = (Array.isArray(q.options) ? q.options : []).map((o) => String(o?.label ?? "")).filter(Boolean);
472
+ try {
473
+ const answer = await sink.ask({ prompt: String(q.question ?? q.header ?? ""), ...(options.length ? { options } : {}) });
474
+ answers[id] = { answers: answer ? [answer] : [] };
475
+ }
476
+ catch {
477
+ break;
478
+ }
479
+ }
480
+ return { answers };
481
+ }
482
+ exited(code, signal) {
483
+ if (this.closing)
484
+ return;
485
+ void this.bridge?.close();
486
+ const error = new AiCliError("PROVIDER_CRASHED", "Codex stopped unexpectedly", { meta: { code, signal, stderr: this.proc.stderr.toString().slice(-300) } });
487
+ this.hooks.exited(error);
488
+ this.settle((p) => p.reject(error));
489
+ }
490
+ settle(fn) {
491
+ const pending = this.pending;
492
+ this.pending = null;
493
+ if (pending)
494
+ fn(pending);
495
+ }
496
+ }
497
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/codex/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ScopedLog } from "../../diagnostics.js";
2
+ import { type ManagedProcess } from "../../platform/process.js";
3
+ /**
4
+ * JSON-RPC over a child process's pipes, one message per line, as Codex's
5
+ * app server speaks it: without the `"jsonrpc"` field. Three kinds of
6
+ * traffic: requests the client waits on, notifications from the server, and
7
+ * requests from the server (an approval, a question) answered by the same id.
8
+ */
9
+ export interface RpcHandlers {
10
+ onNotification?: (method: string, params: any) => void;
11
+ onRequest?: (method: string, params: any) => Promise<unknown>;
12
+ }
13
+ export interface Rpc {
14
+ request<T = any>(method: string, params?: unknown, timeoutMs?: number): Promise<T>;
15
+ notify(method: string, params?: unknown): void;
16
+ }
17
+ export declare function attachRpc(proc: ManagedProcess, handlers: RpcHandlers, log: ScopedLog): Rpc;
@@ -0,0 +1,75 @@
1
+ import { AiCliError } from "../../errors.js";
2
+ import { readLines } from "../../platform/process.js";
3
+ export function attachRpc(proc, handlers, log) {
4
+ const pending = new Map();
5
+ let nextId = 1;
6
+ const fail = (reason) => {
7
+ for (const [id, waiting] of pending) {
8
+ pending.delete(id);
9
+ clearTimeout(waiting.timer);
10
+ waiting.reject(new AiCliError("PROVIDER_CRASHED", reason, { meta: { method: waiting.method } }));
11
+ }
12
+ };
13
+ void proc.exited.then(() => fail("the Codex app server stopped"));
14
+ readLines(proc.child.stdout, (line) => {
15
+ if (!line.trim())
16
+ return;
17
+ let msg;
18
+ try {
19
+ msg = JSON.parse(line);
20
+ }
21
+ catch {
22
+ log.warn("ignored a line that is not JSON-RPC", { line: line.slice(0, 200) });
23
+ return;
24
+ }
25
+ if (!msg || typeof msg !== "object")
26
+ return;
27
+ const hasId = msg.id !== undefined && msg.id !== null;
28
+ // Method names and ids only: params can hold document content.
29
+ if (typeof msg.method === "string" && !/delta$/i.test(msg.method))
30
+ log.debug(`codex -> ${msg.method}${hasId ? ` #${msg.id}` : ""}`);
31
+ if (hasId && typeof msg.method === "string") {
32
+ const answer = handlers.onRequest ? handlers.onRequest(msg.method, msg.params ?? {}) : Promise.reject(new Error(`unhandled request: ${msg.method}`));
33
+ answer.then((result) => proc.writeLine({ id: msg.id, result: result ?? null }), (e) => {
34
+ log.debug(`request ${msg.method} refused`, { message: e instanceof Error ? e.message : String(e) });
35
+ proc.writeLine({ id: msg.id, error: { code: -32603, message: e instanceof Error ? e.message : String(e) } });
36
+ });
37
+ return;
38
+ }
39
+ if (hasId) {
40
+ const waiting = pending.get(msg.id);
41
+ if (!waiting)
42
+ return;
43
+ pending.delete(msg.id);
44
+ clearTimeout(waiting.timer);
45
+ if (msg.error)
46
+ waiting.reject(new AiCliError("PROVIDER_ERROR", String(msg.error.message ?? "Codex refused the request"), { meta: { method: waiting.method, rpcCode: msg.error.code } }));
47
+ else
48
+ waiting.resolve(msg.result ?? null);
49
+ return;
50
+ }
51
+ if (typeof msg.method === "string")
52
+ handlers.onNotification?.(msg.method, msg.params ?? {});
53
+ }, { onOverflow: () => log.warn("discarded an oversized line from Codex") });
54
+ return {
55
+ request(method, params = {}, timeoutMs = 120_000) {
56
+ const id = nextId++;
57
+ return new Promise((resolve, reject) => {
58
+ const timer = setTimeout(() => {
59
+ pending.delete(id);
60
+ reject(new AiCliError("TIMEOUT", `Codex did not answer ${method} in time`, { meta: { method } }));
61
+ }, timeoutMs);
62
+ pending.set(id, { resolve, reject, timer, method });
63
+ if (!proc.writeLine({ id, method, params })) {
64
+ pending.delete(id);
65
+ clearTimeout(timer);
66
+ reject(new AiCliError("PROVIDER_CRASHED", "the Codex app server is not running", { meta: { method } }));
67
+ }
68
+ });
69
+ },
70
+ notify(method, params = {}) {
71
+ proc.writeLine({ method, params });
72
+ },
73
+ };
74
+ }
75
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/providers/codex/rpc.ts"],"names":[],"mappings":"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"}