@linkshell/host 0.4.18 → 0.4.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +14 -2
  2. package/dist/host/src/acp-settings.d.ts +12 -0
  3. package/dist/host/src/acp-settings.js +41 -0
  4. package/dist/host/src/acp-settings.js.map +1 -0
  5. package/dist/host/src/carry.js +13 -2
  6. package/dist/host/src/carry.js.map +1 -1
  7. package/dist/host/src/drivers/acp/client-services.d.ts +29 -0
  8. package/dist/host/src/drivers/acp/client-services.js +192 -0
  9. package/dist/host/src/drivers/acp/client-services.js.map +1 -0
  10. package/dist/host/src/drivers/acp/connection.d.ts +40 -7
  11. package/dist/host/src/drivers/acp/connection.js +132 -103
  12. package/dist/host/src/drivers/acp/connection.js.map +1 -1
  13. package/dist/host/src/drivers/acp/driver.d.ts +95 -2
  14. package/dist/host/src/drivers/acp/driver.js +628 -53
  15. package/dist/host/src/drivers/acp/driver.js.map +1 -1
  16. package/dist/host/src/drivers/acp/editor.d.ts +31 -0
  17. package/dist/host/src/drivers/acp/editor.js +242 -0
  18. package/dist/host/src/drivers/acp/editor.js.map +1 -0
  19. package/dist/host/src/drivers/acp/mapper.d.ts +2 -1
  20. package/dist/host/src/drivers/acp/mapper.js +88 -35
  21. package/dist/host/src/drivers/acp/mapper.js.map +1 -1
  22. package/dist/host/src/drivers/acp/mcp.d.ts +20 -0
  23. package/dist/host/src/drivers/acp/mcp.js +139 -0
  24. package/dist/host/src/drivers/acp/mcp.js.map +1 -0
  25. package/dist/host/src/drivers/acp/questions.js +14 -0
  26. package/dist/host/src/drivers/acp/questions.js.map +1 -1
  27. package/dist/host/src/drivers/acp/updates.d.ts +10 -0
  28. package/dist/host/src/drivers/acp/updates.js +137 -0
  29. package/dist/host/src/drivers/acp/updates.js.map +1 -0
  30. package/dist/host/src/drivers/claude/activity.d.ts +1 -0
  31. package/dist/host/src/drivers/claude/activity.js +17 -3
  32. package/dist/host/src/drivers/claude/activity.js.map +1 -1
  33. package/dist/host/src/drivers/claude/children.d.ts +7 -0
  34. package/dist/host/src/drivers/claude/children.js +31 -2
  35. package/dist/host/src/drivers/claude/children.js.map +1 -1
  36. package/dist/host/src/drivers/claude/driver.d.ts +4 -1
  37. package/dist/host/src/drivers/claude/driver.js +42 -1
  38. package/dist/host/src/drivers/claude/driver.js.map +1 -1
  39. package/dist/host/src/drivers/claude/tasks.d.ts +3 -3
  40. package/dist/host/src/drivers/claude/transcript.d.ts +497 -38
  41. package/dist/host/src/drivers/codex/archives.d.ts +2 -0
  42. package/dist/host/src/drivers/codex/archives.js +18 -0
  43. package/dist/host/src/drivers/codex/archives.js.map +1 -0
  44. package/dist/host/src/drivers/codex/attention.js +2 -2
  45. package/dist/host/src/drivers/codex/attention.js.map +1 -1
  46. package/dist/host/src/drivers/codex/driver.d.ts +4 -0
  47. package/dist/host/src/drivers/codex/driver.js +51 -2
  48. package/dist/host/src/drivers/codex/driver.js.map +1 -1
  49. package/dist/host/src/drivers/registry.d.ts +6 -0
  50. package/dist/host/src/drivers/registry.js +8 -0
  51. package/dist/host/src/drivers/registry.js.map +1 -1
  52. package/dist/host/src/drivers/types.d.ts +38 -1
  53. package/dist/host/src/fs.d.ts +3 -3
  54. package/dist/host/src/host.js +21 -3
  55. package/dist/host/src/host.js.map +1 -1
  56. package/dist/host/src/hub.d.ts +250 -2
  57. package/dist/host/src/hub.js +184 -13
  58. package/dist/host/src/hub.js.map +1 -1
  59. package/dist/host/src/input.d.ts +5 -3
  60. package/dist/host/src/input.js +8 -6
  61. package/dist/host/src/input.js.map +1 -1
  62. package/dist/host/src/questions.d.ts +3 -1
  63. package/dist/host/src/questions.js +33 -7
  64. package/dist/host/src/questions.js.map +1 -1
  65. package/dist/host/src/rpc/server.js +14 -0
  66. package/dist/host/src/rpc/server.js.map +1 -1
  67. package/dist/host/src/screen.js +5 -5
  68. package/dist/host/src/screen.js.map +1 -1
  69. package/dist/host/src/slim.js +15 -4
  70. package/dist/host/src/slim.js.map +1 -1
  71. package/dist/host/src/store.d.ts +2 -0
  72. package/dist/host/src/store.js +16 -2
  73. package/dist/host/src/store.js.map +1 -1
  74. package/dist/host/src/terminals.d.ts +8 -3
  75. package/dist/host/src/terminals.js +3 -2
  76. package/dist/host/src/terminals.js.map +1 -1
  77. package/dist/host/tsconfig.tsbuildinfo +1 -1
  78. package/dist/wire/src/acp.d.ts +510 -0
  79. package/dist/wire/src/acp.js +39 -0
  80. package/dist/wire/src/acp.js.map +1 -0
  81. package/dist/wire/src/async-questions.d.ts +2 -2
  82. package/dist/wire/src/computer-preview.d.ts +2 -2
  83. package/dist/wire/src/content.d.ts +465 -0
  84. package/dist/wire/src/content.js +58 -0
  85. package/dist/wire/src/content.js.map +1 -0
  86. package/dist/wire/src/editor.d.ts +702 -0
  87. package/dist/wire/src/editor.js +23 -0
  88. package/dist/wire/src/editor.js.map +1 -0
  89. package/dist/wire/src/index.d.ts +3 -0
  90. package/dist/wire/src/index.js +3 -0
  91. package/dist/wire/src/index.js.map +1 -1
  92. package/dist/wire/src/model.d.ts +1383 -79
  93. package/dist/wire/src/model.js +20 -1
  94. package/dist/wire/src/model.js.map +1 -1
  95. package/dist/wire/src/peer.d.ts +1 -0
  96. package/dist/wire/src/peer.js +22 -6
  97. package/dist/wire/src/peer.js.map +1 -1
  98. package/dist/wire/src/questions.d.ts +3 -0
  99. package/dist/wire/src/questions.js +65 -0
  100. package/dist/wire/src/questions.js.map +1 -0
  101. package/dist/wire/src/relay.d.ts +4 -4
  102. package/dist/wire/src/rpc.d.ts +19023 -2518
  103. package/dist/wire/src/rpc.js +41 -3
  104. package/dist/wire/src/rpc.js.map +1 -1
  105. package/dist/wire/src/updates.d.ts +3848 -1114
  106. package/dist/wire/src/updates.js +42 -40
  107. package/dist/wire/src/updates.js.map +1 -1
  108. package/dist/wire/src/workflow.d.ts +22 -22
  109. package/package.json +4 -3
package/README.md CHANGED
@@ -8,6 +8,18 @@ Run it through the CLI: `npm install -g linkshell-cli`, then `linkshell host --d
8
8
 
9
9
  Claude Workflow progress and background sub-agent transcripts stay synchronized even while the main conversation is idle. The app can open each run, phase and Agent independently.
10
10
 
11
+ ## Session recovery
12
+
13
+ Host 0.4.19 revalidates busy sessions after restart, reconciles Codex native archives,
14
+ and treats interrupted turns as finished. Archived Codex history is read without unarchiving.
15
+ Missing Claude transcripts and other history failures preserve cached messages and show a
16
+ retryable error. Lazy ACP agents initialize before their restore capabilities are checked;
17
+ resume-only agents explain that earlier messages cannot be fetched.
18
+
19
+ The host negotiates and validates ACP 1. ACP 2 remains draft and changes prompt completion,
20
+ history replay, messages and permissions; changing the version number alone is incompatible.
21
+ See [session recovery, protocol evidence and validation](../../docs/v2/session-recovery.md).
22
+
11
23
  ## Agent questions
12
24
 
13
25
  Codex Desktop asynchronous questions retain their pending state and accept immediate replies.
@@ -18,8 +30,8 @@ See [question support and validation boundaries](../../docs/v2/agent-questions.m
18
30
  ## Remote screen
19
31
 
20
32
  `screen.start` returns a token-protected loopback viewer port and display list. The phone
21
- forwards the port; the web client hosts the same page in an isolated iframe. On Apple silicon
22
- Macs, LinkShell.app captures and encodes with ScreenCaptureKit/VideoToolbox. The host passes
33
+ forwards the port; the web client hosts the same page in an isolated iframe. On Apple silicon and Intel
34
+ Macs running macOS 13+, the universal LinkShell.app captures and encodes with ScreenCaptureKit/VideoToolbox. The host passes
23
35
  SDP/ICE over its Unix socket; the media track and four input/cursor channels run directly
24
36
  between LinkShell.app and the native iOS receiver or web player.
25
37
 
@@ -0,0 +1,12 @@
1
+ import { type AcpAgentSettings, type AcpRemoteAgent } from "@linkshell/wire";
2
+ export declare class AcpSettingsStore {
3
+ private readonly path;
4
+ constructor(path: string);
5
+ private read;
6
+ settings(agent: string): AcpAgentSettings;
7
+ setSettings(agent: string, settings: AcpAgentSettings): void;
8
+ agents(): AcpRemoteAgent[];
9
+ saveAgent(agent: AcpRemoteAgent): void;
10
+ removeAgent(id: string): void;
11
+ private write;
12
+ }
@@ -0,0 +1,41 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { z } from "zod";
4
+ import { acpAgentSettingsSchema, acpRemoteAgentSchema } from "@linkshell/wire";
5
+ const schema = z.object({ settings: z.record(acpAgentSettingsSchema).default({}), agents: z.array(acpRemoteAgentSchema).default([]) });
6
+ export class AcpSettingsStore {
7
+ path;
8
+ constructor(path) {
9
+ this.path = path;
10
+ }
11
+ read() {
12
+ try {
13
+ return schema.parse(JSON.parse(readFileSync(this.path, "utf8")));
14
+ }
15
+ catch (error) {
16
+ if (error.code === "ENOENT")
17
+ return { settings: {}, agents: [] };
18
+ throw new Error("ACP 配置文件无效,请检查 acp.json", { cause: error });
19
+ }
20
+ }
21
+ settings(agent) { const value = this.read(); return value.settings[agent] ?? value.agents.find((entry) => entry.id === agent)?.settings ?? acpAgentSettingsSchema.parse({}); }
22
+ setSettings(agent, settings) {
23
+ const value = this.read();
24
+ value.settings[agent] = acpAgentSettingsSchema.parse(settings);
25
+ this.write(value);
26
+ }
27
+ agents() { return this.read().agents; }
28
+ saveAgent(agent) {
29
+ const value = this.read();
30
+ value.agents = [...value.agents.filter((entry) => entry.id !== agent.id), acpRemoteAgentSchema.parse(agent)];
31
+ this.write(value);
32
+ }
33
+ removeAgent(id) { const value = this.read(); value.agents = value.agents.filter((agent) => agent.id !== id); delete value.settings[id]; this.write(value); }
34
+ write(value) {
35
+ mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
36
+ const temp = `${this.path}.${process.pid}.tmp`;
37
+ writeFileSync(temp, JSON.stringify(value, null, 2) + "\n", { mode: 0o600 });
38
+ renameSync(temp, this.path);
39
+ }
40
+ }
41
+ //# sourceMappingURL=acp-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-settings.js","sourceRoot":"","sources":["../../../src/acp-settings.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  /** What of a session's log is the conversation itself: what was said and done, not state that was true then. */
5
5
  export function isConversation(update) {
6
6
  switch (update.sessionUpdate) {
7
+ case "ls_message":
7
8
  case "user_message_chunk":
8
9
  case "agent_message_chunk":
9
10
  case "agent_thought_chunk":
@@ -50,9 +51,19 @@ export function conversationDigest(events, maxBytes = 60_000) {
50
51
  for (const { update } of events) {
51
52
  if ("parentToolCallId" in update && update.parentToolCallId)
52
53
  continue;
53
- if (update.sessionUpdate === "user_message_chunk" || update.sessionUpdate === "agent_message_chunk") {
54
+ if (update.sessionUpdate === "ls_message" && update.role !== "thought" && update.content) {
55
+ const label = update.role === "user" ? "User" : "Assistant", key = `${label}:${update.messageId}`;
56
+ const text = update.content.map((block) => block.type === "text" ? block.text : block.type === "resource" ? `${block.resource.uri}\n${block.resource.text ?? "[attachment]"}` : block.type === "resource_link" ? `[${block.name}]` : `[${block.type}]`).join("");
57
+ const existing = entries.find((entry) => entry.key === key);
58
+ if (existing)
59
+ existing.text = (update.append ? existing.text : "") + text;
60
+ else
61
+ entries.push({ key, label, text });
62
+ }
63
+ else if (update.sessionUpdate === "user_message_chunk" || update.sessionUpdate === "agent_message_chunk") {
54
64
  const label = update.sessionUpdate === "user_message_chunk" ? "User" : "Assistant";
55
- const text = update.content.type === "text" ? update.content.text : update.content.type === "image" ? "[image]" : `[${update.content.name}]`;
65
+ const block = update.content;
66
+ const text = block.type === "text" ? block.text : block.type === "resource" ? `${block.resource.uri}\n${block.resource.text ?? "[attachment]"}` : block.type === "resource_link" ? `[${block.name}]` : `[${block.type}]`;
56
67
  const key = `${label}:${update.messageId ?? ""}`;
57
68
  if (last()?.key === key)
58
69
  last().text += text;
@@ -1 +1 @@
1
- {"version":3,"file":"carry.js","sourceRoot":"","sources":["../../../src/carry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"carry.js","sourceRoot":"","sources":["../../../src/carry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface AcpScope {
2
+ cwd: string;
3
+ additionalDirectories?: string[];
4
+ }
5
+ export interface AcpTerminalSnapshot {
6
+ output: string;
7
+ truncated: boolean;
8
+ exitStatus?: {
9
+ exitCode: number | null;
10
+ signal?: string | null;
11
+ };
12
+ }
13
+ /** Resolve the nearest existing ancestor so new files cannot escape through a symlink. */
14
+ export declare function scopedPath(scope: AcpScope, path: string): Promise<string>;
15
+ export declare class AcpClientServices {
16
+ private readonly options;
17
+ private readonly terminals;
18
+ constructor(options: {
19
+ scope: (sessionId: string) => AcpScope | undefined;
20
+ env: NodeJS.ProcessEnv;
21
+ output: (sessionId: string, terminalId: string, text: string, snapshot: AcpTerminalSnapshot) => void;
22
+ });
23
+ private scope;
24
+ request(method: string, raw: unknown, signal?: AbortSignal): Promise<unknown>;
25
+ output(sessionId: string, terminalId: string): AcpTerminalSnapshot | undefined;
26
+ private snapshot;
27
+ private kill;
28
+ close(sessionId?: string): Promise<void>;
29
+ }
@@ -0,0 +1,192 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile, realpath, stat, writeFile } from "node:fs/promises";
3
+ import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
4
+ import { StringDecoder } from "node:string_decoder";
5
+ import { randomUUID } from "node:crypto";
6
+ import { RpcError } from "@linkshell/wire";
7
+ const object = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
8
+ const invalid = (message) => new RpcError(-32602, message);
9
+ const cancelled = () => new RpcError(-32800, "请求已取消");
10
+ const within = (root, path) => { const rel = relative(root, path); return rel === "" || (rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel)); };
11
+ /** Resolve the nearest existing ancestor so new files cannot escape through a symlink. */
12
+ export async function scopedPath(scope, path) {
13
+ if (!isAbsolute(path))
14
+ throw invalid("文件路径必须是绝对路径");
15
+ const target = resolve(path);
16
+ let ancestor = target;
17
+ while (true) {
18
+ try {
19
+ ancestor = await realpath(ancestor);
20
+ break;
21
+ }
22
+ catch (error) {
23
+ if (error.code !== "ENOENT" || dirname(ancestor) === ancestor)
24
+ throw error;
25
+ ancestor = dirname(ancestor);
26
+ }
27
+ }
28
+ for (const root of [scope.cwd, ...(scope.additionalDirectories ?? [])]) {
29
+ const canonical = await realpath(root).catch(() => undefined);
30
+ if (canonical && within(canonical, ancestor))
31
+ return target;
32
+ }
33
+ throw new RpcError(-32000, "这个文件不在会话的工作目录中");
34
+ }
35
+ export class AcpClientServices {
36
+ options;
37
+ terminals = new Map();
38
+ constructor(options) {
39
+ this.options = options;
40
+ }
41
+ scope(sessionId) {
42
+ const scope = typeof sessionId === "string" ? this.options.scope(sessionId) : undefined;
43
+ if (!scope)
44
+ throw invalid("文件或终端请求没有有效的会话");
45
+ return scope;
46
+ }
47
+ async request(method, raw, signal) {
48
+ const p = object(raw);
49
+ const scope = this.scope(p.sessionId);
50
+ if (signal?.aborted)
51
+ throw cancelled();
52
+ if (method === "fs/read_text_file" || method === "fs/write_text_file") {
53
+ if (typeof p.path !== "string")
54
+ throw invalid("缺少文件路径");
55
+ const path = await scopedPath(scope, p.path);
56
+ if (method === "fs/write_text_file") {
57
+ if (typeof p.content !== "string")
58
+ throw invalid("文件内容必须是文本");
59
+ if (Buffer.byteLength(p.content) > 16 * 1024 * 1024)
60
+ throw invalid("文本文件超过 16 MB");
61
+ if (signal?.aborted)
62
+ throw cancelled();
63
+ await mkdir(dirname(path), { recursive: true });
64
+ await writeFile(path, p.content, { encoding: "utf8", signal });
65
+ return {};
66
+ }
67
+ for (const key of ["line", "limit"]) {
68
+ if (p[key] != null && (!Number.isSafeInteger(p[key]) || Number(p[key]) < (key === "line" ? 1 : 0)))
69
+ throw invalid(`${key} 必须是${key === "line" ? "正" : "非负"}整数`);
70
+ }
71
+ if ((await stat(path)).size > 16 * 1024 * 1024)
72
+ throw invalid("文本文件超过 16 MB");
73
+ const bytes = await readFile(path, { signal });
74
+ const content = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
75
+ if (p.line == null && p.limit == null)
76
+ return { content };
77
+ const lines = content.match(/[^\n]*\n|[^\n]+$/g) ?? [];
78
+ const from = Number(p.line ?? 1) - 1;
79
+ return { content: lines.slice(from, p.limit == null ? undefined : from + Number(p.limit)).join("") };
80
+ }
81
+ if (method === "terminal/create") {
82
+ if (this.terminals.size >= 64)
83
+ throw invalid("请先释放不用的 ACP 终端");
84
+ if (typeof p.command !== "string" || !p.command || (p.args != null && (!Array.isArray(p.args) || p.args.some((arg) => typeof arg !== "string"))))
85
+ throw invalid("终端命令无效");
86
+ const cwd = typeof p.cwd === "string" ? await scopedPath(scope, p.cwd) : scope.cwd;
87
+ if (signal?.aborted)
88
+ throw cancelled();
89
+ const env = { ...this.options.env };
90
+ for (const entry of Array.isArray(p.env) ? p.env : []) {
91
+ const item = object(entry);
92
+ if (typeof item.name !== "string" || typeof item.value !== "string")
93
+ throw invalid("终端环境变量无效");
94
+ env[item.name] = item.value;
95
+ }
96
+ if (p.outputByteLimit != null && (!Number.isSafeInteger(p.outputByteLimit) || Number(p.outputByteLimit) < 0))
97
+ throw invalid("终端输出上限必须是非负整数");
98
+ const child = spawn(p.command, (p.args ?? []), { cwd, env, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"] });
99
+ const terminalId = randomUUID();
100
+ let finish;
101
+ const terminal = { sessionId: String(p.sessionId), child, output: "", truncated: false,
102
+ limit: Math.min(Number(p.outputByteLimit ?? 256 * 1024), 4 * 1024 * 1024), exited: new Promise((resolve) => { finish = resolve; }) };
103
+ this.terminals.set(terminalId, terminal);
104
+ const append = (text) => {
105
+ if (!text)
106
+ return;
107
+ const bytes = Buffer.from(terminal.output + text);
108
+ let start = Math.max(0, bytes.length - terminal.limit);
109
+ if (start) {
110
+ terminal.truncated = true;
111
+ while (start < bytes.length && (bytes[start] & 0xc0) === 0x80)
112
+ start++;
113
+ }
114
+ terminal.output = bytes.subarray(start).toString("utf8");
115
+ this.options.output(terminal.sessionId, terminalId, text, this.snapshot(terminal));
116
+ };
117
+ for (const stream of [child.stdout, child.stderr]) {
118
+ const decoder = new StringDecoder("utf8");
119
+ stream?.on("data", (data) => append(decoder.write(data)));
120
+ stream?.on("end", () => append(decoder.end()));
121
+ }
122
+ const exited = (exitCode, exitSignal) => {
123
+ if (terminal.exitStatus)
124
+ return;
125
+ terminal.exitStatus = { exitCode, signal: exitSignal };
126
+ finish(terminal.exitStatus);
127
+ this.options.output(terminal.sessionId, terminalId, "", this.snapshot(terminal));
128
+ };
129
+ child.once("close", exited);
130
+ child.once("error", (error) => { append(error.message); exited(1); });
131
+ return { terminalId };
132
+ }
133
+ const terminal = typeof p.terminalId === "string" ? this.terminals.get(p.terminalId) : undefined;
134
+ if (!terminal || terminal.sessionId !== p.sessionId)
135
+ throw invalid("找不到这个会话的终端");
136
+ if (method === "terminal/output")
137
+ return this.snapshot(terminal);
138
+ if (method === "terminal/wait_for_exit") {
139
+ if (!signal)
140
+ return terminal.exited;
141
+ return new Promise((resolve, reject) => {
142
+ const abort = () => reject(cancelled());
143
+ signal.addEventListener("abort", abort, { once: true });
144
+ void terminal.exited.then((status) => { signal.removeEventListener("abort", abort); resolve(status); });
145
+ });
146
+ }
147
+ if (method === "terminal/kill" || method === "terminal/release") {
148
+ await this.kill(terminal);
149
+ if (method === "terminal/release")
150
+ this.terminals.delete(String(p.terminalId));
151
+ return {};
152
+ }
153
+ throw new RpcError(-32601, `不支持 ${method}`);
154
+ }
155
+ output(sessionId, terminalId) {
156
+ const terminal = this.terminals.get(terminalId);
157
+ return terminal?.sessionId === sessionId ? this.snapshot(terminal) : undefined;
158
+ }
159
+ snapshot(terminal) { return { output: terminal.output, truncated: terminal.truncated, ...(terminal.exitStatus ? { exitStatus: terminal.exitStatus } : {}) }; }
160
+ async kill(terminal) {
161
+ const kill = (signal) => {
162
+ try {
163
+ if (process.platform !== "win32" && terminal.child.pid)
164
+ process.kill(-terminal.child.pid, signal);
165
+ else
166
+ terminal.child.kill(signal);
167
+ }
168
+ catch { /* The process may have exited between the status check and the signal. */ }
169
+ };
170
+ // The launcher may exit while a detached-from-stdio child still owns its
171
+ // process group. Releasing the terminal must also release those children.
172
+ if (terminal.exitStatus) {
173
+ kill("SIGKILL");
174
+ return;
175
+ }
176
+ kill("SIGTERM");
177
+ const timer = setTimeout(() => kill("SIGKILL"), 1500);
178
+ timer.unref();
179
+ await terminal.exited;
180
+ kill("SIGKILL");
181
+ clearTimeout(timer);
182
+ }
183
+ async close(sessionId) {
184
+ for (const [id, terminal] of this.terminals) {
185
+ if (sessionId && terminal.sessionId !== sessionId)
186
+ continue;
187
+ await this.kill(terminal);
188
+ this.terminals.delete(id);
189
+ }
190
+ }
191
+ }
192
+ //# sourceMappingURL=client-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-services.js","sourceRoot":"","sources":["../../../../../src/drivers/acp/client-services.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,37 @@
1
1
  import { type RpcId } from "@linkshell/wire";
2
- /** The subset of ACP `initialize` results LinkShell reads. */
2
+ export declare const ACP_PROTOCOL_VERSION = 1;
3
+ export declare class AcpProtocolError extends Error {
4
+ constructor(version: unknown, requested?: number);
5
+ }
6
+ /** Both versions normalize their capability names here, never their wire semantics. */
3
7
  export interface AcpAgentCapabilities {
8
+ sessions?: boolean;
4
9
  loadSession?: boolean;
5
10
  promptCapabilities?: {
6
11
  image?: boolean;
7
12
  audio?: boolean;
8
13
  embeddedContext?: boolean;
9
14
  };
15
+ mcpCapabilities?: {
16
+ http?: boolean;
17
+ sse?: boolean;
18
+ stdio?: boolean;
19
+ acp?: boolean;
20
+ };
10
21
  sessionCapabilities?: {
11
22
  list?: unknown;
12
23
  resume?: unknown;
13
24
  close?: unknown;
14
25
  fork?: unknown;
15
26
  delete?: unknown;
27
+ additionalDirectories?: unknown;
16
28
  };
29
+ auth?: {
30
+ logout?: unknown;
31
+ };
32
+ providers?: unknown;
33
+ nes?: unknown;
34
+ positionEncoding?: string;
17
35
  _meta?: Record<string, unknown>;
18
36
  }
19
37
  export interface AcpInitializeResult {
@@ -26,39 +44,54 @@ export interface AcpInitializeResult {
26
44
  authMethods?: {
27
45
  id: string;
28
46
  name?: string;
47
+ description?: string;
48
+ type?: string;
49
+ args?: string[];
50
+ env?: Record<string, string>;
29
51
  }[];
30
52
  _meta?: Record<string, unknown>;
31
53
  }
32
54
  export interface AcpConnectionOptions {
33
55
  command: string;
34
56
  args: string[];
57
+ transport?: {
58
+ type: "http" | "websocket";
59
+ url: string;
60
+ headers?: Record<string, string>;
61
+ };
62
+ protocolVersion?: 1 | 2;
63
+ experimental?: boolean;
35
64
  env?: NodeJS.ProcessEnv;
36
65
  cwd?: string;
37
66
  clientVersion: string;
38
- /** Namespace extensions implemented by this client for this adapter. */
39
67
  clientMeta?: Record<string, unknown>;
40
68
  onUpdate: (sessionId: string, update: unknown) => void;
41
- /** Agent → client requests (session/request_permission, …). */
42
69
  onRequest: (method: string, params: unknown, id: RpcId) => unknown;
70
+ onNotification?: (method: string, params: unknown) => void;
43
71
  onCancelRequest?: (id: RpcId) => void;
44
72
  onExit: (reason: string) => void;
45
73
  }
46
- /**
47
- * One ACP agent subprocess: JSON-RPC 2.0 over newline-delimited stdio.
48
- * A single process serves every session of that agent.
49
- */
74
+ /** One version-negotiated ACP connection. Native credentials remain owned by the agent. */
50
75
  export declare class AcpConnection {
51
76
  private readonly options;
52
77
  private child?;
53
78
  private peer?;
79
+ private reader?;
80
+ private writer?;
54
81
  private stopping;
82
+ private closed;
55
83
  private stderrTail;
56
84
  initializeResult: AcpInitializeResult;
57
85
  constructor(options: AcpConnectionOptions);
58
86
  get capabilities(): AcpAgentCapabilities;
59
87
  get alive(): boolean;
88
+ get protocolVersion(): 1 | 2;
60
89
  start(): Promise<AcpInitializeResult>;
90
+ private read;
91
+ private notification;
92
+ private lost;
61
93
  request<T>(method: string, params: unknown, timeoutMs?: number): Promise<T>;
94
+ hasPendingRequest(id: RpcId): boolean;
62
95
  notify(method: string, params: unknown): void;
63
96
  stop(): Promise<void>;
64
97
  }