@bastani/atomic 0.9.57-alpha.1 → 0.9.58-alpha.1
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.
- package/CHANGELOG.md +52 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +12 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +39 -5
- package/dist/builtin/web-access/CHANGELOG.md +12 -0
- package/dist/builtin/web-access/index.bundle.mjs +2 -2
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +42 -0
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +885 -228
- package/dist/builtin/workflows/src/extension/local-worker-entry.mjs +933 -175
- package/dist/builtin/workflows/src/index.js +630 -162
- package/dist/builtin/workflows/src/local-worker-entry.mjs +933 -175
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +1 -1
- package/dist/builtin/workflows/src/shared/workflow-infrastructure-error.d.ts +13 -0
- package/dist/builtin/workflows/src/workers/public-options.d.ts +10 -0
- package/dist/core/agent-session-persistent-custom-messages.d.ts +5 -0
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.js +16 -0
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
- package/dist/core/agent-session-tasks.d.ts.map +1 -1
- package/dist/core/agent-session-tasks.js +20 -0
- package/dist/core/agent-session-tasks.js.map +1 -1
- package/dist/core/settings-defaults.d.ts +4 -0
- package/dist/core/settings-defaults.d.ts.map +1 -1
- package/dist/core/settings-defaults.js +4 -0
- package/dist/core/settings-defaults.js.map +1 -1
- package/dist/core/settings-manager-resource-accessors.d.ts +2 -0
- package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-resource-accessors.js +6 -0
- package/dist/core/settings-manager-resource-accessors.js.map +1 -1
- package/dist/core/settings-schema.d.ts +9 -0
- package/dist/core/settings-schema.d.ts.map +1 -1
- package/dist/core/settings-schema.js +11 -0
- package/dist/core/settings-schema.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -1
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/tasks/agent-adapter.d.ts +10 -1
- package/dist/core/tasks/agent-adapter.d.ts.map +1 -1
- package/dist/core/tasks/agent-adapter.js +20 -0
- package/dist/core/tasks/agent-adapter.js.map +1 -1
- package/dist/core/tasks/contracts.d.ts +6 -0
- package/dist/core/tasks/contracts.d.ts.map +1 -1
- package/dist/core/tasks/contracts.js.map +1 -1
- package/dist/core/tasks/heartbeat-notice.d.ts +64 -0
- package/dist/core/tasks/heartbeat-notice.d.ts.map +1 -0
- package/dist/core/tasks/heartbeat-notice.js +98 -0
- package/dist/core/tasks/heartbeat-notice.js.map +1 -0
- package/dist/core/tasks/heartbeat.d.ts +75 -0
- package/dist/core/tasks/heartbeat.d.ts.map +1 -0
- package/dist/core/tasks/heartbeat.js +440 -0
- package/dist/core/tasks/heartbeat.js.map +1 -0
- package/dist/core/tasks/supervisor.d.ts +2 -0
- package/dist/core/tasks/supervisor.d.ts.map +1 -1
- package/dist/core/tasks/supervisor.js +32 -4
- package/dist/core/tasks/supervisor.js.map +1 -1
- package/dist/core/tasks/task-view-source.d.ts +72 -0
- package/dist/core/tasks/task-view-source.d.ts.map +1 -0
- package/dist/core/tasks/task-view-source.js +155 -0
- package/dist/core/tasks/task-view-source.js.map +1 -0
- package/dist/core/tools/bash-pty-native.d.ts +2 -0
- package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
- package/dist/core/tools/bash-pty-native.js +1 -0
- package/dist/core/tools/bash-pty-native.js.map +1 -1
- package/dist/core/tools/bash.d.ts +3 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +20 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +16 -8
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +7 -0
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +3 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +4 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.d.ts +11 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +2 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +15 -8
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +12 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/task-detail.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-detail.js +5 -0
- package/dist/modes/interactive/components/task-detail.js.map +1 -1
- package/dist/modes/interactive/components/task-heartbeat-message.d.ts +14 -0
- package/dist/modes/interactive/components/task-heartbeat-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-heartbeat-message.js +76 -0
- package/dist/modes/interactive/components/task-heartbeat-message.js.map +1 -0
- package/dist/modes/interactive/components/task-inspector.d.ts +6 -3
- package/dist/modes/interactive/components/task-inspector.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-inspector.js +53 -100
- package/dist/modes/interactive/components/task-inspector.js.map +1 -1
- package/dist/modes/interactive/skill-command-autocomplete.d.ts +22 -2
- package/dist/modes/interactive/skill-command-autocomplete.d.ts.map +1 -1
- package/dist/modes/interactive/skill-command-autocomplete.js +28 -9
- package/dist/modes/interactive/skill-command-autocomplete.js.map +1 -1
- package/docs/background-tasks.md +65 -1
- package/docs/settings.md +12 -0
- package/docs/subagents.md +2 -0
- package/docs/tools.md +2 -1
- package/docs/workflows/operations.md +5 -3
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
- package/schemas/settings.schema.json +24 -0
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { stripVTControlCharacters } from "node:util";
|
|
3
2
|
import { getKeybindings, Input, matchesKey, Text, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { readTaskTranscriptSnapshot } from "../../../core/tasks/transcript.js";
|
|
3
|
+
import { OwnerTaskStore } from "../../../core/tasks/owner-store.js";
|
|
4
|
+
import { ownerTaskViewSource } from "../../../core/tasks/task-view-source.js";
|
|
7
5
|
import { theme } from "../theme/theme.js";
|
|
8
6
|
import { chatEntriesFromAgentMessages, renderChatMessageEntry } from "./chat-message-renderer.js";
|
|
9
7
|
import { mouseWheelDeltaRows } from "./chat-transcript.js";
|
|
@@ -14,7 +12,7 @@ import { taskListSections } from "./task-list.js";
|
|
|
14
12
|
import { TaskLiveTranscript } from "./task-live-transcript.js";
|
|
15
13
|
import { TaskNavigation } from "./task-navigation.js";
|
|
16
14
|
import { taskDisplayText, taskLabel, taskMetricsText, taskModelText, taskStatusAppearance } from "./task-row.js";
|
|
17
|
-
/** Focused view only. The
|
|
15
|
+
/** Focused view only. The task source and original session remain the authorities. */
|
|
18
16
|
export class TaskInspector {
|
|
19
17
|
navigation;
|
|
20
18
|
actionIndex = 0;
|
|
@@ -28,6 +26,8 @@ export class TaskInspector {
|
|
|
28
26
|
transcriptPageRows = 5;
|
|
29
27
|
cursor;
|
|
30
28
|
status = "";
|
|
29
|
+
/** Why the last stop did not reach its task; shown under the list until the next key. */
|
|
30
|
+
stopFailure = "";
|
|
31
31
|
scroll = 0;
|
|
32
32
|
detailContent = {};
|
|
33
33
|
detailTaskId;
|
|
@@ -37,7 +37,7 @@ export class TaskInspector {
|
|
|
37
37
|
input = new Input();
|
|
38
38
|
unsubscribe;
|
|
39
39
|
constructor(privateStore, privateRender, privateClose, openQuestion) {
|
|
40
|
-
this.store = privateStore;
|
|
40
|
+
this.store = privateStore instanceof OwnerTaskStore ? ownerTaskViewSource(privateStore) : privateStore;
|
|
41
41
|
this.requestRender = privateRender;
|
|
42
42
|
this.close = privateClose;
|
|
43
43
|
this.navigation = new TaskNavigation(getKeybindings(), {
|
|
@@ -57,26 +57,23 @@ export class TaskInspector {
|
|
|
57
57
|
void this.loadTranscript();
|
|
58
58
|
},
|
|
59
59
|
foreground: (task) => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.requestRender();
|
|
65
|
-
});
|
|
60
|
+
void this.store.foregroundTask(task.ref.taskId).then((result) => {
|
|
61
|
+
this.status = result.ok ? result.value.kind : result.error.message;
|
|
62
|
+
this.requestRender();
|
|
63
|
+
});
|
|
66
64
|
},
|
|
67
65
|
confirmCancel: () => new Promise((resolve) => {
|
|
68
66
|
this.confirmation = resolve;
|
|
69
67
|
this.requestRender();
|
|
70
68
|
}),
|
|
71
69
|
cancel: (task) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const lease = this.store.resolveTask(task.ref.taskId);
|
|
78
|
-
return lease.ok && this.store.supervisor.taskStdin(lease.value).ok;
|
|
70
|
+
void this.store.cancelTask(task.ref.taskId).then((result) => {
|
|
71
|
+
// A stop that did not reach the task says so, instead of leaving it looking untouched.
|
|
72
|
+
this.stopFailure = result.ok ? "" : `Could not stop the task: ${result.error.message}`;
|
|
73
|
+
this.requestRender();
|
|
74
|
+
});
|
|
79
75
|
},
|
|
76
|
+
stdinAvailable: (task) => this.store.stdinAvailable(task.ref.taskId),
|
|
80
77
|
input: () => {
|
|
81
78
|
this.input.setValue("");
|
|
82
79
|
},
|
|
@@ -131,25 +128,13 @@ export class TaskInspector {
|
|
|
131
128
|
const task = this.selected();
|
|
132
129
|
if (!task || task.execution.kind === "settled")
|
|
133
130
|
return false;
|
|
134
|
-
|
|
135
|
-
return lease.ok && this.store.supervisor.taskStdin(lease.value).ok;
|
|
131
|
+
return this.store.stdinAvailable(task.ref.taskId);
|
|
136
132
|
}
|
|
137
133
|
async sendInput(text) {
|
|
138
134
|
const task = this.selected();
|
|
139
135
|
if (!task)
|
|
140
136
|
return;
|
|
141
|
-
const
|
|
142
|
-
if (!lease.ok)
|
|
143
|
-
return;
|
|
144
|
-
const stdin = this.store.supervisor.taskStdin(lease.value);
|
|
145
|
-
if (!stdin.ok) {
|
|
146
|
-
this.status = stdin.error.message;
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
const result = await this.store.supervisor.writeTaskInput(stdin.value, randomUUID(), {
|
|
150
|
-
kind: "bytes",
|
|
151
|
-
bytes: Buffer.from(`${text}\n`),
|
|
152
|
-
});
|
|
137
|
+
const result = await this.store.writeTaskInput(task.ref.taskId, text);
|
|
153
138
|
this.status = result.ok ? `Sent ${result.value.acceptedBytes} bytes` : result.error.message;
|
|
154
139
|
this.input.setValue("");
|
|
155
140
|
this.requestRender();
|
|
@@ -164,8 +149,7 @@ export class TaskInspector {
|
|
|
164
149
|
*/
|
|
165
150
|
taskStatusRows(width) {
|
|
166
151
|
const task = this.navigation.focus.kind === "detail" && !this.confirmation ? this.selected() : undefined;
|
|
167
|
-
|
|
168
|
-
if (!task || !lease?.ok) {
|
|
152
|
+
if (task?.kind !== "agent") {
|
|
169
153
|
this.releaseStatusWatch();
|
|
170
154
|
return [];
|
|
171
155
|
}
|
|
@@ -173,10 +157,10 @@ export class TaskInspector {
|
|
|
173
157
|
this.releaseStatusWatch();
|
|
174
158
|
this.statusWatch = {
|
|
175
159
|
taskId: task.ref.taskId,
|
|
176
|
-
release:
|
|
160
|
+
release: this.store.watchExtensionStatuses(task.ref.taskId, () => this.requestRender()),
|
|
177
161
|
};
|
|
178
162
|
}
|
|
179
|
-
const row = renderExtensionStatusRow(
|
|
163
|
+
const row = renderExtensionStatusRow(this.store.extensionStatuses(task.ref.taskId), width);
|
|
180
164
|
return row === undefined ? [] : [row];
|
|
181
165
|
}
|
|
182
166
|
releaseLiveTranscript() {
|
|
@@ -188,12 +172,11 @@ export class TaskInspector {
|
|
|
188
172
|
if (this.disposed || !this.transcriptRequested)
|
|
189
173
|
return;
|
|
190
174
|
const task = this.selected();
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
if (bound?.ok && this.liveTranscript?.source === bound.value.session)
|
|
175
|
+
const follow = task && this.store.followTaskTranscript(task.ref.taskId);
|
|
176
|
+
if (follow?.session !== undefined && this.liveTranscript?.source === follow.session)
|
|
194
177
|
return;
|
|
195
|
-
//
|
|
196
|
-
if (
|
|
178
|
+
// History-only sources have no live tail; keep their retained page anchored.
|
|
179
|
+
if (follow?.historyOnly === true && this.transcriptHistorical)
|
|
197
180
|
return;
|
|
198
181
|
if (this.transcriptLoading)
|
|
199
182
|
this.transcriptRefreshPending = true;
|
|
@@ -212,14 +195,9 @@ export class TaskInspector {
|
|
|
212
195
|
this.transcriptHistorical = true;
|
|
213
196
|
this.requestRender();
|
|
214
197
|
try {
|
|
215
|
-
const lease = this.store.resolveTask(task.ref.taskId);
|
|
216
|
-
if (!lease.ok) {
|
|
217
|
-
this.status = lease.error.message;
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
198
|
if (task.kind === "command") {
|
|
221
199
|
const count = BigInt(task.output.byteCount);
|
|
222
|
-
const page = await this.store.
|
|
200
|
+
const page = await this.store.readTaskOutput(task.ref.taskId, {
|
|
223
201
|
start: String(count > 8192n ? count - 8192n : 0n),
|
|
224
202
|
maximumBytes: 8192,
|
|
225
203
|
});
|
|
@@ -228,7 +206,7 @@ export class TaskInspector {
|
|
|
228
206
|
focus !== this.navigation.focus ||
|
|
229
207
|
task.ref.taskId !== this.navigation.selectedTaskId)
|
|
230
208
|
return;
|
|
231
|
-
const text = page.ok ?
|
|
209
|
+
const text = page.ok ? page.value.text : page.error.message;
|
|
232
210
|
this.transcript = [
|
|
233
211
|
new Text(text.split("\n").map(taskDisplayText).join("\n") || "No output available", 0, 0),
|
|
234
212
|
];
|
|
@@ -238,34 +216,20 @@ export class TaskInspector {
|
|
|
238
216
|
this.requestRender();
|
|
239
217
|
return;
|
|
240
218
|
}
|
|
241
|
-
const
|
|
219
|
+
const read = this.store.readTaskTranscript(task.ref.taskId, earlier ? this.cursor : undefined);
|
|
220
|
+
const page = read instanceof Promise ? await read : read;
|
|
242
221
|
if (this.disposed ||
|
|
243
222
|
generation !== this.detailGeneration ||
|
|
244
223
|
focus !== this.navigation.focus ||
|
|
245
224
|
task.ref.taskId !== this.navigation.selectedTaskId)
|
|
246
225
|
return;
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
this.status = "Transcript unavailable";
|
|
226
|
+
if (!page.ok) {
|
|
227
|
+
this.status = page.error.message;
|
|
250
228
|
this.requestRender();
|
|
251
229
|
return;
|
|
252
230
|
}
|
|
253
|
-
const
|
|
254
|
-
const
|
|
255
|
-
if (entry.type !== "message" || !ids.has(entry.id))
|
|
256
|
-
return [];
|
|
257
|
-
const message = entry.message;
|
|
258
|
-
if (message.role === "assistant")
|
|
259
|
-
return [
|
|
260
|
-
{
|
|
261
|
-
...message,
|
|
262
|
-
content: message.content.filter((block, index) => block.type !== "thinking" &&
|
|
263
|
-
page.ok &&
|
|
264
|
-
page.value.items.some((item) => item.source.entryId === entry.id && item.source.contentIndex === index)),
|
|
265
|
-
},
|
|
266
|
-
];
|
|
267
|
-
return message.role === "user" || message.role === "toolResult" ? [message] : [];
|
|
268
|
-
});
|
|
231
|
+
const messages = [...page.value.messages];
|
|
232
|
+
const follow = this.store.followTaskTranscript(task.ref.taskId);
|
|
269
233
|
const components = chatEntriesFromAgentMessages(messages).map((entry) => renderChatMessageEntry(entry, {
|
|
270
234
|
ui: { requestRender: this.requestRender },
|
|
271
235
|
cwd: process.cwd(),
|
|
@@ -273,14 +237,14 @@ export class TaskInspector {
|
|
|
273
237
|
toolOutputExpanded: true,
|
|
274
238
|
showImages: false,
|
|
275
239
|
}));
|
|
276
|
-
if (!earlier &&
|
|
240
|
+
if (!earlier && follow?.session?.subscribe) {
|
|
277
241
|
this.releaseLiveTranscript();
|
|
278
|
-
this.liveTranscript = new TaskLiveTranscript(
|
|
242
|
+
this.liveTranscript = new TaskLiveTranscript(follow.session, messages, this.requestRender);
|
|
279
243
|
this.transcript = [this.liveTranscript];
|
|
280
244
|
}
|
|
281
245
|
else
|
|
282
246
|
this.transcript = earlier ? [...components, ...(this.transcript ?? [])] : components;
|
|
283
|
-
this.cursor = page.
|
|
247
|
+
this.cursor = page.value.nextCursor;
|
|
284
248
|
this.status = this.cursor ? "PageUp: earlier retained messages" : "";
|
|
285
249
|
this.requestRender();
|
|
286
250
|
}
|
|
@@ -318,42 +282,26 @@ export class TaskInspector {
|
|
|
318
282
|
this.navigation.focus === focus &&
|
|
319
283
|
focus.kind === "detail" &&
|
|
320
284
|
this.navigation.selectedTaskId === task.ref.taskId;
|
|
321
|
-
const
|
|
322
|
-
|
|
285
|
+
const read = this.store.taskDetailText(task.ref.taskId);
|
|
286
|
+
const own = read instanceof Promise ? await read : read;
|
|
287
|
+
if (!current())
|
|
323
288
|
return;
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
this.detailContent.prompt =
|
|
329
|
-
typeof prompt.message.content === "string"
|
|
330
|
-
? prompt.message.content
|
|
331
|
-
: prompt.message.content
|
|
332
|
-
.filter((block) => block.type === "text")
|
|
333
|
-
.map((block) => block.text)
|
|
334
|
-
.join("");
|
|
335
|
-
const response = ownEntries
|
|
336
|
-
.slice()
|
|
337
|
-
.reverse()
|
|
338
|
-
.find((entry) => entry.type === "message" && entry.message.role === "assistant");
|
|
339
|
-
if (response?.type === "message" && response.message.role === "assistant")
|
|
340
|
-
this.detailContent.output = response.message.content
|
|
341
|
-
.filter((block) => block.type === "text")
|
|
342
|
-
.map((block) => block.text)
|
|
343
|
-
.join("");
|
|
344
|
-
}
|
|
289
|
+
if (own.prompt !== undefined)
|
|
290
|
+
this.detailContent.prompt = own.prompt;
|
|
291
|
+
if (own.output !== undefined)
|
|
292
|
+
this.detailContent.output = own.output;
|
|
345
293
|
if (task.kind === "command") {
|
|
346
294
|
try {
|
|
347
295
|
const count = BigInt(task.output.byteCount);
|
|
348
|
-
const output = await this.store.
|
|
296
|
+
const output = await this.store.readTaskOutput(task.ref.taskId, {
|
|
349
297
|
start: String(count > 8192n ? count - 8192n : 0n),
|
|
350
298
|
maximumBytes: 8192,
|
|
351
299
|
});
|
|
352
300
|
if (!current())
|
|
353
301
|
return;
|
|
354
302
|
if (output.ok) {
|
|
355
|
-
this.detailContent.output =
|
|
356
|
-
this.detailContent.outputOmitted = count > 8192n || output.value.
|
|
303
|
+
this.detailContent.output = output.value.text;
|
|
304
|
+
this.detailContent.outputOmitted = count > 8192n || output.value.omitted;
|
|
357
305
|
}
|
|
358
306
|
else
|
|
359
307
|
this.status = output.error.message;
|
|
@@ -368,6 +316,7 @@ export class TaskInspector {
|
|
|
368
316
|
this.requestRender();
|
|
369
317
|
}
|
|
370
318
|
handleInput(data) {
|
|
319
|
+
this.stopFailure = "";
|
|
371
320
|
if (this.confirmation) {
|
|
372
321
|
if (data === "y" || data === "n" || matchesKey(data, "escape")) {
|
|
373
322
|
const answer = this.confirmation;
|
|
@@ -492,7 +441,8 @@ export class TaskInspector {
|
|
|
492
441
|
renderTranscriptViewport(width, budget) {
|
|
493
442
|
const task = this.selected();
|
|
494
443
|
const statusRows = this.taskStatusRows(width);
|
|
495
|
-
const
|
|
444
|
+
const failure = this.stopFailure ? [theme.fg("warning", this.stopFailure)] : [];
|
|
445
|
+
const room = Math.max(1, budget - 5 - statusRows.length - failure.length);
|
|
496
446
|
this.transcriptPageRows = room;
|
|
497
447
|
const rows = this.transcript?.flatMap((component) => component.render(width)) ?? [
|
|
498
448
|
this.transcriptLoading ? "Loading transcript…" : this.status,
|
|
@@ -514,6 +464,7 @@ export class TaskInspector {
|
|
|
514
464
|
...Array.from({ length: Math.max(0, room - visible.length) }, () => ""),
|
|
515
465
|
theme.fg("dim", `Lines ${rows.length ? this.scroll + 1 : 0}–${Math.min(rows.length, this.scroll + room)} of ${rows.length}${this.cursor ? " · PgUp at top: earlier history" : ""}${this.status ? ` · ${this.status}` : ""}`),
|
|
516
466
|
theme.fg("dim", "↑↓ scroll · PgUp/PgDn page · Home/End · ←/Esc back"),
|
|
467
|
+
...failure,
|
|
517
468
|
...statusRows,
|
|
518
469
|
]
|
|
519
470
|
.map(fit)
|
|
@@ -560,8 +511,9 @@ export class TaskInspector {
|
|
|
560
511
|
.filter(Boolean)
|
|
561
512
|
.join(" · ");
|
|
562
513
|
const footer = theme.fg("dim", truncateToWidth(`/tasks · ${hints}`, width));
|
|
514
|
+
const failure = this.stopFailure ? [theme.fg("warning", truncateToWidth(this.stopFailure, width))] : [];
|
|
563
515
|
if (!framed)
|
|
564
|
-
return [...compactSummary, ...view, ...actionRow, footer, ...statusRows]
|
|
516
|
+
return [...compactSummary, ...view, ...actionRow, footer, ...failure, ...statusRows]
|
|
565
517
|
.map((line) => truncateToWidth(line, width))
|
|
566
518
|
.slice(-Math.max(1, budget));
|
|
567
519
|
const live = this.store.backgroundTasks.filter((task) => task.execution.kind !== "settled").length;
|
|
@@ -583,6 +535,7 @@ export class TaskInspector {
|
|
|
583
535
|
...actionRow.map(frameRow),
|
|
584
536
|
border(`╰${"─".repeat(Math.max(0, width - 2))}╯`),
|
|
585
537
|
footer,
|
|
538
|
+
...failure,
|
|
586
539
|
...statusRows,
|
|
587
540
|
].map((line) => truncateToWidth(line, width));
|
|
588
541
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-inspector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-inspector.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype Component,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { taskOutputText } from \"../../../core/tasks/command-output.js\";\nimport type { OperationId, PromptRoute, TaskId } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore } from \"../../../core/tasks/owner-store.js\";\nimport {\n\ttaskExtensionStatuses,\n\ttaskOwnTranscriptEntries,\n\ttaskTranscriptSource,\n\twatchTaskExtensionStatuses,\n} from \"../../../core/tasks/supervisor.js\";\nimport { readTaskTranscriptSnapshot } from \"../../../core/tasks/transcript.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { chatEntriesFromAgentMessages, renderChatMessageEntry } from \"./chat-message-renderer.ts\";\nimport { mouseWheelDeltaRows } from \"./chat-transcript.js\";\nimport { renderExtensionStatusRow } from \"./footer.ts\";\nimport { keyHintIfBound } from \"./keybinding-hints.js\";\nimport {\n\tTaskDetail,\n\ttype TaskDetailContent,\n\ttaskDetailActions,\n\ttaskDetailLabels,\n\ttaskDetailSummary,\n} from \"./task-detail.js\";\nimport { type TaskListSection, taskListSections } from \"./task-list.js\";\nimport { TaskLiveTranscript } from \"./task-live-transcript.js\";\nimport { TaskNavigation } from \"./task-navigation.js\";\nimport { taskDisplayText, taskLabel, taskMetricsText, taskModelText, taskStatusAppearance } from \"./task-row.js\";\n\n/** Focused view only. The store and original session remain the authorities. */\nexport class TaskInspector implements Component {\n\treadonly navigation: TaskNavigation;\n\tprivate actionIndex = 0;\n\tprivate confirmation?: (answer: boolean) => void;\n\tprivate transcript?: Component[];\n\tprivate liveTranscript?: TaskLiveTranscript;\n\tprivate transcriptRefreshPending = false;\n\tprivate transcriptRequested = false;\n\tprivate transcriptLoading = false;\n\tprivate transcriptHistorical = false;\n\tprivate transcriptPageRows = 5;\n\tprivate cursor?: string;\n\tprivate status = \"\";\n\tprivate scroll = 0;\n\tprivate detailContent: Omit<TaskDetailContent, \"stdinAvailable\"> = {};\n\tprivate detailTaskId?: TaskId;\n\tprivate detailGeneration = 0;\n\tprivate disposed = false;\n\tprivate statusWatch?: { taskId: TaskId; release: () => void };\n\tprivate readonly input = new Input();\n\tprivate readonly unsubscribe: () => void;\n\tconstructor(\n\t\tprivateStore: OwnerTaskStore,\n\t\tprivateRender: () => void,\n\t\tprivateClose: () => void,\n\t\topenQuestion?: (route: PromptRoute) => void,\n\t) {\n\t\tthis.store = privateStore;\n\t\tthis.requestRender = privateRender;\n\t\tthis.close = privateClose;\n\t\tthis.navigation = new TaskNavigation(getKeybindings() as KeybindingsManager, {\n\t\t\tinspect: () => {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.actionIndex = 0;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t},\n\t\t\ttranscript: () => {\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadTranscript();\n\t\t\t},\n\t\t\tforeground: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok)\n\t\t\t\t\tvoid this.store.supervisor.foregroundTask(lease.value).then((result) => {\n\t\t\t\t\t\tthis.status = result.ok ? result.value.kind : result.error.message;\n\t\t\t\t\t\tthis.requestRender();\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tconfirmCancel: () =>\n\t\t\t\tnew Promise<boolean>((resolve) => {\n\t\t\t\t\tthis.confirmation = resolve;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}),\n\t\t\tcancel: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\tif (lease.ok) void this.store.supervisor.cancelTask(lease.value, \"user\").then(() => this.requestRender());\n\t\t\t},\n\t\t\tstdinAvailable: (task) => {\n\t\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t\t\t},\n\t\t\tinput: () => {\n\t\t\t\tthis.input.setValue(\"\");\n\t\t\t},\n\t\t\topenQuestion: (route) => {\n\t\t\t\tif (openQuestion) {\n\t\t\t\t\tthis.close();\n\t\t\t\t\topenQuestion(route);\n\t\t\t\t} else this.status = \"Question is available in its owning session.\";\n\t\t\t},\n\t\t});\n\t\tthis.unsubscribe = this.store.subscribe(() => {\n\t\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.refreshTranscript();\n\t\t\t} else if (this.navigation.focus.kind === \"detail\") void this.loadDetail();\n\t\t\tthis.requestRender();\n\t\t});\n\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\tthis.navigation.open();\n\t\tthis.input.onSubmit = (text) => {\n\t\t\tvoid this.sendInput(text);\n\t\t};\n\t}\n\tprivate readonly store: OwnerTaskStore;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly close: () => void;\n\topen(id?: TaskId): void {\n\t\tthis.navigation.open(id);\n\t}\n\tprivate orderedSections(): TaskListSection[] {\n\t\treturn taskListSections(this.store.backgroundTasks, this.store.settlementOrder);\n\t}\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.releaseStatusWatch();\n\t\tthis.releaseLiveTranscript();\n\t\tthis.confirmation?.(false);\n\t\tthis.unsubscribe();\n\t}\n\tinvalidate(): void {\n\t\tfor (const component of this.transcript ?? []) component.invalidate();\n\t}\n\tprivate selected() {\n\t\treturn this.store.backgroundTasks.find((task) => task.ref.taskId === this.navigation.selectedTaskId);\n\t}\n\tprivate stdinAvailable(): boolean {\n\t\tconst task = this.selected();\n\t\tif (!task || task.execution.kind === \"settled\") return false;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\treturn lease.ok && this.store.supervisor.taskStdin(lease.value).ok;\n\t}\n\tprivate async sendInput(text: string): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst stdin = this.store.supervisor.taskStdin(lease.value);\n\t\tif (!stdin.ok) {\n\t\t\tthis.status = stdin.error.message;\n\t\t\treturn;\n\t\t}\n\t\tconst result = await this.store.supervisor.writeTaskInput(stdin.value, randomUUID() as OperationId, {\n\t\t\tkind: \"bytes\",\n\t\t\tbytes: Buffer.from(`${text}\\n`),\n\t\t});\n\t\tthis.status = result.ok ? `Sent ${result.value.acceptedBytes} bytes` : result.error.message;\n\t\tthis.input.setValue(\"\");\n\t\tthis.requestRender();\n\t}\n\tprivate releaseStatusWatch(): void {\n\t\tthis.statusWatch?.release();\n\t\tthis.statusWatch = undefined;\n\t}\n\t/**\n\t * The selected task's own extension statuses, as the row under its fullscreen page's footer. The\n\t * compact picker and confirmation page show none. A write repaints the page while it is shown.\n\t */\n\tprivate taskStatusRows(width: number): string[] {\n\t\tconst task = this.navigation.focus.kind === \"detail\" && !this.confirmation ? this.selected() : undefined;\n\t\tconst lease = task?.kind === \"agent\" ? this.store.resolveTask(task.ref.taskId) : undefined;\n\t\tif (!task || !lease?.ok) {\n\t\t\tthis.releaseStatusWatch();\n\t\t\treturn [];\n\t\t}\n\t\tif (this.statusWatch?.taskId !== task.ref.taskId) {\n\t\t\tthis.releaseStatusWatch();\n\t\t\tthis.statusWatch = {\n\t\t\t\ttaskId: task.ref.taskId,\n\t\t\t\trelease: watchTaskExtensionStatuses(lease.value, () => this.requestRender()),\n\t\t\t};\n\t\t}\n\t\tconst row = renderExtensionStatusRow(taskExtensionStatuses(lease.value), width);\n\t\treturn row === undefined ? [] : [row];\n\t}\n\tprivate releaseLiveTranscript(): void {\n\t\tthis.liveTranscript?.dispose();\n\t\tthis.liveTranscript = undefined;\n\t\tthis.transcriptRefreshPending = false;\n\t}\n\tprivate refreshTranscript(): void {\n\t\tif (this.disposed || !this.transcriptRequested) return;\n\t\tconst task = this.selected();\n\t\tconst lease = task && this.store.resolveTask(task.ref.taskId);\n\t\tconst bound = lease?.ok ? taskTranscriptSource(lease.value) : undefined;\n\t\tif (bound?.ok && this.liveTranscript?.source === bound.value.session) return;\n\t\t// Legacy history-only sources have no live tail; keep their retained page anchored.\n\t\tif (bound?.ok && !bound.value.session.subscribe && this.transcriptHistorical) return;\n\t\tif (this.transcriptLoading) this.transcriptRefreshPending = true;\n\t\telse void this.loadTranscript();\n\t}\n\tprivate async loadTranscript(earlier = false): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tthis.transcriptRequested = true;\n\t\tthis.transcriptLoading = true;\n\t\tif (earlier) this.transcriptHistorical = true;\n\t\tthis.requestRender();\n\t\ttry {\n\t\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\t\tif (!lease.ok) {\n\t\t\t\tthis.status = lease.error.message;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (task.kind === \"command\") {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst page = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst text = page.ok ? taskOutputText(page.value) : page.error.message;\n\t\t\t\tthis.transcript = [\n\t\t\t\t\tnew Text(text.split(\"\\n\").map(taskDisplayText).join(\"\\n\") || \"No output available\", 0, 0),\n\t\t\t\t];\n\t\t\t\tthis.cursor = undefined;\n\t\t\t\tthis.status =\n\t\t\t\t\tcount > 8192n ? \"Earlier output omitted · showing retained 8 KiB tail\" : \"Retained shell output\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst page = readTaskTranscriptSnapshot(lease.value, earlier ? this.cursor : undefined);\n\t\t\tif (\n\t\t\t\tthis.disposed ||\n\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tconst bound = taskTranscriptSource(lease.value);\n\t\t\tif (!bound.ok || (!page.ok && !bound.value.session.subscribe)) {\n\t\t\t\tthis.status = \"Transcript unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst ids = new Set(page.ok ? page.value.items.map((item) => item.source.entryId) : []);\n\t\t\tconst messages = bound.value.session.getEntries().flatMap<AgentMessage>((entry) => {\n\t\t\t\tif (entry.type !== \"message\" || !ids.has(entry.id)) return [];\n\t\t\t\tconst message = entry.message;\n\t\t\t\tif (message.role === \"assistant\")\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\tcontent: message.content.filter(\n\t\t\t\t\t\t\t\t(block, index) =>\n\t\t\t\t\t\t\t\t\tblock.type !== \"thinking\" &&\n\t\t\t\t\t\t\t\t\tpage.ok &&\n\t\t\t\t\t\t\t\t\tpage.value.items.some(\n\t\t\t\t\t\t\t\t\t\t(item) => item.source.entryId === entry.id && item.source.contentIndex === index,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\treturn message.role === \"user\" || message.role === \"toolResult\" ? [message] : [];\n\t\t\t});\n\t\t\tconst components = chatEntriesFromAgentMessages(messages).map((entry) =>\n\t\t\t\trenderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (!earlier && bound.value.session.subscribe) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.liveTranscript = new TaskLiveTranscript(bound.value.session, messages, this.requestRender);\n\t\t\t\tthis.transcript = [this.liveTranscript];\n\t\t\t} else this.transcript = earlier ? [...components, ...(this.transcript ?? [])] : components;\n\t\t\tthis.cursor = page.ok ? page.value.nextCursor : undefined;\n\t\t\tthis.status = this.cursor ? \"PageUp: earlier retained messages\" : \"\";\n\t\t\tthis.requestRender();\n\t\t} catch {\n\t\t\tif (!this.disposed && generation === this.detailGeneration && focus === this.navigation.focus) {\n\t\t\t\tthis.transcript = [];\n\t\t\t\tthis.status = \"Task output unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (generation === this.detailGeneration) {\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tif (this.transcriptRefreshPending) {\n\t\t\t\t\tthis.transcriptRefreshPending = false;\n\t\t\t\t\tthis.refreshTranscript();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async loadDetail(): Promise<void> {\n\t\tconst selectedId = this.selected()?.ref.taskId;\n\t\tif (selectedId !== this.detailTaskId) {\n\t\t\tthis.detailContent = {};\n\t\t\tthis.detailTaskId = selectedId;\n\t\t}\n\t\tthis.status = \"\";\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst current = () =>\n\t\t\t!this.disposed &&\n\t\t\tgeneration === this.detailGeneration &&\n\t\t\tthis.navigation.focus === focus &&\n\t\t\tfocus.kind === \"detail\" &&\n\t\t\tthis.navigation.selectedTaskId === task.ref.taskId;\n\t\tconst lease = this.store.resolveTask(task.ref.taskId);\n\t\tif (!lease.ok) return;\n\t\tconst ownEntries = taskOwnTranscriptEntries(lease.value);\n\t\tif (ownEntries) {\n\t\t\tconst prompt = ownEntries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\t\t\tif (prompt?.type === \"message\" && prompt.message.role === \"user\")\n\t\t\t\tthis.detailContent.prompt =\n\t\t\t\t\ttypeof prompt.message.content === \"string\"\n\t\t\t\t\t\t? prompt.message.content\n\t\t\t\t\t\t: prompt.message.content\n\t\t\t\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t\t\t\t.join(\"\");\n\t\t\tconst response = ownEntries\n\t\t\t\t.slice()\n\t\t\t\t.reverse()\n\t\t\t\t.find((entry) => entry.type === \"message\" && entry.message.role === \"assistant\");\n\t\t\tif (response?.type === \"message\" && response.message.role === \"assistant\")\n\t\t\t\tthis.detailContent.output = response.message.content\n\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t.map((block) => block.text)\n\t\t\t\t\t.join(\"\");\n\t\t}\n\t\tif (task.kind === \"command\") {\n\t\t\ttry {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst output = await this.store.supervisor.readTaskOutput(lease.value, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (!current()) return;\n\t\t\t\tif (output.ok) {\n\t\t\t\t\tthis.detailContent.output = taskOutputText(output.value);\n\t\t\t\t\tthis.detailContent.outputOmitted = count > 8192n || output.value.omittedRanges.length > 0;\n\t\t\t\t} else this.status = output.error.message;\n\t\t\t} catch {\n\t\t\t\tif (!current()) return;\n\t\t\t\tthis.status = \"Command output unavailable\";\n\t\t\t}\n\t\t}\n\t\tif (current()) this.requestRender();\n\t}\n\thandleInput(data: string): boolean {\n\t\tif (this.confirmation) {\n\t\t\tif (data === \"y\" || data === \"n\" || matchesKey(data, \"escape\")) {\n\t\t\t\tconst answer = this.confirmation;\n\t\t\t\tthis.confirmation = undefined;\n\t\t\t\tanswer(data === \"y\");\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst wheel = mouseWheelDeltaRows(data);\n\t\tif (wheel !== 0) {\n\t\t\tif (this.navigation.focus.kind === \"tasks\") this.navigation.moveSelection(Math.sign(wheel));\n\t\t\telse if (this.navigation.focus.kind === \"detail\") {\n\t\t\t\tif (this.transcriptRequested && wheel < 0 && this.scroll === 0 && this.cursor && !this.transcriptLoading)\n\t\t\t\t\tvoid this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll + wheel);\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\t// Mouse reports are never text input, including horizontal wheel/release.\n\t\tif (/^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\")) return true;\n\t\tif (\n\t\t\tmatchesKey(data, \"escape\") ||\n\t\t\t(matchesKey(data, \"left\") && this.navigation.focus.kind !== \"stdin\" && !this.configuredTaskKey(data))\n\t\t) {\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t} else {\n\t\t\t\tthis.navigation.handleInput(\"\\x1b\", \"tasks\");\n\t\t\t\tif (this.navigation.focus.kind === \"composer\") this.close();\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.navigation.focus.kind === \"stdin\") {\n\t\t\tthis.input.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"x\" && !this.configuredTaskKey(data)) {\n\t\t\tvoid this.navigation.activate(\"cancel\");\n\t\t\treturn true;\n\t\t}\n\t\tif (this.transcriptRequested) {\n\t\t\tif (this.configuredTaskKey(data)) this.navigation.handleInput(data, \"tasks\");\n\t\t\telse if (matchesKey(data, \"up\")) this.scroll = Math.max(0, this.scroll - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.scroll++;\n\t\t\telse if (matchesKey(data, \"pageUp\")) {\n\t\t\t\tif (this.scroll === 0 && this.cursor && !this.transcriptLoading) void this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll - this.transcriptPageRows);\n\t\t\t} else if (matchesKey(data, \"pageDown\")) this.scroll += this.transcriptPageRows;\n\t\t\telse if (matchesKey(data, \"home\")) this.scroll = 0;\n\t\t\telse if (matchesKey(data, \"end\")) this.scroll = Number.MAX_SAFE_INTEGER;\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst task = this.selected();\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\tconst actions = taskDetailActions(task.execution, task.attention, this.stdinAvailable());\n\t\t\tif (this.configuredTaskKey(data)) {\n\t\t\t\tif (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\t\telse this.navigation.handleInput(data, \"tasks\");\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"pageUp\") || matchesKey(data, \"pageDown\")) {\n\t\t\t\tthis.scroll = Math.max(0, this.scroll + (matchesKey(data, \"pageUp\") ? -5 : 5));\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"up\")) this.actionIndex = Math.max(0, this.actionIndex - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.actionIndex = Math.min(actions.length - 1, this.actionIndex + 1);\n\t\t\telse if (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\telse if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\t} else if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\tthis.requestRender();\n\t\treturn true;\n\t}\n\tprivate configuredTaskKey(data: string): boolean {\n\t\treturn ([\"app.tasks.inspect\", \"app.tasks.foreground\", \"app.tasks.cancel\", \"app.tasks.input\"] as const).some(\n\t\t\t(key) => getKeybindings().matches(data, key),\n\t\t);\n\t}\n\t/** Only the task picker stays inline; drill-down and confirmation own the screen. */\n\tget fullscreen(): boolean {\n\t\treturn (\n\t\t\tthis.confirmation !== undefined ||\n\t\t\tthis.navigation.focus.kind === \"detail\" ||\n\t\t\tthis.navigation.focus.kind === \"stdin\"\n\t\t);\n\t}\n\trenderPicker(width: number, availableRows: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(1, Math.min(12, availableRows)));\n\t}\n\trender(width: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(3, (process.stdout.rows || 24) - 5));\n\t}\n\tprivate renderTranscriptViewport(width: number, budget: number): string[] {\n\t\tconst task = this.selected();\n\t\tconst statusRows = this.taskStatusRows(width);\n\t\tconst room = Math.max(1, budget - 5 - statusRows.length);\n\t\tthis.transcriptPageRows = room;\n\t\tconst rows = this.transcript?.flatMap((component) => component.render(width)) ?? [\n\t\t\tthis.transcriptLoading ? \"Loading transcript…\" : this.status,\n\t\t];\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - room));\n\t\tconst visible = rows.slice(this.scroll, this.scroll + room);\n\t\t// Transcript tools own their backgrounds. Keep them out of a nested box,\n\t\t// strip terminal movement, and reset styles at every viewport row boundary.\n\t\tconst safeLine = (line: string) =>\n\t\t\tline\n\t\t\t\t.split(/(\\x1b\\[[0-9;:]*m)/g)\n\t\t\t\t.map((part, index) =>\n\t\t\t\t\tindex % 2 ? part : stripVTControlCharacters(part).replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \"),\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\tconst fit = (line: string) => truncateToWidth(safeLine(line), Math.max(1, width)) + \"\\x1b[0m\";\n\t\treturn [\n\t\t\ttheme.bold(`Transcript · ${task ? taskDisplayText(taskLabel(task)) : \"Task\"}`),\n\t\t\ttask ? taskDetailSummary(task) : \"\",\n\t\t\ttheme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, width))),\n\t\t\t...visible,\n\t\t\t...Array.from({ length: Math.max(0, room - visible.length) }, () => \"\"),\n\t\t\ttheme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t`Lines ${rows.length ? this.scroll + 1 : 0}–${Math.min(rows.length, this.scroll + room)} of ${rows.length}${this.cursor ? \" · PgUp at top: earlier history\" : \"\"}${this.status ? ` · ${this.status}` : \"\"}`,\n\t\t\t),\n\t\t\ttheme.fg(\"dim\", \"↑↓ scroll · PgUp/PgDn page · Home/End · ←/Esc back\"),\n\t\t\t...statusRows,\n\t\t]\n\t\t\t.map(fit)\n\t\t\t.slice(0, Math.max(1, budget));\n\t}\n\trenderViewport(width: number, budget: number): string[] {\n\t\tif (this.transcriptRequested && !this.confirmation && this.navigation.focus.kind === \"detail\")\n\t\t\treturn this.renderTranscriptViewport(width, budget);\n\t\tconst framed = width >= 20 && budget >= 7;\n\t\tconst inner = Math.max(1, width - (framed ? 4 : 0));\n\t\tconst current = this.selected();\n\t\tconst detail = this.navigation.focus.kind === \"detail\";\n\t\tconst selectingAction = current && detail && !this.transcriptRequested && !this.confirmation;\n\t\tconst actions = selectingAction\n\t\t\t? taskDetailActions(current.execution, current.attention, this.stdinAvailable())\n\t\t\t: [];\n\t\tthis.actionIndex = Math.max(0, Math.min(this.actionIndex, actions.length - 1));\n\t\tconst action = actions[this.actionIndex];\n\t\tconst actionRow = action ? [theme.fg(\"accent\", `› ${taskDetailLabels[action]}`)] : [];\n\t\tconst rows = this.renderAll(inner);\n\t\tconst compactSummary = !framed && detail && current && budget >= 4 ? [taskDetailSummary(current)] : [];\n\t\tconst statusRows = this.taskStatusRows(width);\n\t\tconst height = Math.max(\n\t\t\t0,\n\t\t\tbudget - (framed ? 4 : 1) - actionRow.length - compactSummary.length - statusRows.length,\n\t\t);\n\t\tconst selected = detail ? -1 : rows.findIndex((row) => stripVTControlCharacters(row).startsWith(\"›\"));\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - height));\n\t\tconst selectionRows = Math.min(height, current?.kind === \"agent\" ? 3 : 2);\n\t\tconst offset = detail ? this.scroll : Math.max(0, selected + selectionRows - height);\n\t\tconst view = rows.slice(offset, offset + height);\n\t\tconst inspect = keyHintIfBound(\"app.tasks.inspect\", detail ? \"select\" : \"view\");\n\t\tconst hints = this.confirmation\n\t\t\t? \"y confirm · n/Esc keep running\"\n\t\t\t: this.navigation.focus.kind === \"stdin\"\n\t\t\t\t? \"Enter send · Esc back\"\n\t\t\t\t: this.transcriptRequested\n\t\t\t\t\t? \"↑↓ scroll · PgUp/PgDn page · ←/Esc back\"\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tdetail ? \"PgUp/PgDn scroll · ↑↓ actions\" : \"↑↓ select\",\n\t\t\t\t\t\t\tinspect,\n\t\t\t\t\t\t\tcurrent && current.execution.kind !== \"settled\"\n\t\t\t\t\t\t\t\t? keyHintIfBound(\"app.tasks.cancel\", \"stop\") || (!this.configuredTaskKey(\"x\") ? \"x stop\" : \"\")\n\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\"Esc back\",\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" · \");\n\t\tconst footer = theme.fg(\"dim\", truncateToWidth(`/tasks · ${hints}`, width));\n\t\tif (!framed)\n\t\t\treturn [...compactSummary, ...view, ...actionRow, footer, ...statusRows]\n\t\t\t\t.map((line) => truncateToWidth(line, width))\n\t\t\t\t.slice(-Math.max(1, budget));\n\t\tconst live = this.store.backgroundTasks.filter((task) => task.execution.kind !== \"settled\").length;\n\t\tconst title =\n\t\t\tdetail && current\n\t\t\t\t? `${taskDisplayText(taskLabel(current))} › ${taskDisplayText(current.title)}`\n\t\t\t\t: \"Background tasks\";\n\t\tconst heading = ` ${truncateToWidth(title, Math.max(1, width - 5))} `;\n\t\tconst border = (text: string) => theme.fg(\"borderMuted\", text);\n\t\tconst frameRow = (line: string) => {\n\t\t\tconst text = truncateToWidth(line, inner);\n\t\t\treturn border(\"│ \") + text + \" \".repeat(Math.max(0, inner - visibleWidth(text))) + border(\" │\");\n\t\t};\n\t\treturn [\n\t\t\tborder(\"╭─\") + theme.bold(heading) + border(`${\"─\".repeat(Math.max(0, width - visibleWidth(heading) - 3))}╮`),\n\t\t\tframeRow(\n\t\t\t\tdetail && current\n\t\t\t\t\t? taskDetailSummary(current)\n\t\t\t\t\t: theme.fg(\"muted\", `${live} active · ${this.store.backgroundTasks.length} total`),\n\t\t\t),\n\t\t\t...view.map(frameRow),\n\t\t\t...actionRow.map(frameRow),\n\t\t\tborder(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`),\n\t\t\tfooter,\n\t\t\t...statusRows,\n\t\t].map((line) => truncateToWidth(line, width));\n\t}\n\tprivate renderAll(width: number): string[] {\n\t\tconst task = this.selected();\n\t\tif (this.confirmation)\n\t\t\treturn new Text(\n\t\t\t\t`Cancel ${task?.title}\\nTask ${task?.ref.taskId}\\ny: confirm · n/Escape: keep running`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t).render(width);\n\t\tif (this.navigation.focus.kind === \"stdin\")\n\t\t\treturn [`Input to ${task?.title} · Escape: tasks`, ...this.input.render(width), this.status];\n\t\tif (this.transcript) return [...this.transcript.flatMap((component) => component.render(width)), this.status];\n\t\tif (this.transcriptRequested)\n\t\t\treturn [this.transcriptLoading ? \"Loading transcript…\" : this.status || \"Transcript unavailable\"];\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\treturn [\n\t\t\t\t...new TaskDetail(task, {\n\t\t\t\t\t...this.detailContent,\n\t\t\t\t\tstdinAvailable: this.stdinAvailable(),\n\t\t\t\t\tactivity: this.store.recentActivity(task.ref.taskId),\n\t\t\t\t\tactivityOmitted: this.store.activityOmitted(task.ref.taskId),\n\t\t\t\t}).renderContent(width),\n\t\t\t\tthis.status,\n\t\t\t];\n\t\t}\n\t\tconst sections = this.orderedSections();\n\t\tif (!sections.length)\n\t\t\treturn new Text(\"No background tasks.\\nBackground agents and shells will appear here.\", 0, 0).render(width);\n\t\treturn sections.flatMap((section) => [\n\t\t\t\"\",\n\t\t\ttheme.fg(\"muted\", theme.bold(`${section.title} (${section.tasks.length})`)),\n\t\t\t...section.tasks.flatMap((item) => {\n\t\t\t\tconst selected = item.ref.taskId === this.navigation.selectedTaskId;\n\t\t\t\tconst { label: state, color, icon } = taskStatusAppearance(item);\n\t\t\t\tconst status = width < 32 ? ` ${icon}` : ` ${icon} ${state}`;\n\t\t\t\tconst name = taskDisplayText(item.title || taskLabel(item));\n\t\t\t\tconst marker = selected ? \"› \" : \" \";\n\t\t\t\tconst title = marker + truncateToWidth(name, Math.max(1, width - visibleWidth(status) - 3));\n\t\t\t\tconst row = `${selected ? theme.fg(\"accent\", theme.bold(title)) : title}${\" \".repeat(Math.max(1, width - visibleWidth(title) - visibleWidth(status)))}${theme.fg(color, status)}`;\n\t\t\t\tconst metadata = [\n\t\t\t\t\t...(width < 32 ? [state] : []),\n\t\t\t\t\ttaskLabel(item),\n\t\t\t\t\ttaskMetricsText(item),\n\t\t\t\t\titem.currentAction ? `${item.currentAction.tool} ${item.currentAction.text}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" · \");\n\t\t\t\treturn [\n\t\t\t\t\ttruncateToWidth(row, width),\n\t\t\t\t\t...(item.kind === \"agent\" ? [theme.fg(\"dim\", truncateToWidth(` ${taskModelText(item)}`, width))] : []),\n\t\t\t\t\t...(selected ? [theme.fg(\"dim\", truncateToWidth(` ${taskDisplayText(metadata)}`, width))] : []),\n\t\t\t\t];\n\t\t\t}),\n\t\t]);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"task-inspector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/task-inspector.ts"],"names":[],"mappings":"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","sourcesContent":["import { stripVTControlCharacters } from \"node:util\";\nimport {\n\ttype Component,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { PromptRoute, TaskId } from \"../../../core/tasks/contracts.js\";\nimport { OwnerTaskStore } from \"../../../core/tasks/owner-store.js\";\nimport { ownerTaskViewSource, type TaskViewSource } from \"../../../core/tasks/task-view-source.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { chatEntriesFromAgentMessages, renderChatMessageEntry } from \"./chat-message-renderer.ts\";\nimport { mouseWheelDeltaRows } from \"./chat-transcript.js\";\nimport { renderExtensionStatusRow } from \"./footer.ts\";\nimport { keyHintIfBound } from \"./keybinding-hints.js\";\nimport {\n\tTaskDetail,\n\ttype TaskDetailContent,\n\ttaskDetailActions,\n\ttaskDetailLabels,\n\ttaskDetailSummary,\n} from \"./task-detail.js\";\nimport { type TaskListSection, taskListSections } from \"./task-list.js\";\nimport { TaskLiveTranscript } from \"./task-live-transcript.js\";\nimport { TaskNavigation } from \"./task-navigation.js\";\nimport { taskDisplayText, taskLabel, taskMetricsText, taskModelText, taskStatusAppearance } from \"./task-row.js\";\n\n/** Focused view only. The task source and original session remain the authorities. */\nexport class TaskInspector implements Component {\n\treadonly navigation: TaskNavigation;\n\tprivate actionIndex = 0;\n\tprivate confirmation?: (answer: boolean) => void;\n\tprivate transcript?: Component[];\n\tprivate liveTranscript?: TaskLiveTranscript;\n\tprivate transcriptRefreshPending = false;\n\tprivate transcriptRequested = false;\n\tprivate transcriptLoading = false;\n\tprivate transcriptHistorical = false;\n\tprivate transcriptPageRows = 5;\n\tprivate cursor?: string;\n\tprivate status = \"\";\n\t/** Why the last stop did not reach its task; shown under the list until the next key. */\n\tprivate stopFailure = \"\";\n\tprivate scroll = 0;\n\tprivate detailContent: Omit<TaskDetailContent, \"stdinAvailable\"> = {};\n\tprivate detailTaskId?: TaskId;\n\tprivate detailGeneration = 0;\n\tprivate disposed = false;\n\tprivate statusWatch?: { taskId: TaskId; release: () => void };\n\tprivate readonly input = new Input();\n\tprivate readonly unsubscribe: () => void;\n\tconstructor(\n\t\tprivateStore: OwnerTaskStore | TaskViewSource,\n\t\tprivateRender: () => void,\n\t\tprivateClose: () => void,\n\t\topenQuestion?: (route: PromptRoute) => void,\n\t) {\n\t\tthis.store = privateStore instanceof OwnerTaskStore ? ownerTaskViewSource(privateStore) : privateStore;\n\t\tthis.requestRender = privateRender;\n\t\tthis.close = privateClose;\n\t\tthis.navigation = new TaskNavigation(getKeybindings() as KeybindingsManager, {\n\t\t\tinspect: () => {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.actionIndex = 0;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t},\n\t\t\ttranscript: () => {\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadTranscript();\n\t\t\t},\n\t\t\tforeground: (task) => {\n\t\t\t\tvoid this.store.foregroundTask(task.ref.taskId).then((result) => {\n\t\t\t\t\tthis.status = result.ok ? result.value.kind : result.error.message;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t});\n\t\t\t},\n\t\t\tconfirmCancel: () =>\n\t\t\t\tnew Promise<boolean>((resolve) => {\n\t\t\t\t\tthis.confirmation = resolve;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}),\n\t\t\tcancel: (task) => {\n\t\t\t\tvoid this.store.cancelTask(task.ref.taskId).then((result) => {\n\t\t\t\t\t// A stop that did not reach the task says so, instead of leaving it looking untouched.\n\t\t\t\t\tthis.stopFailure = result.ok ? \"\" : `Could not stop the task: ${result.error.message}`;\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t});\n\t\t\t},\n\t\t\tstdinAvailable: (task) => this.store.stdinAvailable(task.ref.taskId),\n\t\t\tinput: () => {\n\t\t\t\tthis.input.setValue(\"\");\n\t\t\t},\n\t\t\topenQuestion: (route) => {\n\t\t\t\tif (openQuestion) {\n\t\t\t\t\tthis.close();\n\t\t\t\t\topenQuestion(route);\n\t\t\t\t} else this.status = \"Question is available in its owning session.\";\n\t\t\t},\n\t\t});\n\t\tthis.unsubscribe = this.store.subscribe(() => {\n\t\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.refreshTranscript();\n\t\t\t} else if (this.navigation.focus.kind === \"detail\") void this.loadDetail();\n\t\t\tthis.requestRender();\n\t\t});\n\t\tthis.navigation.update(this.orderedSections().flatMap((section) => section.tasks));\n\t\tthis.navigation.open();\n\t\tthis.input.onSubmit = (text) => {\n\t\t\tvoid this.sendInput(text);\n\t\t};\n\t}\n\tprivate readonly store: TaskViewSource;\n\tprivate readonly requestRender: () => void;\n\tprivate readonly close: () => void;\n\topen(id?: TaskId): void {\n\t\tthis.navigation.open(id);\n\t}\n\tprivate orderedSections(): TaskListSection[] {\n\t\treturn taskListSections(this.store.backgroundTasks, this.store.settlementOrder);\n\t}\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.releaseStatusWatch();\n\t\tthis.releaseLiveTranscript();\n\t\tthis.confirmation?.(false);\n\t\tthis.unsubscribe();\n\t}\n\tinvalidate(): void {\n\t\tfor (const component of this.transcript ?? []) component.invalidate();\n\t}\n\tprivate selected() {\n\t\treturn this.store.backgroundTasks.find((task) => task.ref.taskId === this.navigation.selectedTaskId);\n\t}\n\tprivate stdinAvailable(): boolean {\n\t\tconst task = this.selected();\n\t\tif (!task || task.execution.kind === \"settled\") return false;\n\t\treturn this.store.stdinAvailable(task.ref.taskId);\n\t}\n\tprivate async sendInput(text: string): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst result = await this.store.writeTaskInput(task.ref.taskId, text);\n\t\tthis.status = result.ok ? `Sent ${result.value.acceptedBytes} bytes` : result.error.message;\n\t\tthis.input.setValue(\"\");\n\t\tthis.requestRender();\n\t}\n\tprivate releaseStatusWatch(): void {\n\t\tthis.statusWatch?.release();\n\t\tthis.statusWatch = undefined;\n\t}\n\t/**\n\t * The selected task's own extension statuses, as the row under its fullscreen page's footer. The\n\t * compact picker and confirmation page show none. A write repaints the page while it is shown.\n\t */\n\tprivate taskStatusRows(width: number): string[] {\n\t\tconst task = this.navigation.focus.kind === \"detail\" && !this.confirmation ? this.selected() : undefined;\n\t\tif (task?.kind !== \"agent\") {\n\t\t\tthis.releaseStatusWatch();\n\t\t\treturn [];\n\t\t}\n\t\tif (this.statusWatch?.taskId !== task.ref.taskId) {\n\t\t\tthis.releaseStatusWatch();\n\t\t\tthis.statusWatch = {\n\t\t\t\ttaskId: task.ref.taskId,\n\t\t\t\trelease: this.store.watchExtensionStatuses(task.ref.taskId, () => this.requestRender()),\n\t\t\t};\n\t\t}\n\t\tconst row = renderExtensionStatusRow(this.store.extensionStatuses(task.ref.taskId), width);\n\t\treturn row === undefined ? [] : [row];\n\t}\n\tprivate releaseLiveTranscript(): void {\n\t\tthis.liveTranscript?.dispose();\n\t\tthis.liveTranscript = undefined;\n\t\tthis.transcriptRefreshPending = false;\n\t}\n\tprivate refreshTranscript(): void {\n\t\tif (this.disposed || !this.transcriptRequested) return;\n\t\tconst task = this.selected();\n\t\tconst follow = task && this.store.followTaskTranscript(task.ref.taskId);\n\t\tif (follow?.session !== undefined && this.liveTranscript?.source === follow.session) return;\n\t\t// History-only sources have no live tail; keep their retained page anchored.\n\t\tif (follow?.historyOnly === true && this.transcriptHistorical) return;\n\t\tif (this.transcriptLoading) this.transcriptRefreshPending = true;\n\t\telse void this.loadTranscript();\n\t}\n\tprivate async loadTranscript(earlier = false): Promise<void> {\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tthis.transcriptRequested = true;\n\t\tthis.transcriptLoading = true;\n\t\tif (earlier) this.transcriptHistorical = true;\n\t\tthis.requestRender();\n\t\ttry {\n\t\t\tif (task.kind === \"command\") {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst page = await this.store.readTaskOutput(task.ref.taskId, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tthis.disposed ||\n\t\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst text = page.ok ? page.value.text : page.error.message;\n\t\t\t\tthis.transcript = [\n\t\t\t\t\tnew Text(text.split(\"\\n\").map(taskDisplayText).join(\"\\n\") || \"No output available\", 0, 0),\n\t\t\t\t];\n\t\t\t\tthis.cursor = undefined;\n\t\t\t\tthis.status =\n\t\t\t\t\tcount > 8192n ? \"Earlier output omitted · showing retained 8 KiB tail\" : \"Retained shell output\";\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst read = this.store.readTaskTranscript(task.ref.taskId, earlier ? this.cursor : undefined);\n\t\t\tconst page = read instanceof Promise ? await read : read;\n\t\t\tif (\n\t\t\t\tthis.disposed ||\n\t\t\t\tgeneration !== this.detailGeneration ||\n\t\t\t\tfocus !== this.navigation.focus ||\n\t\t\t\ttask.ref.taskId !== this.navigation.selectedTaskId\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tif (!page.ok) {\n\t\t\t\tthis.status = page.error.message;\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst messages = [...page.value.messages];\n\t\t\tconst follow = this.store.followTaskTranscript(task.ref.taskId);\n\t\t\tconst components = chatEntriesFromAgentMessages(messages).map((entry) =>\n\t\t\t\trenderChatMessageEntry(entry, {\n\t\t\t\t\tui: { requestRender: this.requestRender },\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\thideThinkingBlock: true,\n\t\t\t\t\ttoolOutputExpanded: true,\n\t\t\t\t\tshowImages: false,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (!earlier && follow?.session?.subscribe) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.liveTranscript = new TaskLiveTranscript(follow.session, messages, this.requestRender);\n\t\t\t\tthis.transcript = [this.liveTranscript];\n\t\t\t} else this.transcript = earlier ? [...components, ...(this.transcript ?? [])] : components;\n\t\t\tthis.cursor = page.value.nextCursor;\n\t\t\tthis.status = this.cursor ? \"PageUp: earlier retained messages\" : \"\";\n\t\t\tthis.requestRender();\n\t\t} catch {\n\t\t\tif (!this.disposed && generation === this.detailGeneration && focus === this.navigation.focus) {\n\t\t\t\tthis.transcript = [];\n\t\t\t\tthis.status = \"Task output unavailable\";\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (generation === this.detailGeneration) {\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tif (this.transcriptRefreshPending) {\n\t\t\t\t\tthis.transcriptRefreshPending = false;\n\t\t\t\t\tthis.refreshTranscript();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tprivate async loadDetail(): Promise<void> {\n\t\tconst selectedId = this.selected()?.ref.taskId;\n\t\tif (selectedId !== this.detailTaskId) {\n\t\t\tthis.detailContent = {};\n\t\t\tthis.detailTaskId = selectedId;\n\t\t}\n\t\tthis.status = \"\";\n\t\tconst generation = ++this.detailGeneration;\n\t\tconst focus = this.navigation.focus;\n\t\tconst task = this.selected();\n\t\tif (!task) return;\n\t\tconst current = () =>\n\t\t\t!this.disposed &&\n\t\t\tgeneration === this.detailGeneration &&\n\t\t\tthis.navigation.focus === focus &&\n\t\t\tfocus.kind === \"detail\" &&\n\t\t\tthis.navigation.selectedTaskId === task.ref.taskId;\n\t\tconst read = this.store.taskDetailText(task.ref.taskId);\n\t\tconst own = read instanceof Promise ? await read : read;\n\t\tif (!current()) return;\n\t\tif (own.prompt !== undefined) this.detailContent.prompt = own.prompt;\n\t\tif (own.output !== undefined) this.detailContent.output = own.output;\n\t\tif (task.kind === \"command\") {\n\t\t\ttry {\n\t\t\t\tconst count = BigInt(task.output.byteCount);\n\t\t\t\tconst output = await this.store.readTaskOutput(task.ref.taskId, {\n\t\t\t\t\tstart: String(count > 8192n ? count - 8192n : 0n),\n\t\t\t\t\tmaximumBytes: 8192,\n\t\t\t\t});\n\t\t\t\tif (!current()) return;\n\t\t\t\tif (output.ok) {\n\t\t\t\t\tthis.detailContent.output = output.value.text;\n\t\t\t\t\tthis.detailContent.outputOmitted = count > 8192n || output.value.omitted;\n\t\t\t\t} else this.status = output.error.message;\n\t\t\t} catch {\n\t\t\t\tif (!current()) return;\n\t\t\t\tthis.status = \"Command output unavailable\";\n\t\t\t}\n\t\t}\n\t\tif (current()) this.requestRender();\n\t}\n\thandleInput(data: string): boolean {\n\t\tthis.stopFailure = \"\";\n\t\tif (this.confirmation) {\n\t\t\tif (data === \"y\" || data === \"n\" || matchesKey(data, \"escape\")) {\n\t\t\t\tconst answer = this.confirmation;\n\t\t\t\tthis.confirmation = undefined;\n\t\t\t\tanswer(data === \"y\");\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst wheel = mouseWheelDeltaRows(data);\n\t\tif (wheel !== 0) {\n\t\t\tif (this.navigation.focus.kind === \"tasks\") this.navigation.moveSelection(Math.sign(wheel));\n\t\t\telse if (this.navigation.focus.kind === \"detail\") {\n\t\t\t\tif (this.transcriptRequested && wheel < 0 && this.scroll === 0 && this.cursor && !this.transcriptLoading)\n\t\t\t\t\tvoid this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll + wheel);\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\t// Mouse reports are never text input, including horizontal wheel/release.\n\t\tif (/^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\")) return true;\n\t\tif (\n\t\t\tmatchesKey(data, \"escape\") ||\n\t\t\t(matchesKey(data, \"left\") && this.navigation.focus.kind !== \"stdin\" && !this.configuredTaskKey(data))\n\t\t) {\n\t\t\tif (this.transcriptRequested) {\n\t\t\t\tthis.releaseLiveTranscript();\n\t\t\t\tthis.detailGeneration++;\n\t\t\t\tthis.transcript = undefined;\n\t\t\t\tthis.transcriptRequested = false;\n\t\t\t\tthis.transcriptLoading = false;\n\t\t\t\tthis.transcriptHistorical = false;\n\t\t\t\tthis.scroll = 0;\n\t\t\t\tvoid this.loadDetail();\n\t\t\t} else {\n\t\t\t\tthis.navigation.handleInput(\"\\x1b\", \"tasks\");\n\t\t\t\tif (this.navigation.focus.kind === \"composer\") this.close();\n\t\t\t}\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.navigation.focus.kind === \"stdin\") {\n\t\t\tthis.input.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"x\" && !this.configuredTaskKey(data)) {\n\t\t\tvoid this.navigation.activate(\"cancel\");\n\t\t\treturn true;\n\t\t}\n\t\tif (this.transcriptRequested) {\n\t\t\tif (this.configuredTaskKey(data)) this.navigation.handleInput(data, \"tasks\");\n\t\t\telse if (matchesKey(data, \"up\")) this.scroll = Math.max(0, this.scroll - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.scroll++;\n\t\t\telse if (matchesKey(data, \"pageUp\")) {\n\t\t\t\tif (this.scroll === 0 && this.cursor && !this.transcriptLoading) void this.loadTranscript(true);\n\t\t\t\telse this.scroll = Math.max(0, this.scroll - this.transcriptPageRows);\n\t\t\t} else if (matchesKey(data, \"pageDown\")) this.scroll += this.transcriptPageRows;\n\t\t\telse if (matchesKey(data, \"home\")) this.scroll = 0;\n\t\t\telse if (matchesKey(data, \"end\")) this.scroll = Number.MAX_SAFE_INTEGER;\n\t\t\tthis.requestRender();\n\t\t\treturn true;\n\t\t}\n\t\tconst task = this.selected();\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\tconst actions = taskDetailActions(task.execution, task.attention, this.stdinAvailable());\n\t\t\tif (this.configuredTaskKey(data)) {\n\t\t\t\tif (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\t\telse this.navigation.handleInput(data, \"tasks\");\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"pageUp\") || matchesKey(data, \"pageDown\")) {\n\t\t\t\tthis.scroll = Math.max(0, this.scroll + (matchesKey(data, \"pageUp\") ? -5 : 5));\n\t\t\t\tthis.requestRender();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"up\")) this.actionIndex = Math.max(0, this.actionIndex - 1);\n\t\t\telse if (matchesKey(data, \"down\")) this.actionIndex = Math.min(actions.length - 1, this.actionIndex + 1);\n\t\t\telse if (getKeybindings().matches(data, \"app.tasks.inspect\"))\n\t\t\t\tvoid this.navigation.activate(actions[Math.min(this.actionIndex, actions.length - 1)]);\n\t\t\telse if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\t} else if (!this.navigation.handleInput(data, \"tasks\")) return false;\n\t\tthis.requestRender();\n\t\treturn true;\n\t}\n\tprivate configuredTaskKey(data: string): boolean {\n\t\treturn ([\"app.tasks.inspect\", \"app.tasks.foreground\", \"app.tasks.cancel\", \"app.tasks.input\"] as const).some(\n\t\t\t(key) => getKeybindings().matches(data, key),\n\t\t);\n\t}\n\t/** Only the task picker stays inline; drill-down and confirmation own the screen. */\n\tget fullscreen(): boolean {\n\t\treturn (\n\t\t\tthis.confirmation !== undefined ||\n\t\t\tthis.navigation.focus.kind === \"detail\" ||\n\t\t\tthis.navigation.focus.kind === \"stdin\"\n\t\t);\n\t}\n\trenderPicker(width: number, availableRows: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(1, Math.min(12, availableRows)));\n\t}\n\trender(width: number): string[] {\n\t\treturn this.renderViewport(width, Math.max(3, (process.stdout.rows || 24) - 5));\n\t}\n\tprivate renderTranscriptViewport(width: number, budget: number): string[] {\n\t\tconst task = this.selected();\n\t\tconst statusRows = this.taskStatusRows(width);\n\t\tconst failure = this.stopFailure ? [theme.fg(\"warning\", this.stopFailure)] : [];\n\t\tconst room = Math.max(1, budget - 5 - statusRows.length - failure.length);\n\t\tthis.transcriptPageRows = room;\n\t\tconst rows = this.transcript?.flatMap((component) => component.render(width)) ?? [\n\t\t\tthis.transcriptLoading ? \"Loading transcript…\" : this.status,\n\t\t];\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - room));\n\t\tconst visible = rows.slice(this.scroll, this.scroll + room);\n\t\t// Transcript tools own their backgrounds. Keep them out of a nested box,\n\t\t// strip terminal movement, and reset styles at every viewport row boundary.\n\t\tconst safeLine = (line: string) =>\n\t\t\tline\n\t\t\t\t.split(/(\\x1b\\[[0-9;:]*m)/g)\n\t\t\t\t.map((part, index) =>\n\t\t\t\t\tindex % 2 ? part : stripVTControlCharacters(part).replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \"),\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\tconst fit = (line: string) => truncateToWidth(safeLine(line), Math.max(1, width)) + \"\\x1b[0m\";\n\t\treturn [\n\t\t\ttheme.bold(`Transcript · ${task ? taskDisplayText(taskLabel(task)) : \"Task\"}`),\n\t\t\ttask ? taskDetailSummary(task) : \"\",\n\t\t\ttheme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, width))),\n\t\t\t...visible,\n\t\t\t...Array.from({ length: Math.max(0, room - visible.length) }, () => \"\"),\n\t\t\ttheme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t`Lines ${rows.length ? this.scroll + 1 : 0}–${Math.min(rows.length, this.scroll + room)} of ${rows.length}${this.cursor ? \" · PgUp at top: earlier history\" : \"\"}${this.status ? ` · ${this.status}` : \"\"}`,\n\t\t\t),\n\t\t\ttheme.fg(\"dim\", \"↑↓ scroll · PgUp/PgDn page · Home/End · ←/Esc back\"),\n\t\t\t...failure,\n\t\t\t...statusRows,\n\t\t]\n\t\t\t.map(fit)\n\t\t\t.slice(0, Math.max(1, budget));\n\t}\n\trenderViewport(width: number, budget: number): string[] {\n\t\tif (this.transcriptRequested && !this.confirmation && this.navigation.focus.kind === \"detail\")\n\t\t\treturn this.renderTranscriptViewport(width, budget);\n\t\tconst framed = width >= 20 && budget >= 7;\n\t\tconst inner = Math.max(1, width - (framed ? 4 : 0));\n\t\tconst current = this.selected();\n\t\tconst detail = this.navigation.focus.kind === \"detail\";\n\t\tconst selectingAction = current && detail && !this.transcriptRequested && !this.confirmation;\n\t\tconst actions = selectingAction\n\t\t\t? taskDetailActions(current.execution, current.attention, this.stdinAvailable())\n\t\t\t: [];\n\t\tthis.actionIndex = Math.max(0, Math.min(this.actionIndex, actions.length - 1));\n\t\tconst action = actions[this.actionIndex];\n\t\tconst actionRow = action ? [theme.fg(\"accent\", `› ${taskDetailLabels[action]}`)] : [];\n\t\tconst rows = this.renderAll(inner);\n\t\tconst compactSummary = !framed && detail && current && budget >= 4 ? [taskDetailSummary(current)] : [];\n\t\tconst statusRows = this.taskStatusRows(width);\n\t\tconst height = Math.max(\n\t\t\t0,\n\t\t\tbudget - (framed ? 4 : 1) - actionRow.length - compactSummary.length - statusRows.length,\n\t\t);\n\t\tconst selected = detail ? -1 : rows.findIndex((row) => stripVTControlCharacters(row).startsWith(\"›\"));\n\t\tthis.scroll = Math.min(this.scroll, Math.max(0, rows.length - height));\n\t\tconst selectionRows = Math.min(height, current?.kind === \"agent\" ? 3 : 2);\n\t\tconst offset = detail ? this.scroll : Math.max(0, selected + selectionRows - height);\n\t\tconst view = rows.slice(offset, offset + height);\n\t\tconst inspect = keyHintIfBound(\"app.tasks.inspect\", detail ? \"select\" : \"view\");\n\t\tconst hints = this.confirmation\n\t\t\t? \"y confirm · n/Esc keep running\"\n\t\t\t: this.navigation.focus.kind === \"stdin\"\n\t\t\t\t? \"Enter send · Esc back\"\n\t\t\t\t: this.transcriptRequested\n\t\t\t\t\t? \"↑↓ scroll · PgUp/PgDn page · ←/Esc back\"\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tdetail ? \"PgUp/PgDn scroll · ↑↓ actions\" : \"↑↓ select\",\n\t\t\t\t\t\t\tinspect,\n\t\t\t\t\t\t\tcurrent && current.execution.kind !== \"settled\"\n\t\t\t\t\t\t\t\t? keyHintIfBound(\"app.tasks.cancel\", \"stop\") || (!this.configuredTaskKey(\"x\") ? \"x stop\" : \"\")\n\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\"Esc back\",\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\" · \");\n\t\tconst footer = theme.fg(\"dim\", truncateToWidth(`/tasks · ${hints}`, width));\n\t\tconst failure = this.stopFailure ? [theme.fg(\"warning\", truncateToWidth(this.stopFailure, width))] : [];\n\t\tif (!framed)\n\t\t\treturn [...compactSummary, ...view, ...actionRow, footer, ...failure, ...statusRows]\n\t\t\t\t.map((line) => truncateToWidth(line, width))\n\t\t\t\t.slice(-Math.max(1, budget));\n\t\tconst live = this.store.backgroundTasks.filter((task) => task.execution.kind !== \"settled\").length;\n\t\tconst title =\n\t\t\tdetail && current\n\t\t\t\t? `${taskDisplayText(taskLabel(current))} › ${taskDisplayText(current.title)}`\n\t\t\t\t: \"Background tasks\";\n\t\tconst heading = ` ${truncateToWidth(title, Math.max(1, width - 5))} `;\n\t\tconst border = (text: string) => theme.fg(\"borderMuted\", text);\n\t\tconst frameRow = (line: string) => {\n\t\t\tconst text = truncateToWidth(line, inner);\n\t\t\treturn border(\"│ \") + text + \" \".repeat(Math.max(0, inner - visibleWidth(text))) + border(\" │\");\n\t\t};\n\t\treturn [\n\t\t\tborder(\"╭─\") + theme.bold(heading) + border(`${\"─\".repeat(Math.max(0, width - visibleWidth(heading) - 3))}╮`),\n\t\t\tframeRow(\n\t\t\t\tdetail && current\n\t\t\t\t\t? taskDetailSummary(current)\n\t\t\t\t\t: theme.fg(\"muted\", `${live} active · ${this.store.backgroundTasks.length} total`),\n\t\t\t),\n\t\t\t...view.map(frameRow),\n\t\t\t...actionRow.map(frameRow),\n\t\t\tborder(`╰${\"─\".repeat(Math.max(0, width - 2))}╯`),\n\t\t\tfooter,\n\t\t\t...failure,\n\t\t\t...statusRows,\n\t\t].map((line) => truncateToWidth(line, width));\n\t}\n\tprivate renderAll(width: number): string[] {\n\t\tconst task = this.selected();\n\t\tif (this.confirmation)\n\t\t\treturn new Text(\n\t\t\t\t`Cancel ${task?.title}\\nTask ${task?.ref.taskId}\\ny: confirm · n/Escape: keep running`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t).render(width);\n\t\tif (this.navigation.focus.kind === \"stdin\")\n\t\t\treturn [`Input to ${task?.title} · Escape: tasks`, ...this.input.render(width), this.status];\n\t\tif (this.transcript) return [...this.transcript.flatMap((component) => component.render(width)), this.status];\n\t\tif (this.transcriptRequested)\n\t\t\treturn [this.transcriptLoading ? \"Loading transcript…\" : this.status || \"Transcript unavailable\"];\n\t\tif (task && this.navigation.focus.kind === \"detail\") {\n\t\t\treturn [\n\t\t\t\t...new TaskDetail(task, {\n\t\t\t\t\t...this.detailContent,\n\t\t\t\t\tstdinAvailable: this.stdinAvailable(),\n\t\t\t\t\tactivity: this.store.recentActivity(task.ref.taskId),\n\t\t\t\t\tactivityOmitted: this.store.activityOmitted(task.ref.taskId),\n\t\t\t\t}).renderContent(width),\n\t\t\t\tthis.status,\n\t\t\t];\n\t\t}\n\t\tconst sections = this.orderedSections();\n\t\tif (!sections.length)\n\t\t\treturn new Text(\"No background tasks.\\nBackground agents and shells will appear here.\", 0, 0).render(width);\n\t\treturn sections.flatMap((section) => [\n\t\t\t\"\",\n\t\t\ttheme.fg(\"muted\", theme.bold(`${section.title} (${section.tasks.length})`)),\n\t\t\t...section.tasks.flatMap((item) => {\n\t\t\t\tconst selected = item.ref.taskId === this.navigation.selectedTaskId;\n\t\t\t\tconst { label: state, color, icon } = taskStatusAppearance(item);\n\t\t\t\tconst status = width < 32 ? ` ${icon}` : ` ${icon} ${state}`;\n\t\t\t\tconst name = taskDisplayText(item.title || taskLabel(item));\n\t\t\t\tconst marker = selected ? \"› \" : \" \";\n\t\t\t\tconst title = marker + truncateToWidth(name, Math.max(1, width - visibleWidth(status) - 3));\n\t\t\t\tconst row = `${selected ? theme.fg(\"accent\", theme.bold(title)) : title}${\" \".repeat(Math.max(1, width - visibleWidth(title) - visibleWidth(status)))}${theme.fg(color, status)}`;\n\t\t\t\tconst metadata = [\n\t\t\t\t\t...(width < 32 ? [state] : []),\n\t\t\t\t\ttaskLabel(item),\n\t\t\t\t\ttaskMetricsText(item),\n\t\t\t\t\titem.currentAction ? `${item.currentAction.tool} ${item.currentAction.text}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" · \");\n\t\t\t\treturn [\n\t\t\t\t\ttruncateToWidth(row, width),\n\t\t\t\t\t...(item.kind === \"agent\" ? [theme.fg(\"dim\", truncateToWidth(` ${taskModelText(item)}`, width))] : []),\n\t\t\t\t\t...(selected ? [theme.fg(\"dim\", truncateToWidth(` ${taskDisplayText(metadata)}`, width))] : []),\n\t\t\t\t];\n\t\t\t}),\n\t\t]);\n\t}\n}\n"]}
|