@linkshell/host 0.4.85 → 0.4.87
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/host/src/children.d.ts +43 -0
- package/dist/host/src/children.js +213 -0
- package/dist/host/src/children.js.map +1 -0
- package/dist/host/src/drivers/acp/antigravity.js +1 -1
- package/dist/host/src/drivers/acp/antigravity.js.map +1 -1
- package/dist/host/src/drivers/acp/client-services.js +2 -0
- package/dist/host/src/drivers/acp/client-services.js.map +1 -1
- package/dist/host/src/drivers/acp/connection.js +8 -2
- package/dist/host/src/drivers/acp/connection.js.map +1 -1
- package/dist/host/src/drivers/acp/driver.d.ts +1 -5
- package/dist/host/src/drivers/acp/driver.js +11 -16
- package/dist/host/src/drivers/acp/driver.js.map +1 -1
- package/dist/host/src/drivers/acp/mcp.js +2 -0
- package/dist/host/src/drivers/acp/mcp.js.map +1 -1
- package/dist/host/src/drivers/claude/activity.js +13 -0
- package/dist/host/src/drivers/claude/activity.js.map +1 -1
- package/dist/host/src/drivers/claude/driver.d.ts +15 -0
- package/dist/host/src/drivers/claude/driver.js +44 -2
- package/dist/host/src/drivers/claude/driver.js.map +1 -1
- package/dist/host/src/drivers/claude/mcp-apps.d.ts +70 -0
- package/dist/host/src/drivers/claude/mcp-apps.js +399 -0
- package/dist/host/src/drivers/claude/mcp-apps.js.map +1 -0
- package/dist/host/src/drivers/claude/task-process.d.ts +23 -0
- package/dist/host/src/drivers/claude/task-process.js +121 -0
- package/dist/host/src/drivers/claude/task-process.js.map +1 -0
- package/dist/host/src/drivers/claude/tasks.d.ts +8 -1
- package/dist/host/src/drivers/claude/tasks.js +34 -6
- package/dist/host/src/drivers/claude/tasks.js.map +1 -1
- package/dist/host/src/drivers/codex/driver.d.ts +21 -0
- package/dist/host/src/drivers/codex/driver.js +99 -12
- package/dist/host/src/drivers/codex/driver.js.map +1 -1
- package/dist/host/src/drivers/queue.d.ts +4 -0
- package/dist/host/src/drivers/queue.js +9 -0
- package/dist/host/src/drivers/queue.js.map +1 -0
- package/dist/host/src/drivers/types.d.ts +1 -1
- package/dist/host/src/fs.js +8 -8
- package/dist/host/src/fs.js.map +1 -1
- package/dist/host/src/gateway.js +3 -3
- package/dist/host/src/gateway.js.map +1 -1
- package/dist/host/src/host.js +6 -0
- package/dist/host/src/host.js.map +1 -1
- package/dist/host/src/hub.js +28 -14
- package/dist/host/src/hub.js.map +1 -1
- package/dist/host/src/input.d.ts +3 -0
- package/dist/host/src/input.js +1 -0
- package/dist/host/src/input.js.map +1 -1
- package/dist/host/src/ports.js +3 -3
- package/dist/host/src/ports.js.map +1 -1
- package/dist/host/src/process.d.ts +8 -2
- package/dist/host/src/process.js +37 -2
- package/dist/host/src/process.js.map +1 -1
- package/dist/host/src/rpc/mcp.d.ts +1 -1
- package/dist/host/src/rpc/mcp.js +2 -2
- package/dist/host/src/rpc/mcp.js.map +1 -1
- package/dist/host/src/rpc/server.js +5 -5
- package/dist/host/src/rpc/server.js.map +1 -1
- package/dist/host/src/screen-viewer.js +7 -7
- package/dist/host/src/screen.js +6 -5
- package/dist/host/src/screen.js.map +1 -1
- package/dist/host/src/slim.js +16 -4
- package/dist/host/src/slim.js.map +1 -1
- package/dist/host/src/store.js +8 -4
- package/dist/host/src/store.js.map +1 -1
- package/dist/host/src/terminals.js +15 -8
- package/dist/host/src/terminals.js.map +1 -1
- package/dist/host/src/windows-video.d.ts +2 -0
- package/dist/host/src/windows-video.js.map +1 -1
- package/dist/host/tsconfig.tsbuildinfo +1 -1
- package/dist/wire/src/model.d.ts +4 -0
- package/dist/wire/src/model.js +4 -0
- package/dist/wire/src/model.js.map +1 -1
- package/dist/wire/src/peer.js +4 -4
- package/dist/wire/src/peer.js.map +1 -1
- package/dist/wire/src/relay-client.js +9 -9
- package/dist/wire/src/relay-client.js.map +1 -1
- package/dist/wire/src/relay.js +2 -2
- package/dist/wire/src/relay.js.map +1 -1
- package/dist/wire/src/rpc-mcp.js +5 -4
- package/dist/wire/src/rpc-mcp.js.map +1 -1
- package/dist/wire/src/rpc.d.ts +5 -0
- package/dist/wire/src/updates.js +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-process.js","sourceRoot":"","sources":["../../../../../src/drivers/claude/task-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,sFAAsF;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAElG;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,MAAM,GAAG,MAAM,CAAE,KAA8B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,GAAG,CAAC,CAAC;YAAC,EAAE,GAAG,EAAE,CAAC;QAAC,CAAC;aAC3D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;aAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,EAAE,GAAG,KAAK,CAAC;aAChC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/H,CAAC;IACD,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9G,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/B,IAAI,IAAI,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC9F,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI;gBAAE,SAAS;YACzD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxF,sBAAsB;YACtB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBAAE,SAAS;YACvD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAoB,EAAE,UAAgC,EAAE;IACxG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;QAAE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3I,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -2,6 +2,7 @@ import type { BackgroundTask } from "@linkshell/wire";
|
|
|
2
2
|
/** Shell tasks are separate from Agent/Workflow runs, even when Claude repeats their notifications. */
|
|
3
3
|
export declare class ClaudeTasks {
|
|
4
4
|
private readonly emit;
|
|
5
|
+
private readonly stoppable;
|
|
5
6
|
readonly records: Map<string, {
|
|
6
7
|
id: string;
|
|
7
8
|
kind: "shell" | "monitor";
|
|
@@ -20,11 +21,17 @@ export declare class ClaudeTasks {
|
|
|
20
21
|
private launches;
|
|
21
22
|
private paths;
|
|
22
23
|
private pending;
|
|
23
|
-
|
|
24
|
+
/** Tasks LinkShell stopped: Claude then reports the shell as failed, which it wasn't. */
|
|
25
|
+
private stoppedHere;
|
|
26
|
+
constructor(emit: (task: BackgroundTask) => void, stoppable?: boolean);
|
|
24
27
|
observe(raw: string): void;
|
|
25
28
|
private notification;
|
|
26
29
|
private change;
|
|
27
30
|
lostHolder(): void;
|
|
31
|
+
/** A stop LinkShell made: the shell's exit Claude reports next doesn't change how it ended. */
|
|
32
|
+
stopped(id: string): void;
|
|
33
|
+
/** The task's output file, only where Claude keeps the session's own tasks, resolved. */
|
|
34
|
+
file(nativeId: string, taskId: string): string | undefined;
|
|
28
35
|
output(nativeId: string, taskId: string, before: number | undefined, limit: number): {
|
|
29
36
|
start: number;
|
|
30
37
|
size: number;
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { constants, openSync, closeSync, fstatSync, readSync, realpathSync } from "node:fs";
|
|
2
2
|
import { outputRange } from "../../task-output.js";
|
|
3
|
+
import { canFindTaskProcesses } from "./task-process.js";
|
|
3
4
|
const obj = (v) => v && typeof v === "object" ? v : {};
|
|
4
5
|
const str = (v) => typeof v === "string" ? v : undefined;
|
|
5
6
|
const tag = (text, name) => new RegExp(`<${name}>\\s*([\\s\\S]*?)\\s*</${name}>`).exec(text)?.[1];
|
|
6
7
|
/** Shell tasks are separate from Agent/Workflow runs, even when Claude repeats their notifications. */
|
|
7
8
|
export class ClaudeTasks {
|
|
8
9
|
emit;
|
|
10
|
+
stoppable;
|
|
9
11
|
records = new Map();
|
|
10
12
|
launches = new Map();
|
|
11
13
|
paths = new Map();
|
|
12
14
|
pending = new Map();
|
|
13
|
-
|
|
15
|
+
/** Tasks LinkShell stopped: Claude then reports the shell as failed, which it wasn't. */
|
|
16
|
+
stoppedHere = new Set();
|
|
17
|
+
constructor(emit, stoppable = canFindTaskProcesses) {
|
|
14
18
|
this.emit = emit;
|
|
19
|
+
this.stoppable = stoppable;
|
|
15
20
|
}
|
|
16
21
|
observe(raw) {
|
|
17
22
|
let line;
|
|
@@ -44,7 +49,7 @@ export class ClaudeTasks {
|
|
|
44
49
|
this.paths.set(id, path);
|
|
45
50
|
// Fold a completion that arrived first into the initial snapshot.
|
|
46
51
|
const { ts: startedAt, ...description } = launch;
|
|
47
|
-
this.records.set(id, { id, ...description, startedAt, toolCallId: call, state: "running", output: !!path });
|
|
52
|
+
this.records.set(id, { id, ...description, startedAt, toolCallId: call, state: "running", output: !!path, canStop: !!path && this.stoppable });
|
|
48
53
|
const pending = this.pending.get(id) ?? this.pending.get(call);
|
|
49
54
|
if (pending) {
|
|
50
55
|
this.notification(pending.text, pending.ts);
|
|
@@ -91,7 +96,13 @@ export class ClaudeTasks {
|
|
|
91
96
|
}
|
|
92
97
|
change(id, patch) {
|
|
93
98
|
const old = this.records.get(id);
|
|
99
|
+
if (this.stoppedHere.has(id)) {
|
|
100
|
+
const { state: _state, exitCode: _code, ...rest } = patch;
|
|
101
|
+
patch = rest;
|
|
102
|
+
}
|
|
94
103
|
const next = { ...old, ...patch };
|
|
104
|
+
// Stopping needs the output file: it is how the shell's process is found.
|
|
105
|
+
next.canStop = next.state === "running" && this.paths.has(id) && this.stoppable;
|
|
95
106
|
if (JSON.stringify(old) === JSON.stringify(next))
|
|
96
107
|
return;
|
|
97
108
|
this.records.set(id, next);
|
|
@@ -102,18 +113,35 @@ export class ClaudeTasks {
|
|
|
102
113
|
if (task.state === "running")
|
|
103
114
|
this.change(id, { state: "unknown", endedAt: Date.now() });
|
|
104
115
|
}
|
|
105
|
-
|
|
116
|
+
/** A stop LinkShell made: the shell's exit Claude reports next doesn't change how it ended. */
|
|
117
|
+
stopped(id) {
|
|
118
|
+
if (!this.records.has(id))
|
|
119
|
+
return;
|
|
120
|
+
this.change(id, { state: "stopped", endedAt: Date.now() });
|
|
121
|
+
this.stoppedHere.add(id);
|
|
122
|
+
}
|
|
123
|
+
/** The task's output file, only where Claude keeps the session's own tasks, resolved. */
|
|
124
|
+
file(nativeId, taskId) {
|
|
106
125
|
const path = this.paths.get(taskId);
|
|
107
126
|
if (!path || !/^[\w-]+$/.test(nativeId) || !/^[\w-]+$/.test(taskId))
|
|
108
127
|
return undefined;
|
|
109
128
|
const valid = (value) => value.includes("/claude-") && new RegExp(`/claude-\\d+/[^/]+/${nativeId}/tasks/${taskId}\\.output$`).test(value);
|
|
110
|
-
let fd;
|
|
111
129
|
try {
|
|
112
130
|
if (!valid(path))
|
|
113
131
|
return undefined;
|
|
114
132
|
const resolved = realpathSync(path);
|
|
115
|
-
|
|
116
|
-
|
|
133
|
+
return valid(resolved) ? resolved : undefined;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
output(nativeId, taskId, before, limit) {
|
|
140
|
+
const resolved = this.file(nativeId, taskId);
|
|
141
|
+
if (!resolved)
|
|
142
|
+
return undefined;
|
|
143
|
+
let fd;
|
|
144
|
+
try {
|
|
117
145
|
fd = openSync(resolved, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
118
146
|
const stat = fstatSync(fd);
|
|
119
147
|
if (!stat.isFile())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../../../src/drivers/claude/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../../../src/drivers/claude/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,6 +84,8 @@ export declare class CodexDriver implements AgentDriver {
|
|
|
84
84
|
private readonly fullAccessTurns;
|
|
85
85
|
/** Sub-agent thread → the parent thread and the spawnAgent call its work nests under. */
|
|
86
86
|
private readonly children;
|
|
87
|
+
/** Each spawnAgent call's card detail, so the sub-agent's running state can be added to it without losing the rest. */
|
|
88
|
+
private readonly spawnDetails;
|
|
87
89
|
/** Threads Codex reported as sub-agents (parentThreadId set); never shown as sessions. */
|
|
88
90
|
private readonly subThreads;
|
|
89
91
|
/** Each thread's working directory: where its skills are looked up. */
|
|
@@ -182,6 +184,12 @@ export declare class CodexDriver implements AgentDriver {
|
|
|
182
184
|
private syncWaiting;
|
|
183
185
|
private setWaiting;
|
|
184
186
|
unqueue(nativeId: string, clientMessageId: string): boolean;
|
|
187
|
+
/**
|
|
188
|
+
* Puts what waits in Codex's own queue in the order the user set: Codex
|
|
189
|
+
* starts its queue in order, so that is the order they are sent. Where
|
|
190
|
+
* Codex can't reorder (an older build), its own order is shown again.
|
|
191
|
+
*/
|
|
192
|
+
reorderQueue(nativeId: string, clientMessageIds: string[]): void;
|
|
185
193
|
/**
|
|
186
194
|
* A message waiting in Codex's queue goes into the turn another Codex is
|
|
187
195
|
* running, by asking that Codex's app: what its own "Steer" on the waiting
|
|
@@ -291,6 +299,19 @@ export declare class CodexDriver implements AgentDriver {
|
|
|
291
299
|
private scheduleRestart;
|
|
292
300
|
private stateOf;
|
|
293
301
|
private onNotification;
|
|
302
|
+
/** Keeps a spawn card's detail; a later report of the call keeps the running state already said on it. */
|
|
303
|
+
private rememberSpawn;
|
|
304
|
+
/**
|
|
305
|
+
* A sub-agent's turn started or ended: its spawn card says whether it is
|
|
306
|
+
* running, and while it is, that it can be stopped on its own
|
|
307
|
+
* (`turn/interrupt` on its thread). Only for a turn seen starting here, so
|
|
308
|
+
* the button never outlives what this host can see.
|
|
309
|
+
*/
|
|
310
|
+
private subagentTurn;
|
|
311
|
+
/** A sub-agent said to be running when this host last saw it: what its thread says now. */
|
|
312
|
+
private settleSubagent;
|
|
313
|
+
/** Stops one sub-agent's running turn, leaving the session's own turn and the other agents alone. */
|
|
314
|
+
cancelSubagent(nativeId: string, childId: string): Promise<void>;
|
|
294
315
|
/** Remembers which spawnAgent call each new sub-agent thread belongs to. */
|
|
295
316
|
private noteSpawns;
|
|
296
317
|
private onServerRequest;
|
|
@@ -12,6 +12,7 @@ import { behaviorCapabilities } from "../behavior.js";
|
|
|
12
12
|
import { CodexAppServer, CodexSharedServer, findCodex, sharedServerSocket } from "./app-server.js";
|
|
13
13
|
import { APPROVAL_METHODS, QUESTION_METHODS, mapApprovalRequest, mapQuestionRequest, mapNotification, threadStateOf, threadToDiscovered, spawnedThreads, subagentHistory, threadToHistory, toCodexInput, toolStart, turnUnderWay, } from "./mapper.js";
|
|
14
14
|
import { nestHistory, nestUnder } from "../nesting.js";
|
|
15
|
+
import { inOrder } from "../queue.js";
|
|
15
16
|
import { configOptions, effective, newThreadModels, settingsFrom, settingsFromConfig, settingsFromTurnContext, turnOverrides } from "./settings.js";
|
|
16
17
|
import { COMMANDS, INIT_PROMPT, commandOf } from "./commands.js";
|
|
17
18
|
import { DesktopUnconfirmed, desktopBusSocket, interruptThroughDesktop, startThroughDesktop, steerThroughDesktop, updateSettingsThroughDesktop } from "./desktop-ipc.js";
|
|
@@ -160,6 +161,8 @@ export class CodexDriver {
|
|
|
160
161
|
fullAccessTurns = new Set();
|
|
161
162
|
/** Sub-agent thread → the parent thread and the spawnAgent call its work nests under. */
|
|
162
163
|
children = new Map();
|
|
164
|
+
/** Each spawnAgent call's card detail, so the sub-agent's running state can be added to it without losing the rest. */
|
|
165
|
+
spawnDetails = new Map();
|
|
163
166
|
/** Threads Codex reported as sub-agents (parentThreadId set); never shown as sessions. */
|
|
164
167
|
subThreads = new Set();
|
|
165
168
|
/** Each thread's working directory: where its skills are looked up. */
|
|
@@ -411,7 +414,7 @@ export class CodexDriver {
|
|
|
411
414
|
if (error instanceof Error && /no rollout/i.test(error.message)) {
|
|
412
415
|
// Opened in another client but no turn yet, so not on disk. A turn can
|
|
413
416
|
// still be started on it; after that it can be joined.
|
|
414
|
-
throw RpcError.app("not_ready", "
|
|
417
|
+
throw RpcError.app("not_ready", "这个 Codex 会话还没有消息");
|
|
415
418
|
}
|
|
416
419
|
if (!heldElsewhere(error))
|
|
417
420
|
throw error;
|
|
@@ -473,7 +476,7 @@ export class CodexDriver {
|
|
|
473
476
|
try {
|
|
474
477
|
const server = home === "shared" ? this.shared : this.server;
|
|
475
478
|
if (!server)
|
|
476
|
-
throw RpcError.app("agent_unavailable", "Codex
|
|
479
|
+
throw RpcError.app("agent_unavailable", "Codex 没有在运行");
|
|
477
480
|
const resumed = await server.request("thread/resume", { threadId });
|
|
478
481
|
if (home === "shared")
|
|
479
482
|
this.inShared.add(threadId);
|
|
@@ -749,6 +752,24 @@ export class CodexDriver {
|
|
|
749
752
|
void this.rpc("thread/queue/delete", { threadId: nativeId, queuedSubmissionId: entry.submissionId }).catch(() => { });
|
|
750
753
|
return true;
|
|
751
754
|
}
|
|
755
|
+
/**
|
|
756
|
+
* Puts what waits in Codex's own queue in the order the user set: Codex
|
|
757
|
+
* starts its queue in order, so that is the order they are sent. Where
|
|
758
|
+
* Codex can't reorder (an older build), its own order is shown again.
|
|
759
|
+
*/
|
|
760
|
+
reorderQueue(nativeId, clientMessageIds) {
|
|
761
|
+
const waiting = this.waiting.get(nativeId);
|
|
762
|
+
if (!waiting || waiting.length < 2)
|
|
763
|
+
return;
|
|
764
|
+
const ordered = inOrder(waiting, clientMessageIds);
|
|
765
|
+
if (ordered.every((entry, index) => entry === waiting[index]))
|
|
766
|
+
return;
|
|
767
|
+
this.setWaiting(nativeId, ordered);
|
|
768
|
+
void this.rpc("thread/queue/reorder", { threadId: nativeId, queuedSubmissionIds: ordered.map((entry) => entry.submissionId) }).catch((error) => {
|
|
769
|
+
this.host?.log(`[codex] couldn't reorder the queue of ${nativeId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
770
|
+
void this.syncWaiting(nativeId);
|
|
771
|
+
});
|
|
772
|
+
}
|
|
752
773
|
/**
|
|
753
774
|
* A message waiting in Codex's queue goes into the turn another Codex is
|
|
754
775
|
* running, by asking that Codex's app: what its own "Steer" on the waiting
|
|
@@ -1049,6 +1070,9 @@ export class CodexDriver {
|
|
|
1049
1070
|
const result = await this.rpcFor(threadId, "thread/read", { threadId: child, includeTurns: true });
|
|
1050
1071
|
known.path = result.thread.path ?? undefined;
|
|
1051
1072
|
known.stamp = stamp;
|
|
1073
|
+
const spawn = history.find((item) => item.itemId === `tool:${callId}` || item.itemId === callId)?.updates
|
|
1074
|
+
.find((update) => update.sessionUpdate === "tool_call" && update.detail?.type === "subagent");
|
|
1075
|
+
this.settleSubagent(threadId, callId, result.thread, spawn?.sessionUpdate === "tool_call" && spawn.detail?.type === "subagent" ? spawn.detail : undefined);
|
|
1052
1076
|
return nestHistory(subagentHistory(result.thread, this.mcpApps.lookup(child)), callId);
|
|
1053
1077
|
}
|
|
1054
1078
|
catch {
|
|
@@ -1181,7 +1205,7 @@ export class CodexDriver {
|
|
|
1181
1205
|
}
|
|
1182
1206
|
async send(nativeId, input, clientMessageId) {
|
|
1183
1207
|
if (input.length === 0)
|
|
1184
|
-
throw RpcError.app("invalid_params", "
|
|
1208
|
+
throw RpcError.app("invalid_params", "没有可发送的内容");
|
|
1185
1209
|
const watch = this.observed.get(nativeId);
|
|
1186
1210
|
if (watch?.running && questionReplies(textOf(input))) {
|
|
1187
1211
|
try {
|
|
@@ -1268,7 +1292,7 @@ export class CodexDriver {
|
|
|
1268
1292
|
const next = { ...this.overridesOf(nativeId) };
|
|
1269
1293
|
if (optionId === "model") {
|
|
1270
1294
|
if (!models.some((m) => m.model === value) && value !== current.model) {
|
|
1271
|
-
throw RpcError.app("invalid_params",
|
|
1295
|
+
throw RpcError.app("invalid_params", `未知模型:${value}`);
|
|
1272
1296
|
}
|
|
1273
1297
|
next.model = value;
|
|
1274
1298
|
// Keep the effort only if the new model supports it.
|
|
@@ -1279,14 +1303,14 @@ export class CodexDriver {
|
|
|
1279
1303
|
}
|
|
1280
1304
|
else if (optionId === "effort") {
|
|
1281
1305
|
if (current.info?.supportedReasoningEfforts && !current.info.supportedReasoningEfforts.some((e) => e.reasoningEffort === value)) {
|
|
1282
|
-
throw RpcError.app("invalid_params",
|
|
1306
|
+
throw RpcError.app("invalid_params", `不支持的思考强度:${value}`);
|
|
1283
1307
|
}
|
|
1284
1308
|
next.effort = value;
|
|
1285
1309
|
}
|
|
1286
1310
|
else if (optionId === "permissions") {
|
|
1287
1311
|
const option = configOptions(base, this.overridesOf(nativeId), models).find((entry) => entry.id === "permissions");
|
|
1288
1312
|
if (!option?.values.some((entry) => entry.value === value))
|
|
1289
|
-
throw RpcError.app("invalid_params",
|
|
1313
|
+
throw RpcError.app("invalid_params", `未知的权限模式:${value}`);
|
|
1290
1314
|
if (value === "custom")
|
|
1291
1315
|
delete next.permissions;
|
|
1292
1316
|
else
|
|
@@ -1296,7 +1320,7 @@ export class CodexDriver {
|
|
|
1296
1320
|
next.plan = value === "on";
|
|
1297
1321
|
}
|
|
1298
1322
|
else {
|
|
1299
|
-
throw RpcError.app("not_supported", `Codex
|
|
1323
|
+
throw RpcError.app("not_supported", `Codex 没有设置项 ${optionId}`);
|
|
1300
1324
|
}
|
|
1301
1325
|
const running = this.stateOf(nativeId).activeTurnId ?? this.observed.get(nativeId)?.turnId;
|
|
1302
1326
|
if (optionId === "permissions" && running && value !== (current.permissions ?? "custom")) {
|
|
@@ -1722,7 +1746,7 @@ export class CodexDriver {
|
|
|
1722
1746
|
async respondPermission(nativeId, requestId, optionId) {
|
|
1723
1747
|
const pending = this.approvals.get(requestId);
|
|
1724
1748
|
if (!pending || pending.threadId !== nativeId) {
|
|
1725
|
-
throw RpcError.app("not_found", "
|
|
1749
|
+
throw RpcError.app("not_found", "这个请求已经处理过或已失效");
|
|
1726
1750
|
}
|
|
1727
1751
|
if (optionId === "cancel" && pending.request.cancel)
|
|
1728
1752
|
return this.cancel(nativeId);
|
|
@@ -1784,7 +1808,7 @@ export class CodexDriver {
|
|
|
1784
1808
|
this.current = {
|
|
1785
1809
|
installed: true,
|
|
1786
1810
|
version: this.current.version,
|
|
1787
|
-
problem: `Codex app-server
|
|
1811
|
+
problem: `Codex app-server 启动失败:${error instanceof Error ? error.message : String(error)}`,
|
|
1788
1812
|
};
|
|
1789
1813
|
this.scheduleRestart();
|
|
1790
1814
|
}
|
|
@@ -1854,7 +1878,7 @@ export class CodexDriver {
|
|
|
1854
1878
|
this.startedHere.clear();
|
|
1855
1879
|
this.fresh.clear();
|
|
1856
1880
|
this.kept.clear();
|
|
1857
|
-
this.current = { installed: true, version: this.current.version, problem: "Codex app-server
|
|
1881
|
+
this.current = { installed: true, version: this.current.version, problem: "Codex app-server 正在重启" };
|
|
1858
1882
|
this.scheduleRestart();
|
|
1859
1883
|
}
|
|
1860
1884
|
scheduleRestart() {
|
|
@@ -1969,7 +1993,7 @@ export class CodexDriver {
|
|
|
1969
1993
|
this.host?.preview?.(this.id, threadId, frame);
|
|
1970
1994
|
}
|
|
1971
1995
|
for (const mapped of mapNotification(method, params, (id) => this.stateOf(id), (id) => this.mcpApps.lookup(id))) {
|
|
1972
|
-
|
|
1996
|
+
let update = from === "shared" && mapped.update.sessionUpdate === "ls_permission_resolved"
|
|
1973
1997
|
? { ...mapped.update, requestId: sharedRequestId(mapped.update.requestId) }
|
|
1974
1998
|
: mapped.update;
|
|
1975
1999
|
if (update.sessionUpdate === "ls_goal" && !this.isNews(`goal:${mapped.threadId}`, update.goal))
|
|
@@ -1984,12 +2008,15 @@ export class CodexDriver {
|
|
|
1984
2008
|
pending.abandon();
|
|
1985
2009
|
}
|
|
1986
2010
|
}
|
|
2011
|
+
update = this.rememberSpawn(update);
|
|
1987
2012
|
const parent = this.children.get(mapped.threadId);
|
|
1988
2013
|
if (parent) {
|
|
1989
2014
|
const nested = nestUnder(update, parent.toolCallId);
|
|
1990
2015
|
if (nested && this.attached.has(parent.threadId)) {
|
|
1991
2016
|
this.host?.update(this.id, parent.threadId, nested, mapped.itemId && `sub:${parent.toolCallId}:${mapped.itemId}`);
|
|
1992
2017
|
}
|
|
2018
|
+
if (update.sessionUpdate === "ls_turn")
|
|
2019
|
+
this.subagentTurn(mapped.threadId, parent, update);
|
|
1993
2020
|
continue;
|
|
1994
2021
|
}
|
|
1995
2022
|
if (!this.attached.has(mapped.threadId))
|
|
@@ -2008,6 +2035,66 @@ export class CodexDriver {
|
|
|
2008
2035
|
}
|
|
2009
2036
|
}
|
|
2010
2037
|
}
|
|
2038
|
+
/** Keeps a spawn card's detail; a later report of the call keeps the running state already said on it. */
|
|
2039
|
+
rememberSpawn(update) {
|
|
2040
|
+
if (update.sessionUpdate !== "tool_call" && update.sessionUpdate !== "tool_call_update")
|
|
2041
|
+
return update;
|
|
2042
|
+
if (update.detail?.type !== "subagent" || update.detail.action !== "spawn")
|
|
2043
|
+
return update;
|
|
2044
|
+
const known = this.spawnDetails.get(update.toolCallId);
|
|
2045
|
+
const detail = { ...update.detail, ...(known?.state ? { state: known.state, nativeSessionId: known.nativeSessionId, canCancel: known.canCancel } : {}) };
|
|
2046
|
+
this.spawnDetails.delete(update.toolCallId);
|
|
2047
|
+
this.spawnDetails.set(update.toolCallId, detail);
|
|
2048
|
+
if (this.spawnDetails.size > 200)
|
|
2049
|
+
this.spawnDetails.delete(this.spawnDetails.keys().next().value);
|
|
2050
|
+
return { ...update, detail };
|
|
2051
|
+
}
|
|
2052
|
+
/**
|
|
2053
|
+
* A sub-agent's turn started or ended: its spawn card says whether it is
|
|
2054
|
+
* running, and while it is, that it can be stopped on its own
|
|
2055
|
+
* (`turn/interrupt` on its thread). Only for a turn seen starting here, so
|
|
2056
|
+
* the button never outlives what this host can see.
|
|
2057
|
+
*/
|
|
2058
|
+
subagentTurn(childId, parent, update) {
|
|
2059
|
+
const detail = this.spawnDetails.get(parent.toolCallId);
|
|
2060
|
+
// Several agents under one call can't be told apart on its card.
|
|
2061
|
+
const siblings = [...this.children.values()].filter((child) => child.toolCallId === parent.toolCallId).length;
|
|
2062
|
+
if (!detail || siblings !== 1 || !this.attached.has(parent.threadId))
|
|
2063
|
+
return;
|
|
2064
|
+
const running = update.state === "started";
|
|
2065
|
+
const state = running ? "running" : update.stopReason === "cancelled" ? "stopped" : update.stopReason === "error" ? "failed" : "completed";
|
|
2066
|
+
const next = { ...detail, nativeSessionId: childId, canCancel: running && !this.observed.has(parent.threadId), state };
|
|
2067
|
+
this.spawnDetails.set(parent.toolCallId, next);
|
|
2068
|
+
// Said running, it must be said ended too, even after a restart (see `settleSubagents`).
|
|
2069
|
+
this.host?.state(this.id, parent.threadId).set(`subagent:${parent.toolCallId}`, running ? childId : "");
|
|
2070
|
+
this.host?.update(this.id, parent.threadId, { sessionUpdate: "tool_call_update", toolCallId: parent.toolCallId, detail: next });
|
|
2071
|
+
}
|
|
2072
|
+
/** A sub-agent said to be running when this host last saw it: what its thread says now. */
|
|
2073
|
+
settleSubagent(threadId, callId, child, detail) {
|
|
2074
|
+
const memory = this.host?.state(this.id, threadId);
|
|
2075
|
+
const childId = memory?.get(`subagent:${callId}`);
|
|
2076
|
+
if (!childId || childId !== child.id || turnUnderWay(child.turns?.at(-1)))
|
|
2077
|
+
return;
|
|
2078
|
+
memory.set(`subagent:${callId}`, "");
|
|
2079
|
+
const last = child.turns?.at(-1);
|
|
2080
|
+
const state = last?.status === "interrupted" ? "stopped" : last?.status === "failed" ? "failed" : "completed";
|
|
2081
|
+
const next = { type: "subagent", action: "spawn", ...detail, nativeSessionId: childId, canCancel: false, state };
|
|
2082
|
+
this.spawnDetails.set(callId, next);
|
|
2083
|
+
this.host?.update(this.id, threadId, { sessionUpdate: "tool_call_update", toolCallId: callId, detail: next });
|
|
2084
|
+
}
|
|
2085
|
+
/** Stops one sub-agent's running turn, leaving the session's own turn and the other agents alone. */
|
|
2086
|
+
async cancelSubagent(nativeId, childId) {
|
|
2087
|
+
const child = this.children.get(childId);
|
|
2088
|
+
if (!child || child.threadId !== nativeId)
|
|
2089
|
+
throw RpcError.app("not_found", "这个子代理不在这个会话里");
|
|
2090
|
+
if (this.observed.has(nativeId))
|
|
2091
|
+
throw this.refused(nativeId, "会话开在电脑的另一个 Codex 里 · 子代理要在那边停止", HELD_COMMAND);
|
|
2092
|
+
const turnId = this.stateOf(childId).activeTurnId;
|
|
2093
|
+
if (!turnId)
|
|
2094
|
+
throw RpcError.app("busy", "这个子代理现在没有在运行");
|
|
2095
|
+
// A sub-agent's thread lives in the server its parent is in.
|
|
2096
|
+
await this.rpcFor(nativeId, "turn/interrupt", { threadId: childId, turnId });
|
|
2097
|
+
}
|
|
2011
2098
|
/** Remembers which spawnAgent call each new sub-agent thread belongs to. */
|
|
2012
2099
|
noteSpawns(params) {
|
|
2013
2100
|
const record = params;
|
|
@@ -2081,7 +2168,7 @@ export class CodexDriver {
|
|
|
2081
2168
|
}
|
|
2082
2169
|
rpc(method, params) {
|
|
2083
2170
|
if (!this.server)
|
|
2084
|
-
return Promise.reject(RpcError.app("agent_unavailable", "Codex
|
|
2171
|
+
return Promise.reject(RpcError.app("agent_unavailable", "Codex 没有在运行"));
|
|
2085
2172
|
return this.server.request(method, params);
|
|
2086
2173
|
}
|
|
2087
2174
|
/** A request about a thread, to the server it is loaded in. */
|