linkshell-cli 0.10.4 → 0.10.6

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 (71) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/src/commands/doctor.js +1 -1
  3. package/dist/cli/src/commands/doctor.js.map +1 -1
  4. package/dist/cli/src/commands/gateway.js +7 -1
  5. package/dist/cli/src/commands/gateway.js.map +1 -1
  6. package/dist/cli/src/commands/host.js +2 -2
  7. package/dist/cli/src/commands/host.js.map +1 -1
  8. package/dist/cli/src/commands/login.js +4 -1
  9. package/dist/cli/src/commands/login.js.map +1 -1
  10. package/dist/cli/src/commands/pair.d.ts +5 -0
  11. package/dist/cli/src/commands/pair.js +22 -12
  12. package/dist/cli/src/commands/pair.js.map +1 -1
  13. package/dist/cli/src/utils/daemon.d.ts +5 -0
  14. package/dist/cli/src/utils/daemon.js +16 -1
  15. package/dist/cli/src/utils/daemon.js.map +1 -1
  16. package/dist/cli/tsconfig.tsbuildinfo +1 -1
  17. package/dist/gateway/src/main.js +1 -1
  18. package/dist/gateway/src/main.js.map +1 -1
  19. package/dist/gateway/src/rate-limit.d.ts +16 -4
  20. package/dist/gateway/src/rate-limit.js +52 -12
  21. package/dist/gateway/src/rate-limit.js.map +1 -1
  22. package/dist/gateway/src/serve.js +15 -1
  23. package/dist/gateway/src/serve.js.map +1 -1
  24. package/dist/gateway/src/subscription.js +1 -1
  25. package/dist/gateway/src/subscription.js.map +1 -1
  26. package/dist/host/src/drivers/acp/driver.js +1 -1
  27. package/dist/host/src/drivers/acp/driver.js.map +1 -1
  28. package/dist/host/src/drivers/acp/mapper.js +5 -2
  29. package/dist/host/src/drivers/acp/mapper.js.map +1 -1
  30. package/dist/host/src/drivers/claude/activity.d.ts +40 -0
  31. package/dist/host/src/drivers/claude/activity.js +425 -0
  32. package/dist/host/src/drivers/claude/activity.js.map +1 -0
  33. package/dist/host/src/drivers/claude/driver.d.ts +2 -0
  34. package/dist/host/src/drivers/claude/driver.js +54 -5
  35. package/dist/host/src/drivers/claude/driver.js.map +1 -1
  36. package/dist/host/src/drivers/claude/transcript.d.ts +78 -13
  37. package/dist/host/src/drivers/claude/transcript.js +11 -3
  38. package/dist/host/src/drivers/claude/transcript.js.map +1 -1
  39. package/dist/host/src/drivers/codex/driver.js +1 -1
  40. package/dist/host/src/drivers/codex/driver.js.map +1 -1
  41. package/dist/host/src/hub.js +16 -6
  42. package/dist/host/src/hub.js.map +1 -1
  43. package/dist/host/src/input.js +0 -2
  44. package/dist/host/src/input.js.map +1 -1
  45. package/dist/host/src/rpc/server.d.ts +11 -0
  46. package/dist/host/src/rpc/server.js +37 -3
  47. package/dist/host/src/rpc/server.js.map +1 -1
  48. package/dist/host/src/store.d.ts +3 -0
  49. package/dist/host/src/store.js +14 -5
  50. package/dist/host/src/store.js.map +1 -1
  51. package/dist/wire/src/index.d.ts +1 -0
  52. package/dist/wire/src/index.js +1 -0
  53. package/dist/wire/src/index.js.map +1 -1
  54. package/dist/wire/src/model.d.ts +222 -30
  55. package/dist/wire/src/model.js +6 -0
  56. package/dist/wire/src/model.js.map +1 -1
  57. package/dist/wire/src/relay.d.ts +2 -2
  58. package/dist/wire/src/rpc.d.ts +2744 -385
  59. package/dist/wire/src/updates.d.ts +1405 -98
  60. package/dist/wire/src/updates.js +5 -0
  61. package/dist/wire/src/updates.js.map +1 -1
  62. package/dist/wire/src/workflow.d.ts +187 -0
  63. package/dist/wire/src/workflow.js +35 -0
  64. package/dist/wire/src/workflow.js.map +1 -0
  65. package/package.json +4 -4
  66. package/src/commands/doctor.ts +1 -0
  67. package/src/commands/gateway.ts +7 -1
  68. package/src/commands/host.ts +2 -2
  69. package/src/commands/login.ts +4 -1
  70. package/src/commands/pair.ts +23 -12
  71. package/src/utils/daemon.ts +16 -1
@@ -0,0 +1,425 @@
1
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
2
+ import { basename, join, relative, sep } from "node:path";
3
+ import { nestUnder } from "../nesting.js";
4
+ import { transcriptLine, TranscriptTail } from "./transcript.js";
5
+ const object = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
6
+ const string = (value) => typeof value === "string" ? value : undefined;
7
+ const number = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
8
+ const safeId = (value) => typeof value === "string" && /^[a-zA-Z0-9_-]+$/.test(value);
9
+ const json = (text) => { try {
10
+ return object(JSON.parse(text));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ } };
15
+ const timestamp = (value) => typeof value === "number" ? value : typeof value === "string" ? Date.parse(value) || undefined : undefined;
16
+ /**
17
+ * Follows Claude's on-disk child transcripts even while the main transcript is
18
+ * quiet. WorkflowOutput is the SDK contract; the journal and final artifact
19
+ * are isolated here because they are Claude Code implementation details.
20
+ * See docs/v2/claude-activity.md for the upstream formats and evidence.
21
+ */
22
+ export class ClaudeActivity {
23
+ options;
24
+ workflows = new Map();
25
+ launches = new Map();
26
+ children = new Map();
27
+ seen = new Set();
28
+ observer;
29
+ timer;
30
+ constructor(options) {
31
+ this.options = options;
32
+ }
33
+ /** Called during history import, then by an independent cursor in every mode. */
34
+ observe(raw) {
35
+ const line = json(raw);
36
+ if (!line || line.isSidechain === true)
37
+ return;
38
+ const uuid = string(line.uuid);
39
+ if (uuid && this.seen.has(uuid))
40
+ return;
41
+ if (uuid)
42
+ this.seen.add(uuid);
43
+ const result = object(line.toolUseResult ?? line.tool_use_result);
44
+ const content = object(line.message)?.content;
45
+ for (const block of Array.isArray(content) ? content : []) {
46
+ const tool = object(block);
47
+ if (tool?.type !== "tool_use" || tool.name !== "Workflow" || !string(tool.id))
48
+ continue;
49
+ const input = object(tool.input);
50
+ this.launches.set(String(tool.id), { name: string(input?.name), task: string(input?.description), ts: timestamp(line.timestamp) });
51
+ }
52
+ if (result && !result.error && string(result.taskId) && (result.status === "async_launched" || result.status === "remote_launched")) {
53
+ const blocks = Array.isArray(content) ? content : [];
54
+ const block = blocks.map(object).find((entry) => entry?.type === "tool_result" && !entry.is_error && string(entry.tool_use_id));
55
+ const call = string(block?.tool_use_id);
56
+ if (call && !this.workflows.has(call)) {
57
+ const candidate = string(result.runId) ?? (string(result.transcriptDir) ? basename(string(result.transcriptDir)) : undefined);
58
+ const launch = this.launches.get(call);
59
+ this.workflows.set(call, {
60
+ call, taskId: string(result.taskId), runId: safeId(candidate) && candidate.startsWith("wf_") ? candidate : undefined,
61
+ name: string(result.workflowName) ?? launch?.name ?? "工作流", description: launch?.task ?? string(result.summary), state: "running",
62
+ startedAt: launch?.ts ?? timestamp(line.timestamp), phases: new Map(), workers: new Map(),
63
+ });
64
+ }
65
+ }
66
+ // Notifications persist in both current SDK and interactive CLI transcripts.
67
+ const attachment = object(line.attachment);
68
+ const texts = [string(attachment?.prompt), string(line.content), typeof content === "string" ? content : undefined,
69
+ ...(Array.isArray(content) ? content.map((block) => string(object(block)?.text)) : [])];
70
+ for (const text of texts) {
71
+ if (!text?.trimStart().startsWith("<task-notification>"))
72
+ continue;
73
+ const call = /<tool-use-id>\s*([^<\s]+)\s*<\/tool-use-id>/.exec(text)?.[1];
74
+ const task = /<task-id>\s*([^<\s]+)\s*<\/task-id>/.exec(text)?.[1];
75
+ this.updateState(call, task, /<status>\s*([^<\s]+)\s*<\/status>/.exec(text)?.[1], timestamp(line.timestamp));
76
+ }
77
+ if (line.type === "system" && (line.subtype === "task_notification" || line.subtype === "task_updated")) {
78
+ this.updateState(string(line.tool_use_id), string(line.task_id), line.status ?? object(line.patch)?.status, timestamp(line.timestamp));
79
+ }
80
+ if (line.type === "system" && line.subtype === "task_progress") {
81
+ const run = [...this.workflows.values()].find((entry) => entry.call === line.tool_use_id || entry.taskId === line.task_id);
82
+ const usage = object(line.usage);
83
+ if (run) {
84
+ run.tokens = number(usage?.total_tokens) ?? run.tokens;
85
+ run.durationMs = number(usage?.duration_ms) ?? run.durationMs;
86
+ this.readProgress(run, line.workflow_progress);
87
+ }
88
+ }
89
+ }
90
+ updateState(call, task, value, ts) {
91
+ const workflow = (call ? this.workflows.get(call) : undefined) ?? (task ? [...this.workflows.values()].find((entry) => entry.taskId === task) : undefined);
92
+ const state = value === "killed" ? "stopped" : value;
93
+ if (!workflow || !["running", "paused", "completed", "failed", "stopped"].includes(String(state)))
94
+ return;
95
+ workflow.state = state;
96
+ if (state !== "running" && state !== "paused")
97
+ workflow.endedAt = ts ?? workflow.endedAt ?? Date.now();
98
+ else
99
+ workflow.endedAt = undefined;
100
+ }
101
+ followFrom(offset) {
102
+ this.observer = new TranscriptTail({ locate: this.options.locate, offset, onLine: (raw) => this.observe(raw) });
103
+ }
104
+ start() {
105
+ this.timer ??= setInterval(() => {
106
+ try {
107
+ this.poll();
108
+ }
109
+ catch (error) {
110
+ this.options.onError?.(error);
111
+ }
112
+ }, 400);
113
+ this.timer.unref?.();
114
+ }
115
+ stop() {
116
+ clearInterval(this.timer);
117
+ this.timer = undefined;
118
+ }
119
+ isRunning(call) {
120
+ return [...this.workflows.values()].some((run) => run.call === call
121
+ ? run.state === "running" || run.state === "paused" || [...run.workers.values()].some((worker) => active(worker.state))
122
+ : [...run.workers.values()].some((worker) => worker.agentId && this.workerCall(run, worker) === call && active(worker.state)));
123
+ }
124
+ poll() {
125
+ this.observer?.poll();
126
+ const transcript = this.options.locate();
127
+ if (!transcript)
128
+ return;
129
+ const sessionDir = transcript.replace(/\.jsonl$/, "");
130
+ const dir = join(sessionDir, "subagents");
131
+ for (const file of files(dir)) {
132
+ if (!file.endsWith(".meta.json"))
133
+ continue;
134
+ if (!ownedFile(sessionDir, join(dir, file)))
135
+ continue;
136
+ const meta = readJson(join(dir, file));
137
+ const parent = string(meta?.toolUseId);
138
+ const path = join(dir, file.replace(/\.meta\.json$/, ".jsonl"));
139
+ if (parent && ownedFile(sessionDir, path))
140
+ this.child(path, parent, () => this.options.desktop()).tail.poll();
141
+ }
142
+ for (const workflow of this.workflows.values())
143
+ this.pollWorkflow(sessionDir, workflow);
144
+ }
145
+ child(path, parent, enabled, metadata) {
146
+ let reader = this.children.get(path);
147
+ if (!reader) {
148
+ const hidden = new Set();
149
+ const seen = new Set();
150
+ const tail = new TranscriptTail({ locate: () => path, offset: 0, onLine: (raw) => {
151
+ const parsed = transcriptLine(raw, { sidechain: true, hidden, seen });
152
+ // Advance while ACP owns an ordinary sub-agent, without echoing its stream.
153
+ if (!enabled())
154
+ return;
155
+ const line = metadata ? json(raw) : undefined;
156
+ if (line)
157
+ metadata?.(line);
158
+ if (parsed.updates.length)
159
+ reader.revision += 1;
160
+ for (const update of parsed.updates) {
161
+ const nested = "parentToolCallId" in update && update.parentToolCallId ? update : nestUnder(update, parent);
162
+ if (nested)
163
+ this.options.onUpdate(nested, parsed.ts);
164
+ }
165
+ } });
166
+ reader = { tail, revision: 0 };
167
+ this.children.set(path, reader);
168
+ }
169
+ return reader;
170
+ }
171
+ pollWorkflow(sessionDir, run) {
172
+ const emit = this.options.onUpdate;
173
+ const runDir = run.runId ? join(sessionDir, "subagents", "workflows", run.runId) : undefined;
174
+ if (runDir) {
175
+ const path = join(runDir, "journal.jsonl");
176
+ if (ownedFile(sessionDir, path)) {
177
+ run.journal ??= new TranscriptTail({ locate: () => path, offset: 0, onLine: (raw) => {
178
+ const event = json(raw);
179
+ if (!event || !safeId(event.agentId) || (event.type !== "started" && event.type !== "result"))
180
+ return;
181
+ let worker = run.workers.get(event.agentId);
182
+ if (!worker) {
183
+ worker = { id: event.agentId, agentId: event.agentId, label: string(event.label) ?? event.agentId, state: "running", startedAt: timestamp(event.ts) };
184
+ run.workers.set(worker.id, worker);
185
+ }
186
+ if (event.type === "result") {
187
+ // null can mean either cancellation or an API failure. Only an explicit
188
+ // agent status can distinguish them; neither is a successful result.
189
+ if (worker.inferredFailure && event.result != null) {
190
+ worker.state = "completed";
191
+ worker.inferredFailure = false;
192
+ }
193
+ else if (worker.state !== "failed" && worker.state !== "stopped")
194
+ worker.state = event.result == null ? "unknown" : "completed";
195
+ worker.result = typeof event.result === "string" ? event.result : event.result == null ? undefined : JSON.stringify(event.result);
196
+ worker.endedAt = timestamp(event.ts);
197
+ }
198
+ } });
199
+ run.journal.poll();
200
+ }
201
+ this.readFinal(sessionDir, run);
202
+ }
203
+ const terminal = run.state !== "running" && run.state !== "paused";
204
+ let childChanged = false;
205
+ // Announce parents before children, and finish them only after their last output.
206
+ if (!run.published) {
207
+ emit({ sessionUpdate: "tool_call", toolCallId: run.call, title: `Workflow: ${run.name}`, kind: "other", status: "in_progress", detail: this.detail(run) }, run.startedAt);
208
+ }
209
+ for (const worker of run.workers.values()) {
210
+ // Live progress may precede Claude assigning an id. It can be shown in the
211
+ // roster, but has no transcript address until the provider supplies one.
212
+ if (!worker.agentId)
213
+ continue;
214
+ const call = this.workerCall(run, worker);
215
+ const describe = () => ({ type: "subagent", action: "spawn", agentType: run.phases.get(worker.phaseId ?? "")?.title ?? "工作流 Agent", task: worker.prompt ?? worker.label, model: worker.model, state: worker.state });
216
+ if (!worker.published)
217
+ emit({ sessionUpdate: "tool_call", toolCallId: call, parentToolCallId: run.call, title: worker.label, kind: "other", status: "in_progress", detail: describe() }, worker.startedAt ?? run.startedAt);
218
+ const childPath = runDir ? join(runDir, `agent-${worker.agentId}.jsonl`) : undefined;
219
+ let revision = 0;
220
+ if (childPath && ownedFile(sessionDir, childPath)) {
221
+ const child = this.child(childPath, call, () => true, (line) => {
222
+ worker.hasTranscript = true;
223
+ const message = object(line.message);
224
+ worker.startedAt ??= timestamp(line.timestamp);
225
+ worker.model ??= string(message?.model);
226
+ if (line.isApiErrorMessage === true && active(worker.state)) {
227
+ worker.state = "failed";
228
+ worker.inferredFailure = true;
229
+ worker.endedAt = timestamp(line.timestamp);
230
+ }
231
+ else if (worker.inferredFailure && line.isApiErrorMessage !== true && (line.type === "assistant" || line.type === "user")) {
232
+ // A later successful retry replaces an error at the previous tail.
233
+ worker.state = "running";
234
+ worker.inferredFailure = false;
235
+ worker.endedAt = undefined;
236
+ }
237
+ if (line.type !== "user" || line.isMeta === true)
238
+ return;
239
+ const content = message?.content;
240
+ const text = typeof content === "string" ? content : Array.isArray(content) ? content.map((block) => string(object(block)?.text) ?? "").join("\n") : "";
241
+ if (text.trim()) {
242
+ worker.prompt ??= text.trim();
243
+ if (worker.label === worker.agentId)
244
+ worker.label = text.trim().slice(0, 2000);
245
+ }
246
+ });
247
+ child.tail.poll();
248
+ revision = child.revision;
249
+ }
250
+ if (runDir && !worker.model) {
251
+ const metaPath = join(runDir, `agent-${worker.agentId}.meta.json`);
252
+ if (ownedFile(sessionDir, metaPath))
253
+ worker.model = string(readJson(metaPath)?.model);
254
+ }
255
+ const detail = describe();
256
+ // A stopped run can still have live processes. Keep watching each worker
257
+ // until its own progress, journal or transcript proves its outcome.
258
+ const status = worker.state === "failed" ? "failed" : active(worker.state) || worker.state === "pending" ? "in_progress" : "completed";
259
+ const snapshot = JSON.stringify([detail, status, worker.result, revision]);
260
+ if (snapshot !== worker.published) {
261
+ childChanged = true;
262
+ emit({ sessionUpdate: "tool_call_update", toolCallId: call, parentToolCallId: run.call, status, detail,
263
+ content: worker.result ? [{ type: "content", content: { type: "text", text: worker.result } }] : undefined }, worker.endedAt ?? run.endedAt);
264
+ emit({ sessionUpdate: "ls_turn", state: status === "in_progress" ? "started" : "ended", parentToolCallId: call,
265
+ stopReason: status === "in_progress" ? undefined : worker.state === "stopped" ? "cancelled" : status === "failed" ? "error" : "end_turn" }, worker.endedAt ?? run.endedAt);
266
+ worker.published = snapshot;
267
+ }
268
+ }
269
+ const detail = this.detail(run);
270
+ const snapshot = JSON.stringify(detail);
271
+ if (snapshot !== run.published || (terminal && childChanged)) {
272
+ emit({ sessionUpdate: "tool_call_update", toolCallId: run.call, detail, status: !terminal ? "in_progress" : run.state === "failed" ? "failed" : "completed" }, run.endedAt);
273
+ emit({ sessionUpdate: "ls_turn", parentToolCallId: run.call, state: terminal ? "ended" : "started", stopReason: terminal ? run.state === "completed" ? "end_turn" : run.state === "stopped" ? "cancelled" : "error" : undefined }, run.endedAt ?? run.startedAt);
274
+ run.published = snapshot;
275
+ }
276
+ }
277
+ detail(run) {
278
+ return { type: "subagent", action: "spawn", agentType: "工作流", task: run.description ?? run.name,
279
+ workflow: { runId: run.runId, name: run.name, state: run.state, started: [...run.workers.values()].filter((worker) => worker.state !== "pending").length,
280
+ completed: [...run.workers.values()].filter((worker) => worker.state === "completed").length,
281
+ tokens: run.tokens, durationMs: run.durationMs, startedAt: run.startedAt, endedAt: run.endedAt,
282
+ phases: [...run.phases.values()].sort((a, b) => a.order - b.order),
283
+ agents: [...run.workers.values()].map((worker) => ({ id: worker.id, title: worker.label, state: worker.state,
284
+ toolCallId: worker.hasTranscript ? this.workerCall(run, worker) : undefined,
285
+ phaseId: worker.phaseId, model: worker.model, tokens: worker.tokens, toolCalls: worker.toolCalls,
286
+ durationMs: worker.durationMs, startedAt: worker.startedAt, endedAt: worker.endedAt, result: worker.result?.slice(0, 2000) })),
287
+ } };
288
+ }
289
+ workerCall(run, worker) { return `workflow:${run.runId ?? run.call}:${worker.agentId}`; }
290
+ phase(run, index, title) {
291
+ if (index === undefined && !title)
292
+ return undefined;
293
+ const named = title ? [...run.phases.values()].filter((phase) => phase.title === title) : [];
294
+ const id = index !== undefined ? `phase:${index}` : named.length === 1 ? named[0].id : `title:${title}`;
295
+ if (index !== undefined && title && run.phases.has(`title:${title}`)) {
296
+ run.phases.delete(`title:${title}`);
297
+ for (const worker of run.workers.values())
298
+ if (worker.phaseId === `title:${title}`)
299
+ worker.phaseId = id;
300
+ }
301
+ const old = run.phases.get(id);
302
+ run.phases.set(id, { id, title: title ?? old?.title ?? `阶段 ${index}`, order: index ?? old?.order ?? run.phases.size + 1 });
303
+ return id;
304
+ }
305
+ /** This undeclared Claude field also appears as workflowProgress in the final artifact. */
306
+ readProgress(run, value) {
307
+ if (!Array.isArray(value))
308
+ return;
309
+ for (const entry of value) {
310
+ const row = object(entry);
311
+ if (!row)
312
+ continue;
313
+ if (row.type === "workflow_phase") {
314
+ this.phase(run, number(row.index), string(row.title));
315
+ continue;
316
+ }
317
+ if (row.type !== "workflow_agent")
318
+ continue;
319
+ const agentId = safeId(row.agentId) ? row.agentId : undefined;
320
+ const index = number(row.index);
321
+ if (!agentId && index === undefined)
322
+ continue;
323
+ const provisional = index === undefined ? undefined : [...run.workers.values()].find((worker) => worker.index === index);
324
+ const id = agentId ?? provisional?.id ?? `pending:${index}`;
325
+ const existing = run.workers.get(id);
326
+ const worker = existing ?? provisional ?? { id, label: agentId ?? `Agent ${(index ?? 0) + 1}`, state: "pending" };
327
+ if (provisional && provisional.id !== id) {
328
+ run.workers.delete(provisional.id);
329
+ if (existing) {
330
+ existing.phaseId ??= provisional.phaseId;
331
+ existing.model ??= provisional.model;
332
+ }
333
+ }
334
+ worker.id = id;
335
+ worker.agentId = agentId ?? worker.agentId;
336
+ worker.index = index ?? worker.index;
337
+ worker.label = string(row.label) ?? worker.label;
338
+ const reported = agentState(row.state);
339
+ if (reported) {
340
+ worker.state = reported;
341
+ worker.inferredFailure = false;
342
+ }
343
+ worker.phaseId = this.phase(run, number(row.phaseIndex), string(row.phaseTitle)) ?? worker.phaseId;
344
+ worker.model = string(row.model) ?? worker.model;
345
+ worker.tokens = number(row.tokens) ?? worker.tokens;
346
+ worker.toolCalls = number(row.toolCalls) ?? worker.toolCalls;
347
+ worker.durationMs = number(row.durationMs) ?? worker.durationMs;
348
+ worker.result = string(row.resultPreview) ?? worker.result;
349
+ worker.startedAt = number(row.startedAt) ?? worker.startedAt;
350
+ if (!active(worker.state) && worker.state !== "pending" && worker.startedAt !== undefined && worker.durationMs !== undefined)
351
+ worker.endedAt = worker.startedAt + worker.durationMs;
352
+ run.workers.set(id, worker);
353
+ }
354
+ }
355
+ readFinal(sessionDir, run) {
356
+ const path = join(sessionDir, "workflows", `${run.runId}.json`);
357
+ if (!ownedFile(sessionDir, path))
358
+ return;
359
+ const stat = statSync(path);
360
+ const stamp = `${stat.size}:${stat.mtimeMs}`;
361
+ if (run.finalStamp === stamp)
362
+ return;
363
+ const final = readJson(path);
364
+ if (!final || final.runId !== run.runId)
365
+ return;
366
+ run.finalStamp = stamp;
367
+ run.name = string(final.workflowName) ?? run.name;
368
+ run.description = string(final.summary) ?? run.description;
369
+ run.startedAt = number(final.startTime) ?? run.startedAt;
370
+ run.tokens = number(final.totalTokens);
371
+ run.durationMs = number(final.durationMs);
372
+ const endedAt = timestamp(final.timestamp) ?? (run.startedAt !== undefined && run.durationMs !== undefined ? run.startedAt + run.durationMs : stat.mtimeMs);
373
+ this.updateState(run.call, undefined, final.status, endedAt);
374
+ this.readProgress(run, final.workflowProgress);
375
+ }
376
+ }
377
+ function active(state) { return state === "running" || state === "paused"; }
378
+ function agentState(value) {
379
+ switch (value) {
380
+ case "pending":
381
+ case "queued": return "pending";
382
+ case "running":
383
+ case "active": return "running";
384
+ case "paused":
385
+ case "blocked": return "paused";
386
+ case "done":
387
+ case "completed":
388
+ case "complete": return "completed";
389
+ case "failed":
390
+ case "error": return "failed";
391
+ case "stopped":
392
+ case "killed":
393
+ case "cancelled": return "stopped";
394
+ default: return undefined;
395
+ }
396
+ }
397
+ function files(path) {
398
+ try {
399
+ return readdirSync(path);
400
+ }
401
+ catch {
402
+ return [];
403
+ }
404
+ }
405
+ function readJson(path) {
406
+ try {
407
+ return statSync(path).size <= 16 * 1024 * 1024 ? json(readFileSync(path, "utf8")) : undefined;
408
+ }
409
+ catch {
410
+ return undefined;
411
+ }
412
+ }
413
+ /** Transcript content may name paths; only follow artifacts inside this session. */
414
+ function ownedFile(root, path) {
415
+ try {
416
+ if (!existsSync(path))
417
+ return false;
418
+ const rel = relative(realpathSync(root), realpathSync(path));
419
+ return rel !== ".." && !rel.startsWith(`..${sep}`) && !rel.startsWith(sep) && statSync(path).isFile();
420
+ }
421
+ catch {
422
+ return false;
423
+ }
424
+ }
425
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../../../host/src/drivers/claude/activity.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ export interface ClaudeDriverOptions {
30
30
  export declare class ClaudeDriver extends AcpDriver {
31
31
  private readonly modes;
32
32
  private readonly tails;
33
+ private readonly activity;
33
34
  /**
34
35
  * The settings Claude offers (model, effort, permission mode…), as the
35
36
  * adapter reported them for any session: what a desktop-driven session
@@ -57,6 +58,7 @@ export declare class ClaudeDriver extends AcpDriver {
57
58
  private readonly waiting;
58
59
  /** Checks that sessions driven from a device haven't been reopened on the computer. */
59
60
  private remoteWatch?;
61
+ private remoteWatchRun?;
60
62
  start(host: import("../types.js").DriverHost): Promise<import("../types.js").DriverStatus>;
61
63
  stop(): Promise<void>;
62
64
  attach(nativeId: string, context: AttachContext): Promise<HistoryItem[]>;
@@ -9,7 +9,8 @@ import { AcpDriver, inOrder } from "../acp/driver.js";
9
9
  import { AcpItemTracker, toConfigOptions, toHistory } from "../acp/mapper.js";
10
10
  import { parseClaudeAuthStatus, runStatusCommand } from "../auth.js";
11
11
  import { descendsFrom, sessionHolders } from "./holders.js";
12
- import { claudeConfigDir, encodeProjectDir, findTranscript, turnEndUuid, mergeSettings, readTail, readTranscript, settingsOf, transcriptLine, transcriptTimes, TranscriptTail, } from "./transcript.js";
12
+ import { ClaudeActivity } from "./activity.js";
13
+ import { claudeConfigDir, encodeProjectDir, findTranscript, turnEndUuid, mergeSettings, mergeByTime, readTail, readTranscript, settingsOf, transcriptLine, transcriptTimes, TranscriptTail, } from "./transcript.js";
13
14
  const execFileAsync = promisify(execFile);
14
15
  /** How the adapter's Claude marks the transcript lines it writes. */
15
16
  const REMOTE_ENTRYPOINT = '"entrypoint":"sdk-ts"';
@@ -98,6 +99,7 @@ function driverOf(mode) {
98
99
  export class ClaudeDriver extends AcpDriver {
99
100
  modes = new Map();
100
101
  tails = new Map();
102
+ activity = new Map();
101
103
  /**
102
104
  * The settings Claude offers (model, effort, permission mode…), as the
103
105
  * adapter reported them for any session: what a desktop-driven session
@@ -151,6 +153,7 @@ export class ClaudeDriver extends AcpDriver {
151
153
  waiting = new Map();
152
154
  /** Checks that sessions driven from a device haven't been reopened on the computer. */
153
155
  remoteWatch;
156
+ remoteWatchRun;
154
157
  async start(host) {
155
158
  if (!this.adapterMissing)
156
159
  return super.start(host);
@@ -165,9 +168,13 @@ export class ClaudeDriver extends AcpDriver {
165
168
  async stop() {
166
169
  clearInterval(this.remoteWatch);
167
170
  this.remoteWatch = undefined;
171
+ await this.remoteWatchRun;
168
172
  for (const tail of this.tails.values())
169
173
  tail.stop();
170
174
  this.tails.clear();
175
+ for (const follower of this.activity.values())
176
+ follower.stop();
177
+ this.activity.clear();
171
178
  await super.stop();
172
179
  }
173
180
  async attach(nativeId, context) {
@@ -175,8 +182,27 @@ export class ClaudeDriver extends AcpDriver {
175
182
  const path = findTranscript(this.configDir, nativeId, context.cwd);
176
183
  let history = [];
177
184
  let offset = 0;
185
+ this.activity.get(nativeId)?.stop();
186
+ let importing = true;
187
+ const nested = [];
188
+ const activity = new ClaudeActivity({
189
+ locate: () => findTranscript(this.configDir, nativeId, context.cwd),
190
+ desktop: () => importing || this.modes.get(nativeId) !== "remote",
191
+ onUpdate: (update, ts) => {
192
+ if (importing) {
193
+ if (ts !== undefined)
194
+ transcriptTimes.set(update, ts);
195
+ nested.push(update);
196
+ }
197
+ else
198
+ this.emit(nativeId, update);
199
+ },
200
+ onError: (error) => this.host?.log(`[claude] child transcript: ${String(error)}`),
201
+ });
202
+ this.activity.set(nativeId, activity);
178
203
  if (path) {
179
- const transcript = readTranscript(path);
204
+ const transcript = readTranscript(path, { includeSubagents: false, onLine: (raw) => activity.observe(raw) });
205
+ activity.poll();
180
206
  state.tracker = new AcpItemTracker();
181
207
  // What is under way on the computer isn't history yet: a turn's start and
182
208
  // the tool calls still running, and agents working in the background
@@ -184,13 +210,25 @@ export class ClaudeDriver extends AcpDriver {
184
210
  // happening now (after the history; the hub holds them until then), so
185
211
  // the session shows as working and results have a card to land on.
186
212
  const underway = [];
187
- history = toHistory(transcript.updates, state.tracker, (update) => transcriptTimes.get(update), underway);
213
+ history = toHistory(mergeByTime(transcript.updates, nested), state.tracker, (update) => transcriptTimes.get(update), underway);
188
214
  const working = turnInProgress(path, this.busyWindowMs);
189
215
  for (const update of underway) {
190
216
  const call = update.parentToolCallId ?? update.toolCallId;
191
- if (working || (call && transcript.agents.has(call)))
217
+ if (working || (call && (transcript.agents.has(call) || activity.isRunning(call))))
192
218
  this.host?.update(this.id, nativeId, update, undefined, transcriptTimes.get(update));
193
219
  }
220
+ // A terminal tool item is deduplicated during history import. Its workflow
221
+ // sidecars can still have changed while the host was down, so reconcile the
222
+ // current metadata separately, without replaying any conversation text.
223
+ const snapshots = nested.filter((update) => update.sessionUpdate === "tool_call_update" && update.detail?.type === "subagent" && (!!update.detail.workflow || !!update.detail.state));
224
+ const calls = new Set(snapshots.map((update) => update.toolCallId));
225
+ const turns = new Map();
226
+ for (const update of nested) {
227
+ if (update.sessionUpdate === "ls_turn" && update.parentToolCallId && calls.has(update.parentToolCallId))
228
+ turns.set(update.parentToolCallId, update);
229
+ }
230
+ for (const update of [...snapshots, ...turns.values()])
231
+ this.host?.update(this.id, nativeId, update, undefined, transcriptTimes.get(update));
194
232
  offset = transcript.size;
195
233
  this.backgroundAgents.set(nativeId, transcript.agents);
196
234
  this.seenLines.set(nativeId, transcript.seen);
@@ -198,7 +236,10 @@ export class ClaudeDriver extends AcpDriver {
198
236
  if (transcript.title)
199
237
  this.host?.update(this.id, nativeId, { sessionUpdate: "session_info_update", title: transcript.title });
200
238
  }
239
+ importing = false;
240
+ activity.followFrom(offset);
201
241
  this.startTail(nativeId, context.cwd, offset);
242
+ activity.start();
202
243
  const mode = this.modes.get(nativeId) ?? "idle";
203
244
  this.host?.update(this.id, nativeId, { sessionUpdate: "ls_driver", driver: driverOf(mode) });
204
245
  if (mode === "remote")
@@ -340,6 +381,8 @@ export class ClaudeDriver extends AcpDriver {
340
381
  this.modes.delete(nativeId);
341
382
  this.hiddenTools.delete(nativeId);
342
383
  this.backgroundAgents.delete(nativeId);
384
+ this.activity.get(nativeId)?.stop();
385
+ this.activity.delete(nativeId);
343
386
  if (transcript)
344
387
  sweepTranscript(transcript);
345
388
  }
@@ -639,7 +682,13 @@ export class ClaudeDriver extends AcpDriver {
639
682
  this.startWatch();
640
683
  }
641
684
  startWatch() {
642
- this.remoteWatch ??= setInterval(() => void this.watchRemoteSessions(), this.holderCheckMs);
685
+ this.remoteWatch ??= setInterval(() => {
686
+ // Process inspection can outlast the poll interval. Two simultaneous
687
+ // checks must not both take over and send the same queued prompt.
688
+ this.remoteWatchRun ??= this.watchRemoteSessions()
689
+ .catch((error) => this.host?.log(`[claude] session watch: ${String(error)}`))
690
+ .finally(() => { this.remoteWatchRun = undefined; });
691
+ }, this.holderCheckMs);
643
692
  this.remoteWatch.unref?.();
644
693
  }
645
694
  /**