@linkshell/host 0.1.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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/host/src/drivers/acp/connection.d.ts +61 -0
  4. package/dist/host/src/drivers/acp/connection.js +121 -0
  5. package/dist/host/src/drivers/acp/connection.js.map +1 -0
  6. package/dist/host/src/drivers/acp/driver.d.ts +110 -0
  7. package/dist/host/src/drivers/acp/driver.js +438 -0
  8. package/dist/host/src/drivers/acp/driver.js.map +1 -0
  9. package/dist/host/src/drivers/acp/mapper.d.ts +49 -0
  10. package/dist/host/src/drivers/acp/mapper.js +411 -0
  11. package/dist/host/src/drivers/acp/mapper.js.map +1 -0
  12. package/dist/host/src/drivers/auth.d.ts +7 -0
  13. package/dist/host/src/drivers/auth.js +57 -0
  14. package/dist/host/src/drivers/auth.js.map +1 -0
  15. package/dist/host/src/drivers/claude/driver.d.ts +76 -0
  16. package/dist/host/src/drivers/claude/driver.js +331 -0
  17. package/dist/host/src/drivers/claude/driver.js.map +1 -0
  18. package/dist/host/src/drivers/claude/transcript.d.ts +335 -0
  19. package/dist/host/src/drivers/claude/transcript.js +516 -0
  20. package/dist/host/src/drivers/claude/transcript.js.map +1 -0
  21. package/dist/host/src/drivers/codex/app-server.d.ts +36 -0
  22. package/dist/host/src/drivers/codex/app-server.js +144 -0
  23. package/dist/host/src/drivers/codex/app-server.js.map +1 -0
  24. package/dist/host/src/drivers/codex/driver.d.ts +89 -0
  25. package/dist/host/src/drivers/codex/driver.js +452 -0
  26. package/dist/host/src/drivers/codex/driver.js.map +1 -0
  27. package/dist/host/src/drivers/codex/mapper.d.ts +61 -0
  28. package/dist/host/src/drivers/codex/mapper.js +623 -0
  29. package/dist/host/src/drivers/codex/mapper.js.map +1 -0
  30. package/dist/host/src/drivers/codex/settings.d.ts +51 -0
  31. package/dist/host/src/drivers/codex/settings.js +107 -0
  32. package/dist/host/src/drivers/codex/settings.js.map +1 -0
  33. package/dist/host/src/drivers/images.d.ts +11 -0
  34. package/dist/host/src/drivers/images.js +34 -0
  35. package/dist/host/src/drivers/images.js.map +1 -0
  36. package/dist/host/src/drivers/nesting.d.ts +6 -0
  37. package/dist/host/src/drivers/nesting.js +25 -0
  38. package/dist/host/src/drivers/nesting.js.map +1 -0
  39. package/dist/host/src/drivers/registry.d.ts +21 -0
  40. package/dist/host/src/drivers/registry.js +30 -0
  41. package/dist/host/src/drivers/registry.js.map +1 -0
  42. package/dist/host/src/drivers/types.d.ts +105 -0
  43. package/dist/host/src/drivers/types.js +2 -0
  44. package/dist/host/src/drivers/types.js.map +1 -0
  45. package/dist/host/src/fs.d.ts +69 -0
  46. package/dist/host/src/fs.js +198 -0
  47. package/dist/host/src/fs.js.map +1 -0
  48. package/dist/host/src/gateway.d.ts +55 -0
  49. package/dist/host/src/gateway.js +263 -0
  50. package/dist/host/src/gateway.js.map +1 -0
  51. package/dist/host/src/host.d.ts +51 -0
  52. package/dist/host/src/host.js +133 -0
  53. package/dist/host/src/host.js.map +1 -0
  54. package/dist/host/src/hub.d.ts +89 -0
  55. package/dist/host/src/hub.js +592 -0
  56. package/dist/host/src/hub.js.map +1 -0
  57. package/dist/host/src/index.d.ts +10 -0
  58. package/dist/host/src/index.js +10 -0
  59. package/dist/host/src/index.js.map +1 -0
  60. package/dist/host/src/ports.d.ts +24 -0
  61. package/dist/host/src/ports.js +201 -0
  62. package/dist/host/src/ports.js.map +1 -0
  63. package/dist/host/src/rpc/client.d.ts +9 -0
  64. package/dist/host/src/rpc/client.js +42 -0
  65. package/dist/host/src/rpc/client.js.map +1 -0
  66. package/dist/host/src/rpc/server.d.ts +52 -0
  67. package/dist/host/src/rpc/server.js +293 -0
  68. package/dist/host/src/rpc/server.js.map +1 -0
  69. package/dist/host/src/screen.d.ts +30 -0
  70. package/dist/host/src/screen.js +230 -0
  71. package/dist/host/src/screen.js.map +1 -0
  72. package/dist/host/src/shell-env.d.ts +8 -0
  73. package/dist/host/src/shell-env.js +39 -0
  74. package/dist/host/src/shell-env.js.map +1 -0
  75. package/dist/host/src/store.d.ts +75 -0
  76. package/dist/host/src/store.js +265 -0
  77. package/dist/host/src/store.js.map +1 -0
  78. package/dist/host/src/terminals.d.ts +55 -0
  79. package/dist/host/src/terminals.js +367 -0
  80. package/dist/host/src/terminals.js.map +1 -0
  81. package/dist/host/tsconfig.tsbuildinfo +1 -0
  82. package/dist/wire/src/crypto.d.ts +65 -0
  83. package/dist/wire/src/crypto.js +253 -0
  84. package/dist/wire/src/crypto.js.map +1 -0
  85. package/dist/wire/src/index.d.ts +8 -0
  86. package/dist/wire/src/index.js +9 -0
  87. package/dist/wire/src/index.js.map +1 -0
  88. package/dist/wire/src/model.d.ts +704 -0
  89. package/dist/wire/src/model.js +163 -0
  90. package/dist/wire/src/model.js.map +1 -0
  91. package/dist/wire/src/peer.d.ts +42 -0
  92. package/dist/wire/src/peer.js +143 -0
  93. package/dist/wire/src/peer.js.map +1 -0
  94. package/dist/wire/src/relay-client.d.ts +82 -0
  95. package/dist/wire/src/relay-client.js +259 -0
  96. package/dist/wire/src/relay-client.js.map +1 -0
  97. package/dist/wire/src/relay.d.ts +481 -0
  98. package/dist/wire/src/relay.js +129 -0
  99. package/dist/wire/src/relay.js.map +1 -0
  100. package/dist/wire/src/rpc.d.ts +4170 -0
  101. package/dist/wire/src/rpc.js +332 -0
  102. package/dist/wire/src/rpc.js.map +1 -0
  103. package/dist/wire/src/shell.d.ts +2 -0
  104. package/dist/wire/src/shell.js +62 -0
  105. package/dist/wire/src/shell.js.map +1 -0
  106. package/dist/wire/src/updates.d.ts +3325 -0
  107. package/dist/wire/src/updates.js +210 -0
  108. package/dist/wire/src/updates.js.map +1 -0
  109. package/package.json +53 -0
@@ -0,0 +1,516 @@
1
+ import { closeSync, existsSync, openSync, readdirSync, readFileSync, readSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { basename, join } from "node:path";
4
+ import { inlineImage } from "../images.js";
5
+ import { nestUnder } from "../nesting.js";
6
+ const str = (value) => (typeof value === "string" ? value : undefined);
7
+ const obj = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
8
+ export function claudeConfigDir(env = process.env) {
9
+ return env.CLAUDE_CONFIG_DIR || join(homedir(), ".claude");
10
+ }
11
+ /** Claude's project directory name for a cwd: every non-alphanumeric character becomes "-". */
12
+ export function encodeProjectDir(cwd) {
13
+ return cwd.replace(/[^a-zA-Z0-9]/g, "-");
14
+ }
15
+ export function findTranscript(configDir, sessionId, cwd) {
16
+ const projects = join(configDir, "projects");
17
+ if (cwd) {
18
+ const direct = join(projects, encodeProjectDir(cwd), `${sessionId}.jsonl`);
19
+ if (existsSync(direct))
20
+ return direct;
21
+ }
22
+ let dirs;
23
+ try {
24
+ dirs = readdirSync(projects);
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ for (const dir of dirs) {
30
+ const candidate = join(projects, dir, `${sessionId}.jsonl`);
31
+ if (existsSync(candidate))
32
+ return candidate;
33
+ }
34
+ return undefined;
35
+ }
36
+ const FILE_TOOLS = new Set(["Read", "Write", "Edit", "MultiEdit", "NotebookEdit", "NotebookRead"]);
37
+ function fileName(path) {
38
+ return path ? basename(path) : "file";
39
+ }
40
+ /** A readable title and kind for a Claude Code tool call. */
41
+ export function describeClaudeTool(name, input) {
42
+ const path = str(input.file_path) ?? str(input.notebook_path) ?? str(input.path);
43
+ switch (name) {
44
+ case "Read":
45
+ case "NotebookRead":
46
+ return { title: `Read ${fileName(path)}`, kind: "read" };
47
+ case "Write":
48
+ return { title: `Write ${fileName(path)}`, kind: "edit" };
49
+ case "Edit":
50
+ case "MultiEdit":
51
+ case "NotebookEdit":
52
+ return { title: `Edit ${fileName(path)}`, kind: "edit" };
53
+ case "Bash":
54
+ return { title: str(input.description) ?? str(input.command) ?? "Run command", kind: "execute" };
55
+ case "Grep":
56
+ return { title: `Search “${str(input.pattern) ?? ""}”${path ? ` in ${fileName(path)}` : ""}`, kind: "search" };
57
+ case "Glob":
58
+ return { title: `Find ${str(input.pattern) ?? "files"}`, kind: "search" };
59
+ case "WebFetch":
60
+ return { title: `Fetch ${str(input.url) ?? ""}`.trim(), kind: "fetch" };
61
+ case "WebSearch":
62
+ return { title: `Search web: ${str(input.query) ?? ""}`.trim(), kind: "fetch", detail: { type: "web_search", query: str(input.query) } };
63
+ case "Task":
64
+ case "Agent":
65
+ return {
66
+ title: `Agent: ${str(input.description) ?? str(input.subagent_type) ?? "task"}`,
67
+ kind: "other",
68
+ detail: {
69
+ type: "subagent",
70
+ action: "spawn",
71
+ task: str(input.description) ?? str(input.prompt),
72
+ agentType: str(input.subagent_type),
73
+ model: str(input.model),
74
+ },
75
+ };
76
+ case "SendMessage":
77
+ return {
78
+ title: `Message ${str(input.to) ?? "agent"}`,
79
+ kind: "other",
80
+ detail: { type: "subagent", action: "message", task: str(input.summary) ?? str(input.message) },
81
+ };
82
+ case "TaskStop":
83
+ case "KillShell":
84
+ return { title: name === "TaskStop" ? "Stop agent" : "Stop shell", kind: "other", detail: name === "TaskStop" ? { type: "subagent", action: "stop" } : undefined };
85
+ case "Skill": {
86
+ const skill = str(input.skill) ?? str(input.command) ?? "skill";
87
+ return { title: `Skill: ${skill}`, kind: "other", detail: { type: "skill", name: skill.replace(/^\//, "") } };
88
+ }
89
+ default: {
90
+ // MCP tools are named mcp__<server>__<tool>.
91
+ const mcp = /^mcp__(.+?)__(.+)$/.exec(name);
92
+ if (mcp)
93
+ return { title: `${mcp[1]} · ${mcp[2]}`, kind: "other", detail: { type: "mcp", server: mcp[1], tool: mcp[2] } };
94
+ return { title: name, kind: FILE_TOOLS.has(name) ? "edit" : "other" };
95
+ }
96
+ }
97
+ }
98
+ function toolContent(name, input) {
99
+ const path = str(input.file_path);
100
+ if (!path)
101
+ return undefined;
102
+ if (name === "Write" && typeof input.content === "string") {
103
+ return [{ type: "diff", path, oldText: null, newText: input.content }];
104
+ }
105
+ if (name === "Edit" && typeof input.new_string === "string") {
106
+ return [{ type: "diff", path, oldText: str(input.old_string) ?? null, newText: input.new_string }];
107
+ }
108
+ if (name === "MultiEdit" && Array.isArray(input.edits)) {
109
+ return input.edits.flatMap((raw) => {
110
+ const edit = obj(raw);
111
+ return typeof edit?.new_string === "string" ? [{ type: "diff", path, oldText: str(edit.old_string) ?? null, newText: edit.new_string }] : [];
112
+ });
113
+ }
114
+ return undefined;
115
+ }
116
+ function todoPlan(input) {
117
+ if (!Array.isArray(input.todos))
118
+ return undefined;
119
+ return input.todos.flatMap((raw) => {
120
+ const todo = obj(raw);
121
+ const content = str(todo?.content);
122
+ if (!content)
123
+ return [];
124
+ const status = todo?.status === "completed" || todo?.status === "in_progress" ? todo.status : "pending";
125
+ return [{ content, status, priority: "medium" }];
126
+ });
127
+ }
128
+ /** Images in a tool result (screenshots, image files the agent read). */
129
+ function resultImages(content) {
130
+ if (!Array.isArray(content))
131
+ return [];
132
+ return content.flatMap((raw) => {
133
+ const block = obj(raw);
134
+ if (block?.type !== "image")
135
+ return [];
136
+ const source = obj(block.source);
137
+ const image = inlineImage(str(source?.data), str(source?.media_type));
138
+ return image ? [{ type: "content", content: image }] : [];
139
+ });
140
+ }
141
+ function resultText(content) {
142
+ if (typeof content === "string")
143
+ return content;
144
+ if (!Array.isArray(content))
145
+ return undefined;
146
+ const text = content
147
+ .map((block) => (obj(block)?.type === "text" ? str(obj(block)?.text) ?? "" : ""))
148
+ .filter(Boolean)
149
+ .join("\n");
150
+ return text || undefined;
151
+ }
152
+ /**
153
+ * A slash command the user typed (`/review`, a skill, a plugin command): Claude
154
+ * records it as tagged text. Returns it as the user wrote it.
155
+ */
156
+ function slashCommand(text) {
157
+ const name = /<command-name>\s*([^<]+?)\s*<\/command-name>/.exec(text)?.[1];
158
+ if (!name)
159
+ return undefined;
160
+ const args = /<command-args>([\s\S]*?)<\/command-args>/.exec(text)?.[1]?.trim();
161
+ const command = name.startsWith("/") ? name : `/${name}`;
162
+ return args ? `${command} ${args}` : command;
163
+ }
164
+ /**
165
+ * Claude tells itself a background task (a sub-agent, a background shell)
166
+ * finished by injecting `<task-notification>` as a user message. It's the
167
+ * task's status, not something the user said.
168
+ */
169
+ function taskNotification(text) {
170
+ if (!text.trimStart().startsWith("<task-notification>"))
171
+ return undefined;
172
+ const toolCallId = /<tool-use-id>\s*([^<\s]+)\s*<\/tool-use-id>/.exec(text)?.[1];
173
+ if (!toolCallId)
174
+ return undefined;
175
+ const status = /<status>\s*([^<\s]+)\s*<\/status>/.exec(text)?.[1];
176
+ return { sessionUpdate: "tool_call_update", toolCallId, status: status === "completed" ? "completed" : "failed" };
177
+ }
178
+ /** Slash-command plumbing and interruption markers that aren't real user messages. */
179
+ function isNoise(text) {
180
+ const trimmed = text.trimStart();
181
+ return (trimmed.startsWith("<command-") ||
182
+ trimmed.startsWith("<local-command-") ||
183
+ trimmed.startsWith("<task-notification>") ||
184
+ trimmed.startsWith("<system-reminder>") ||
185
+ trimmed.startsWith("[Request interrupted by user"));
186
+ }
187
+ /**
188
+ * A message the user typed while Claude was working. Claude folds it into the
189
+ * running turn and records it as a `queued_command` attachment rather than a
190
+ * user line; it's still something the user said.
191
+ */
192
+ function queuedPrompt(line) {
193
+ const attachment = obj(line.attachment);
194
+ if (attachment?.type !== "queued_command" || line.isSidechain === true)
195
+ return { updates: [] };
196
+ if (attachment.commandMode !== undefined && attachment.commandMode !== "prompt")
197
+ return { updates: [] };
198
+ if (obj(attachment.origin)?.kind !== undefined && obj(attachment.origin)?.kind !== "human")
199
+ return { updates: [] };
200
+ const stamp = str(line.timestamp) ? Date.parse(str(line.timestamp)) : Number.NaN;
201
+ const ts = Number.isFinite(stamp) ? stamp : undefined;
202
+ const messageId = str(attachment.source_uuid) ?? str(line.uuid);
203
+ const prompt = attachment.prompt;
204
+ const blocks = [];
205
+ if (typeof prompt === "string") {
206
+ if (prompt.trim())
207
+ blocks.push({ type: "text", text: prompt });
208
+ }
209
+ else if (Array.isArray(prompt)) {
210
+ for (const raw of prompt) {
211
+ const block = obj(raw);
212
+ if (block?.type === "text" && str(block.text))
213
+ blocks.push({ type: "text", text: str(block.text) });
214
+ if (block?.type === "image") {
215
+ const source = obj(block.source);
216
+ const image = inlineImage(str(source?.data), str(source?.media_type));
217
+ if (image)
218
+ blocks.push(image);
219
+ }
220
+ }
221
+ }
222
+ return { updates: blocks.map((content) => ({ sessionUpdate: "user_message_chunk", messageId, content })), ts };
223
+ }
224
+ /** Converts one transcript line to wire updates. Sub-agent files pass `sidechain`. */
225
+ export function transcriptLine(raw, options = {}) {
226
+ let line;
227
+ try {
228
+ line = JSON.parse(raw);
229
+ }
230
+ catch {
231
+ return { updates: [] };
232
+ }
233
+ switch (line.type) {
234
+ case "custom-title":
235
+ return { updates: [], title: str(line.customTitle) };
236
+ case "ai-title":
237
+ return { updates: [], title: str(line.aiTitle) };
238
+ case "user":
239
+ case "assistant":
240
+ break;
241
+ case "attachment":
242
+ return queuedPrompt(line);
243
+ default:
244
+ return { updates: [] };
245
+ }
246
+ if ((line.isSidechain === true && !options.sidechain) || line.isMeta === true)
247
+ return { updates: [] };
248
+ const stamp = str(line.timestamp) ? Date.parse(str(line.timestamp)) : Number.NaN;
249
+ const ts = Number.isFinite(stamp) ? stamp : undefined;
250
+ const message = obj(line.message);
251
+ if (!message)
252
+ return { updates: [] };
253
+ const updates = [];
254
+ if (line.type === "user") {
255
+ const uuid = str(line.uuid);
256
+ const blocks = typeof message.content === "string" ? [{ type: "text", text: message.content }] : Array.isArray(message.content) ? message.content : [];
257
+ let userText = false;
258
+ for (const rawBlock of blocks) {
259
+ const block = obj(rawBlock);
260
+ if (!block)
261
+ continue;
262
+ if (block.type === "text" && typeof block.text === "string") {
263
+ const notification = taskNotification(block.text);
264
+ if (notification) {
265
+ updates.push(notification);
266
+ // Claude answers the notification in a turn of its own.
267
+ userText = true;
268
+ continue;
269
+ }
270
+ const command = slashCommand(block.text);
271
+ if (command) {
272
+ updates.push({ sessionUpdate: "user_message_chunk", messageId: uuid, content: { type: "text", text: command } });
273
+ userText = true;
274
+ continue;
275
+ }
276
+ if (isNoise(block.text))
277
+ continue;
278
+ updates.push({ sessionUpdate: "user_message_chunk", messageId: uuid, content: { type: "text", text: block.text } });
279
+ userText = true;
280
+ }
281
+ else if (block.type === "image") {
282
+ const source = obj(block.source);
283
+ const content = inlineImage(str(source?.data), str(source?.media_type)) ?? { type: "image", mimeType: str(source?.media_type) ?? "image/*" };
284
+ updates.push({ sessionUpdate: "user_message_chunk", messageId: uuid, content });
285
+ userText = true;
286
+ }
287
+ else if (block.type === "tool_result" && str(block.tool_use_id)) {
288
+ const text = resultText(block.content);
289
+ const content = [...(text ? [{ type: "content", content: { type: "text", text } }] : []), ...resultImages(block.content)];
290
+ updates.push({
291
+ sessionUpdate: "tool_call_update",
292
+ toolCallId: str(block.tool_use_id),
293
+ status: block.is_error === true ? "failed" : "completed",
294
+ content: content.length > 0 ? content : undefined,
295
+ });
296
+ }
297
+ }
298
+ // A real prompt starts a turn; tool results continue one.
299
+ if (userText)
300
+ updates.push({ sessionUpdate: "ls_turn", state: "started" });
301
+ return { updates, ts };
302
+ }
303
+ const messageId = str(message.id) ?? str(line.uuid) ?? "";
304
+ for (const rawBlock of Array.isArray(message.content) ? message.content : []) {
305
+ const block = obj(rawBlock);
306
+ if (!block)
307
+ continue;
308
+ if (block.type === "thinking" && typeof block.thinking === "string" && block.thinking) {
309
+ updates.push({ sessionUpdate: "agent_thought_chunk", messageId, content: { type: "text", text: block.thinking } });
310
+ }
311
+ else if (block.type === "text" && typeof block.text === "string" && block.text) {
312
+ updates.push({ sessionUpdate: "agent_message_chunk", messageId, content: { type: "text", text: block.text } });
313
+ }
314
+ else if (block.type === "tool_use" && str(block.id) && str(block.name)) {
315
+ const input = obj(block.input) ?? {};
316
+ if (block.name === "TodoWrite") {
317
+ const entries = todoPlan(input);
318
+ if (entries)
319
+ updates.push({ sessionUpdate: "plan", entries });
320
+ // Keep the id so the tool_result that follows closes cleanly.
321
+ }
322
+ const { title, kind, detail } = describeClaudeTool(str(block.name), input);
323
+ updates.push({
324
+ sessionUpdate: "tool_call",
325
+ toolCallId: str(block.id),
326
+ title,
327
+ kind,
328
+ detail,
329
+ status: "in_progress",
330
+ rawInput: input,
331
+ content: toolContent(str(block.name), input),
332
+ });
333
+ }
334
+ }
335
+ if (message.stop_reason === "end_turn")
336
+ updates.push({ sessionUpdate: "ls_turn", state: "ended", stopReason: "end_turn" });
337
+ return { updates, ts };
338
+ }
339
+ /** Parses a whole transcript file. */
340
+ /** When each transcript update happened, for history import. */
341
+ export const transcriptTimes = new WeakMap();
342
+ /**
343
+ * Claude Code keeps each sub-agent's transcript next to the session:
344
+ * `<session>/subagents/agent-<id>.jsonl`, with `agent-<id>.meta.json` naming
345
+ * the Agent/Task tool call that spawned it. Returns the sub-agents' work as
346
+ * updates nested under those calls (their prompt is the call's own input).
347
+ */
348
+ export function readSubagents(transcriptPath) {
349
+ const dir = join(transcriptPath.replace(/\.jsonl$/, ""), "subagents");
350
+ if (!existsSync(dir))
351
+ return [];
352
+ const updates = [];
353
+ for (const file of readdirSync(dir)) {
354
+ if (!file.endsWith(".meta.json"))
355
+ continue;
356
+ let parent;
357
+ try {
358
+ parent = str(obj(JSON.parse(readFileSync(join(dir, file), "utf8")))?.toolUseId);
359
+ }
360
+ catch {
361
+ continue;
362
+ }
363
+ const transcript = join(dir, file.replace(/\.meta\.json$/, ".jsonl"));
364
+ if (!parent || !existsSync(transcript))
365
+ continue;
366
+ for (const raw of readFileSync(transcript, "utf8").split("\n")) {
367
+ if (!raw.trim())
368
+ continue;
369
+ const result = transcriptLine(raw, { sidechain: true });
370
+ for (const update of result.updates) {
371
+ const nested = nestUnder(update, parent);
372
+ if (!nested)
373
+ continue;
374
+ if (result.ts !== undefined)
375
+ transcriptTimes.set(nested, result.ts);
376
+ updates.push(nested);
377
+ }
378
+ }
379
+ }
380
+ // Parallel sub-agents: one timeline, in time order (sort is stable within each).
381
+ return updates.sort((a, b) => (transcriptTimes.get(a) ?? 0) - (transcriptTimes.get(b) ?? 0));
382
+ }
383
+ /** Interleaves sub-agent updates into the session's by time, keeping each list's order. */
384
+ export function mergeByTime(main, nested) {
385
+ if (nested.length === 0)
386
+ return main;
387
+ const out = [];
388
+ let j = 0;
389
+ let lastMain = Number.NEGATIVE_INFINITY;
390
+ for (const update of main) {
391
+ const ts = transcriptTimes.get(update) ?? lastMain;
392
+ while (j < nested.length && (transcriptTimes.get(nested[j]) ?? Number.POSITIVE_INFINITY) < ts)
393
+ out.push(nested[j++]);
394
+ out.push(update);
395
+ lastMain = ts;
396
+ }
397
+ while (j < nested.length)
398
+ out.push(nested[j++]);
399
+ return out;
400
+ }
401
+ export function readTranscript(path) {
402
+ const size = statSync(path).size;
403
+ const text = readRange(path, 0, size);
404
+ const complete = text.slice(0, text.lastIndexOf("\n") + 1);
405
+ let title;
406
+ const updates = [];
407
+ for (const raw of complete.split("\n")) {
408
+ if (!raw.trim())
409
+ continue;
410
+ const result = transcriptLine(raw);
411
+ if (result.ts !== undefined)
412
+ for (const update of result.updates)
413
+ transcriptTimes.set(update, result.ts);
414
+ updates.push(...result.updates);
415
+ if (result.title)
416
+ title = result.title;
417
+ }
418
+ return { updates: mergeByTime(updates, readSubagents(path)), title, size: Buffer.byteLength(complete) };
419
+ }
420
+ function readRange(path, start, end) {
421
+ if (end <= start)
422
+ return "";
423
+ const fd = openSync(path, "r");
424
+ try {
425
+ const buffer = Buffer.alloc(end - start);
426
+ let read = 0;
427
+ while (read < buffer.length) {
428
+ const n = readSync(fd, buffer, read, buffer.length - read, start + read);
429
+ if (n === 0)
430
+ break;
431
+ read += n;
432
+ }
433
+ return buffer.subarray(0, read).toString("utf8");
434
+ }
435
+ finally {
436
+ closeSync(fd);
437
+ }
438
+ }
439
+ /**
440
+ * Follows a transcript from a byte offset by polling (Claude only appends).
441
+ * `locate` is retried until the file exists, for sessions with no messages yet.
442
+ */
443
+ export class TranscriptTail {
444
+ options;
445
+ offset;
446
+ carry = "";
447
+ timer;
448
+ paused = false;
449
+ path;
450
+ constructor(options) {
451
+ this.options = options;
452
+ this.offset = options.offset;
453
+ }
454
+ start() {
455
+ if (this.timer)
456
+ return;
457
+ this.timer = setInterval(() => this.poll(), this.options.pollMs ?? 400);
458
+ this.timer.unref?.();
459
+ }
460
+ stop() {
461
+ if (this.timer)
462
+ clearInterval(this.timer);
463
+ this.timer = undefined;
464
+ }
465
+ /** Stops emitting (the remote driver is writing); `resumeAtEnd` skips what was written meanwhile. */
466
+ pause() {
467
+ this.poll();
468
+ this.paused = true;
469
+ }
470
+ resumeAtEnd() {
471
+ const path = this.resolve();
472
+ this.offset = path ? statSync(path).size : this.offset;
473
+ this.carry = "";
474
+ this.paused = false;
475
+ }
476
+ /** Reads whatever is new right now. */
477
+ poll() {
478
+ if (this.paused)
479
+ return;
480
+ const path = this.resolve();
481
+ if (!path)
482
+ return;
483
+ let size;
484
+ try {
485
+ size = statSync(path).size;
486
+ }
487
+ catch {
488
+ return;
489
+ }
490
+ if (size < this.offset) {
491
+ // Rewritten (rare): start over.
492
+ this.offset = 0;
493
+ this.carry = "";
494
+ }
495
+ if (size === this.offset)
496
+ return;
497
+ const chunk = this.carry + readRange(path, this.offset, size);
498
+ this.offset = size;
499
+ const end = chunk.lastIndexOf("\n");
500
+ if (end < 0) {
501
+ this.carry = chunk;
502
+ return;
503
+ }
504
+ this.carry = chunk.slice(end + 1);
505
+ for (const line of chunk.slice(0, end).split("\n")) {
506
+ if (line.trim())
507
+ this.options.onLine(line);
508
+ }
509
+ }
510
+ resolve() {
511
+ if (!this.path)
512
+ this.path = this.options.locate();
513
+ return this.path;
514
+ }
515
+ }
516
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../../../src/drivers/claude/transcript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type RpcId } from "@linkshell/wire";
2
+ export interface CodexAppServerOptions {
3
+ /** Unix socket path; must stay under the ~104-byte sun_path limit. */
4
+ socketPath: string;
5
+ command?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ clientVersion: string;
8
+ log: (message: string) => void;
9
+ onNotification: (method: string, params: unknown) => void;
10
+ /** Server → client requests (approvals). Return ABANDON to leave one to other clients. */
11
+ onRequest: (method: string, params: unknown, id: RpcId) => unknown;
12
+ /** Called when the app-server process or its socket goes away unexpectedly. */
13
+ onDown: (reason: string) => void;
14
+ }
15
+ export declare function detectCodex(command?: string, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
16
+ /**
17
+ * Owns one `codex app-server --listen unix://…` process and a client connection
18
+ * to it. The same socket is what `codex --remote` attaches the desktop TUI to,
19
+ * so the TUI and LinkShell are peers on the same threads.
20
+ *
21
+ * The socket speaks WebSocket; permessage-deflate must be off or the upgrade is reset.
22
+ */
23
+ export declare class CodexAppServer {
24
+ private readonly options;
25
+ private child?;
26
+ private socket?;
27
+ private peer?;
28
+ private stopping;
29
+ constructor(options: CodexAppServerOptions);
30
+ get socketPath(): string;
31
+ start(): Promise<void>;
32
+ stop(): Promise<void>;
33
+ request<T>(method: string, params: unknown, timeoutMs?: number): Promise<T>;
34
+ private connectWhenReady;
35
+ private connect;
36
+ }