@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.
- package/LICENSE +9 -0
- package/README.md +162 -2
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +256 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/diagnostics.d.ts +28 -0
- package/dist/diagnostics.js +35 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/engine.d.ts +157 -0
- package/dist/engine.js +395 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +95 -0
- package/dist/events.js +8 -0
- package/dist/events.js.map +1 -0
- package/dist/host/main.d.ts +2 -0
- package/dist/host/main.js +30 -0
- package/dist/host/main.js.map +1 -0
- package/dist/host/stdio.d.ts +34 -0
- package/dist/host/stdio.js +254 -0
- package/dist/host/stdio.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/config.d.ts +19 -0
- package/dist/mcp/config.js +63 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/external.d.ts +55 -0
- package/dist/mcp/external.js +129 -0
- package/dist/mcp/external.js.map +1 -0
- package/dist/mcp/toolServer.d.ts +30 -0
- package/dist/mcp/toolServer.js +102 -0
- package/dist/mcp/toolServer.js.map +1 -0
- package/dist/platform/discovery.d.ts +23 -0
- package/dist/platform/discovery.js +64 -0
- package/dist/platform/discovery.js.map +1 -0
- package/dist/platform/env.d.ts +12 -0
- package/dist/platform/env.js +104 -0
- package/dist/platform/env.js.map +1 -0
- package/dist/platform/login.d.ts +16 -0
- package/dist/platform/login.js +42 -0
- package/dist/platform/login.js.map +1 -0
- package/dist/platform/paths.d.ts +19 -0
- package/dist/platform/paths.js +46 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/process.d.ts +55 -0
- package/dist/platform/process.js +186 -0
- package/dist/platform/process.js.map +1 -0
- package/dist/provider.d.ts +156 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/claude/adapter.d.ts +43 -0
- package/dist/providers/claude/adapter.js +398 -0
- package/dist/providers/claude/adapter.js.map +1 -0
- package/dist/providers/claude/events.d.ts +36 -0
- package/dist/providers/claude/events.js +90 -0
- package/dist/providers/claude/events.js.map +1 -0
- package/dist/providers/codex/adapter.d.ts +28 -0
- package/dist/providers/codex/adapter.js +497 -0
- package/dist/providers/codex/adapter.js.map +1 -0
- package/dist/providers/codex/rpc.d.ts +17 -0
- package/dist/providers/codex/rpc.js +75 -0
- package/dist/providers/codex/rpc.js.map +1 -0
- package/dist/providers.d.ts +9 -0
- package/dist/providers.js +15 -0
- package/dist/providers.js.map +1 -0
- package/dist/redact.d.ts +7 -0
- package/dist/redact.js +48 -0
- package/dist/redact.js.map +1 -0
- package/dist/registry/lock.d.ts +18 -0
- package/dist/registry/lock.js +83 -0
- package/dist/registry/lock.js.map +1 -0
- package/dist/registry/registry.d.ts +38 -0
- package/dist/registry/registry.js +119 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/session.d.ts +126 -0
- package/dist/session.js +333 -0
- package/dist/session.js.map +1 -0
- package/dist/settings.d.ts +8 -0
- package/dist/settings.js +7 -0
- package/dist/settings.js.map +1 -0
- package/dist/skills.d.ts +24 -0
- package/dist/skills.js +91 -0
- package/dist/skills.js.map +1 -0
- package/dist/testing/fakeProvider.d.ts +22 -0
- package/dist/testing/fakeProvider.js +266 -0
- package/dist/testing/fakeProvider.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tools.d.ts +45 -0
- package/dist/tools.js +32 -0
- package/dist/tools.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/fixtures/fake-ai.mjs +230 -0
- package/fixtures/fake-claude.mjs +62 -0
- package/fixtures/fake-codex.mjs +281 -0
- package/fixtures/fake-mcp-server.mjs +14 -0
- 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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"}
|