linkshell-cli 0.5.42 → 0.6.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/dist/cli/src/commands/host.d.ts +30 -0
- package/dist/cli/src/commands/host.js +278 -0
- package/dist/cli/src/commands/host.js.map +1 -0
- package/dist/cli/src/commands/pair.d.ts +1 -0
- package/dist/cli/src/commands/pair.js +51 -0
- package/dist/cli/src/commands/pair.js.map +1 -0
- package/dist/cli/src/index.js +69 -0
- package/dist/cli/src/index.js.map +1 -1
- package/dist/cli/src/utils/daemon.d.ts +1 -1
- package/dist/cli/src/utils/daemon.js +3 -2
- package/dist/cli/src/utils/daemon.js.map +1 -1
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/dist/host/src/drivers/acp/connection.d.ts +61 -0
- package/dist/host/src/drivers/acp/connection.js +121 -0
- package/dist/host/src/drivers/acp/connection.js.map +1 -0
- package/dist/host/src/drivers/acp/driver.d.ts +110 -0
- package/dist/host/src/drivers/acp/driver.js +438 -0
- package/dist/host/src/drivers/acp/driver.js.map +1 -0
- package/dist/host/src/drivers/acp/mapper.d.ts +49 -0
- package/dist/host/src/drivers/acp/mapper.js +411 -0
- package/dist/host/src/drivers/acp/mapper.js.map +1 -0
- package/dist/host/src/drivers/auth.d.ts +7 -0
- package/dist/host/src/drivers/auth.js +57 -0
- package/dist/host/src/drivers/auth.js.map +1 -0
- package/dist/host/src/drivers/claude/driver.d.ts +76 -0
- package/dist/host/src/drivers/claude/driver.js +331 -0
- package/dist/host/src/drivers/claude/driver.js.map +1 -0
- package/dist/host/src/drivers/claude/transcript.d.ts +335 -0
- package/dist/host/src/drivers/claude/transcript.js +516 -0
- package/dist/host/src/drivers/claude/transcript.js.map +1 -0
- package/dist/host/src/drivers/codex/app-server.d.ts +36 -0
- package/dist/host/src/drivers/codex/app-server.js +144 -0
- package/dist/host/src/drivers/codex/app-server.js.map +1 -0
- package/dist/host/src/drivers/codex/driver.d.ts +89 -0
- package/dist/host/src/drivers/codex/driver.js +452 -0
- package/dist/host/src/drivers/codex/driver.js.map +1 -0
- package/dist/host/src/drivers/codex/mapper.d.ts +61 -0
- package/dist/host/src/drivers/codex/mapper.js +623 -0
- package/dist/host/src/drivers/codex/mapper.js.map +1 -0
- package/dist/host/src/drivers/codex/settings.d.ts +51 -0
- package/dist/host/src/drivers/codex/settings.js +107 -0
- package/dist/host/src/drivers/codex/settings.js.map +1 -0
- package/dist/host/src/drivers/images.d.ts +11 -0
- package/dist/host/src/drivers/images.js +34 -0
- package/dist/host/src/drivers/images.js.map +1 -0
- package/dist/host/src/drivers/nesting.d.ts +6 -0
- package/dist/host/src/drivers/nesting.js +25 -0
- package/dist/host/src/drivers/nesting.js.map +1 -0
- package/dist/host/src/drivers/registry.d.ts +21 -0
- package/dist/host/src/drivers/registry.js +30 -0
- package/dist/host/src/drivers/registry.js.map +1 -0
- package/dist/host/src/drivers/types.d.ts +105 -0
- package/dist/host/src/drivers/types.js +2 -0
- package/dist/host/src/drivers/types.js.map +1 -0
- package/dist/host/src/fs.d.ts +69 -0
- package/dist/host/src/fs.js +198 -0
- package/dist/host/src/fs.js.map +1 -0
- package/dist/host/src/gateway.d.ts +55 -0
- package/dist/host/src/gateway.js +263 -0
- package/dist/host/src/gateway.js.map +1 -0
- package/dist/host/src/host.d.ts +51 -0
- package/dist/host/src/host.js +133 -0
- package/dist/host/src/host.js.map +1 -0
- package/dist/host/src/hub.d.ts +89 -0
- package/dist/host/src/hub.js +592 -0
- package/dist/host/src/hub.js.map +1 -0
- package/dist/host/src/index.d.ts +10 -0
- package/dist/host/src/index.js +10 -0
- package/dist/host/src/index.js.map +1 -0
- package/dist/host/src/ports.d.ts +24 -0
- package/dist/host/src/ports.js +201 -0
- package/dist/host/src/ports.js.map +1 -0
- package/dist/host/src/rpc/client.d.ts +9 -0
- package/dist/host/src/rpc/client.js +42 -0
- package/dist/host/src/rpc/client.js.map +1 -0
- package/dist/host/src/rpc/server.d.ts +52 -0
- package/dist/host/src/rpc/server.js +293 -0
- package/dist/host/src/rpc/server.js.map +1 -0
- package/dist/host/src/screen.d.ts +30 -0
- package/dist/host/src/screen.js +230 -0
- package/dist/host/src/screen.js.map +1 -0
- package/dist/host/src/shell-env.d.ts +8 -0
- package/dist/host/src/shell-env.js +39 -0
- package/dist/host/src/shell-env.js.map +1 -0
- package/dist/host/src/store.d.ts +75 -0
- package/dist/host/src/store.js +265 -0
- package/dist/host/src/store.js.map +1 -0
- package/dist/host/src/terminals.d.ts +55 -0
- package/dist/host/src/terminals.js +367 -0
- package/dist/host/src/terminals.js.map +1 -0
- package/dist/shared-protocol/src/index.d.ts +3345 -3345
- package/dist/wire/src/crypto.d.ts +65 -0
- package/dist/wire/src/crypto.js +253 -0
- package/dist/wire/src/crypto.js.map +1 -0
- package/dist/wire/src/index.d.ts +8 -0
- package/dist/wire/src/index.js +9 -0
- package/dist/wire/src/index.js.map +1 -0
- package/dist/wire/src/model.d.ts +704 -0
- package/dist/wire/src/model.js +163 -0
- package/dist/wire/src/model.js.map +1 -0
- package/dist/wire/src/peer.d.ts +42 -0
- package/dist/wire/src/peer.js +143 -0
- package/dist/wire/src/peer.js.map +1 -0
- package/dist/wire/src/relay-client.d.ts +82 -0
- package/dist/wire/src/relay-client.js +259 -0
- package/dist/wire/src/relay-client.js.map +1 -0
- package/dist/wire/src/relay.d.ts +481 -0
- package/dist/wire/src/relay.js +129 -0
- package/dist/wire/src/relay.js.map +1 -0
- package/dist/wire/src/rpc.d.ts +4170 -0
- package/dist/wire/src/rpc.js +332 -0
- package/dist/wire/src/rpc.js.map +1 -0
- package/dist/wire/src/shell.d.ts +2 -0
- package/dist/wire/src/shell.js +62 -0
- package/dist/wire/src/shell.js.map +1 -0
- package/dist/wire/src/updates.d.ts +3325 -0
- package/dist/wire/src/updates.js +210 -0
- package/dist/wire/src/updates.js.map +1 -0
- package/package.json +8 -3
- package/src/commands/host.ts +297 -0
- package/src/commands/pair.ts +52 -0
- package/src/index.ts +74 -0
- package/src/utils/daemon.ts +4 -3
- package/dist/cli/src/commands/hook.d.ts +0 -6
- package/dist/cli/src/commands/hook.js +0 -120
- package/dist/cli/src/commands/hook.js.map +0 -1
- package/dist/cli/src/runtime/acp/agent-workspace-git.d.ts +0 -63
- package/dist/cli/src/runtime/acp/agent-workspace-git.js +0 -297
- package/dist/cli/src/runtime/acp/agent-workspace-git.js.map +0 -1
- package/dist/cli/src/runtime/acp-relay.d.ts +0 -23
- package/dist/cli/src/runtime/acp-relay.js +0 -73
- package/dist/cli/src/runtime/acp-relay.js.map +0 -1
- package/dist/cli/src/runtime/hook-permission-server.d.ts +0 -36
- package/dist/cli/src/runtime/hook-permission-server.js +0 -147
- package/dist/cli/src/runtime/hook-permission-server.js.map +0 -1
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { ABANDON, RpcError } from "@linkshell/wire";
|
|
2
|
+
import { parseCodexLoginStatus, runStatusCommand } from "../auth.js";
|
|
3
|
+
import { CodexAppServer, detectCodex } from "./app-server.js";
|
|
4
|
+
import { APPROVAL_METHODS, mapApprovalRequest, mapNotification, threadStateOf, threadToDiscovered, spawnedThreads, threadToHistory, toCodexInput, } from "./mapper.js";
|
|
5
|
+
import { nestHistory, nestUnder } from "../nesting.js";
|
|
6
|
+
import { configOptions, effective, settingsFrom, turnOverrides } from "./settings.js";
|
|
7
|
+
/**
|
|
8
|
+
* Codex, tier multi_client: LinkShell and the desktop TUI (`codex --remote`)
|
|
9
|
+
* are both clients of one app-server, so every thread is live on both sides.
|
|
10
|
+
*/
|
|
11
|
+
export class CodexDriver {
|
|
12
|
+
options;
|
|
13
|
+
id = "codex";
|
|
14
|
+
label = "Codex";
|
|
15
|
+
tier = "multi_client";
|
|
16
|
+
capabilities = {
|
|
17
|
+
interrupt: true,
|
|
18
|
+
steer: true,
|
|
19
|
+
permissions: true,
|
|
20
|
+
images: true,
|
|
21
|
+
fork: true,
|
|
22
|
+
models: true,
|
|
23
|
+
modes: true,
|
|
24
|
+
};
|
|
25
|
+
host;
|
|
26
|
+
server;
|
|
27
|
+
current = { installed: false };
|
|
28
|
+
threads = new Map();
|
|
29
|
+
attached = new Set();
|
|
30
|
+
/** Threads this connection started: already subscribed, and not on disk until their first turn. */
|
|
31
|
+
startedHere = new Set();
|
|
32
|
+
followRetries = new Map();
|
|
33
|
+
startsInFlight = new Set();
|
|
34
|
+
approvals = new Map();
|
|
35
|
+
settings = new Map();
|
|
36
|
+
overrides = new Map();
|
|
37
|
+
/** Sub-agent thread → the parent thread and the spawnAgent call its work nests under. */
|
|
38
|
+
children = new Map();
|
|
39
|
+
/** Threads Codex reported as sub-agents (parentThreadId set); never shown as sessions. */
|
|
40
|
+
subThreads = new Set();
|
|
41
|
+
models;
|
|
42
|
+
restartTimer;
|
|
43
|
+
restartDelay;
|
|
44
|
+
stopped = false;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
this.restartDelay = options.restartDelayMs ?? 1000;
|
|
48
|
+
}
|
|
49
|
+
status() {
|
|
50
|
+
return this.current;
|
|
51
|
+
}
|
|
52
|
+
async start(host) {
|
|
53
|
+
this.host = host;
|
|
54
|
+
this.stopped = false;
|
|
55
|
+
const version = await detectCodex(this.options.command, this.options.env);
|
|
56
|
+
if (!version) {
|
|
57
|
+
this.current = { installed: false };
|
|
58
|
+
return this.current;
|
|
59
|
+
}
|
|
60
|
+
this.current = { installed: true, version };
|
|
61
|
+
await this.boot();
|
|
62
|
+
return this.current;
|
|
63
|
+
}
|
|
64
|
+
async authStatus() {
|
|
65
|
+
return parseCodexLoginStatus(await runStatusCommand(this.options.command ?? "codex", ["login", "status"], this.options.env));
|
|
66
|
+
}
|
|
67
|
+
async stop() {
|
|
68
|
+
this.stopped = true;
|
|
69
|
+
if (this.restartTimer)
|
|
70
|
+
clearTimeout(this.restartTimer);
|
|
71
|
+
for (const timer of this.followRetries.values())
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
this.followRetries.clear();
|
|
74
|
+
for (const pending of this.approvals.values())
|
|
75
|
+
pending.abandon();
|
|
76
|
+
this.approvals.clear();
|
|
77
|
+
await this.server?.stop();
|
|
78
|
+
this.server = undefined;
|
|
79
|
+
}
|
|
80
|
+
async listSessions(limit) {
|
|
81
|
+
const result = await this.rpc("thread/list", { limit, archived: false });
|
|
82
|
+
return result.data.map(threadToDiscovered);
|
|
83
|
+
}
|
|
84
|
+
async createSession(options) {
|
|
85
|
+
const starting = this.rpc("thread/start", {
|
|
86
|
+
cwd: options.cwd,
|
|
87
|
+
model: options.model ?? null,
|
|
88
|
+
}).then((result) => {
|
|
89
|
+
this.startedHere.add(result.thread.id);
|
|
90
|
+
this.settings.set(result.thread.id, settingsFrom(result));
|
|
91
|
+
return result;
|
|
92
|
+
});
|
|
93
|
+
this.startsInFlight.add(starting);
|
|
94
|
+
let result;
|
|
95
|
+
try {
|
|
96
|
+
result = await starting;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
this.startsInFlight.delete(starting);
|
|
100
|
+
}
|
|
101
|
+
const discovered = threadToDiscovered(result.thread);
|
|
102
|
+
return { ...discovered, model: discovered.model ?? result.model };
|
|
103
|
+
}
|
|
104
|
+
async attach(nativeId) {
|
|
105
|
+
// Mark first: notifications that race the resume response are buffered by
|
|
106
|
+
// the host rather than dropped.
|
|
107
|
+
this.attached.add(nativeId);
|
|
108
|
+
if (this.startedHere.delete(nativeId)) {
|
|
109
|
+
// thread/start already subscribed us, and a thread without turns has no
|
|
110
|
+
// rollout yet, so thread/resume would fail. Nothing to import either.
|
|
111
|
+
void this.announceConfig(nativeId);
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
let thread;
|
|
115
|
+
try {
|
|
116
|
+
// On a running thread, thread/resume rejoins it; otherwise it loads it from disk.
|
|
117
|
+
const resumed = await this.rpc("thread/resume", { threadId: nativeId });
|
|
118
|
+
thread = resumed.thread;
|
|
119
|
+
this.settings.set(nativeId, settingsFrom(resumed));
|
|
120
|
+
void this.announceConfig(nativeId);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.attached.delete(nativeId);
|
|
124
|
+
if (error instanceof Error && /no rollout/i.test(error.message)) {
|
|
125
|
+
// Opened in another client but no turn yet, so not on disk. A turn can
|
|
126
|
+
// still be started on it; after that it can be joined.
|
|
127
|
+
throw RpcError.app("not_ready", "this Codex session has no messages yet");
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
const active = thread.turns?.find((turn) => turn.status === "inProgress");
|
|
132
|
+
this.stateOf(nativeId).activeTurnId = active?.id;
|
|
133
|
+
this.host?.update(this.id, nativeId, { sessionUpdate: "ls_status", state: threadStateOf(thread.status) });
|
|
134
|
+
return this.withSubAgents(nativeId, thread, threadToHistory(thread));
|
|
135
|
+
}
|
|
136
|
+
/** Nests each sub-agent's own history right after the call that spawned it. */
|
|
137
|
+
async withSubAgents(threadId, thread, history) {
|
|
138
|
+
const spawns = new Map();
|
|
139
|
+
for (const turn of thread.turns ?? []) {
|
|
140
|
+
for (const item of turn.items) {
|
|
141
|
+
const ids = spawnedThreads(item);
|
|
142
|
+
const callId = typeof item.id === "string" ? item.id : undefined;
|
|
143
|
+
if (!callId || ids.length === 0)
|
|
144
|
+
continue;
|
|
145
|
+
spawns.set(callId, ids);
|
|
146
|
+
for (const child of ids)
|
|
147
|
+
this.children.set(child, { threadId, toolCallId: callId });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (spawns.size === 0)
|
|
151
|
+
return history;
|
|
152
|
+
const nested = new Map();
|
|
153
|
+
await Promise.all([...spawns].map(async ([callId, ids]) => {
|
|
154
|
+
const parts = await Promise.all(ids.map((child) => this.rpc("thread/read", { threadId: child, includeTurns: true })
|
|
155
|
+
.then((result) => nestHistory(threadToHistory(result.thread), callId))
|
|
156
|
+
.catch(() => [])));
|
|
157
|
+
nested.set(callId, parts.flat());
|
|
158
|
+
}));
|
|
159
|
+
return history.flatMap((item) => {
|
|
160
|
+
const callId = item.itemId.replace(/^tool:/, "");
|
|
161
|
+
const children = nested.get(callId) ?? nested.get(item.itemId);
|
|
162
|
+
return children ? [item, ...children.map((child) => ({ ...child, ts: child.ts ?? item.ts }))] : [item];
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async detach(nativeId) {
|
|
166
|
+
if (!this.attached.delete(nativeId))
|
|
167
|
+
return;
|
|
168
|
+
await this.rpc("thread/unsubscribe", { threadId: nativeId }).catch(() => { });
|
|
169
|
+
}
|
|
170
|
+
async prompt(nativeId, content, clientMessageId) {
|
|
171
|
+
const input = toCodexInput(content);
|
|
172
|
+
if (input.length === 0)
|
|
173
|
+
throw RpcError.app("invalid_params", "nothing to send");
|
|
174
|
+
const activeTurnId = this.stateOf(nativeId).activeTurnId;
|
|
175
|
+
if (activeTurnId) {
|
|
176
|
+
try {
|
|
177
|
+
await this.rpc("turn/steer", {
|
|
178
|
+
threadId: nativeId,
|
|
179
|
+
expectedTurnId: activeTurnId,
|
|
180
|
+
clientUserMessageId: clientMessageId,
|
|
181
|
+
input,
|
|
182
|
+
});
|
|
183
|
+
return "steered";
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
// The turn may have just ended; fall through to a fresh turn.
|
|
187
|
+
this.host?.log(`[codex] steer failed, starting a new turn: ${error instanceof Error ? error.message : String(error)}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
await this.rpc("turn/start", {
|
|
191
|
+
threadId: nativeId,
|
|
192
|
+
clientUserMessageId: clientMessageId,
|
|
193
|
+
input,
|
|
194
|
+
...turnOverrides(this.overrides.get(nativeId) ?? {}),
|
|
195
|
+
});
|
|
196
|
+
return "started";
|
|
197
|
+
}
|
|
198
|
+
/** Model, reasoning effort and permissions apply from the next turn on. */
|
|
199
|
+
async setConfig(nativeId, optionId, value) {
|
|
200
|
+
const models = await this.loadModels();
|
|
201
|
+
const current = effective(this.settings.get(nativeId) ?? {}, this.overrides.get(nativeId) ?? {}, models);
|
|
202
|
+
const next = { ...this.overrides.get(nativeId) };
|
|
203
|
+
if (optionId === "model") {
|
|
204
|
+
if (!models.some((m) => m.model === value) && value !== current.model) {
|
|
205
|
+
throw RpcError.app("invalid_params", `unknown model ${value}`);
|
|
206
|
+
}
|
|
207
|
+
next.model = value;
|
|
208
|
+
// Keep the effort only if the new model supports it.
|
|
209
|
+
const info = models.find((m) => m.model === value);
|
|
210
|
+
const supported = info?.supportedReasoningEfforts?.map((e) => e.reasoningEffort) ?? [];
|
|
211
|
+
if (next.effort && !supported.includes(next.effort))
|
|
212
|
+
delete next.effort;
|
|
213
|
+
}
|
|
214
|
+
else if (optionId === "effort") {
|
|
215
|
+
if (current.info?.supportedReasoningEfforts && !current.info.supportedReasoningEfforts.some((e) => e.reasoningEffort === value)) {
|
|
216
|
+
throw RpcError.app("invalid_params", `unsupported reasoning effort ${value}`);
|
|
217
|
+
}
|
|
218
|
+
next.effort = value;
|
|
219
|
+
}
|
|
220
|
+
else if (optionId === "permissions") {
|
|
221
|
+
if (value === "custom")
|
|
222
|
+
delete next.permissions;
|
|
223
|
+
else
|
|
224
|
+
next.permissions = value;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
throw RpcError.app("not_supported", `Codex has no setting ${optionId}`);
|
|
228
|
+
}
|
|
229
|
+
this.overrides.set(nativeId, next);
|
|
230
|
+
await this.announceConfig(nativeId);
|
|
231
|
+
}
|
|
232
|
+
loadModels() {
|
|
233
|
+
this.models ??= this.rpc("model/list", { includeHidden: false })
|
|
234
|
+
.then((result) => result.data)
|
|
235
|
+
.catch((error) => {
|
|
236
|
+
this.models = undefined;
|
|
237
|
+
this.host?.log(`[codex] model/list failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
238
|
+
return [];
|
|
239
|
+
});
|
|
240
|
+
return this.models;
|
|
241
|
+
}
|
|
242
|
+
async announceConfig(nativeId) {
|
|
243
|
+
const models = await this.loadModels();
|
|
244
|
+
const options = configOptions(this.settings.get(nativeId) ?? {}, this.overrides.get(nativeId) ?? {}, models);
|
|
245
|
+
if (options.length > 0)
|
|
246
|
+
this.host?.update(this.id, nativeId, { sessionUpdate: "ls_config", options });
|
|
247
|
+
}
|
|
248
|
+
async cancel(nativeId) {
|
|
249
|
+
const turnId = this.stateOf(nativeId).activeTurnId;
|
|
250
|
+
if (!turnId)
|
|
251
|
+
return;
|
|
252
|
+
await this.rpc("turn/interrupt", { threadId: nativeId, turnId });
|
|
253
|
+
}
|
|
254
|
+
async respondPermission(nativeId, requestId, optionId) {
|
|
255
|
+
const pending = this.approvals.get(requestId);
|
|
256
|
+
if (!pending || pending.threadId !== nativeId) {
|
|
257
|
+
throw RpcError.app("not_found", "this permission request is no longer pending");
|
|
258
|
+
}
|
|
259
|
+
this.approvals.delete(requestId);
|
|
260
|
+
pending.answer(pending.request.respond(optionId));
|
|
261
|
+
this.host?.update(this.id, nativeId, { sessionUpdate: "ls_permission_resolved", requestId, optionId });
|
|
262
|
+
if (optionId === "cancel")
|
|
263
|
+
await this.cancel(nativeId).catch(() => { });
|
|
264
|
+
}
|
|
265
|
+
desktopLaunch(args, nativeId) {
|
|
266
|
+
// Multi-client: no lease to take, the TUI just joins the shared server.
|
|
267
|
+
const remote = ["--remote", `unix://${this.options.socketPath}`];
|
|
268
|
+
return {
|
|
269
|
+
command: this.options.command ?? "codex",
|
|
270
|
+
args: nativeId ? [...remote, "resume", nativeId, ...args] : [...remote, ...args],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// ── internals ──────────────────────────────────────────────────────
|
|
274
|
+
async boot() {
|
|
275
|
+
const server = new CodexAppServer({
|
|
276
|
+
socketPath: this.options.socketPath,
|
|
277
|
+
command: this.options.command,
|
|
278
|
+
env: this.options.env,
|
|
279
|
+
clientVersion: this.options.hostVersion,
|
|
280
|
+
log: (message) => this.host?.log(message),
|
|
281
|
+
onNotification: (method, params) => this.onNotification(method, params),
|
|
282
|
+
onRequest: (method, params, id) => this.onServerRequest(method, params, id),
|
|
283
|
+
onDown: (reason) => this.onDown(reason),
|
|
284
|
+
});
|
|
285
|
+
this.server = server;
|
|
286
|
+
try {
|
|
287
|
+
await server.start();
|
|
288
|
+
this.current = { installed: true, version: this.current.version };
|
|
289
|
+
this.restartDelay = this.options.restartDelayMs ?? 1000;
|
|
290
|
+
await this.reattachLoaded();
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
this.current = {
|
|
294
|
+
installed: true,
|
|
295
|
+
version: this.current.version,
|
|
296
|
+
problem: `Codex app-server failed to start: ${error instanceof Error ? error.message : String(error)}`,
|
|
297
|
+
};
|
|
298
|
+
this.scheduleRestart();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/** Follows every thread already live in the app-server (e.g. opened in the TUI). */
|
|
302
|
+
async reattachLoaded() {
|
|
303
|
+
const loaded = await this.rpc("thread/loaded/list", {}).catch(() => ({ data: [] }));
|
|
304
|
+
for (const threadId of loaded.data)
|
|
305
|
+
this.follow(threadId);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Asks the host to follow a thread another client opened. A brand-new thread
|
|
309
|
+
* has no rollout on disk until its first turn, so thread/resume fails until
|
|
310
|
+
* then; keep retrying while the thread stays loaded.
|
|
311
|
+
*/
|
|
312
|
+
follow(threadId, attempt = 0) {
|
|
313
|
+
if (this.stopped || !this.host || this.followRetries.has(threadId))
|
|
314
|
+
return;
|
|
315
|
+
this.host.follow(this.id, threadId).catch(async (error) => {
|
|
316
|
+
if (this.stopped)
|
|
317
|
+
return;
|
|
318
|
+
if (!(error instanceof RpcError && error.appCode === "not_ready")) {
|
|
319
|
+
this.host?.log(`[codex] could not follow ${threadId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (attempt % 30 === 29) {
|
|
323
|
+
const loaded = await this.rpc("thread/loaded/list", {}).catch(() => ({ data: [] }));
|
|
324
|
+
if (!loaded.data.includes(threadId))
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const timer = setTimeout(() => {
|
|
328
|
+
this.followRetries.delete(threadId);
|
|
329
|
+
this.follow(threadId, attempt + 1);
|
|
330
|
+
}, attempt < 4 ? 250 : 1000);
|
|
331
|
+
this.followRetries.set(threadId, timer);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
onDown(reason) {
|
|
335
|
+
this.models = undefined;
|
|
336
|
+
if (this.stopped)
|
|
337
|
+
return;
|
|
338
|
+
this.host?.log(`[codex] ${reason}`);
|
|
339
|
+
for (const pending of this.approvals.values())
|
|
340
|
+
pending.abandon();
|
|
341
|
+
this.approvals.clear();
|
|
342
|
+
for (const threadId of this.attached) {
|
|
343
|
+
this.threads.delete(threadId);
|
|
344
|
+
this.host?.update(this.id, threadId, { sessionUpdate: "ls_status", state: "offline" });
|
|
345
|
+
this.host?.detached(this.id, threadId);
|
|
346
|
+
}
|
|
347
|
+
this.attached.clear();
|
|
348
|
+
this.startedHere.clear();
|
|
349
|
+
this.current = { installed: true, version: this.current.version, problem: "Codex app-server restarting" };
|
|
350
|
+
this.scheduleRestart();
|
|
351
|
+
}
|
|
352
|
+
scheduleRestart() {
|
|
353
|
+
if (this.stopped || this.restartTimer)
|
|
354
|
+
return;
|
|
355
|
+
const delay = this.restartDelay;
|
|
356
|
+
this.restartDelay = Math.min(this.restartDelay * 2, 30_000);
|
|
357
|
+
this.restartTimer = setTimeout(() => {
|
|
358
|
+
this.restartTimer = undefined;
|
|
359
|
+
void this.server?.stop().finally(() => {
|
|
360
|
+
if (!this.stopped)
|
|
361
|
+
void this.boot();
|
|
362
|
+
});
|
|
363
|
+
}, delay);
|
|
364
|
+
}
|
|
365
|
+
stateOf(threadId) {
|
|
366
|
+
let state = this.threads.get(threadId);
|
|
367
|
+
if (!state) {
|
|
368
|
+
state = {};
|
|
369
|
+
this.threads.set(threadId, state);
|
|
370
|
+
}
|
|
371
|
+
return state;
|
|
372
|
+
}
|
|
373
|
+
onNotification(method, params) {
|
|
374
|
+
if (method === "thread/started") {
|
|
375
|
+
const thread = params?.thread;
|
|
376
|
+
if (!thread?.id)
|
|
377
|
+
return;
|
|
378
|
+
if (thread.parentThreadId) {
|
|
379
|
+
// A sub-agent: its work shows inside the parent session, not as a session of its own.
|
|
380
|
+
this.subThreads.add(thread.id);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
this.host?.sessionSeen(this.id, threadToDiscovered(thread));
|
|
384
|
+
// The broadcast can beat our own thread/start response; decide whether
|
|
385
|
+
// the thread was opened elsewhere (the desktop TUI) once those settle.
|
|
386
|
+
void Promise.allSettled([...this.startsInFlight]).then(() => {
|
|
387
|
+
if (!this.attached.has(thread.id) && !this.startedHere.has(thread.id))
|
|
388
|
+
this.follow(thread.id);
|
|
389
|
+
});
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
this.noteSpawns(params);
|
|
393
|
+
for (const mapped of mapNotification(method, params, (threadId) => this.stateOf(threadId))) {
|
|
394
|
+
if (mapped.update.sessionUpdate === "ls_permission_resolved") {
|
|
395
|
+
const pending = this.approvals.get(mapped.update.requestId);
|
|
396
|
+
if (pending) {
|
|
397
|
+
// Another client (the TUI) answered first.
|
|
398
|
+
this.approvals.delete(mapped.update.requestId);
|
|
399
|
+
pending.abandon();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const parent = this.children.get(mapped.threadId);
|
|
403
|
+
if (parent) {
|
|
404
|
+
const nested = nestUnder(mapped.update, parent.toolCallId);
|
|
405
|
+
if (nested && this.attached.has(parent.threadId)) {
|
|
406
|
+
this.host?.update(this.id, parent.threadId, nested, mapped.itemId && `sub:${parent.toolCallId}:${mapped.itemId}`);
|
|
407
|
+
}
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
if (!this.attached.has(mapped.threadId))
|
|
411
|
+
continue;
|
|
412
|
+
this.host?.update(this.id, mapped.threadId, mapped.update, mapped.itemId);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** Remembers which spawnAgent call each new sub-agent thread belongs to. */
|
|
416
|
+
noteSpawns(params) {
|
|
417
|
+
const record = params;
|
|
418
|
+
const threadId = typeof record?.threadId === "string" ? record.threadId : undefined;
|
|
419
|
+
const callId = record?.item?.id;
|
|
420
|
+
if (!threadId || typeof callId !== "string")
|
|
421
|
+
return;
|
|
422
|
+
// A sub-agent's own sub-agents nest under the same top-level session.
|
|
423
|
+
const root = this.children.get(threadId)?.threadId ?? threadId;
|
|
424
|
+
for (const child of spawnedThreads(record?.item))
|
|
425
|
+
this.children.set(child, { threadId: root, toolCallId: callId });
|
|
426
|
+
}
|
|
427
|
+
onServerRequest(method, params, id) {
|
|
428
|
+
if (!APPROVAL_METHODS.has(method))
|
|
429
|
+
return ABANDON;
|
|
430
|
+
const requestId = String(id);
|
|
431
|
+
const mapped = mapApprovalRequest(method, params, requestId);
|
|
432
|
+
// A sub-agent asking for permission asks in its parent session.
|
|
433
|
+
const request = mapped && this.children.has(mapped.threadId) ? { ...mapped, threadId: this.children.get(mapped.threadId).threadId } : mapped;
|
|
434
|
+
if (!request || !this.attached.has(request.threadId))
|
|
435
|
+
return ABANDON;
|
|
436
|
+
return new Promise((resolve) => {
|
|
437
|
+
this.approvals.set(requestId, {
|
|
438
|
+
threadId: request.threadId,
|
|
439
|
+
request,
|
|
440
|
+
answer: resolve,
|
|
441
|
+
abandon: () => resolve(ABANDON),
|
|
442
|
+
});
|
|
443
|
+
this.host?.update(this.id, request.threadId, request.update);
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
rpc(method, params) {
|
|
447
|
+
if (!this.server)
|
|
448
|
+
return Promise.reject(RpcError.app("agent_unavailable", "Codex is not running"));
|
|
449
|
+
return this.server.request(method, params);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/codex/driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ContentBlock, SessionState, SessionUpdate } from "@linkshell/wire";
|
|
2
|
+
import type { DiscoveredSession, HistoryItem } from "../types.js";
|
|
3
|
+
type Json = Record<string, unknown>;
|
|
4
|
+
export interface CodexThread {
|
|
5
|
+
id: string;
|
|
6
|
+
preview?: string;
|
|
7
|
+
name?: string | null;
|
|
8
|
+
cwd: string;
|
|
9
|
+
model?: string | null;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
status?: {
|
|
13
|
+
type: string;
|
|
14
|
+
activeFlags?: string[];
|
|
15
|
+
};
|
|
16
|
+
turns?: CodexTurn[];
|
|
17
|
+
}
|
|
18
|
+
export interface CodexTurn {
|
|
19
|
+
id: string;
|
|
20
|
+
items: Json[];
|
|
21
|
+
status: "completed" | "interrupted" | "failed" | "inProgress";
|
|
22
|
+
error?: {
|
|
23
|
+
message: string;
|
|
24
|
+
additionalDetails?: string | null;
|
|
25
|
+
} | null;
|
|
26
|
+
startedAt?: number | null;
|
|
27
|
+
completedAt?: number | null;
|
|
28
|
+
}
|
|
29
|
+
export interface MappedUpdate {
|
|
30
|
+
threadId: string;
|
|
31
|
+
update: SessionUpdate;
|
|
32
|
+
/** Set when this update completes a native item. */
|
|
33
|
+
itemId?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Per-thread state the mapper needs across notifications. */
|
|
36
|
+
export interface CodexThreadState {
|
|
37
|
+
activeTurnId?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function threadStateOf(status: CodexThread["status"]): SessionState;
|
|
40
|
+
export declare function threadToDiscovered(thread: CodexThread): DiscoveredSession;
|
|
41
|
+
/** Drops the `/bin/zsh -lc '…'` wrapper Codex puts around every command. */
|
|
42
|
+
export declare function unwrapShell(command: string): string;
|
|
43
|
+
/** Threads a spawnAgent call created: their work nests under the call. */
|
|
44
|
+
export declare function spawnedThreads(item: unknown): string[];
|
|
45
|
+
/** One native item as complete history. */
|
|
46
|
+
export declare function itemToHistory(raw: Json): HistoryItem | undefined;
|
|
47
|
+
export declare function threadToHistory(thread: CodexThread): HistoryItem[];
|
|
48
|
+
/** Maps one app-server notification to session updates. */
|
|
49
|
+
export declare function mapNotification(method: string, rawParams: unknown, stateOf: (threadId: string) => CodexThreadState): MappedUpdate[];
|
|
50
|
+
export declare const APPROVAL_METHODS: Set<string>;
|
|
51
|
+
export interface ApprovalRequest {
|
|
52
|
+
threadId: string;
|
|
53
|
+
update: Extract<SessionUpdate, {
|
|
54
|
+
sessionUpdate: "ls_permission";
|
|
55
|
+
}>;
|
|
56
|
+
/** Builds the JSON-RPC result for the chosen option. */
|
|
57
|
+
respond(optionId: string): unknown;
|
|
58
|
+
}
|
|
59
|
+
export declare function mapApprovalRequest(method: string, rawParams: unknown, requestId: string): ApprovalRequest | undefined;
|
|
60
|
+
export declare function toCodexInput(content: ContentBlock[]): Json[];
|
|
61
|
+
export {};
|