linkshell-cli 0.5.42 → 0.6.0
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 +23 -0
- package/dist/cli/src/commands/host.js +264 -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 +48 -0
- package/dist/cli/src/commands/pair.js.map +1 -0
- package/dist/cli/src/index.js +68 -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 +283 -0
- package/src/commands/pair.ts +47 -0
- package/src/index.ts +73 -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,144 @@
|
|
|
1
|
+
import { spawn, execFile } from "node:child_process";
|
|
2
|
+
import { existsSync, rmSync } from "node:fs";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import WebSocket from "ws";
|
|
5
|
+
import { ABANDON, RpcPeer } from "@linkshell/wire";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
// Notifications LinkShell never renders; opting out keeps the socket quiet.
|
|
8
|
+
const OPT_OUT_NOTIFICATIONS = [
|
|
9
|
+
"account/rateLimits/updated",
|
|
10
|
+
"account/updated",
|
|
11
|
+
"app/list/updated",
|
|
12
|
+
"fs/changed",
|
|
13
|
+
"hook/started",
|
|
14
|
+
"hook/completed",
|
|
15
|
+
"mcpServer/startupStatus/updated",
|
|
16
|
+
"rawResponse/completed",
|
|
17
|
+
"rawResponseItem/completed",
|
|
18
|
+
"remoteControl/status/changed",
|
|
19
|
+
"skills/changed",
|
|
20
|
+
"thread/goal/cleared",
|
|
21
|
+
"thread/goal/updated",
|
|
22
|
+
];
|
|
23
|
+
export async function detectCodex(command = "codex", env) {
|
|
24
|
+
try {
|
|
25
|
+
const { stdout } = await execFileAsync(command, ["--version"], { env, timeout: 10_000 });
|
|
26
|
+
return stdout.trim().replace(/^codex-cli\s+/, "") || undefined;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Owns one `codex app-server --listen unix://…` process and a client connection
|
|
34
|
+
* to it. The same socket is what `codex --remote` attaches the desktop TUI to,
|
|
35
|
+
* so the TUI and LinkShell are peers on the same threads.
|
|
36
|
+
*
|
|
37
|
+
* The socket speaks WebSocket; permessage-deflate must be off or the upgrade is reset.
|
|
38
|
+
*/
|
|
39
|
+
export class CodexAppServer {
|
|
40
|
+
options;
|
|
41
|
+
child;
|
|
42
|
+
socket;
|
|
43
|
+
peer;
|
|
44
|
+
stopping = false;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
}
|
|
48
|
+
get socketPath() {
|
|
49
|
+
return this.options.socketPath;
|
|
50
|
+
}
|
|
51
|
+
async start() {
|
|
52
|
+
this.stopping = false;
|
|
53
|
+
if (existsSync(this.options.socketPath))
|
|
54
|
+
rmSync(this.options.socketPath, { force: true });
|
|
55
|
+
const child = spawn(this.options.command ?? "codex", ["app-server", "--listen", `unix://${this.options.socketPath}`], { env: this.options.env, stdio: ["ignore", "pipe", "pipe"] });
|
|
56
|
+
this.child = child;
|
|
57
|
+
let stderrTail = "";
|
|
58
|
+
child.stderr?.on("data", (chunk) => {
|
|
59
|
+
stderrTail = (stderrTail + chunk.toString()).slice(-2000);
|
|
60
|
+
});
|
|
61
|
+
child.stdout?.on("data", () => { });
|
|
62
|
+
const exited = new Promise((_, reject) => {
|
|
63
|
+
child.once("exit", (code, signal) => {
|
|
64
|
+
const reason = `codex app-server exited (${signal ?? code})${stderrTail ? `: ${stderrTail.trim()}` : ""}`;
|
|
65
|
+
if (!this.stopping)
|
|
66
|
+
this.options.onDown(reason);
|
|
67
|
+
reject(new Error(reason));
|
|
68
|
+
});
|
|
69
|
+
child.once("error", (error) => reject(error));
|
|
70
|
+
});
|
|
71
|
+
exited.catch(() => { });
|
|
72
|
+
await Promise.race([this.connectWhenReady(), exited]);
|
|
73
|
+
}
|
|
74
|
+
async stop() {
|
|
75
|
+
this.stopping = true;
|
|
76
|
+
this.peer?.close("stopping");
|
|
77
|
+
this.socket?.close();
|
|
78
|
+
const child = this.child;
|
|
79
|
+
this.child = undefined;
|
|
80
|
+
if (child && child.exitCode === null) {
|
|
81
|
+
child.kill("SIGTERM");
|
|
82
|
+
await new Promise((resolve) => {
|
|
83
|
+
const timer = setTimeout(() => {
|
|
84
|
+
child.kill("SIGKILL");
|
|
85
|
+
resolve();
|
|
86
|
+
}, 3000);
|
|
87
|
+
child.once("exit", () => {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
resolve();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
rmSync(this.options.socketPath, { force: true });
|
|
94
|
+
}
|
|
95
|
+
request(method, params, timeoutMs) {
|
|
96
|
+
if (!this.peer)
|
|
97
|
+
return Promise.reject(new Error("codex app-server is not connected"));
|
|
98
|
+
return this.peer.request(method, params, timeoutMs);
|
|
99
|
+
}
|
|
100
|
+
async connectWhenReady() {
|
|
101
|
+
const deadline = Date.now() + 15_000;
|
|
102
|
+
let lastError;
|
|
103
|
+
while (Date.now() < deadline) {
|
|
104
|
+
if (existsSync(this.options.socketPath)) {
|
|
105
|
+
try {
|
|
106
|
+
await this.connect();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
lastError = error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
114
|
+
}
|
|
115
|
+
throw new Error(`codex app-server did not accept connections: ${lastError instanceof Error ? lastError.message : "timeout"}`);
|
|
116
|
+
}
|
|
117
|
+
async connect() {
|
|
118
|
+
const socket = new WebSocket(`ws+unix://${this.options.socketPath}:/`, { perMessageDeflate: false });
|
|
119
|
+
await new Promise((resolve, reject) => {
|
|
120
|
+
socket.once("open", () => resolve());
|
|
121
|
+
socket.once("error", reject);
|
|
122
|
+
});
|
|
123
|
+
const peer = new RpcPeer({
|
|
124
|
+
send: (text) => socket.send(text),
|
|
125
|
+
onNotification: (method, params) => this.options.onNotification(method, params),
|
|
126
|
+
onRequest: (method, params, id) => this.options.onRequest(method, params, id) ?? ABANDON,
|
|
127
|
+
requestTimeoutMs: 60_000,
|
|
128
|
+
});
|
|
129
|
+
socket.on("message", (data) => peer.receive(data.toString()));
|
|
130
|
+
socket.on("close", () => {
|
|
131
|
+
peer.close("codex app-server connection closed");
|
|
132
|
+
if (!this.stopping)
|
|
133
|
+
this.options.onDown("codex app-server connection closed");
|
|
134
|
+
});
|
|
135
|
+
this.socket = socket;
|
|
136
|
+
this.peer = peer;
|
|
137
|
+
await peer.request("initialize", {
|
|
138
|
+
clientInfo: { name: "linkshell", title: "LinkShell", version: this.options.clientVersion },
|
|
139
|
+
capabilities: { experimentalApi: false, requestAttestation: false, optOutNotificationMethods: OPT_OUT_NOTIFICATIONS },
|
|
140
|
+
});
|
|
141
|
+
peer.notify("initialized", {});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/codex/app-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAc,MAAM,iBAAiB,CAAC;AAE/D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,4EAA4E;AAC5E,MAAM,qBAAqB,GAAG;IAC5B,4BAA4B;IAC5B,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,iCAAiC;IACjC,uBAAuB;IACvB,2BAA2B;IAC3B,8BAA8B;IAC9B,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;CACtB,CAAC;AAgBF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,GAAuB;IAC1E,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAMI;IALrB,KAAK,CAAgB;IACrB,MAAM,CAAa;IACnB,IAAI,CAAW;IACf,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAE/D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,KAAK,CACjB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAC/B,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAC/D,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC7D,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,UAAU,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,4BAA4B,MAAM,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1G,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAI,MAAc,EAAE,MAAe,EAAE,SAAkB;QAC5D,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,IAAI,SAAkB,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gDAAgD,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAC7G,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC;YACvB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACjC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;YAC/E,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,OAAO;YACxF,gBAAgB,EAAE,MAAM;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YAC1F,YAAY,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE;SACtH,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { type ContentBlock } from "@linkshell/wire";
|
|
2
|
+
import type { AgentAuth } from "@linkshell/wire";
|
|
3
|
+
import type { AgentDriver, DiscoveredSession, DriverHost, DriverStatus, HistoryItem, LaunchSpec } from "../types.js";
|
|
4
|
+
export interface CodexDriverOptions {
|
|
5
|
+
socketPath: string;
|
|
6
|
+
command?: string;
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
hostVersion: string;
|
|
9
|
+
/** Delay before restarting a crashed app-server; doubles up to 30s. */
|
|
10
|
+
restartDelayMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Codex, tier multi_client: LinkShell and the desktop TUI (`codex --remote`)
|
|
14
|
+
* are both clients of one app-server, so every thread is live on both sides.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CodexDriver implements AgentDriver {
|
|
17
|
+
private readonly options;
|
|
18
|
+
readonly id = "codex";
|
|
19
|
+
readonly label = "Codex";
|
|
20
|
+
readonly tier: "multi_client";
|
|
21
|
+
readonly capabilities: {
|
|
22
|
+
interrupt: boolean;
|
|
23
|
+
steer: boolean;
|
|
24
|
+
permissions: boolean;
|
|
25
|
+
images: boolean;
|
|
26
|
+
fork: boolean;
|
|
27
|
+
models: boolean;
|
|
28
|
+
modes: boolean;
|
|
29
|
+
};
|
|
30
|
+
private host?;
|
|
31
|
+
private server?;
|
|
32
|
+
private current;
|
|
33
|
+
private readonly threads;
|
|
34
|
+
private readonly attached;
|
|
35
|
+
/** Threads this connection started: already subscribed, and not on disk until their first turn. */
|
|
36
|
+
private readonly startedHere;
|
|
37
|
+
private readonly followRetries;
|
|
38
|
+
private readonly startsInFlight;
|
|
39
|
+
private readonly approvals;
|
|
40
|
+
private readonly settings;
|
|
41
|
+
private readonly overrides;
|
|
42
|
+
/** Sub-agent thread → the parent thread and the spawnAgent call its work nests under. */
|
|
43
|
+
private readonly children;
|
|
44
|
+
/** Threads Codex reported as sub-agents (parentThreadId set); never shown as sessions. */
|
|
45
|
+
private readonly subThreads;
|
|
46
|
+
private models?;
|
|
47
|
+
private restartTimer?;
|
|
48
|
+
private restartDelay;
|
|
49
|
+
private stopped;
|
|
50
|
+
constructor(options: CodexDriverOptions);
|
|
51
|
+
status(): DriverStatus;
|
|
52
|
+
start(host: DriverHost): Promise<DriverStatus>;
|
|
53
|
+
authStatus(): Promise<AgentAuth>;
|
|
54
|
+
stop(): Promise<void>;
|
|
55
|
+
listSessions(limit: number): Promise<DiscoveredSession[]>;
|
|
56
|
+
createSession(options: {
|
|
57
|
+
cwd: string;
|
|
58
|
+
model?: string;
|
|
59
|
+
}): Promise<DiscoveredSession>;
|
|
60
|
+
attach(nativeId: string): Promise<HistoryItem[]>;
|
|
61
|
+
/** Nests each sub-agent's own history right after the call that spawned it. */
|
|
62
|
+
private withSubAgents;
|
|
63
|
+
detach(nativeId: string): Promise<void>;
|
|
64
|
+
prompt(nativeId: string, content: ContentBlock[], clientMessageId: string): Promise<"started" | "steered">;
|
|
65
|
+
/** Model, reasoning effort and permissions apply from the next turn on. */
|
|
66
|
+
setConfig(nativeId: string, optionId: string, value: string): Promise<void>;
|
|
67
|
+
private loadModels;
|
|
68
|
+
private announceConfig;
|
|
69
|
+
cancel(nativeId: string): Promise<void>;
|
|
70
|
+
respondPermission(nativeId: string, requestId: string, optionId: string): Promise<void>;
|
|
71
|
+
desktopLaunch(args: string[], nativeId?: string): LaunchSpec;
|
|
72
|
+
private boot;
|
|
73
|
+
/** Follows every thread already live in the app-server (e.g. opened in the TUI). */
|
|
74
|
+
private reattachLoaded;
|
|
75
|
+
/**
|
|
76
|
+
* Asks the host to follow a thread another client opened. A brand-new thread
|
|
77
|
+
* has no rollout on disk until its first turn, so thread/resume fails until
|
|
78
|
+
* then; keep retrying while the thread stays loaded.
|
|
79
|
+
*/
|
|
80
|
+
private follow;
|
|
81
|
+
private onDown;
|
|
82
|
+
private scheduleRestart;
|
|
83
|
+
private stateOf;
|
|
84
|
+
private onNotification;
|
|
85
|
+
/** Remembers which spawnAgent call each new sub-agent thread belongs to. */
|
|
86
|
+
private noteSpawns;
|
|
87
|
+
private onServerRequest;
|
|
88
|
+
private rpc;
|
|
89
|
+
}
|