@aiwayds/dsh-tui-pi 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +205 -68
  2. package/lib/agent-manager.d.ts +125 -0
  3. package/lib/agent-manager.js +298 -0
  4. package/lib/agent-manager.js.map +1 -0
  5. package/lib/agents.d.ts +30 -0
  6. package/lib/agents.js +468 -0
  7. package/lib/agents.js.map +1 -0
  8. package/lib/append-system.d.ts +2 -0
  9. package/lib/append-system.js +1 -1
  10. package/lib/append-system.js.map +1 -1
  11. package/lib/dsh-events.d.ts +12 -0
  12. package/lib/editor.d.ts +58 -0
  13. package/lib/editor.js +92 -0
  14. package/lib/editor.js.map +1 -1
  15. package/lib/footer.d.ts +8 -0
  16. package/lib/footer.js +8 -0
  17. package/lib/footer.js.map +1 -1
  18. package/lib/hotkeys.d.ts +93 -0
  19. package/lib/hotkeys.js +305 -0
  20. package/lib/hotkeys.js.map +1 -0
  21. package/lib/index.js +342 -38
  22. package/lib/index.js.map +1 -1
  23. package/lib/keymap.d.ts +177 -0
  24. package/lib/keymap.js +189 -0
  25. package/lib/keymap.js.map +1 -0
  26. package/lib/live-widgets.d.ts +82 -29
  27. package/lib/live-widgets.js +222 -92
  28. package/lib/live-widgets.js.map +1 -1
  29. package/lib/messages.d.ts +4 -2
  30. package/lib/messages.js +8 -3
  31. package/lib/messages.js.map +1 -1
  32. package/lib/panels.d.ts +177 -0
  33. package/lib/panels.js +331 -0
  34. package/lib/panels.js.map +1 -0
  35. package/lib/provider-catalog.d.ts +31 -8
  36. package/lib/provider-catalog.js +63 -8
  37. package/lib/provider-catalog.js.map +1 -1
  38. package/lib/selectors.d.ts +12 -1
  39. package/lib/selectors.js +5 -2
  40. package/lib/selectors.js.map +1 -1
  41. package/lib/session.d.ts +36 -0
  42. package/lib/session.js +171 -10
  43. package/lib/session.js.map +1 -1
  44. package/lib/settings.d.ts +1 -2
  45. package/lib/settings.js +29 -2
  46. package/lib/settings.js.map +1 -1
  47. package/lib/subagent-policy.d.ts +58 -0
  48. package/lib/subagent-policy.js +137 -0
  49. package/lib/subagent-policy.js.map +1 -0
  50. package/lib/subagent-viewer.d.ts +49 -0
  51. package/lib/subagent-viewer.js +523 -0
  52. package/lib/subagent-viewer.js.map +1 -0
  53. package/lib/theme/index.js +4 -0
  54. package/lib/theme/index.js.map +1 -1
  55. package/lib/theme/palette.d.ts +21 -3
  56. package/lib/theme/palette.js +27 -6
  57. package/lib/theme/palette.js.map +1 -1
  58. package/lib/theme-settings.d.ts +39 -4
  59. package/lib/theme-settings.js +69 -12
  60. package/lib/theme-settings.js.map +1 -1
  61. package/lib/tui.d.ts +32 -12
  62. package/lib/tui.js +109 -36
  63. package/lib/tui.js.map +1 -1
  64. package/package.json +3 -4
  65. package/patches/@earendil-works__pi-tui.patch +206 -2
  66. package/scripts/dev-install.mjs +87 -0
  67. package/scripts/link-dsh-closure.mjs +85 -0
package/lib/agents.js ADDED
@@ -0,0 +1,468 @@
1
+ /**
2
+ * `/agents` — manage agent definition markdown files (the dsh terminal
3
+ * counterpart of pi's fun-agent `/fun-agent-cfg` and zcode's subagents page).
4
+ *
5
+ * Two layers, both built on the select-panel framework (src/panels.ts):
6
+ *
7
+ * 1. agent table (TablePanel) — one row per agent, four columns
8
+ * (name | model | deep | description), ↑↓/PgUp/PgDn navigate, Enter
9
+ * opens the agent.
10
+ * 2. agent fields window (FieldPanel) — title (display name + id), the
11
+ * full description, and the editable field rows model / thinking /
12
+ * deep. Enter edits the selected row (or m/t/d shortcuts), v opens the
13
+ * full system-prompt body (ViewerPanel), Esc returns to the table.
14
+ * 3. subagent-limits panel (FieldPanel, `l` from the table) — the live
15
+ * `maxAgents` / `maxRounds` caps, editable and written straight to the
16
+ * `dsh-tui` settings namespace. Also the initial view when no agent
17
+ * files exist yet, so the caps stay configurable before any agent.
18
+ *
19
+ * Edits go straight to the frontmatter of the agent's markdown file and
20
+ * take effect the next time the agent is spawned.
21
+ */
22
+ import { getKeybindings, SelectList, } from '@earendil-works/pi-tui';
23
+ import { agentsDir, listAgentFiles, migrateLegacyAgentsDir, seedFromZcode, updateAgentFrontmatter, zcodeAgentsDir, } from "./agent-manager.js";
24
+ import { EditField } from "./settings.js";
25
+ import { readSubagentLimits, writeSubagentLimit } from "./theme-settings.js";
26
+ import { FieldPanel, PanelHost, TablePanel, ViewerPanel, } from "./panels.js";
27
+ import { openEffortPicker } from "./selectors.js";
28
+ import { ansiFg, BOLD, RESET } from "./theme/index.js";
29
+ import { clipToWidth } from "./text.js";
30
+ /** zcode-style 8-color label palette — GitHub-flavored hexes, per theme. */
31
+ const AGENT_COLORS = {
32
+ red: '#d1242f',
33
+ blue: '#0969da',
34
+ green: '#1a7f37',
35
+ yellow: '#9a6700',
36
+ purple: '#8250df',
37
+ orange: '#bc4c00',
38
+ pink: '#bf3989',
39
+ cyan: '#1b7c83',
40
+ };
41
+ /** Bright variants for the dark theme (the light hexes are too dim on dark). */
42
+ const AGENT_COLORS_DARK = {
43
+ red: '#ff7b72',
44
+ blue: '#58a6ff',
45
+ green: '#3fb950',
46
+ yellow: '#d29922',
47
+ purple: '#bc8cff',
48
+ orange: '#f0883e',
49
+ pink: '#db61a2',
50
+ cyan: '#39c5cf',
51
+ };
52
+ /** The label-dot color for an agent color name under the active theme. */
53
+ function agentDotColor(theme, name) {
54
+ const table = theme.palette.dark ? AGENT_COLORS_DARK : AGENT_COLORS;
55
+ return table[name];
56
+ }
57
+ /** Depth editor parse: empty = keep, otherwise a non-negative integer. */
58
+ function parseDeepInput(text) {
59
+ const trimmed = text.trim();
60
+ if (trimmed === '')
61
+ return { kind: 'keep' };
62
+ if (!/^\d+$/.test(trimmed)) {
63
+ return { kind: 'error', error: `expected a non-negative integer, got "${trimmed}"` };
64
+ }
65
+ return { kind: 'value', value: Number(trimmed) };
66
+ }
67
+ /** Subagent-limit editor parse: empty = keep, otherwise a non-negative integer. */
68
+ function parseLimitInput(text) {
69
+ const trimmed = text.trim();
70
+ if (trimmed === '')
71
+ return { kind: 'keep' };
72
+ if (!/^\d+$/.test(trimmed)) {
73
+ return { kind: 'error', error: `expected a non-negative integer, got "${trimmed}"` };
74
+ }
75
+ return { kind: 'value', value: Number(trimmed) };
76
+ }
77
+ /** The four table columns of the agent list. */
78
+ const AGENT_COLUMNS = [
79
+ { key: 'name', title: 'name', width: 12 },
80
+ { key: 'model', title: 'model', width: 24 },
81
+ { key: 'deep', title: 'deep', width: 4, align: 'right' },
82
+ { key: 'description', title: 'description', flex: true },
83
+ ];
84
+ /** Cell text for one agent table row. */
85
+ function agentCell(agent, column) {
86
+ const meta = agent.meta;
87
+ switch (column.key) {
88
+ case 'name': return meta.displayName ?? meta.name;
89
+ case 'model': return meta.model ?? '(inherit)';
90
+ case 'deep': return String(meta.deep);
91
+ default: return meta.description ?? '';
92
+ }
93
+ }
94
+ /** The colored-dot title line of the fields window. */
95
+ function agentTitle(theme, meta) {
96
+ const dotColor = agentDotColor(theme, meta.color ?? '');
97
+ const dot = dotColor !== undefined ? ansiFg(dotColor) + '● ' + RESET : '';
98
+ const name = clipToWidth(meta.displayName ?? meta.name, 100);
99
+ return ansiFg(theme.palette.accent) + BOLD + `${dot}${name}` + RESET;
100
+ }
101
+ /**
102
+ * Flat `provider/model` picker for one agent — every route's models in one
103
+ * list (the current frontmatter `model` is preselected), then — when that
104
+ * model exposes reasoning levels — a think-level stage. Esc at either stage
105
+ * cancels the whole change. `host` is the shared overlay lifecycle; the
106
+ * stage-1 overlay is returned so the effort stage can hide it once it owns
107
+ * focus.
108
+ */
109
+ async function pickAgentModel(ctx, tui, theme, meta, host) {
110
+ const llm = ctx.get('llm');
111
+ if (llm === undefined)
112
+ return undefined;
113
+ const models = [];
114
+ for (const provider of llm.listProviders()) {
115
+ try {
116
+ for (const model of await llm.listModels(provider.id)) {
117
+ models.push({
118
+ value: `${provider.id}/${model.id}`,
119
+ label: model.name === '' ? model.id : model.name,
120
+ description: provider.id,
121
+ });
122
+ }
123
+ }
124
+ catch { /* one provider's listing failure must not kill the picker */ }
125
+ }
126
+ if (models.length === 0)
127
+ return undefined;
128
+ return new Promise(resolve => {
129
+ const items = models.map(model => ({
130
+ value: model.value,
131
+ label: model.label,
132
+ ...(model.description !== undefined ? { description: model.description } : {}),
133
+ }));
134
+ const list = new SelectList(items, 12, theme.selectList);
135
+ const currentIndex = meta.model === undefined ? -1 : items.findIndex(item => item.value === meta.model);
136
+ if (currentIndex >= 0)
137
+ list.setSelectedIndex(currentIndex);
138
+ list.onSelect = item => {
139
+ // Detach the stage-1 input handlers on first settle: while the model
140
+ // info resolves (stage 2 not up yet), a stray Esc would otherwise fire
141
+ // a ghost settle AFTER this promise already settled, and a second
142
+ // Enter would run two concurrent stage-2s.
143
+ list.onSelect = () => { };
144
+ list.onCancel = () => { };
145
+ void (async () => {
146
+ const slash = item.value.indexOf('/');
147
+ if (slash <= 0) {
148
+ resolve({ model: item.value, thinking: null });
149
+ return;
150
+ }
151
+ const providerId = item.value.slice(0, slash);
152
+ const modelId = item.value.slice(slash + 1);
153
+ let efforts;
154
+ try {
155
+ efforts = (await llm.resolveModelInfo(providerId, modelId)).reasoning?.efforts;
156
+ }
157
+ catch { /* an unresolvable model just skips the effort stage */ }
158
+ if (efforts === undefined || efforts.length === 0) {
159
+ resolve({ model: item.value, thinking: null });
160
+ return;
161
+ }
162
+ const current = meta.thinking;
163
+ const chosen = await openEffortPicker(tui, theme, efforts, current, () => { }, () => stage1?.hide());
164
+ if (chosen === undefined)
165
+ resolve(undefined);
166
+ else if (chosen.effort === 'default')
167
+ resolve({ model: item.value, thinking: null });
168
+ else
169
+ resolve({ model: item.value, thinking: chosen.effort });
170
+ })();
171
+ };
172
+ list.onCancel = () => {
173
+ // Same first-settle detachment as onSelect: a cancellation while no
174
+ // stage-2 is in flight must not let a late Enter start one.
175
+ list.onSelect = () => { };
176
+ list.onCancel = () => { };
177
+ resolve(undefined);
178
+ };
179
+ const stage1 = host.open(list);
180
+ if (stage1 === undefined)
181
+ resolve(undefined);
182
+ });
183
+ }
184
+ /**
185
+ * Open the `/agents` manager. Resolves with a summary text when the user
186
+ * made changes (or seeded agents) and exits, or `undefined` when nothing
187
+ * changed. `preselect` jumps straight into one agent's fields window.
188
+ */
189
+ export async function openAgentManager(ctx, tui, theme, restoreFocus, preselect) {
190
+ const dir = agentsDir();
191
+ migrateLegacyAgentsDir(dir);
192
+ const seed = seedFromZcode(dir);
193
+ const { agents, broken } = listAgentFiles(dir);
194
+ const changed = [];
195
+ let detailStatus;
196
+ let limitsStatus;
197
+ let pendingPreselect = preselect;
198
+ /** Settles the manager promise (assigned inside the executor below). */
199
+ let settle;
200
+ /** The fields-window overlay handle (for effort-stage afterShow). */
201
+ let fieldsHandle;
202
+ const host = new PanelHost(tui, theme, message => {
203
+ restoreFocus();
204
+ settle?.(`✘ failed to open the agents view: ${message}`);
205
+ });
206
+ return new Promise(resolve => {
207
+ settle = resolve;
208
+ const showTable = () => {
209
+ const preselectIndex = pendingPreselect === undefined
210
+ ? undefined
211
+ : agents.findIndex(agent => agent.meta.name === pendingPreselect);
212
+ pendingPreselect = undefined;
213
+ // TablePanel has no single-key shortcuts, so the `l` limits entry is a
214
+ // thin subclass that routes the key before the table's own handling.
215
+ class AgentTablePanel extends TablePanel {
216
+ handleInput(data) {
217
+ if (data.toLowerCase() === 'l') {
218
+ showLimits();
219
+ return;
220
+ }
221
+ super.handleInput(data);
222
+ }
223
+ }
224
+ const table = new AgentTablePanel(theme, {
225
+ columns: AGENT_COLUMNS,
226
+ rows: agents,
227
+ renderCell: agentCell,
228
+ preselect: preselectIndex !== undefined && preselectIndex >= 0 ? preselectIndex : undefined,
229
+ footer: '↑↓ navigate · Enter open · Esc back · l limits',
230
+ // Defensive: an empty table (never shown, but guards the round-trip)
231
+ // must not hand `undefined` to showFields.
232
+ onSelect: agent => {
233
+ if (agent !== undefined)
234
+ showFields(agent);
235
+ },
236
+ onCancel: () => closeManager(),
237
+ });
238
+ host.open(table);
239
+ };
240
+ const closeManager = () => {
241
+ host.close();
242
+ restoreFocus();
243
+ if (changed.length > 0) {
244
+ const seededNote = seed.seeded > 0 ? ` (seeded ${seed.seeded} from ${zcodeAgentsDir()})` : '';
245
+ resolve(`Agents updated: ${changed.join(', ')}${seededNote}`);
246
+ }
247
+ else {
248
+ resolve(seed.seeded > 0 ? `Seeded ${seed.seeded} agent(s) from ${zcodeAgentsDir()} — no changes.` : undefined);
249
+ }
250
+ };
251
+ const showFields = (agent) => {
252
+ const meta = agent.meta;
253
+ const content = (meta.description ?? '(no description)').split('\n');
254
+ const fields = [
255
+ { key: 'model', value: meta.model ?? '(inherit — default model)', editable: true },
256
+ { key: 'thinking', value: meta.thinking ?? '(inherit)', editable: true },
257
+ { key: 'deep', value: String(meta.deep), editable: true },
258
+ ];
259
+ const view = new FieldPanel(theme, {
260
+ title: agentTitle(theme, meta),
261
+ content,
262
+ fields,
263
+ status: () => detailStatus,
264
+ footer: '↑↓ field · Enter edit (m model · t think · d deep) · v full prompt · Esc back',
265
+ shortcuts: {
266
+ m: () => void changeModel(agent),
267
+ t: () => void changeThinking(agent),
268
+ d: () => showDeepEditor(agent),
269
+ v: () => showBody(agent),
270
+ },
271
+ onEdit: index => {
272
+ if (index === 0)
273
+ void changeModel(agent);
274
+ else if (index === 1)
275
+ void changeThinking(agent);
276
+ else
277
+ showDeepEditor(agent);
278
+ },
279
+ onCancel: () => showTable(),
280
+ });
281
+ fieldsHandle = host.open(view);
282
+ };
283
+ /** Commit path shared by model/think edits: write, mutate, flash, re-show. */
284
+ const writeAndFlash = (agent, error, message) => {
285
+ if (error !== undefined) {
286
+ detailStatus = `✘ ${error}`;
287
+ }
288
+ else {
289
+ if (!changed.includes(agent.meta.name))
290
+ changed.push(agent.meta.name);
291
+ detailStatus = message;
292
+ }
293
+ showFields(agent);
294
+ };
295
+ const changeModel = async (agent) => {
296
+ const picked = await pickAgentModel(ctx, tui, theme, agent.meta, host);
297
+ if (picked === undefined) {
298
+ showFields(agent);
299
+ return;
300
+ }
301
+ const error = updateAgentFrontmatter(agent.path, {
302
+ model: picked.model,
303
+ thinking: picked.thinking,
304
+ });
305
+ if (error === undefined) {
306
+ agent.meta.model = picked.model;
307
+ agent.meta.thinking = picked.thinking ?? undefined;
308
+ }
309
+ const thinkText = picked.thinking !== null ? ` · think ${picked.thinking}` : '';
310
+ writeAndFlash(agent, error, `saved ${agent.meta.name} → ${picked.model}${thinkText}`);
311
+ };
312
+ const changeThinking = async (agent) => {
313
+ if (agent.meta.model === undefined) {
314
+ detailStatus = '✘ no model set — pick a model first (m)';
315
+ showFields(agent);
316
+ return;
317
+ }
318
+ const llm = ctx.get('llm');
319
+ if (llm === undefined) {
320
+ detailStatus = '✘ llm service unavailable';
321
+ showFields(agent);
322
+ return;
323
+ }
324
+ const slash = agent.meta.model.indexOf('/');
325
+ if (slash <= 0) {
326
+ detailStatus = `✘ cannot resolve think levels for ${agent.meta.model}`;
327
+ showFields(agent);
328
+ return;
329
+ }
330
+ let efforts;
331
+ try {
332
+ efforts = (await llm.resolveModelInfo(agent.meta.model.slice(0, slash), agent.meta.model.slice(slash + 1))).reasoning?.efforts;
333
+ }
334
+ catch {
335
+ efforts = undefined;
336
+ }
337
+ if (efforts === undefined || efforts.length === 0) {
338
+ detailStatus = `✘ ${agent.meta.model} exposes no think levels`;
339
+ showFields(agent);
340
+ return;
341
+ }
342
+ const currentEffort = agent.meta.thinking;
343
+ const chosen = await openEffortPicker(tui, theme, efforts, currentEffort, () => { }, () => fieldsHandle?.hide());
344
+ if (chosen === undefined) {
345
+ showFields(agent);
346
+ return;
347
+ }
348
+ const thinking = chosen.effort === 'default' ? null : chosen.effort;
349
+ const error = updateAgentFrontmatter(agent.path, { thinking });
350
+ if (error === undefined)
351
+ agent.meta.thinking = thinking ?? undefined;
352
+ writeAndFlash(agent, error, `saved ${agent.meta.name} → think ${thinking ?? 'inherit'}`);
353
+ };
354
+ const showDeepEditor = (agent) => {
355
+ let committed = false;
356
+ const field = new EditField(tui, {
357
+ title: `Max spawn depth — ${agent.meta.displayName ?? agent.meta.name}`,
358
+ subtitle: '0 = this agent never spawns subagents · no unlimited',
359
+ initial: String(agent.meta.deep),
360
+ parse: parseDeepInput,
361
+ onCommit: async (parsed) => {
362
+ if (parsed.kind !== 'value')
363
+ return undefined;
364
+ const n = parsed.value;
365
+ const error = updateAgentFrontmatter(agent.path, { deep: n });
366
+ if (error !== undefined)
367
+ return { error };
368
+ agent.meta.deep = n;
369
+ committed = true;
370
+ return { notice: `max depth ${n} saved — takes effect when this agent is spawned` };
371
+ },
372
+ onDone: () => {
373
+ // onDone fires on every terminal transition (commit, keep, Esc) —
374
+ // only a real commit counts as a change.
375
+ if (committed) {
376
+ if (!changed.includes(agent.meta.name))
377
+ changed.push(agent.meta.name);
378
+ detailStatus = `saved ${agent.meta.name} → max depth ${agent.meta.deep}`;
379
+ }
380
+ showFields(agent);
381
+ },
382
+ onError: message => { detailStatus = `✘ ${message}`; },
383
+ }, theme);
384
+ host.open(field);
385
+ };
386
+ const showBody = (agent) => {
387
+ host.open(new ViewerPanel(theme, {
388
+ title: `ⓘ ${agent.meta.name} · system prompt`,
389
+ lines: agent.body.split('\n'),
390
+ footer: ' Esc to close',
391
+ onClose: () => showFields(agent),
392
+ }));
393
+ };
394
+ /**
395
+ * The subagent-limits panel: the live `maxAgents` / `maxRounds` values
396
+ * (0 = unlimited), editable like the field rows. Esc returns to the table
397
+ * — from here the limits are reachable even with no agent files at all.
398
+ */
399
+ const showLimits = () => {
400
+ const limits = readSubagentLimits(ctx);
401
+ const fields = [
402
+ { key: 'maxAgents', value: `${limits.maxAgents} · concurrent live children (0 = unlimited)`, editable: true },
403
+ { key: 'maxRounds', value: `${limits.maxRounds} · completed turns before wrap-up (0 = unlimited)`, editable: true },
404
+ ];
405
+ const content = [
406
+ 'subagent delegation caps — read live at every spawn / turn decision',
407
+ ...(agents.length === 0
408
+ ? [`no agents in ${dir} yet — drop a markdown file to define one`, ...(broken.length > 0 ? [`${broken.length} broken file(s) ignored`] : [])]
409
+ : []),
410
+ ];
411
+ const panel = new FieldPanel(theme, {
412
+ title: ansiFg(theme.palette.accent) + BOLD + '⚙ subagent limits' + RESET,
413
+ content,
414
+ fields,
415
+ status: () => limitsStatus,
416
+ footer: '↑↓ field · Enter edit (0 = unlimited) · Esc back',
417
+ onEdit: index => editLimit(index === 0 ? 'maxAgents' : 'maxRounds'),
418
+ // With no agent files the table has nothing to go back to — Esc then
419
+ // closes the whole manager (mirroring the old empty-directory reply).
420
+ onCancel: () => (agents.length === 0 ? closeManager() : showTable()),
421
+ });
422
+ host.open(panel);
423
+ };
424
+ /**
425
+ * EditField for one subagent limit: a non-negative integer, 0 = unlimited,
426
+ * empty keeps the current value. A commit writes the setting live — the
427
+ * policy reads `readSubagentLimits` at its next decision point.
428
+ */
429
+ const editLimit = (key) => {
430
+ const current = readSubagentLimits(ctx)[key];
431
+ let committed = false;
432
+ const field = new EditField(tui, {
433
+ title: `${key} — subagent delegation limit (current ${current})`,
434
+ subtitle: 'non-negative integer · 0 = unlimited · empty keeps the current value',
435
+ initial: String(current),
436
+ parse: parseLimitInput,
437
+ onCommit: async (parsed) => {
438
+ if (parsed.kind !== 'value')
439
+ return undefined;
440
+ const n = parsed.value;
441
+ const error = await writeSubagentLimit(ctx, key, n);
442
+ if (error !== undefined)
443
+ return { error };
444
+ committed = true;
445
+ return undefined;
446
+ },
447
+ onDone: () => {
448
+ // onDone fires on every terminal transition (commit, keep, Esc) —
449
+ // only a real commit counts and flashes the status line.
450
+ if (committed) {
451
+ const n = readSubagentLimits(ctx)[key];
452
+ limitsStatus = `${key} → ${n} saved — applies to future subagent spawns`;
453
+ }
454
+ showLimits();
455
+ },
456
+ onError: message => { limitsStatus = `✘ ${message}`; },
457
+ }, theme);
458
+ host.open(field);
459
+ };
460
+ // No agent files? The manager still opens — straight into the limits
461
+ // panel, so maxAgents/maxRounds stay configurable before any agent exists.
462
+ if (agents.length === 0)
463
+ showLimits();
464
+ else
465
+ showTable();
466
+ });
467
+ }
468
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EACL,cAAc,EACd,UAAU,GAKX,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,SAAS,EACT,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,cAAc,GAGf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAiB,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,4EAA4E;AAC5E,MAAM,YAAY,GAA2B;IAC3C,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,gFAAgF;AAChF,MAAM,iBAAiB,GAA2B;IAChD,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,0EAA0E;AAC1E,SAAS,aAAa,CAAC,KAAe,EAAE,IAAY;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAA;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC;AAED,0EAA0E;AAC1E,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,OAAO,GAAG,EAAE,CAAA;IACtF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;AAClD,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,OAAO,GAAG,EAAE,CAAA;IACtF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;AAClD,CAAC;AAED,gDAAgD;AAChD,MAAM,aAAa,GAAG;IACpB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IACzC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;IAC3C,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE;IACjE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;CACzD,CAAA;AAED,yCAAyC;AACzC,SAAS,SAAS,CAAC,KAAgB,EAAE,MAAuB;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAA;QACjD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,WAAW,CAAA;QAC9C,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE,CAAA;IACxC,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,KAAe,EAAE,IAAe;IAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAY,EACZ,GAAQ,EACR,KAAe,EACf,IAAe,EACf,IAAe;IAEf,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC1B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,MAAM,GAAkE,EAAE,CAAA;IAChF,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE;oBACnC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;oBAChD,WAAW,EAAE,QAAQ,CAAC,EAAE;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6DAA6D,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAEzC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAiB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/E,CAAC,CAAC,CAAA;QACH,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;QACvG,IAAI,YAAY,IAAI,CAAC;YAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAE1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;YACrB,qEAAqE;YACrE,uEAAuE;YACvE,kEAAkE;YAClE,2CAA2C;YAC3C,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YACxB,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YACxB,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACrC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;oBAC9C,OAAM;gBACR,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;gBAC3C,IAAI,OAAsD,CAAA;gBAC1D,IAAI,CAAC;oBACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAA;gBAChF,CAAC;gBAAC,MAAM,CAAC,CAAC,uDAAuD,CAAC,CAAC;gBACnE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClD,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;oBAC9C,OAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAyC,CAAA;gBAC9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAC7D,CAAA;gBACD,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,SAAS,CAAC,CAAA;qBACvC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;oBAC/E,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;YAC9D,CAAC,CAAC,EAAE,CAAA;QACN,CAAC,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;YACnB,oEAAoE;YACpE,4DAA4D;YAC5D,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YACxB,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YACxB,OAAO,CAAC,SAAS,CAAC,CAAA;QACpB,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAY,EACZ,GAAQ,EACR,KAAe,EACf,YAAwB,EACxB,SAAkB;IAElB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAA;IACvB,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IAE9C,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,YAAgC,CAAA;IACpC,IAAI,YAAgC,CAAA;IACpC,IAAI,gBAAgB,GAAG,SAAS,CAAA;IAChC,wEAAwE;IACxE,IAAI,MAAyD,CAAA;IAC7D,qEAAqE;IACrE,IAAI,YAAuC,CAAA;IAE3C,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE;QAC/C,YAAY,EAAE,CAAA;QACd,MAAM,EAAE,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,GAAG,OAAO,CAAA;QAEhB,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,MAAM,cAAc,GAAG,gBAAgB,KAAK,SAAS;gBACnD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAA;YACnE,gBAAgB,GAAG,SAAS,CAAA;YAC5B,uEAAuE;YACvE,qEAAqE;YACrE,MAAM,eAAgB,SAAQ,UAAqB;gBACjD,WAAW,CAAC,IAAY;oBACtB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;wBAC/B,UAAU,EAAE,CAAA;wBACZ,OAAM;oBACR,CAAC;oBACD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBACzB,CAAC;aACF;YACD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE;gBACvC,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,cAAc,KAAK,SAAS,IAAI,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;gBAC3F,MAAM,EAAE,gDAAgD;gBACxD,qEAAqE;gBACrE,2CAA2C;gBAC3C,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAChB,IAAI,KAAK,KAAK,SAAS;wBAAE,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC5C,CAAC;gBACD,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;aAC/B,CAAC,CAAA;YACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC,CAAA;QAED,MAAM,YAAY,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,YAAY,EAAE,CAAA;YACd,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,SAAS,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC7F,OAAO,CAAC,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,CAAA;YAC/D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,kBAAkB,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAChH,CAAC;QACH,CAAC,CAAA;QAED,MAAM,UAAU,GAAG,CAAC,KAAgB,EAAQ,EAAE;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;YACvB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpE,MAAM,MAAM,GAAG;gBACb,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,2BAA2B,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAClF,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACxE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC1D,CAAA;YACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE;gBACjC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC9B,OAAO;gBACP,MAAM;gBACN,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY;gBAC1B,MAAM,EAAE,+EAA+E;gBACvF,SAAS,EAAE;oBACT,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC;oBAChC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC;oBACnC,CAAC,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;oBAC9B,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;iBACzB;gBACD,MAAM,EAAE,KAAK,CAAC,EAAE;oBACd,IAAI,KAAK,KAAK,CAAC;wBAAE,KAAK,WAAW,CAAC,KAAK,CAAC,CAAA;yBACnC,IAAI,KAAK,KAAK,CAAC;wBAAE,KAAK,cAAc,CAAC,KAAK,CAAC,CAAA;;wBAC3C,cAAc,CAAC,KAAK,CAAC,CAAA;gBAC5B,CAAC;gBACD,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;aAC5B,CAAC,CAAA;YACF,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC,CAAA;QAED,8EAA8E;QAC9E,MAAM,aAAa,GAAG,CAAC,KAAgB,EAAE,KAAyB,EAAE,OAAe,EAAQ,EAAE;YAC3F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,YAAY,GAAG,KAAK,KAAK,EAAE,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACrE,YAAY,GAAG,OAAO,CAAA;YACxB,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,KAAK,EAAE,KAAgB,EAAiB,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC/C,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAA;YACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC/B,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAA;YACpD,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC/E,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC,CAAA;QACvF,CAAC,CAAA;QAED,MAAM,cAAc,GAAG,KAAK,EAAE,KAAgB,EAAiB,EAAE;YAC/D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACnC,YAAY,GAAG,yCAAyC,CAAA;gBACxD,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,YAAY,GAAG,2BAA2B,CAAA;gBAC1C,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,YAAY,GAAG,qCAAqC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;gBACtE,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,IAAI,OAAsD,CAAA;YAC1D,IAAI,CAAC;gBACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAA;YAChI,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,SAAS,CAAA;YACrB,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,YAAY,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,0BAA0B,CAAA;gBAC9D,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAyC,CAAA;YAC1E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,CACzE,CAAA;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,UAAU,CAAC,KAAK,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;YACnE,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC9D,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAA;YACpE,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAA;QAC1F,CAAC,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAQ,EAAE;YAChD,IAAI,SAAS,GAAG,KAAK,CAAA;YACrB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;gBAC/B,KAAK,EAAE,qBAAqB,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;gBACvE,QAAQ,EAAE,sDAAsD;gBAChE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,cAAc;gBACrB,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;oBACvB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;wBAAE,OAAO,SAAS,CAAA;oBAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAe,CAAA;oBAChC,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;oBAC7D,IAAI,KAAK,KAAK,SAAS;wBAAE,OAAO,EAAE,KAAK,EAAE,CAAA;oBACzC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;oBACnB,SAAS,GAAG,IAAI,CAAA;oBAChB,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,kDAAkD,EAAE,CAAA;gBACrF,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE;oBACX,kEAAkE;oBAClE,yCAAyC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACd,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;4BAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBACrE,YAAY,GAAG,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;oBAC1E,CAAC;oBACD,UAAU,CAAC,KAAK,CAAC,CAAA;gBACnB,CAAC;gBACD,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,GAAG,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC;aACtD,EAAE,KAAK,CAAC,CAAA;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAQ,EAAE;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE;gBAC/B,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,kBAAkB;gBAC7C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;aACjC,CAAC,CAAC,CAAA;QACL,CAAC,CAAA;QAED;;;;WAIG;QACH,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;YACtC,MAAM,MAAM,GAAG;gBACb,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,SAAS,6CAA6C,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC7G,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,SAAS,mDAAmD,EAAE,QAAQ,EAAE,IAAI,EAAE;aACpH,CAAA;YACD,MAAM,OAAO,GAAa;gBACxB,qEAAqE;gBACrE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;oBACrB,CAAC,CAAC,CAAC,gBAAgB,GAAG,2CAA2C,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7I,CAAC,CAAC,EAAE,CAAC;aACR,CAAA;YACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,mBAAmB,GAAG,KAAK;gBACxE,OAAO;gBACP,MAAM;gBACN,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY;gBAC1B,MAAM,EAAE,kDAAkD;gBAC1D,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;gBACnE,qEAAqE;gBACrE,sEAAsE;gBACtE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;aACrE,CAAC,CAAA;YACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC,CAAA;QAED;;;;WAIG;QACH,MAAM,SAAS,GAAG,CAAC,GAA8B,EAAQ,EAAE;YACzD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC5C,IAAI,SAAS,GAAG,KAAK,CAAA;YACrB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;gBAC/B,KAAK,EAAE,GAAG,GAAG,yCAAyC,OAAO,GAAG;gBAChE,QAAQ,EAAE,sEAAsE;gBAChF,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;gBACxB,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;oBACvB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;wBAAE,OAAO,SAAS,CAAA;oBAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAe,CAAA;oBAChC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;oBACnD,IAAI,KAAK,KAAK,SAAS;wBAAE,OAAO,EAAE,KAAK,EAAE,CAAA;oBACzC,SAAS,GAAG,IAAI,CAAA;oBAChB,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE;oBACX,kEAAkE;oBAClE,yDAAyD;oBACzD,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;wBACtC,YAAY,GAAG,GAAG,GAAG,MAAM,CAAC,4CAA4C,CAAA;oBAC1E,CAAC;oBACD,UAAU,EAAE,CAAA;gBACd,CAAC;gBACD,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,GAAG,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC;aACtD,EAAE,KAAK,CAAC,CAAA;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC,CAAA;QAED,qEAAqE;QACrE,2EAA2E;QAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,UAAU,EAAE,CAAA;;YAChC,SAAS,EAAE,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -26,6 +26,8 @@ export declare const TODO_LIFECYCLE_MARKER = "<!-- dsh-tui-pi:todo-lifecycle -->
26
26
  * an all-completed list would stay pinned above the chat input.
27
27
  */
28
28
  export declare const TODO_LIFECYCLE_SECTION = "<!-- dsh-tui-pi:todo-lifecycle -->\n## Todo list lifecycle (dsh-tui-pi)\n\nThe UI renders your todo list as a fixed panel above the chat input. Keep\nitems `pending` or `in_progress` while they are not done. When EVERY todo is\ncompleted \u2014 no pending or in-progress items remain \u2014 write an EMPTY todo list\n(`todos: []`) so the panel clears. Never leave a fully-completed list behind.\n";
29
+ /** Default harness home: `$DSH_HOME` or `~/.dsh`. */
30
+ export declare function dshHome(): string;
29
31
  /** The user-editable append file path (`$DSH_HOME/APPEND_SYSTEM.md`). */
30
32
  export declare function appendSystemPath(home?: string): string;
31
33
  /**
@@ -39,7 +39,7 @@ completed — no pending or in-progress items remain — write an EMPTY todo lis
39
39
  (\`todos: []\`) so the panel clears. Never leave a fully-completed list behind.
40
40
  `;
41
41
  /** Default harness home: `$DSH_HOME` or `~/.dsh`. */
42
- function dshHome() {
42
+ export function dshHome() {
43
43
  return process.env.DSH_HOME ?? join(homedir(), '.dsh');
44
44
  }
45
45
  /** The user-editable append file path (`$DSH_HOME/APPEND_SYSTEM.md`). */
@@ -1 +1 @@
1
- {"version":3,"file":"append-system.js","sourceRoot":"","sources":["../src/append-system.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"append-system.js","sourceRoot":"","sources":["../src/append-system.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,10 @@ export declare function isLlmRetry(event: SessionEvent): event is SessionEvent &
79
79
  export interface AgentView {
80
80
  /** The child session id (raw string) — the stable identity key. */
81
81
  readonly childId: string;
82
+ /** The delegating parent session id, when known (header discovery). */
83
+ readonly parentSession?: string;
84
+ /** Delegation mode from the child's `subagent/descriptor`, when known. */
85
+ readonly mode?: 'one-shot' | 'continuable';
82
86
  /** Subagent type name from the child's `subagent/descriptor.provider`, when known. */
83
87
  readonly provider?: string;
84
88
  /** Delegation label from `tool-workflow/agent-start` or the child's descriptor. */
@@ -103,4 +107,12 @@ export interface AgentView {
103
107
  readonly lastTool?: string;
104
108
  /** Context window from the child's `request/context`, for the % column. */
105
109
  readonly contextWindow?: number;
110
+ /**
111
+ * Latest visible last line of the child's own output (the tail-line the
112
+ * compact activity row shows so the user knows it is alive). Maintained
113
+ * O(1) as child events arrive: assistant text → its last non-blank line,
114
+ * `tool/call` → `⚙ <name>`, `llm/retry` → `↻ retry`. ANSI-stripped and
115
+ * whitespace-folded; absent when the child has produced no such output yet.
116
+ */
117
+ readonly lastLine?: string;
106
118
  }
package/lib/editor.d.ts CHANGED
@@ -8,6 +8,23 @@
8
8
  import { Editor, type EditorTheme, type TUI } from '@earendil-works/pi-tui';
9
9
  /** Shorten the cwd by replacing the HOME prefix with `~`. */
10
10
  export declare function formatCwd(cwd: string): string;
11
+ /** History cap for the submitted-message browse (shell-style Up/Down recall). */
12
+ export declare const HISTORY_LIMIT = 500;
13
+ /**
14
+ * Snapshot of the pi-tui base editor's mid-browse state: the history cursor
15
+ * (`index`, -1 = not browsing, 0 = most recent) plus the editor state that the
16
+ * base captured when the user pressed Up off the newest entry (the pre-browse
17
+ * draft), if any. Used so a theme hot-swap rebuild can restore exactly where
18
+ * the user was — not just the history list.
19
+ */
20
+ export interface BrowseState {
21
+ index: number;
22
+ draft: {
23
+ lines: string[];
24
+ cursorLine: number;
25
+ cursorCol: number;
26
+ } | null;
27
+ }
11
28
  export declare class CwdBorderEditor extends Editor {
12
29
  private readonly sessionCwd;
13
30
  private readonly infoColor;
@@ -24,5 +41,46 @@ export declare class CwdBorderEditor extends Editor {
24
41
  * badge shown right after the cwd; polled outside, the editor only reads it.
25
42
  */
26
43
  setPermissionProvider(provider: () => string | undefined): void;
44
+ /**
45
+ * Record a submitted message for Up/Down browsing. Same semantics as the
46
+ * pi-tui base `addToHistory` (trim, skip empty, skip consecutive duplicates,
47
+ * index 0 = most recent) but caps the list at `HISTORY_LIMIT` instead of the
48
+ * base's 100 — the chat editor wants a 500-entry recall, dropping the oldest.
49
+ * Note: the base (0.84.2) declares `history` private in its .d.ts but keeps
50
+ * it as a plain runtime field; we reach it via a type cast. The `override`
51
+ * keyword is fine under this tsconfig.
52
+ */
53
+ addToHistory(text: string): void;
54
+ /**
55
+ * Snapshot of the browse history, newest first (index 0). Returns a copy so
56
+ * callers can reseed another instance (theme-swap rebuild) without mutating
57
+ * this editor's internal list. Returns `[]` when the base no longer exposes
58
+ * the runtime list (a bad pi-tui bump) rather than throwing.
59
+ */
60
+ getHistory(): string[];
61
+ /**
62
+ * Reseed this editor's browse history from `entries` (newest first, index 0
63
+ * = most recent, matching the base's addToHistory ordering). Adds oldest →
64
+ * newest so the list lands in the same order on a fresh instance. Pinned to
65
+ * HISTORY_LIMIT like any other add.
66
+ */
67
+ reseedHistory(entries: readonly string[]): void;
68
+ /**
69
+ * Snapshot the base's mid-browse state for a rebuild restore. `draft` is
70
+ * `null` when not browsing (historyIndex -1) — `structuredClone`d so the
71
+ * caller can reseed another instance without aliasing this editor's object.
72
+ * Treats a missing/invalid base field as not browsing (a bad pi-tui bump
73
+ * must degrade, not throw).
74
+ */
75
+ getBrowseState(): BrowseState;
76
+ /**
77
+ * Restore a previously-captured browse state (see getBrowseState) onto a
78
+ * fresh editor after a rebuild. `index` is clamped to the reseeded list so a
79
+ * stale snapshot can never read out of bounds; a snapshot whose history was
80
+ * truncated to nothing degrades to not browsing. `draft` is `null` → null,
81
+ * else `structuredClone`d. Skips writes entirely when the base no longer
82
+ * exposes the runtime fields (a bad pi-tui bump degrades silently).
83
+ */
84
+ restoreBrowseState(state: BrowseState): void;
27
85
  render(width: number): string[];
28
86
  }