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.
Files changed (135) hide show
  1. package/dist/cli/src/commands/host.d.ts +23 -0
  2. package/dist/cli/src/commands/host.js +264 -0
  3. package/dist/cli/src/commands/host.js.map +1 -0
  4. package/dist/cli/src/commands/pair.d.ts +1 -0
  5. package/dist/cli/src/commands/pair.js +48 -0
  6. package/dist/cli/src/commands/pair.js.map +1 -0
  7. package/dist/cli/src/index.js +68 -0
  8. package/dist/cli/src/index.js.map +1 -1
  9. package/dist/cli/src/utils/daemon.d.ts +1 -1
  10. package/dist/cli/src/utils/daemon.js +3 -2
  11. package/dist/cli/src/utils/daemon.js.map +1 -1
  12. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  13. package/dist/host/src/drivers/acp/connection.d.ts +61 -0
  14. package/dist/host/src/drivers/acp/connection.js +121 -0
  15. package/dist/host/src/drivers/acp/connection.js.map +1 -0
  16. package/dist/host/src/drivers/acp/driver.d.ts +110 -0
  17. package/dist/host/src/drivers/acp/driver.js +438 -0
  18. package/dist/host/src/drivers/acp/driver.js.map +1 -0
  19. package/dist/host/src/drivers/acp/mapper.d.ts +49 -0
  20. package/dist/host/src/drivers/acp/mapper.js +411 -0
  21. package/dist/host/src/drivers/acp/mapper.js.map +1 -0
  22. package/dist/host/src/drivers/auth.d.ts +7 -0
  23. package/dist/host/src/drivers/auth.js +57 -0
  24. package/dist/host/src/drivers/auth.js.map +1 -0
  25. package/dist/host/src/drivers/claude/driver.d.ts +76 -0
  26. package/dist/host/src/drivers/claude/driver.js +331 -0
  27. package/dist/host/src/drivers/claude/driver.js.map +1 -0
  28. package/dist/host/src/drivers/claude/transcript.d.ts +335 -0
  29. package/dist/host/src/drivers/claude/transcript.js +516 -0
  30. package/dist/host/src/drivers/claude/transcript.js.map +1 -0
  31. package/dist/host/src/drivers/codex/app-server.d.ts +36 -0
  32. package/dist/host/src/drivers/codex/app-server.js +144 -0
  33. package/dist/host/src/drivers/codex/app-server.js.map +1 -0
  34. package/dist/host/src/drivers/codex/driver.d.ts +89 -0
  35. package/dist/host/src/drivers/codex/driver.js +452 -0
  36. package/dist/host/src/drivers/codex/driver.js.map +1 -0
  37. package/dist/host/src/drivers/codex/mapper.d.ts +61 -0
  38. package/dist/host/src/drivers/codex/mapper.js +623 -0
  39. package/dist/host/src/drivers/codex/mapper.js.map +1 -0
  40. package/dist/host/src/drivers/codex/settings.d.ts +51 -0
  41. package/dist/host/src/drivers/codex/settings.js +107 -0
  42. package/dist/host/src/drivers/codex/settings.js.map +1 -0
  43. package/dist/host/src/drivers/images.d.ts +11 -0
  44. package/dist/host/src/drivers/images.js +34 -0
  45. package/dist/host/src/drivers/images.js.map +1 -0
  46. package/dist/host/src/drivers/nesting.d.ts +6 -0
  47. package/dist/host/src/drivers/nesting.js +25 -0
  48. package/dist/host/src/drivers/nesting.js.map +1 -0
  49. package/dist/host/src/drivers/registry.d.ts +21 -0
  50. package/dist/host/src/drivers/registry.js +30 -0
  51. package/dist/host/src/drivers/registry.js.map +1 -0
  52. package/dist/host/src/drivers/types.d.ts +105 -0
  53. package/dist/host/src/drivers/types.js +2 -0
  54. package/dist/host/src/drivers/types.js.map +1 -0
  55. package/dist/host/src/fs.d.ts +69 -0
  56. package/dist/host/src/fs.js +198 -0
  57. package/dist/host/src/fs.js.map +1 -0
  58. package/dist/host/src/gateway.d.ts +55 -0
  59. package/dist/host/src/gateway.js +263 -0
  60. package/dist/host/src/gateway.js.map +1 -0
  61. package/dist/host/src/host.d.ts +51 -0
  62. package/dist/host/src/host.js +133 -0
  63. package/dist/host/src/host.js.map +1 -0
  64. package/dist/host/src/hub.d.ts +89 -0
  65. package/dist/host/src/hub.js +592 -0
  66. package/dist/host/src/hub.js.map +1 -0
  67. package/dist/host/src/index.d.ts +10 -0
  68. package/dist/host/src/index.js +10 -0
  69. package/dist/host/src/index.js.map +1 -0
  70. package/dist/host/src/ports.d.ts +24 -0
  71. package/dist/host/src/ports.js +201 -0
  72. package/dist/host/src/ports.js.map +1 -0
  73. package/dist/host/src/rpc/client.d.ts +9 -0
  74. package/dist/host/src/rpc/client.js +42 -0
  75. package/dist/host/src/rpc/client.js.map +1 -0
  76. package/dist/host/src/rpc/server.d.ts +52 -0
  77. package/dist/host/src/rpc/server.js +293 -0
  78. package/dist/host/src/rpc/server.js.map +1 -0
  79. package/dist/host/src/screen.d.ts +30 -0
  80. package/dist/host/src/screen.js +230 -0
  81. package/dist/host/src/screen.js.map +1 -0
  82. package/dist/host/src/shell-env.d.ts +8 -0
  83. package/dist/host/src/shell-env.js +39 -0
  84. package/dist/host/src/shell-env.js.map +1 -0
  85. package/dist/host/src/store.d.ts +75 -0
  86. package/dist/host/src/store.js +265 -0
  87. package/dist/host/src/store.js.map +1 -0
  88. package/dist/host/src/terminals.d.ts +55 -0
  89. package/dist/host/src/terminals.js +367 -0
  90. package/dist/host/src/terminals.js.map +1 -0
  91. package/dist/shared-protocol/src/index.d.ts +3345 -3345
  92. package/dist/wire/src/crypto.d.ts +65 -0
  93. package/dist/wire/src/crypto.js +253 -0
  94. package/dist/wire/src/crypto.js.map +1 -0
  95. package/dist/wire/src/index.d.ts +8 -0
  96. package/dist/wire/src/index.js +9 -0
  97. package/dist/wire/src/index.js.map +1 -0
  98. package/dist/wire/src/model.d.ts +704 -0
  99. package/dist/wire/src/model.js +163 -0
  100. package/dist/wire/src/model.js.map +1 -0
  101. package/dist/wire/src/peer.d.ts +42 -0
  102. package/dist/wire/src/peer.js +143 -0
  103. package/dist/wire/src/peer.js.map +1 -0
  104. package/dist/wire/src/relay-client.d.ts +82 -0
  105. package/dist/wire/src/relay-client.js +259 -0
  106. package/dist/wire/src/relay-client.js.map +1 -0
  107. package/dist/wire/src/relay.d.ts +481 -0
  108. package/dist/wire/src/relay.js +129 -0
  109. package/dist/wire/src/relay.js.map +1 -0
  110. package/dist/wire/src/rpc.d.ts +4170 -0
  111. package/dist/wire/src/rpc.js +332 -0
  112. package/dist/wire/src/rpc.js.map +1 -0
  113. package/dist/wire/src/shell.d.ts +2 -0
  114. package/dist/wire/src/shell.js +62 -0
  115. package/dist/wire/src/shell.js.map +1 -0
  116. package/dist/wire/src/updates.d.ts +3325 -0
  117. package/dist/wire/src/updates.js +210 -0
  118. package/dist/wire/src/updates.js.map +1 -0
  119. package/package.json +8 -3
  120. package/src/commands/host.ts +283 -0
  121. package/src/commands/pair.ts +47 -0
  122. package/src/index.ts +73 -0
  123. package/src/utils/daemon.ts +4 -3
  124. package/dist/cli/src/commands/hook.d.ts +0 -6
  125. package/dist/cli/src/commands/hook.js +0 -120
  126. package/dist/cli/src/commands/hook.js.map +0 -1
  127. package/dist/cli/src/runtime/acp/agent-workspace-git.d.ts +0 -63
  128. package/dist/cli/src/runtime/acp/agent-workspace-git.js +0 -297
  129. package/dist/cli/src/runtime/acp/agent-workspace-git.js.map +0 -1
  130. package/dist/cli/src/runtime/acp-relay.d.ts +0 -23
  131. package/dist/cli/src/runtime/acp-relay.js +0 -73
  132. package/dist/cli/src/runtime/acp-relay.js.map +0 -1
  133. package/dist/cli/src/runtime/hook-permission-server.d.ts +0 -36
  134. package/dist/cli/src/runtime/hook-permission-server.js +0 -147
  135. package/dist/cli/src/runtime/hook-permission-server.js.map +0 -1
@@ -0,0 +1,411 @@
1
+ import { describeClaudeTool } from "../claude/transcript.js";
2
+ import { inlineImage } from "../images.js";
3
+ const str = (value) => (typeof value === "string" ? value : undefined);
4
+ const obj = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
5
+ const arr = (value) => (Array.isArray(value) ? value : []);
6
+ const TOOL_KINDS = new Set(["read", "edit", "delete", "move", "search", "execute", "think", "fetch", "other"]);
7
+ const TOOL_STATUSES = new Set(["pending", "in_progress", "completed", "failed"]);
8
+ export function toContentBlock(raw) {
9
+ const block = obj(raw);
10
+ if (!block)
11
+ return undefined;
12
+ switch (block.type) {
13
+ case "text":
14
+ return typeof block.text === "string" ? { type: "text", text: block.text } : undefined;
15
+ case "image":
16
+ if (str(block.data))
17
+ return inlineImage(str(block.data), str(block.mimeType));
18
+ return str(block.uri) ? { type: "image", mimeType: str(block.mimeType) ?? "image/*", uri: str(block.uri) } : undefined;
19
+ case "resource_link":
20
+ return str(block.uri) ? { type: "resource_link", uri: str(block.uri), name: str(block.name) ?? str(block.uri) } : undefined;
21
+ case "resource": {
22
+ const resource = obj(block.resource);
23
+ if (typeof resource?.text === "string")
24
+ return { type: "text", text: resource.text };
25
+ if (str(resource?.mimeType)?.startsWith("image/") && str(resource?.blob))
26
+ return inlineImage(str(resource?.blob), str(resource?.mimeType));
27
+ return str(resource?.uri) ? { type: "resource_link", uri: str(resource?.uri), name: str(resource?.uri) } : undefined;
28
+ }
29
+ default:
30
+ return undefined;
31
+ }
32
+ }
33
+ function toolContent(raw) {
34
+ if (!Array.isArray(raw))
35
+ return undefined;
36
+ const content = [];
37
+ for (const entry of raw) {
38
+ const item = obj(entry);
39
+ if (!item)
40
+ continue;
41
+ if (item.type === "content") {
42
+ const block = toContentBlock(item.content);
43
+ if (block)
44
+ content.push({ type: "content", content: block });
45
+ }
46
+ else if (item.type === "diff" && str(item.path) && typeof item.newText === "string") {
47
+ content.push({ type: "diff", path: str(item.path), oldText: str(item.oldText) ?? null, newText: item.newText });
48
+ }
49
+ else if (item.type === "terminal" && str(item.terminalId)) {
50
+ content.push({ type: "terminal", terminalId: str(item.terminalId) });
51
+ }
52
+ }
53
+ return content;
54
+ }
55
+ function toolKind(value) {
56
+ return typeof value === "string" && TOOL_KINDS.has(value) ? value : "other";
57
+ }
58
+ function toolStatus(value) {
59
+ return typeof value === "string" && TOOL_STATUSES.has(value) ? value : undefined;
60
+ }
61
+ function locations(raw) {
62
+ if (!Array.isArray(raw))
63
+ return undefined;
64
+ return raw.flatMap((entry) => {
65
+ const location = obj(entry);
66
+ return str(location?.path) ? [{ path: str(location?.path), line: typeof location?.line === "number" ? location.line : undefined }] : [];
67
+ });
68
+ }
69
+ /** Reads ACP `configOptions` / `modes` / legacy `models` into LinkShell config options. */
70
+ export function toConfigOptions(response) {
71
+ const source = obj(response);
72
+ if (!source)
73
+ return [];
74
+ const options = [];
75
+ for (const raw of arr(source.configOptions)) {
76
+ const option = obj(raw);
77
+ if (!option || option.type !== "select" || !str(option.id))
78
+ continue;
79
+ const values = arr(option.options).flatMap((entry) => {
80
+ const value = obj(entry);
81
+ if (!value)
82
+ return [];
83
+ if (Array.isArray(value.options)) {
84
+ return value.options.flatMap((inner) => {
85
+ const v = obj(inner);
86
+ return str(v?.value) ? [{ value: str(v?.value), name: str(v?.name) ?? str(v?.value), description: str(v?.description) }] : [];
87
+ });
88
+ }
89
+ return str(value.value) ? [{ value: str(value.value), name: str(value.name) ?? str(value.value), description: str(value.description) }] : [];
90
+ });
91
+ const category = str(option.category) ?? str(option.id);
92
+ options.push({
93
+ id: str(option.id),
94
+ name: str(option.name) ?? str(option.id),
95
+ category: category === "model" || category === "mode" ? category : category?.includes("thought") || category?.includes("effort") ? "effort" : "other",
96
+ current: str(option.currentValue) ?? values[0]?.value ?? "",
97
+ values,
98
+ source: "configOptions",
99
+ });
100
+ }
101
+ const modes = obj(source.modes);
102
+ if (modes && !options.some((option) => option.category === "mode")) {
103
+ const values = arr(modes.availableModes).flatMap((entry) => {
104
+ const mode = obj(entry);
105
+ return str(mode?.id) ? [{ value: str(mode?.id), name: str(mode?.name) ?? str(mode?.id), description: str(mode?.description) }] : [];
106
+ });
107
+ if (values.length > 0) {
108
+ options.push({ id: "mode", name: "Mode", category: "mode", current: str(modes.currentModeId) ?? values[0].value, values, source: "modes" });
109
+ }
110
+ }
111
+ const models = obj(source.models);
112
+ if (models && !options.some((option) => option.category === "model")) {
113
+ const values = arr(models.availableModels).flatMap((entry) => {
114
+ const model = obj(entry);
115
+ const id = str(model?.modelId) ?? str(model?.id);
116
+ return id ? [{ value: id, name: str(model?.name) ?? id, description: str(model?.description) }] : [];
117
+ });
118
+ if (values.length > 0) {
119
+ options.push({ id: "model", name: "Model", category: "model", current: str(models.currentModelId) ?? values[0].value, values, source: "models" });
120
+ }
121
+ }
122
+ return options;
123
+ }
124
+ /**
125
+ * Agent-specific tool metadata some ACP adapters attach in `_meta`. Only
126
+ * Claude's adapter does today (`_meta.claudeCode.toolName`); anything else
127
+ * renders from ACP's generic `title` and `kind`.
128
+ */
129
+ /** The spawning tool call of a sub-agent's update (Claude: `_meta.claudeCode.parentToolUseId`). */
130
+ function parentOf(update) {
131
+ return str(obj(obj(update._meta)?.claudeCode)?.parentToolUseId);
132
+ }
133
+ function toolDetail(update) {
134
+ const claudeTool = str(obj(obj(update._meta)?.claudeCode)?.toolName);
135
+ if (claudeTool)
136
+ return describeClaudeTool(claudeTool, obj(update.rawInput) ?? {}).detail;
137
+ return undefined;
138
+ }
139
+ /** Maps one ACP `session/update` payload. Returns undefined for kinds LinkShell doesn't carry. */
140
+ export function normalizeAcpUpdate(raw) {
141
+ const update = obj(raw);
142
+ if (!update)
143
+ return undefined;
144
+ switch (update.sessionUpdate) {
145
+ case "user_message_chunk":
146
+ case "agent_message_chunk":
147
+ case "agent_thought_chunk": {
148
+ const content = toContentBlock(update.content);
149
+ if (!content)
150
+ return undefined;
151
+ const messageId = str(update.messageId);
152
+ if (update.sessionUpdate === "user_message_chunk") {
153
+ // A sub-agent's prompt is its spawning call's input; don't show it as the user's.
154
+ return parentOf(update) ? undefined : { sessionUpdate: "user_message_chunk", messageId, content };
155
+ }
156
+ // Agent chunks without an id get one from the ItemTracker.
157
+ return { sessionUpdate: update.sessionUpdate, messageId: messageId ?? "", content, parentToolCallId: parentOf(update) };
158
+ }
159
+ case "tool_call": {
160
+ const toolCallId = str(update.toolCallId);
161
+ if (!toolCallId)
162
+ return undefined;
163
+ return {
164
+ sessionUpdate: "tool_call",
165
+ toolCallId,
166
+ parentToolCallId: parentOf(update),
167
+ title: str(update.title) ?? str(update.name) ?? "Tool",
168
+ kind: toolKind(update.kind),
169
+ status: toolStatus(update.status) ?? "pending",
170
+ rawInput: update.rawInput,
171
+ content: toolContent(update.content),
172
+ locations: locations(update.locations),
173
+ detail: toolDetail(update),
174
+ };
175
+ }
176
+ case "tool_call_update": {
177
+ const toolCallId = str(update.toolCallId);
178
+ if (!toolCallId)
179
+ return undefined;
180
+ return {
181
+ sessionUpdate: "tool_call_update",
182
+ toolCallId,
183
+ parentToolCallId: parentOf(update),
184
+ status: toolStatus(update.status),
185
+ title: str(update.title) ?? undefined,
186
+ detail: toolDetail(update),
187
+ content: toolContent(update.content),
188
+ rawOutput: update.rawOutput,
189
+ };
190
+ }
191
+ case "plan":
192
+ return {
193
+ sessionUpdate: "plan",
194
+ entries: arr(update.entries).flatMap((entry) => {
195
+ const plan = obj(entry);
196
+ if (!str(plan?.content))
197
+ return [];
198
+ const status = plan?.status === "completed" || plan?.status === "in_progress" ? plan.status : "pending";
199
+ const priority = plan?.priority === "high" || plan?.priority === "low" ? plan.priority : "medium";
200
+ return [{ content: str(plan?.content), status, priority }];
201
+ }),
202
+ };
203
+ case "available_commands_update":
204
+ return {
205
+ sessionUpdate: "available_commands_update",
206
+ availableCommands: arr(update.availableCommands).flatMap((entry) => {
207
+ const command = obj(entry);
208
+ if (!str(command?.name))
209
+ return [];
210
+ return [{ name: str(command?.name), description: str(command?.description) ?? "", hint: str(obj(command?.input)?.hint) }];
211
+ }),
212
+ };
213
+ case "current_mode_update":
214
+ return str(update.currentModeId) ? { sessionUpdate: "current_mode_update", currentModeId: str(update.currentModeId) } : undefined;
215
+ case "config_option_update": {
216
+ const options = toConfigOptions({ configOptions: update.configOptions }).map(({ source: _source, ...option }) => option);
217
+ return options.length > 0 ? { sessionUpdate: "ls_config", options } : undefined;
218
+ }
219
+ case "session_info_update":
220
+ return str(update.title) ? { sessionUpdate: "session_info_update", title: str(update.title) } : undefined;
221
+ case "usage_update":
222
+ return {
223
+ sessionUpdate: "usage_update",
224
+ usedTokens: typeof update.used === "number" ? update.used : undefined,
225
+ contextWindow: typeof update.size === "number" ? update.size : undefined,
226
+ };
227
+ case "notice": {
228
+ const title = str(update.title);
229
+ if (!title)
230
+ return undefined;
231
+ if (update.severity === "error")
232
+ return { sessionUpdate: "ls_error", code: "agent_notice", message: title, hint: str(update.description) };
233
+ return { sessionUpdate: "ls_notice", level: update.severity === "warning" ? "warning" : "info", title, detail: str(update.description) };
234
+ }
235
+ default:
236
+ return undefined;
237
+ }
238
+ }
239
+ /** FNV-1a, for content-derived ids of messages that arrive without one. */
240
+ function contentHash(text) {
241
+ let hash = 0x811c9dc5;
242
+ for (let i = 0; i < text.length; i += 1) {
243
+ hash ^= text.charCodeAt(i);
244
+ hash = Math.imul(hash, 0x01000193);
245
+ }
246
+ return (hash >>> 0).toString(36);
247
+ }
248
+ /**
249
+ * Gives streamed ACP updates stable item ids and closes messages. Agents that
250
+ * stamp `messageId` (Claude does, identically live and on replay) get ids that
251
+ * match across session/load and transcripts. Messages without one get an id
252
+ * derived from their content, so a later replay maps to the same item.
253
+ */
254
+ export class AcpItemTracker {
255
+ open;
256
+ syntheticCounter = 0;
257
+ finishedTools = new Set();
258
+ /** How often each user text has been seen, so repeats ("yes", "continue") get distinct ids. */
259
+ userOccurrences = new Map();
260
+ feed(update) {
261
+ const out = [];
262
+ if (update.sessionUpdate === "agent_message_chunk" ||
263
+ update.sessionUpdate === "agent_thought_chunk" ||
264
+ update.sessionUpdate === "user_message_chunk") {
265
+ const kind = update.sessionUpdate === "agent_message_chunk" ? "agent" : update.sessionUpdate === "agent_thought_chunk" ? "thought" : "user";
266
+ let messageId = update.messageId || "";
267
+ const synthetic = !messageId;
268
+ if (synthetic) {
269
+ // Consecutive id-less chunks of one kind belong to the same message.
270
+ messageId =
271
+ this.open && this.open.kind === kind && this.open.synthetic ? this.open.messageId : `pending-${++this.syntheticCounter}`;
272
+ }
273
+ const parent = update.sessionUpdate === "user_message_chunk" ? undefined : update.parentToolCallId;
274
+ if (this.open && (this.open.kind !== kind || this.open.messageId !== messageId || this.open.parent !== parent))
275
+ out.push(...this.close());
276
+ if (!this.open)
277
+ this.open = { kind, messageId, synthetic, text: "", parent };
278
+ if (update.content.type === "text")
279
+ this.open.text += update.content.text;
280
+ out.push({ update: { ...update, messageId } });
281
+ return out;
282
+ }
283
+ // Any other update ends the message in progress.
284
+ out.push(...this.close());
285
+ if (update.sessionUpdate === "tool_call" || update.sessionUpdate === "tool_call_update") {
286
+ const terminal = update.status === "completed" || update.status === "failed";
287
+ const itemId = terminal && !this.finishedTools.has(update.toolCallId) ? `tool:${update.toolCallId}` : undefined;
288
+ if (itemId)
289
+ this.finishedTools.add(update.toolCallId);
290
+ out.push({ update, itemId });
291
+ return out;
292
+ }
293
+ out.push({ update });
294
+ return out;
295
+ }
296
+ /** Closes the open message (turn end, end of a history replay). */
297
+ close() {
298
+ const open = this.open;
299
+ this.open = undefined;
300
+ if (!open)
301
+ return [];
302
+ let itemKey = open.synthetic ? `h${contentHash(open.text)}` : open.messageId;
303
+ if (open.kind === "user") {
304
+ // Agents (Claude among them) mint their own id for a prompt and don't echo
305
+ // it live, so the id we see live never matches the one on replay. Key user
306
+ // messages by content and occurrence instead, which both sides agree on.
307
+ const hash = contentHash(open.text.replace(/\s+/g, " ").trim());
308
+ const occurrence = this.userOccurrences.get(hash) ?? 0;
309
+ this.userOccurrences.set(hash, occurrence + 1);
310
+ itemKey = `h${hash}#${occurrence}`;
311
+ }
312
+ return [
313
+ {
314
+ update: { sessionUpdate: "ls_message_done", messageId: open.messageId, role: open.kind, parentToolCallId: open.parent },
315
+ itemId: `${open.kind}:${itemKey}`,
316
+ },
317
+ ];
318
+ }
319
+ }
320
+ /**
321
+ * Groups a replay (session/load) into history items, keeping only complete
322
+ * items. Pass the session's tracker so live messages that follow continue the
323
+ * same numbering.
324
+ */
325
+ export function toHistory(updates, tracker = new AcpItemTracker(), timeOf) {
326
+ const tracked = [
327
+ ...updates.flatMap((update) => {
328
+ const ts = timeOf?.(update);
329
+ return tracker.feed(update).map((entry) => ({ ...entry, ts }));
330
+ }),
331
+ ...tracker.close().map((entry) => ({ ...entry, ts: undefined })),
332
+ ];
333
+ const history = [];
334
+ let group = [];
335
+ let groupTs;
336
+ const toolGroups = new Map();
337
+ for (const { update, itemId, ts } of tracked) {
338
+ if (update.sessionUpdate === "tool_call" || update.sessionUpdate === "tool_call_update") {
339
+ const entry = toolGroups.get(update.toolCallId) ?? { updates: [], ts };
340
+ entry.updates.push(update);
341
+ entry.ts ??= ts;
342
+ toolGroups.set(update.toolCallId, entry);
343
+ if (itemId) {
344
+ history.push({ itemId, updates: entry.updates, ts: entry.ts });
345
+ toolGroups.delete(update.toolCallId);
346
+ }
347
+ continue;
348
+ }
349
+ group.push(update);
350
+ groupTs ??= ts;
351
+ if (itemId) {
352
+ history.push({ itemId, updates: group, ts: groupTs });
353
+ group = [];
354
+ groupTs = undefined;
355
+ }
356
+ }
357
+ return history;
358
+ }
359
+ export function toAcpPrompt(content) {
360
+ return content.flatMap((block) => {
361
+ switch (block.type) {
362
+ case "text":
363
+ return [{ type: "text", text: block.text }];
364
+ case "image":
365
+ return block.data ? [{ type: "image", mimeType: block.mimeType, data: block.data, uri: block.uri }] : [];
366
+ case "resource_link":
367
+ return [{ type: "resource_link", uri: block.uri, name: block.name }];
368
+ default:
369
+ return [];
370
+ }
371
+ });
372
+ }
373
+ export function toStopReason(value) {
374
+ switch (value) {
375
+ case "cancelled":
376
+ case "refusal":
377
+ case "max_tokens":
378
+ return value;
379
+ case "max_turn_requests":
380
+ return "max_tokens";
381
+ default:
382
+ return "end_turn";
383
+ }
384
+ }
385
+ export function mapPermissionRequest(params, requestId) {
386
+ const payload = obj(params);
387
+ const toolCall = obj(payload?.toolCall);
388
+ const options = arr(payload?.options).flatMap((entry) => {
389
+ const option = obj(entry);
390
+ const kind = option?.kind;
391
+ if (!str(option?.optionId) || (kind !== "allow_once" && kind !== "allow_always" && kind !== "reject_once" && kind !== "reject_always")) {
392
+ return [];
393
+ }
394
+ return [{ optionId: str(option?.optionId), name: str(option?.name) ?? str(option?.optionId), kind }];
395
+ });
396
+ if (options.length === 0)
397
+ return undefined;
398
+ const rawInput = obj(toolCall?.rawInput);
399
+ const detail = str(rawInput?.command) ?? str(rawInput?.file_path) ?? str(rawInput?.path) ?? str(rawInput?.url);
400
+ return {
401
+ update: {
402
+ sessionUpdate: "ls_permission",
403
+ requestId,
404
+ toolCallId: str(toolCall?.toolCallId),
405
+ title: str(toolCall?.title) ?? "Permission required",
406
+ detail,
407
+ options,
408
+ },
409
+ };
410
+ }
411
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/acp/mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentAuth } from "@linkshell/wire";
2
+ /** Runs an agent's own status command; never reads credential stores itself. */
3
+ export declare function runStatusCommand(command: string, args: string[], env?: NodeJS.ProcessEnv): Promise<string | undefined>;
4
+ /** `claude auth status --json`. */
5
+ export declare function parseClaudeAuthStatus(output: string | undefined): AgentAuth;
6
+ /** `codex login status`. */
7
+ export declare function parseCodexLoginStatus(output: string | undefined): AgentAuth;
@@ -0,0 +1,57 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ /** Runs an agent's own status command; never reads credential stores itself. */
5
+ export async function runStatusCommand(command, args, env) {
6
+ try {
7
+ const { stdout, stderr } = await execFileAsync(command, args, { env, timeout: 15_000 });
8
+ return `${stdout}\n${stderr}`.trim();
9
+ }
10
+ catch (error) {
11
+ // Some CLIs exit non-zero when logged out but still print the status.
12
+ const output = error;
13
+ const text = `${output.stdout ?? ""}\n${output.stderr ?? ""}`.trim();
14
+ return text || undefined;
15
+ }
16
+ }
17
+ /** `claude auth status --json`. */
18
+ export function parseClaudeAuthStatus(output) {
19
+ if (!output)
20
+ return { state: "unknown" };
21
+ let parsed;
22
+ try {
23
+ parsed = JSON.parse(output.slice(output.indexOf("{"), output.lastIndexOf("}") + 1));
24
+ }
25
+ catch {
26
+ return { state: "unknown" };
27
+ }
28
+ if (parsed.loggedIn !== true) {
29
+ return {
30
+ state: "missing",
31
+ hint: "Claude 未登录:在电脑终端运行 claude /login,或设置 ANTHROPIC_API_KEY",
32
+ };
33
+ }
34
+ const provider = typeof parsed.apiProvider === "string" ? parsed.apiProvider : undefined;
35
+ const method = typeof parsed.authMethod === "string" ? parsed.authMethod : undefined;
36
+ return { state: "ok", method: provider && provider !== "firstParty" ? provider : method };
37
+ }
38
+ /** `codex login status`. */
39
+ export function parseCodexLoginStatus(output) {
40
+ if (!output)
41
+ return { state: "unknown" };
42
+ const text = output.toLowerCase();
43
+ if (text.includes("not logged in")) {
44
+ return { state: "missing", hint: "Codex 未登录:在电脑终端运行 codex login" };
45
+ }
46
+ if (text.includes("logged in")) {
47
+ if (text.includes("chatgpt"))
48
+ return { state: "ok", method: "chatgpt" };
49
+ if (text.includes("api key"))
50
+ return { state: "ok", method: "api_key" };
51
+ if (text.includes("access token"))
52
+ return { state: "ok", method: "access_token" };
53
+ return { state: "ok" };
54
+ }
55
+ return { state: "unknown" };
56
+ }
57
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../host/src/drivers/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { type ContentBlock, type SessionUpdate } from "@linkshell/wire";
2
+ import { AcpDriver } from "../acp/driver.js";
3
+ import type { AttachContext, DesktopLaunch, DesktopLaunchContext, DiscoveredSession, HistoryItem, LaunchSpec } from "../types.js";
4
+ /** Finds an executable on the given PATH (the adapter needs an absolute path). */
5
+ export declare function resolveExecutable(name: string, env: NodeJS.ProcessEnv): string | undefined;
6
+ export interface ClaudeDriverOptions {
7
+ env?: NodeJS.ProcessEnv;
8
+ hostVersion: string;
9
+ /** The user's Claude Code CLI; the TUI and the adapter both run this binary. */
10
+ claudeCommand?: string;
11
+ /** How to start the ACP adapter; defaults to the bundled claude-agent-acp. */
12
+ adapter?: {
13
+ command: string;
14
+ args: string[];
15
+ };
16
+ /** A transcript written within this window counts as "in use" by an unmanaged TUI. */
17
+ busyWindowMs?: number;
18
+ }
19
+ /**
20
+ * Claude Code, tier handoff. On the desktop the native TUI owns the session
21
+ * (`linkshell claude` runs it); a device can take over, and the session then
22
+ * continues headlessly through the ACP adapter under the same id. Claude has
23
+ * no write lock, so the host guarantees one writer at a time.
24
+ *
25
+ * History and desktop activity come from the transcript file; remote turns
26
+ * stream through ACP. Both carry the same message and tool ids.
27
+ */
28
+ export declare class ClaudeDriver extends AcpDriver {
29
+ private readonly modes;
30
+ private readonly tails;
31
+ private readonly claudeCommand;
32
+ private readonly configDir;
33
+ private readonly busyWindowMs;
34
+ private claudePath?;
35
+ constructor(options: ClaudeDriverOptions);
36
+ private readonly adapterMissing;
37
+ start(host: import("../types.js").DriverHost): Promise<import("../types.js").DriverStatus>;
38
+ stop(): Promise<void>;
39
+ attach(nativeId: string, context: AttachContext): Promise<HistoryItem[]>;
40
+ createSession(options: {
41
+ cwd: string;
42
+ model?: string;
43
+ }): Promise<DiscoveredSession>;
44
+ /** The `linkshell claude` terminal went away (the user quit the TUI). */
45
+ desktopDetached(nativeId: string): void;
46
+ detach(nativeId: string): Promise<void>;
47
+ prompt(nativeId: string, content: ContentBlock[], clientMessageId: string): Promise<"started" | "steered" | "queued">;
48
+ cancel(nativeId: string): Promise<void>;
49
+ setConfig(nativeId: string, optionId: string, value: string): Promise<void>;
50
+ takeover(nativeId: string): Promise<void>;
51
+ reclaim(nativeId: string, _context: DesktopLaunchContext): Promise<LaunchSpec>;
52
+ desktopLaunch(args: string[], nativeId: string | undefined, context: DesktopLaunchContext): Promise<DesktopLaunch>;
53
+ private launchSpec;
54
+ /** Pulls a session id out of `--resume <id>` / `-r <id>` / `--session-id <id>`. */
55
+ private parseSessionArgs;
56
+ private writer;
57
+ private setWriter;
58
+ private setMode;
59
+ private startTail;
60
+ /** Desktop activity: what the TUI (or a plain `claude`) writes to the transcript. */
61
+ private onTranscriptLine;
62
+ /** Makes this host the session's only writer, taking it from the desktop if needed. */
63
+ private ensureRemote;
64
+ /** Hands the session back: stop remote driving and resume following the transcript. */
65
+ private leaveRemote;
66
+ /**
67
+ * With no `linkshell claude` terminal to ask, make sure no other `claude` is
68
+ * writing the session before becoming a second writer. If this host or a
69
+ * managed terminal wrote it last, only a live process counts; otherwise a
70
+ * transcript written moments ago does too (a plain `claude` may be mid-turn).
71
+ */
72
+ private refuseIfTuiMayBeActive;
73
+ private tuiProcessHolds;
74
+ /** Mirrors remote progress to the terminal that stepped aside. */
75
+ protected emit(nativeId: string, update: SessionUpdate): void;
76
+ }