@linkshell/host 0.4.19 → 0.4.21

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 (105) hide show
  1. package/README.md +2 -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 +37 -8
  11. package/dist/host/src/drivers/acp/connection.js +127 -110
  12. package/dist/host/src/drivers/acp/connection.js.map +1 -1
  13. package/dist/host/src/drivers/acp/driver.d.ts +92 -2
  14. package/dist/host/src/drivers/acp/driver.js +599 -52
  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.js +1 -0
  37. package/dist/host/src/drivers/claude/driver.js.map +1 -1
  38. package/dist/host/src/drivers/claude/tasks.d.ts +3 -3
  39. package/dist/host/src/drivers/claude/transcript.d.ts +497 -38
  40. package/dist/host/src/drivers/codex/driver.d.ts +3 -0
  41. package/dist/host/src/drivers/codex/driver.js +36 -1
  42. package/dist/host/src/drivers/codex/driver.js.map +1 -1
  43. package/dist/host/src/drivers/registry.d.ts +6 -0
  44. package/dist/host/src/drivers/registry.js +8 -0
  45. package/dist/host/src/drivers/registry.js.map +1 -1
  46. package/dist/host/src/drivers/types.d.ts +34 -1
  47. package/dist/host/src/fs.d.ts +3 -3
  48. package/dist/host/src/host.js +21 -3
  49. package/dist/host/src/host.js.map +1 -1
  50. package/dist/host/src/hub.d.ts +249 -2
  51. package/dist/host/src/hub.js +150 -9
  52. package/dist/host/src/hub.js.map +1 -1
  53. package/dist/host/src/input.d.ts +5 -3
  54. package/dist/host/src/input.js +8 -6
  55. package/dist/host/src/input.js.map +1 -1
  56. package/dist/host/src/questions.d.ts +3 -1
  57. package/dist/host/src/questions.js +33 -7
  58. package/dist/host/src/questions.js.map +1 -1
  59. package/dist/host/src/rpc/server.js +14 -0
  60. package/dist/host/src/rpc/server.js.map +1 -1
  61. package/dist/host/src/screen-metrics.d.ts +3 -0
  62. package/dist/host/src/screen-metrics.js +27 -0
  63. package/dist/host/src/screen-metrics.js.map +1 -0
  64. package/dist/host/src/screen.js +7 -6
  65. package/dist/host/src/screen.js.map +1 -1
  66. package/dist/host/src/slim.js +15 -4
  67. package/dist/host/src/slim.js.map +1 -1
  68. package/dist/host/src/store.js +7 -2
  69. package/dist/host/src/store.js.map +1 -1
  70. package/dist/host/src/terminals.d.ts +8 -3
  71. package/dist/host/src/terminals.js +3 -2
  72. package/dist/host/src/terminals.js.map +1 -1
  73. package/dist/host/tsconfig.tsbuildinfo +1 -1
  74. package/dist/wire/src/acp.d.ts +510 -0
  75. package/dist/wire/src/acp.js +39 -0
  76. package/dist/wire/src/acp.js.map +1 -0
  77. package/dist/wire/src/async-questions.d.ts +2 -2
  78. package/dist/wire/src/computer-preview.d.ts +2 -2
  79. package/dist/wire/src/content.d.ts +465 -0
  80. package/dist/wire/src/content.js +58 -0
  81. package/dist/wire/src/content.js.map +1 -0
  82. package/dist/wire/src/editor.d.ts +702 -0
  83. package/dist/wire/src/editor.js +23 -0
  84. package/dist/wire/src/editor.js.map +1 -0
  85. package/dist/wire/src/index.d.ts +3 -0
  86. package/dist/wire/src/index.js +3 -0
  87. package/dist/wire/src/index.js.map +1 -1
  88. package/dist/wire/src/model.d.ts +1383 -79
  89. package/dist/wire/src/model.js +20 -1
  90. package/dist/wire/src/model.js.map +1 -1
  91. package/dist/wire/src/peer.d.ts +1 -0
  92. package/dist/wire/src/peer.js +22 -6
  93. package/dist/wire/src/peer.js.map +1 -1
  94. package/dist/wire/src/questions.d.ts +3 -0
  95. package/dist/wire/src/questions.js +65 -0
  96. package/dist/wire/src/questions.js.map +1 -0
  97. package/dist/wire/src/relay.d.ts +4 -4
  98. package/dist/wire/src/rpc.d.ts +19023 -2518
  99. package/dist/wire/src/rpc.js +41 -3
  100. package/dist/wire/src/rpc.js.map +1 -1
  101. package/dist/wire/src/updates.d.ts +3848 -1114
  102. package/dist/wire/src/updates.js +42 -40
  103. package/dist/wire/src/updates.js.map +1 -1
  104. package/dist/wire/src/workflow.d.ts +22 -22
  105. package/package.json +4 -3
package/README.md CHANGED
@@ -30,8 +30,8 @@ See [question support and validation boundaries](../../docs/v2/agent-questions.m
30
30
  ## Remote screen
31
31
 
32
32
  `screen.start` returns a token-protected loopback viewer port and display list. The phone
33
- forwards the port; the web client hosts the same page in an isolated iframe. On Apple silicon
34
- 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
35
35
  SDP/ICE over its Unix socket; the media track and four input/cursor channels run directly
36
36
  between LinkShell.app and the native iOS receiver or web player.
37
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,23 +1,37 @@
1
1
  import { type RpcId } from "@linkshell/wire";
2
2
  export declare const ACP_PROTOCOL_VERSION = 1;
3
3
  export declare class AcpProtocolError extends Error {
4
- constructor(version: unknown);
4
+ constructor(version: unknown, requested?: number);
5
5
  }
6
- /** The subset of ACP `initialize` results LinkShell reads. */
6
+ /** Both versions normalize their capability names here, never their wire semantics. */
7
7
  export interface AcpAgentCapabilities {
8
+ sessions?: boolean;
8
9
  loadSession?: boolean;
9
10
  promptCapabilities?: {
10
11
  image?: boolean;
11
12
  audio?: boolean;
12
13
  embeddedContext?: boolean;
13
14
  };
15
+ mcpCapabilities?: {
16
+ http?: boolean;
17
+ sse?: boolean;
18
+ stdio?: boolean;
19
+ acp?: boolean;
20
+ };
14
21
  sessionCapabilities?: {
15
22
  list?: unknown;
16
23
  resume?: unknown;
17
24
  close?: unknown;
18
25
  fork?: unknown;
19
26
  delete?: unknown;
27
+ additionalDirectories?: unknown;
28
+ };
29
+ auth?: {
30
+ logout?: unknown;
20
31
  };
32
+ providers?: unknown;
33
+ nes?: unknown;
34
+ positionEncoding?: string;
21
35
  _meta?: Record<string, unknown>;
22
36
  }
23
37
  export interface AcpInitializeResult {
@@ -30,39 +44,54 @@ export interface AcpInitializeResult {
30
44
  authMethods?: {
31
45
  id: string;
32
46
  name?: string;
47
+ description?: string;
48
+ type?: string;
49
+ args?: string[];
50
+ env?: Record<string, string>;
33
51
  }[];
34
52
  _meta?: Record<string, unknown>;
35
53
  }
36
54
  export interface AcpConnectionOptions {
37
55
  command: string;
38
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;
39
64
  env?: NodeJS.ProcessEnv;
40
65
  cwd?: string;
41
66
  clientVersion: string;
42
- /** Namespace extensions implemented by this client for this adapter. */
43
67
  clientMeta?: Record<string, unknown>;
44
68
  onUpdate: (sessionId: string, update: unknown) => void;
45
- /** Agent → client requests (session/request_permission, …). */
46
69
  onRequest: (method: string, params: unknown, id: RpcId) => unknown;
70
+ onNotification?: (method: string, params: unknown) => void;
47
71
  onCancelRequest?: (id: RpcId) => void;
48
72
  onExit: (reason: string) => void;
49
73
  }
50
- /**
51
- * One ACP agent subprocess: JSON-RPC 2.0 over newline-delimited stdio.
52
- * A single process serves every session of that agent.
53
- */
74
+ /** One version-negotiated ACP connection. Native credentials remain owned by the agent. */
54
75
  export declare class AcpConnection {
55
76
  private readonly options;
56
77
  private child?;
57
78
  private peer?;
79
+ private reader?;
80
+ private writer?;
58
81
  private stopping;
82
+ private closed;
59
83
  private stderrTail;
60
84
  initializeResult: AcpInitializeResult;
61
85
  constructor(options: AcpConnectionOptions);
62
86
  get capabilities(): AcpAgentCapabilities;
63
87
  get alive(): boolean;
88
+ get protocolVersion(): 1 | 2;
64
89
  start(): Promise<AcpInitializeResult>;
90
+ private read;
91
+ private notification;
92
+ private lost;
65
93
  request<T>(method: string, params: unknown, timeoutMs?: number): Promise<T>;
94
+ hasPendingRequest(id: RpcId): boolean;
66
95
  notify(method: string, params: unknown): void;
67
96
  stop(): Promise<void>;
68
97
  }