@dsh-cc/tui 0.5.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.
- package/LICENSE +201 -0
- package/README.md +144 -0
- package/lib/bash-history.d.ts +31 -0
- package/lib/bash-history.d.ts.map +1 -0
- package/lib/bash-history.js +94 -0
- package/lib/bash-history.js.map +1 -0
- package/lib/compact-fold.d.ts +35 -0
- package/lib/compact-fold.d.ts.map +1 -0
- package/lib/compact-fold.js +60 -0
- package/lib/compact-fold.js.map +1 -0
- package/lib/components/arg-completers.d.ts +22 -0
- package/lib/components/arg-completers.d.ts.map +1 -0
- package/lib/components/arg-completers.js +75 -0
- package/lib/components/arg-completers.js.map +1 -0
- package/lib/components/code-theme.d.ts +25 -0
- package/lib/components/code-theme.d.ts.map +1 -0
- package/lib/components/code-theme.js +137 -0
- package/lib/components/code-theme.js.map +1 -0
- package/lib/components/completion.d.ts +50 -0
- package/lib/components/completion.d.ts.map +1 -0
- package/lib/components/completion.js +279 -0
- package/lib/components/completion.js.map +1 -0
- package/lib/components/diff-card.d.ts +29 -0
- package/lib/components/diff-card.d.ts.map +1 -0
- package/lib/components/diff-card.js +175 -0
- package/lib/components/diff-card.js.map +1 -0
- package/lib/components/diff-hunks.d.ts +44 -0
- package/lib/components/diff-hunks.d.ts.map +1 -0
- package/lib/components/diff-hunks.js +188 -0
- package/lib/components/diff-hunks.js.map +1 -0
- package/lib/components/editor-history.d.ts +23 -0
- package/lib/components/editor-history.d.ts.map +1 -0
- package/lib/components/editor-history.js +29 -0
- package/lib/components/editor-history.js.map +1 -0
- package/lib/components/markdown-theme.d.ts +11 -0
- package/lib/components/markdown-theme.d.ts.map +1 -0
- package/lib/components/markdown-theme.js +29 -0
- package/lib/components/markdown-theme.js.map +1 -0
- package/lib/components/masked-input.d.ts +24 -0
- package/lib/components/masked-input.d.ts.map +1 -0
- package/lib/components/masked-input.js +168 -0
- package/lib/components/masked-input.js.map +1 -0
- package/lib/components/overlay-host.d.ts +31 -0
- package/lib/components/overlay-host.d.ts.map +1 -0
- package/lib/components/overlay-host.js +128 -0
- package/lib/components/overlay-host.js.map +1 -0
- package/lib/components/overlays.d.ts +94 -0
- package/lib/components/overlays.d.ts.map +1 -0
- package/lib/components/overlays.js +450 -0
- package/lib/components/overlays.js.map +1 -0
- package/lib/components/provider-box.d.ts +23 -0
- package/lib/components/provider-box.d.ts.map +1 -0
- package/lib/components/provider-box.js +164 -0
- package/lib/components/provider-box.js.map +1 -0
- package/lib/components/read-group.d.ts +51 -0
- package/lib/components/read-group.d.ts.map +1 -0
- package/lib/components/read-group.js +105 -0
- package/lib/components/read-group.js.map +1 -0
- package/lib/components/root-bash.d.ts +36 -0
- package/lib/components/root-bash.d.ts.map +1 -0
- package/lib/components/root-bash.js +112 -0
- package/lib/components/root-bash.js.map +1 -0
- package/lib/components/root-types.d.ts +42 -0
- package/lib/components/root-types.d.ts.map +1 -0
- package/lib/components/root-types.js +8 -0
- package/lib/components/root-types.js.map +1 -0
- package/lib/components/root-utils.d.ts +22 -0
- package/lib/components/root-utils.d.ts.map +1 -0
- package/lib/components/root-utils.js +45 -0
- package/lib/components/root-utils.js.map +1 -0
- package/lib/components/root.d.ts +25 -0
- package/lib/components/root.d.ts.map +1 -0
- package/lib/components/root.js +357 -0
- package/lib/components/root.js.map +1 -0
- package/lib/components/theme.d.ts +61 -0
- package/lib/components/theme.d.ts.map +1 -0
- package/lib/components/theme.js +99 -0
- package/lib/components/theme.js.map +1 -0
- package/lib/components/transcript.d.ts +43 -0
- package/lib/components/transcript.d.ts.map +1 -0
- package/lib/components/transcript.js +203 -0
- package/lib/components/transcript.js.map +1 -0
- package/lib/components/working-line.d.ts +35 -0
- package/lib/components/working-line.d.ts.map +1 -0
- package/lib/components/working-line.js +66 -0
- package/lib/components/working-line.js.map +1 -0
- package/lib/effort-catalog.d.ts +27 -0
- package/lib/effort-catalog.d.ts.map +1 -0
- package/lib/effort-catalog.js +36 -0
- package/lib/effort-catalog.js.map +1 -0
- package/lib/export-markdown.d.ts +18 -0
- package/lib/export-markdown.d.ts.map +1 -0
- package/lib/export-markdown.js +124 -0
- package/lib/export-markdown.js.map +1 -0
- package/lib/harness/approval-preview.d.ts +33 -0
- package/lib/harness/approval-preview.d.ts.map +1 -0
- package/lib/harness/approval-preview.js +179 -0
- package/lib/harness/approval-preview.js.map +1 -0
- package/lib/harness/boot-banner.d.ts +14 -0
- package/lib/harness/boot-banner.d.ts.map +1 -0
- package/lib/harness/boot-banner.js +89 -0
- package/lib/harness/boot-banner.js.map +1 -0
- package/lib/harness/driver-agent.d.ts +78 -0
- package/lib/harness/driver-agent.d.ts.map +1 -0
- package/lib/harness/driver-agent.js +314 -0
- package/lib/harness/driver-agent.js.map +1 -0
- package/lib/harness/driver-agents.d.ts +20 -0
- package/lib/harness/driver-agents.d.ts.map +1 -0
- package/lib/harness/driver-agents.js +123 -0
- package/lib/harness/driver-agents.js.map +1 -0
- package/lib/harness/driver-approvals.d.ts +38 -0
- package/lib/harness/driver-approvals.d.ts.map +1 -0
- package/lib/harness/driver-approvals.js +277 -0
- package/lib/harness/driver-approvals.js.map +1 -0
- package/lib/harness/driver-bash.d.ts +15 -0
- package/lib/harness/driver-bash.d.ts.map +1 -0
- package/lib/harness/driver-bash.js +73 -0
- package/lib/harness/driver-bash.js.map +1 -0
- package/lib/harness/driver-catalog.d.ts +84 -0
- package/lib/harness/driver-catalog.d.ts.map +1 -0
- package/lib/harness/driver-catalog.js +256 -0
- package/lib/harness/driver-catalog.js.map +1 -0
- package/lib/harness/driver-ctx.d.ts +462 -0
- package/lib/harness/driver-ctx.d.ts.map +1 -0
- package/lib/harness/driver-ctx.js +11 -0
- package/lib/harness/driver-ctx.js.map +1 -0
- package/lib/harness/driver-hud.d.ts +31 -0
- package/lib/harness/driver-hud.d.ts.map +1 -0
- package/lib/harness/driver-hud.js +204 -0
- package/lib/harness/driver-hud.js.map +1 -0
- package/lib/harness/driver-live.d.ts +36 -0
- package/lib/harness/driver-live.d.ts.map +1 -0
- package/lib/harness/driver-live.js +44 -0
- package/lib/harness/driver-live.js.map +1 -0
- package/lib/harness/driver-modal.d.ts +52 -0
- package/lib/harness/driver-modal.d.ts.map +1 -0
- package/lib/harness/driver-modal.js +78 -0
- package/lib/harness/driver-modal.js.map +1 -0
- package/lib/harness/driver-mode.d.ts +35 -0
- package/lib/harness/driver-mode.d.ts.map +1 -0
- package/lib/harness/driver-mode.js +84 -0
- package/lib/harness/driver-mode.js.map +1 -0
- package/lib/harness/driver-pickers.d.ts +48 -0
- package/lib/harness/driver-pickers.d.ts.map +1 -0
- package/lib/harness/driver-pickers.js +249 -0
- package/lib/harness/driver-pickers.js.map +1 -0
- package/lib/harness/driver-promote.d.ts +29 -0
- package/lib/harness/driver-promote.d.ts.map +1 -0
- package/lib/harness/driver-promote.js +36 -0
- package/lib/harness/driver-promote.js.map +1 -0
- package/lib/harness/driver-queue.d.ts +19 -0
- package/lib/harness/driver-queue.d.ts.map +1 -0
- package/lib/harness/driver-queue.js +281 -0
- package/lib/harness/driver-queue.js.map +1 -0
- package/lib/harness/driver-run-local.d.ts +32 -0
- package/lib/harness/driver-run-local.d.ts.map +1 -0
- package/lib/harness/driver-run-local.js +366 -0
- package/lib/harness/driver-run-local.js.map +1 -0
- package/lib/harness/driver-sessions.d.ts +28 -0
- package/lib/harness/driver-sessions.d.ts.map +1 -0
- package/lib/harness/driver-sessions.js +386 -0
- package/lib/harness/driver-sessions.js.map +1 -0
- package/lib/harness/driver.d.ts +22 -0
- package/lib/harness/driver.d.ts.map +1 -0
- package/lib/harness/driver.js +459 -0
- package/lib/harness/driver.js.map +1 -0
- package/lib/harness/preset.d.ts +32 -0
- package/lib/harness/preset.d.ts.map +1 -0
- package/lib/harness/preset.js +34 -0
- package/lib/harness/preset.js.map +1 -0
- package/lib/harness/session-list.d.ts +65 -0
- package/lib/harness/session-list.d.ts.map +1 -0
- package/lib/harness/session-list.js +91 -0
- package/lib/harness/session-list.js.map +1 -0
- package/lib/harness/shell-output.d.ts +44 -0
- package/lib/harness/shell-output.d.ts.map +1 -0
- package/lib/harness/shell-output.js +90 -0
- package/lib/harness/shell-output.js.map +1 -0
- package/lib/harness/statusline-cc-transcript.d.ts +51 -0
- package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
- package/lib/harness/statusline-cc-transcript.js +191 -0
- package/lib/harness/statusline-cc-transcript.js.map +1 -0
- package/lib/harness/statusline-command.d.ts +54 -0
- package/lib/harness/statusline-command.d.ts.map +1 -0
- package/lib/harness/statusline-command.js +161 -0
- package/lib/harness/statusline-command.js.map +1 -0
- package/lib/harness/statusline-payload.d.ts +79 -0
- package/lib/harness/statusline-payload.d.ts.map +1 -0
- package/lib/harness/statusline-payload.js +93 -0
- package/lib/harness/statusline-payload.js.map +1 -0
- package/lib/harness/statusline-settings.d.ts +47 -0
- package/lib/harness/statusline-settings.d.ts.map +1 -0
- package/lib/harness/statusline-settings.js +57 -0
- package/lib/harness/statusline-settings.js.map +1 -0
- package/lib/harness/statusline-wiring.d.ts +45 -0
- package/lib/harness/statusline-wiring.d.ts.map +1 -0
- package/lib/harness/statusline-wiring.js +247 -0
- package/lib/harness/statusline-wiring.js.map +1 -0
- package/lib/harness/usage-view.d.ts +84 -0
- package/lib/harness/usage-view.d.ts.map +1 -0
- package/lib/harness/usage-view.js +199 -0
- package/lib/harness/usage-view.js.map +1 -0
- package/lib/harness/worktree-exit.d.ts +105 -0
- package/lib/harness/worktree-exit.d.ts.map +1 -0
- package/lib/harness/worktree-exit.js +168 -0
- package/lib/harness/worktree-exit.js.map +1 -0
- package/lib/history.d.ts +50 -0
- package/lib/history.d.ts.map +1 -0
- package/lib/history.js +139 -0
- package/lib/history.js.map +1 -0
- package/lib/index.d.ts +63 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +54 -0
- package/lib/index.js.map +1 -0
- package/lib/input.d.ts +158 -0
- package/lib/input.d.ts.map +1 -0
- package/lib/input.js +400 -0
- package/lib/input.js.map +1 -0
- package/lib/invariant.d.ts +14 -0
- package/lib/invariant.d.ts.map +1 -0
- package/lib/invariant.js +20 -0
- package/lib/invariant.js.map +1 -0
- package/lib/mode-cycle.d.ts +22 -0
- package/lib/mode-cycle.d.ts.map +1 -0
- package/lib/mode-cycle.js +32 -0
- package/lib/mode-cycle.js.map +1 -0
- package/lib/model-catalog.d.ts +22 -0
- package/lib/model-catalog.d.ts.map +1 -0
- package/lib/model-catalog.js +45 -0
- package/lib/model-catalog.js.map +1 -0
- package/lib/packaged-preset.d.ts +32 -0
- package/lib/packaged-preset.d.ts.map +1 -0
- package/lib/packaged-preset.js +94 -0
- package/lib/packaged-preset.js.map +1 -0
- package/lib/plugin.d.ts +11 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +88 -0
- package/lib/plugin.js.map +1 -0
- package/lib/profile.d.ts +4 -0
- package/lib/profile.d.ts.map +1 -0
- package/lib/profile.js +7 -0
- package/lib/profile.js.map +1 -0
- package/lib/project-sessions.d.ts +29 -0
- package/lib/project-sessions.d.ts.map +1 -0
- package/lib/project-sessions.js +60 -0
- package/lib/project-sessions.js.map +1 -0
- package/lib/project.d.ts +75 -0
- package/lib/project.d.ts.map +1 -0
- package/lib/project.js +196 -0
- package/lib/project.js.map +1 -0
- package/lib/provider-actions.d.ts +37 -0
- package/lib/provider-actions.d.ts.map +1 -0
- package/lib/provider-actions.js +417 -0
- package/lib/provider-actions.js.map +1 -0
- package/lib/provider-command.d.ts +109 -0
- package/lib/provider-command.d.ts.map +1 -0
- package/lib/provider-command.js +220 -0
- package/lib/provider-command.js.map +1 -0
- package/lib/provider-detail.d.ts +15 -0
- package/lib/provider-detail.d.ts.map +1 -0
- package/lib/provider-detail.js +201 -0
- package/lib/provider-detail.js.map +1 -0
- package/lib/provider-flow.d.ts +191 -0
- package/lib/provider-flow.d.ts.map +1 -0
- package/lib/provider-flow.js +192 -0
- package/lib/provider-flow.js.map +1 -0
- package/lib/provider-presets.d.ts +32 -0
- package/lib/provider-presets.d.ts.map +1 -0
- package/lib/provider-presets.js +105 -0
- package/lib/provider-presets.js.map +1 -0
- package/lib/provider-read.d.ts +63 -0
- package/lib/provider-read.d.ts.map +1 -0
- package/lib/provider-read.js +115 -0
- package/lib/provider-read.js.map +1 -0
- package/lib/provider-settings.d.ts +30 -0
- package/lib/provider-settings.d.ts.map +1 -0
- package/lib/provider-settings.js +65 -0
- package/lib/provider-settings.js.map +1 -0
- package/lib/resume-target.d.ts +59 -0
- package/lib/resume-target.d.ts.map +1 -0
- package/lib/resume-target.js +143 -0
- package/lib/resume-target.js.map +1 -0
- package/lib/slash.d.ts +44 -0
- package/lib/slash.d.ts.map +1 -0
- package/lib/slash.js +81 -0
- package/lib/slash.js.map +1 -0
- package/lib/state/driver-types.d.ts +505 -0
- package/lib/state/driver-types.d.ts.map +1 -0
- package/lib/state/driver-types.js +8 -0
- package/lib/state/driver-types.js.map +1 -0
- package/lib/state/driver-usage-types.d.ts +59 -0
- package/lib/state/driver-usage-types.d.ts.map +1 -0
- package/lib/state/driver-usage-types.js +8 -0
- package/lib/state/driver-usage-types.js.map +1 -0
- package/lib/statusline.d.ts +63 -0
- package/lib/statusline.d.ts.map +1 -0
- package/lib/statusline.js +97 -0
- package/lib/statusline.js.map +1 -0
- package/lib/store/pickers.d.ts +34 -0
- package/lib/store/pickers.d.ts.map +1 -0
- package/lib/store/pickers.js +111 -0
- package/lib/store/pickers.js.map +1 -0
- package/lib/store/provider-panel.d.ts +107 -0
- package/lib/store/provider-panel.d.ts.map +1 -0
- package/lib/store/provider-panel.js +151 -0
- package/lib/store/provider-panel.js.map +1 -0
- package/lib/store/question.d.ts +21 -0
- package/lib/store/question.d.ts.map +1 -0
- package/lib/store/question.js +59 -0
- package/lib/store/question.js.map +1 -0
- package/lib/store/queue.d.ts +27 -0
- package/lib/store/queue.d.ts.map +1 -0
- package/lib/store/queue.js +34 -0
- package/lib/store/queue.js.map +1 -0
- package/lib/store/session.d.ts +73 -0
- package/lib/store/session.d.ts.map +1 -0
- package/lib/store/session.js +172 -0
- package/lib/store/session.js.map +1 -0
- package/lib/store/subagents.d.ts +16 -0
- package/lib/store/subagents.d.ts.map +1 -0
- package/lib/store/subagents.js +44 -0
- package/lib/store/subagents.js.map +1 -0
- package/lib/store/todos.d.ts +35 -0
- package/lib/store/todos.d.ts.map +1 -0
- package/lib/store/todos.js +68 -0
- package/lib/store/todos.js.map +1 -0
- package/lib/store/usage.d.ts +15 -0
- package/lib/store/usage.d.ts.map +1 -0
- package/lib/store/usage.js +27 -0
- package/lib/store/usage.js.map +1 -0
- package/lib/store/views.d.ts +419 -0
- package/lib/store/views.d.ts.map +1 -0
- package/lib/store/views.js +3 -0
- package/lib/store/views.js.map +1 -0
- package/lib/store.d.ts +19 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +10 -0
- package/lib/store.js.map +1 -0
- package/lib/terminal/lease.d.ts +33 -0
- package/lib/terminal/lease.d.ts.map +1 -0
- package/lib/terminal/lease.js +99 -0
- package/lib/terminal/lease.js.map +1 -0
- package/lib/tool-card.d.ts +75 -0
- package/lib/tool-card.d.ts.map +1 -0
- package/lib/tool-card.js +109 -0
- package/lib/tool-card.js.map +1 -0
- package/lib/tool-verbs.d.ts +12 -0
- package/lib/tool-verbs.d.ts.map +1 -0
- package/lib/tool-verbs.js +29 -0
- package/lib/tool-verbs.js.map +1 -0
- package/lib/transcript.d.ts +40 -0
- package/lib/transcript.d.ts.map +1 -0
- package/lib/transcript.js +413 -0
- package/lib/transcript.js.map +1 -0
- package/lib/working-line.d.ts +44 -0
- package/lib/working-line.d.ts.map +1 -0
- package/lib/working-line.js +56 -0
- package/lib/working-line.js.map +1 -0
- package/package.json +72 -0
- package/presets/cc/.dsh-cc-managed.json +5 -0
- package/presets/cc/agent.cordis.yml +524 -0
- package/presets/cc/preset.yml +3 -0
- package/scripts/stage-preset.mjs +26 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold a harness session-event envelope into the TUI store. UI-only: never
|
|
3
|
+
* appends new durable event types.
|
|
4
|
+
* @module @dsh-cc/tui/transcript
|
|
5
|
+
*/
|
|
6
|
+
import { formatCallCard, formatResultCard, } from "./tool-card.js";
|
|
7
|
+
import { setBusy, setPermissionMode, setSessionTitle, upsertRow, } from "./store.js";
|
|
8
|
+
import { dropRowsInRange, extractCompactSummary, isCompactCheckpointSource } from "./compact-fold.js";
|
|
9
|
+
function parseArgs(raw) {
|
|
10
|
+
if (raw.length === 0)
|
|
11
|
+
return {};
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return raw;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function textOf(data) {
|
|
20
|
+
if (data === null || data === undefined)
|
|
21
|
+
return '';
|
|
22
|
+
if (typeof data === 'string')
|
|
23
|
+
return data;
|
|
24
|
+
if (typeof data !== 'object')
|
|
25
|
+
return String(data);
|
|
26
|
+
const record = data;
|
|
27
|
+
if (typeof record.text === 'string')
|
|
28
|
+
return record.text;
|
|
29
|
+
if (typeof record.message === 'string')
|
|
30
|
+
return record.message;
|
|
31
|
+
if (typeof record.content === 'string')
|
|
32
|
+
return record.content;
|
|
33
|
+
// UserMessage carries content as an array of typed blocks; concatenate the
|
|
34
|
+
// text of every text block (ignore images and other non-text blocks).
|
|
35
|
+
if (Array.isArray(record.content)) {
|
|
36
|
+
return record.content
|
|
37
|
+
.filter((block) => block !== null && typeof block === 'object' &&
|
|
38
|
+
block.type === 'text' &&
|
|
39
|
+
typeof block.text === 'string')
|
|
40
|
+
.map(block => block.text)
|
|
41
|
+
.join('');
|
|
42
|
+
}
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
function callIdOf(data) {
|
|
46
|
+
if (data === null || typeof data !== 'object')
|
|
47
|
+
return '';
|
|
48
|
+
const record = data;
|
|
49
|
+
if (record.callId !== undefined)
|
|
50
|
+
return String(record.callId);
|
|
51
|
+
if (record.id !== undefined)
|
|
52
|
+
return String(record.id);
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
function nameOf(data) {
|
|
56
|
+
if (data === null || typeof data !== 'object')
|
|
57
|
+
return 'tool';
|
|
58
|
+
const record = data;
|
|
59
|
+
if (typeof record.name === 'string')
|
|
60
|
+
return record.name;
|
|
61
|
+
if (typeof record.toolName === 'string')
|
|
62
|
+
return record.toolName;
|
|
63
|
+
return 'tool';
|
|
64
|
+
}
|
|
65
|
+
function argsOf(data) {
|
|
66
|
+
if (data === null || typeof data !== 'object')
|
|
67
|
+
return '';
|
|
68
|
+
const record = data;
|
|
69
|
+
if (typeof record.arguments === 'string')
|
|
70
|
+
return record.arguments;
|
|
71
|
+
if (record.arguments !== undefined) {
|
|
72
|
+
try {
|
|
73
|
+
return JSON.stringify(record.arguments);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return String(record.arguments);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return '';
|
|
80
|
+
}
|
|
81
|
+
/** Unwrap the live {turn, step, chunk} envelope to the inner StreamChunk. */
|
|
82
|
+
function unwrapChunk(data) {
|
|
83
|
+
if (data === null || typeof data !== 'object')
|
|
84
|
+
return data;
|
|
85
|
+
const record = data;
|
|
86
|
+
if (record.chunk !== null && typeof record.chunk === 'object' && !Array.isArray(record.chunk)) {
|
|
87
|
+
return record.chunk;
|
|
88
|
+
}
|
|
89
|
+
return data;
|
|
90
|
+
}
|
|
91
|
+
/** Structural check for a tool-call-delta stream chunk. */
|
|
92
|
+
function isToolCallDelta(chunk) {
|
|
93
|
+
if (chunk === null || typeof chunk !== 'object')
|
|
94
|
+
return false;
|
|
95
|
+
const record = chunk;
|
|
96
|
+
return record.type === 'tool-call-delta'
|
|
97
|
+
&& (typeof record.id === 'string' || typeof record.id === 'number')
|
|
98
|
+
&& typeof record.argumentsDelta === 'string';
|
|
99
|
+
}
|
|
100
|
+
function chunkKind(data) {
|
|
101
|
+
const chunk = unwrapChunk(data);
|
|
102
|
+
if (chunk === null || typeof chunk !== 'object')
|
|
103
|
+
return 'assistant';
|
|
104
|
+
const record = chunk;
|
|
105
|
+
const type = typeof record.type === 'string' ? record.type : '';
|
|
106
|
+
if (type.includes('reason') || type.includes('think'))
|
|
107
|
+
return 'thinking';
|
|
108
|
+
if (record.reasoning === true)
|
|
109
|
+
return 'thinking';
|
|
110
|
+
return 'assistant';
|
|
111
|
+
}
|
|
112
|
+
function chunkText(data) {
|
|
113
|
+
if (data === null || typeof data !== 'object')
|
|
114
|
+
return textOf(data);
|
|
115
|
+
const record = unwrapChunk(data);
|
|
116
|
+
if (typeof record.text === 'string')
|
|
117
|
+
return record.text;
|
|
118
|
+
if (typeof record.delta === 'string')
|
|
119
|
+
return record.delta;
|
|
120
|
+
if (record.delta !== null && typeof record.delta === 'object') {
|
|
121
|
+
const delta = record.delta;
|
|
122
|
+
if (typeof delta.text === 'string')
|
|
123
|
+
return delta.text;
|
|
124
|
+
}
|
|
125
|
+
return textOf(data);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Seq tag for rows created by `event`: rows carry the log position that
|
|
129
|
+
* produced them so a surface `replace` can drop the exact replaced span.
|
|
130
|
+
* Omitted (key absent) when the envelope carries no seq.
|
|
131
|
+
*/
|
|
132
|
+
function seqTag(event) {
|
|
133
|
+
return typeof event.seq === 'number' ? { seq: event.seq } : {};
|
|
134
|
+
}
|
|
135
|
+
/** The surface-replacement range of a `user/message`, when it replaces. */
|
|
136
|
+
function replaceOpOf(event) {
|
|
137
|
+
const op = event.surfaceOp;
|
|
138
|
+
if (typeof op !== 'object' || op === null || op.op !== 'replace')
|
|
139
|
+
return undefined;
|
|
140
|
+
return typeof op.start === 'number' && typeof op.end === 'number' ? { start: op.start, end: op.end } : undefined;
|
|
141
|
+
}
|
|
142
|
+
/** Drop `pendingCompact` (exactOptionalPropertyTypes-safe field removal). */
|
|
143
|
+
function withoutPendingCompact(state) {
|
|
144
|
+
const { pendingCompact: _dropped, ...rest } = state;
|
|
145
|
+
return rest;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Apply one surface replacement: drop the replaced span from the transcript
|
|
149
|
+
* and — when the replacement is a compact checkpoint — paint the collapsible
|
|
150
|
+
* compact boundary at the cut point using the metering armed by the adjacent
|
|
151
|
+
* `compaction/summary`. Non-checkpoint replacements just shrink the visible
|
|
152
|
+
* transcript (the model sees the same surface).
|
|
153
|
+
*/
|
|
154
|
+
function applySurfaceReplace(state, event, op) {
|
|
155
|
+
const data = event.data;
|
|
156
|
+
const source = data !== null && typeof data === 'object'
|
|
157
|
+
? data.source
|
|
158
|
+
: undefined;
|
|
159
|
+
const rows = dropRowsInRange(state.rows, op.start, op.end);
|
|
160
|
+
if (!isCompactCheckpointSource(source)) {
|
|
161
|
+
return withoutPendingCompact({ ...state, rows });
|
|
162
|
+
}
|
|
163
|
+
const pending = state.pendingCompact;
|
|
164
|
+
const sourceCommandId = pending?.sourceCommandId
|
|
165
|
+
?? (source !== null && typeof source === 'object'
|
|
166
|
+
&& typeof source.sourceCommandId === 'string'
|
|
167
|
+
? source.sourceCommandId
|
|
168
|
+
: undefined);
|
|
169
|
+
const compact = {
|
|
170
|
+
kind: 'compact',
|
|
171
|
+
trigger: sourceCommandId === undefined ? 'auto' : 'manual',
|
|
172
|
+
items: pending?.items ?? 0,
|
|
173
|
+
tokens: pending?.tokens ?? 0,
|
|
174
|
+
summary: extractCompactSummary(data.content),
|
|
175
|
+
...seqTag(event),
|
|
176
|
+
};
|
|
177
|
+
// Insert at the cut point: before the first surviving row past the
|
|
178
|
+
// replaced range (or the tail when the compaction kept nothing newer).
|
|
179
|
+
const insertAt = rows.findIndex(row => {
|
|
180
|
+
const seq = row.seq;
|
|
181
|
+
return typeof seq === 'number' && seq > op.end;
|
|
182
|
+
});
|
|
183
|
+
const withCompact = insertAt === -1
|
|
184
|
+
? [...rows, compact]
|
|
185
|
+
: [...rows.slice(0, insertAt), compact, ...rows.slice(insertAt)];
|
|
186
|
+
return withoutPendingCompact({ ...state, rows: withCompact });
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Fold a tool-call-delta chunk into the pending tool row, accumulating
|
|
190
|
+
* `argumentsDelta` per callId. Presenters are NOT invoked on partial JSON;
|
|
191
|
+
* the durable tool/call finalizes the card through the existing callId
|
|
192
|
+
* upsert. A delta arriving after the row was finalized (running:false with
|
|
193
|
+
* a result) is ignored — durable order normally prevents this.
|
|
194
|
+
*/
|
|
195
|
+
function foldToolCallDelta(state, chunk, seq) {
|
|
196
|
+
const callId = String(chunk.id);
|
|
197
|
+
const carriedName = typeof chunk.name === 'string' && chunk.name.length > 0 ? chunk.name : undefined;
|
|
198
|
+
const existing = state.rows.find(row => row.kind === 'tool' && row.callId === callId);
|
|
199
|
+
if (existing !== undefined && existing.kind === 'tool') {
|
|
200
|
+
if (existing.running === false && existing.result !== undefined)
|
|
201
|
+
return state;
|
|
202
|
+
const name = carriedName !== undefined && existing.name === 'tool' ? carriedName : existing.name;
|
|
203
|
+
const title = carriedName !== undefined && existing.title === 'tool' ? carriedName : existing.title;
|
|
204
|
+
return setBusy(upsertRow(state, {
|
|
205
|
+
kind: 'tool',
|
|
206
|
+
callId,
|
|
207
|
+
name,
|
|
208
|
+
args: existing.args + chunk.argumentsDelta,
|
|
209
|
+
title,
|
|
210
|
+
...existing.body !== undefined ? { body: existing.body } : {},
|
|
211
|
+
...existing.result !== undefined ? { result: existing.result } : {},
|
|
212
|
+
...existing.error !== undefined ? { error: existing.error } : {},
|
|
213
|
+
running: true,
|
|
214
|
+
...seq === undefined ? {} : { seq },
|
|
215
|
+
}), true);
|
|
216
|
+
}
|
|
217
|
+
const initialName = carriedName ?? 'tool';
|
|
218
|
+
return setBusy(upsertRow(state, {
|
|
219
|
+
kind: 'tool',
|
|
220
|
+
callId,
|
|
221
|
+
name: initialName,
|
|
222
|
+
args: chunk.argumentsDelta,
|
|
223
|
+
title: initialName,
|
|
224
|
+
running: true,
|
|
225
|
+
...seq === undefined ? {} : { seq },
|
|
226
|
+
}), true);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Apply one session event to the view model.
|
|
230
|
+
* @param state - current TUI state.
|
|
231
|
+
* @param event - a `session/event` envelope.
|
|
232
|
+
* @param presenters - optional presentCall/presentResult lookup.
|
|
233
|
+
*/
|
|
234
|
+
export function applySessionEvent(state, event, presenters) {
|
|
235
|
+
const data = event.data;
|
|
236
|
+
switch (event.type) {
|
|
237
|
+
case 'user/message': {
|
|
238
|
+
// A surface replacement follows the compact seam: drop the replaced
|
|
239
|
+
// span and (for the checkpoint) paint the compact boundary. Busy and
|
|
240
|
+
// turn anchoring stay driver-side.
|
|
241
|
+
const replace = replaceOpOf(event);
|
|
242
|
+
if (replace !== undefined)
|
|
243
|
+
return applySurfaceReplace(state, event, replace);
|
|
244
|
+
// Route on UserMessage.source.kind: only human input renders as a user
|
|
245
|
+
// row. Injected context (kind 'plugin') is model-facing — a notice form
|
|
246
|
+
// surfaces as a one-line dim status per its contract, every other form
|
|
247
|
+
// (instructions/catalog/snapshot/relay/recall) stays hidden. Tool and
|
|
248
|
+
// unknown/absent kinds fold to nothing: never dump unrecognized
|
|
249
|
+
// injected content as if the user typed it.
|
|
250
|
+
const source = data !== null && typeof data === 'object'
|
|
251
|
+
? data.source
|
|
252
|
+
: undefined;
|
|
253
|
+
const kind = source !== null && typeof source === 'object'
|
|
254
|
+
&& typeof source.kind === 'string'
|
|
255
|
+
? source.kind
|
|
256
|
+
: undefined;
|
|
257
|
+
if (kind !== 'user') {
|
|
258
|
+
if (kind === 'plugin') {
|
|
259
|
+
const plugin = source;
|
|
260
|
+
if (plugin.form === 'notice' && typeof plugin.summary === 'string') {
|
|
261
|
+
return upsertRow(state, { kind: 'status', text: plugin.summary, ...seqTag(event) });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return state;
|
|
265
|
+
}
|
|
266
|
+
const text = textOf(data);
|
|
267
|
+
// Chip clearing is deliberately NOT event-driven: the driver clears the
|
|
268
|
+
// queue synchronously at dispatch (flush / Ctrl+S / interrupt / recall),
|
|
269
|
+
// so a late durable `user/message` can never wipe a same-text chip the
|
|
270
|
+
// user re-queued in the meantime. Empty or whitespace-only text adds no
|
|
271
|
+
// row (no blank `> ` lines).
|
|
272
|
+
if (text.trim().length === 0)
|
|
273
|
+
return state;
|
|
274
|
+
return upsertRow(state, { kind: 'user', text, ...seqTag(event) });
|
|
275
|
+
}
|
|
276
|
+
case 'compaction/summary': {
|
|
277
|
+
// Metering for the immediately following surface replacement: park the
|
|
278
|
+
// shadowed accounting on state; the replacement paints the compact row.
|
|
279
|
+
const record = data !== null && typeof data === 'object'
|
|
280
|
+
? data
|
|
281
|
+
: {};
|
|
282
|
+
const items = Array.isArray(record.shadowedSeqs) ? record.shadowedSeqs.length : 0;
|
|
283
|
+
const tokens = typeof record.shadowedTokenCount === 'number' ? record.shadowedTokenCount : 0;
|
|
284
|
+
return {
|
|
285
|
+
...state,
|
|
286
|
+
pendingCompact: {
|
|
287
|
+
items,
|
|
288
|
+
tokens,
|
|
289
|
+
...typeof record.sourceCommandId === 'string' ? { sourceCommandId: record.sourceCommandId } : {},
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
case 'assistant/chunk': {
|
|
294
|
+
const chunk = unwrapChunk(data);
|
|
295
|
+
if (isToolCallDelta(chunk))
|
|
296
|
+
return foldToolCallDelta(state, chunk, event.seq);
|
|
297
|
+
const text = chunkText(data);
|
|
298
|
+
if (text.length === 0)
|
|
299
|
+
return setBusy(state, true);
|
|
300
|
+
return setBusy(upsertRow(state, { kind: chunkKind(data), text, ...seqTag(event) }), true);
|
|
301
|
+
}
|
|
302
|
+
case 'assistant/message':
|
|
303
|
+
return setBusy(state, false);
|
|
304
|
+
case 'tool/call': {
|
|
305
|
+
const name = nameOf(data);
|
|
306
|
+
const args = argsOf(data);
|
|
307
|
+
const view = presenters?.presentCall?.(name, parseArgs(args));
|
|
308
|
+
const card = formatCallCard(view, { name, args });
|
|
309
|
+
const diffs = view !== undefined && view.card === 'diff' ? view.diffs : undefined;
|
|
310
|
+
return upsertRow(state, {
|
|
311
|
+
kind: 'tool',
|
|
312
|
+
callId: callIdOf(data),
|
|
313
|
+
name,
|
|
314
|
+
args,
|
|
315
|
+
title: card.title,
|
|
316
|
+
...card.body === undefined ? {} : { body: card.body },
|
|
317
|
+
...diffs !== undefined ? { diffs } : {},
|
|
318
|
+
running: true,
|
|
319
|
+
...seqTag(event),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
case 'tool/result': {
|
|
323
|
+
const name = nameOf(data);
|
|
324
|
+
const callId = callIdOf(data);
|
|
325
|
+
const pending = state.rows.find(row => row.kind === 'tool' && row.callId === callId);
|
|
326
|
+
const pendingTitle = pending?.kind === 'tool' ? pending.title : name;
|
|
327
|
+
const pendingArgs = pending?.kind === 'tool' ? pending.args : argsOf(data);
|
|
328
|
+
const isError = data !== null && typeof data === 'object' && data.error !== undefined;
|
|
329
|
+
const fallback = textOf(data) || argsOf(data);
|
|
330
|
+
const view = presenters?.presentResult?.(name, parseArgs(pendingArgs), {
|
|
331
|
+
content: data,
|
|
332
|
+
isError,
|
|
333
|
+
});
|
|
334
|
+
const card = formatResultCard(view, { pendingTitle, fallback, error: isError });
|
|
335
|
+
const diffs = view !== undefined && view.card === 'diff' ? view.diffs : undefined;
|
|
336
|
+
return upsertRow(state, {
|
|
337
|
+
kind: 'tool',
|
|
338
|
+
callId,
|
|
339
|
+
name,
|
|
340
|
+
args: pendingArgs,
|
|
341
|
+
title: card.title,
|
|
342
|
+
...card.body === undefined ? {} : { body: card.body, result: card.body },
|
|
343
|
+
...diffs !== undefined ? { diffs } : {},
|
|
344
|
+
error: card.error,
|
|
345
|
+
running: false,
|
|
346
|
+
...seqTag(event),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
case 'turn/start':
|
|
350
|
+
return setBusy(state, true);
|
|
351
|
+
case 'turn/end': {
|
|
352
|
+
// A turn always clears busy. Beyond that, fold the reason into a visible
|
|
353
|
+
// status row so a backend failure never ends the turn silently: error
|
|
354
|
+
// reasons paint red, blocked/max-tokens paint dim, and
|
|
355
|
+
// completed/aborted/absent add nothing (abort already shows
|
|
356
|
+
// "Interrupted by user." from interrupt()).
|
|
357
|
+
const reason = data !== null && typeof data === 'object'
|
|
358
|
+
? data.reason
|
|
359
|
+
: undefined;
|
|
360
|
+
const kind = reason !== null && typeof reason === 'object'
|
|
361
|
+
? reason.kind
|
|
362
|
+
: undefined;
|
|
363
|
+
if (kind === 'error') {
|
|
364
|
+
const err = reason.error;
|
|
365
|
+
const message = err !== null && typeof err === 'object'
|
|
366
|
+
? err.message
|
|
367
|
+
: undefined;
|
|
368
|
+
const text = typeof message === 'string' && message.length > 0
|
|
369
|
+
? `⚠ Turn failed: ${message}`
|
|
370
|
+
: '⚠ Turn failed';
|
|
371
|
+
return setBusy(upsertRow(state, { kind: 'status', text, error: true, ...seqTag(event) }), false);
|
|
372
|
+
}
|
|
373
|
+
if (kind === 'blocked') {
|
|
374
|
+
return setBusy(upsertRow(state, { kind: 'status', text: '⚠ Turn blocked', ...seqTag(event) }), false);
|
|
375
|
+
}
|
|
376
|
+
if (kind === 'max-tokens') {
|
|
377
|
+
return setBusy(upsertRow(state, { kind: 'status', text: '⚠ Reached the token ceiling', ...seqTag(event) }), false);
|
|
378
|
+
}
|
|
379
|
+
return setBusy(state, false);
|
|
380
|
+
}
|
|
381
|
+
case 'agent/status': {
|
|
382
|
+
const status = data !== null && typeof data === 'object'
|
|
383
|
+
? data.status
|
|
384
|
+
: undefined;
|
|
385
|
+
if (event.type === 'agent/status' && status === 'running')
|
|
386
|
+
return setBusy(state, true);
|
|
387
|
+
return setBusy(state, false);
|
|
388
|
+
}
|
|
389
|
+
case 'permission/mode': {
|
|
390
|
+
const mode = data !== null && typeof data === 'object'
|
|
391
|
+
? data.mode
|
|
392
|
+
: undefined;
|
|
393
|
+
return mode === undefined ? state : setPermissionMode(state, mode);
|
|
394
|
+
}
|
|
395
|
+
case 'plan/mode': {
|
|
396
|
+
const active = data !== null && typeof data === 'object'
|
|
397
|
+
? data.active
|
|
398
|
+
: undefined;
|
|
399
|
+
return active ? setPermissionMode(state, 'plan') : state;
|
|
400
|
+
}
|
|
401
|
+
case 'session/title': {
|
|
402
|
+
// Log-only framework title (fallback or LLM provider): fold last-wins
|
|
403
|
+
// into state.title for the window-title effect; never a transcript row.
|
|
404
|
+
const title = data !== null && typeof data === 'object'
|
|
405
|
+
? data.title
|
|
406
|
+
: undefined;
|
|
407
|
+
return typeof title === 'string' && title.length > 0 ? setSessionTitle(state, title) : state;
|
|
408
|
+
}
|
|
409
|
+
default:
|
|
410
|
+
return state;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the live working line (claude-code style spinner row).
|
|
3
|
+
* Deliberately a leaf module: the store imports `VERBS`/`TurnAnchor` from
|
|
4
|
+
* here, so nothing here may import back from the store or components.
|
|
5
|
+
* @module @dsh-cc/tui/working-line
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Whimsical progressive verbs the working line cycles through. Lives in this
|
|
9
|
+
* leaf module (not the component) so `store.ts` can derive
|
|
10
|
+
* `verbIndex = startedAt % VERBS.length` without a store → components
|
|
11
|
+
* reverse dependency.
|
|
12
|
+
*/
|
|
13
|
+
export declare const VERBS: readonly string[];
|
|
14
|
+
/**
|
|
15
|
+
* Anchor for the currently-running turn: when it started, the session's
|
|
16
|
+
* cumulative output-token total at anchor time (`undefined` when the HUD was
|
|
17
|
+
* not yet seeded — the first tokenUsage change pins it, see the driver's
|
|
18
|
+
* rebase guard), and the deterministic spinner verb index. `stepStartedAt`
|
|
19
|
+
* (optional) is the current step's clock, reset by the driver on each
|
|
20
|
+
* `tool/call`/`tool/result`; when absent the step clock falls back to
|
|
21
|
+
* `startedAt`, so elapsed time shows the whole turn.
|
|
22
|
+
*/
|
|
23
|
+
export interface TurnAnchor {
|
|
24
|
+
startedAt: number;
|
|
25
|
+
outputBase: number | undefined;
|
|
26
|
+
verbIndex: number;
|
|
27
|
+
stepStartedAt?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compact elapsed time: `12s` under a minute, `4m 23s` under an hour, `1h 5m`
|
|
31
|
+
* beyond. Negative inputs clamp to `0s` — the line stays calm on clock skew.
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatElapsed(ms: number): string;
|
|
34
|
+
/**
|
|
35
|
+
* Render the working-line message for a live turn:
|
|
36
|
+
* `Galloping… (4m 23s · ↓ 5.8k tokens)`. Elapsed time counts from the current
|
|
37
|
+
* step (`stepStartedAt`, falling back to `startedAt`) — the driver resets the
|
|
38
|
+
* step clock per tool call/result, so the line shows this step's duration.
|
|
39
|
+
* The token segment is omitted while the baseline is unseeded
|
|
40
|
+
* (`outputBase === undefined`) or the delta has not yet gone positive — no
|
|
41
|
+
* `↓ 0 tokens` flicker at turn start.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatWorkingLine(turn: TurnAnchor, currentOutput: number, now: number): string;
|
|
44
|
+
//# sourceMappingURL=working-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-line.d.ts","sourceRoot":"","sources":["../src/working-line.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,MAAM,EASlC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ9F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the live working line (claude-code style spinner row).
|
|
3
|
+
* Deliberately a leaf module: the store imports `VERBS`/`TurnAnchor` from
|
|
4
|
+
* here, so nothing here may import back from the store or components.
|
|
5
|
+
* @module @dsh-cc/tui/working-line
|
|
6
|
+
*/
|
|
7
|
+
import { formatTokens } from "./statusline.js";
|
|
8
|
+
/**
|
|
9
|
+
* Whimsical progressive verbs the working line cycles through. Lives in this
|
|
10
|
+
* leaf module (not the component) so `store.ts` can derive
|
|
11
|
+
* `verbIndex = startedAt % VERBS.length` without a store → components
|
|
12
|
+
* reverse dependency.
|
|
13
|
+
*/
|
|
14
|
+
export const VERBS = [
|
|
15
|
+
'Thinking',
|
|
16
|
+
'Galloping',
|
|
17
|
+
'Cogitating',
|
|
18
|
+
'Pondering',
|
|
19
|
+
'Brewing',
|
|
20
|
+
'Percolating',
|
|
21
|
+
'Deliberating',
|
|
22
|
+
'Musing',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Compact elapsed time: `12s` under a minute, `4m 23s` under an hour, `1h 5m`
|
|
26
|
+
* beyond. Negative inputs clamp to `0s` — the line stays calm on clock skew.
|
|
27
|
+
*/
|
|
28
|
+
export function formatElapsed(ms) {
|
|
29
|
+
const totalSeconds = Math.max(0, Math.floor(ms / 1000));
|
|
30
|
+
if (totalSeconds < 60)
|
|
31
|
+
return `${totalSeconds}s`;
|
|
32
|
+
const minutes = Math.floor(totalSeconds / 60) % 60;
|
|
33
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
34
|
+
if (hours === 0)
|
|
35
|
+
return `${minutes}m ${totalSeconds % 60}s`;
|
|
36
|
+
return `${hours}h ${minutes}m`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Render the working-line message for a live turn:
|
|
40
|
+
* `Galloping… (4m 23s · ↓ 5.8k tokens)`. Elapsed time counts from the current
|
|
41
|
+
* step (`stepStartedAt`, falling back to `startedAt`) — the driver resets the
|
|
42
|
+
* step clock per tool call/result, so the line shows this step's duration.
|
|
43
|
+
* The token segment is omitted while the baseline is unseeded
|
|
44
|
+
* (`outputBase === undefined`) or the delta has not yet gone positive — no
|
|
45
|
+
* `↓ 0 tokens` flicker at turn start.
|
|
46
|
+
*/
|
|
47
|
+
export function formatWorkingLine(turn, currentOutput, now) {
|
|
48
|
+
const elapsed = formatElapsed(now - (turn.stepStartedAt ?? turn.startedAt));
|
|
49
|
+
const delta = turn.outputBase === undefined ? 0 : currentOutput - turn.outputBase;
|
|
50
|
+
const tokens = turn.outputBase !== undefined && delta > 0
|
|
51
|
+
? ` · ↓ ${formatTokens(delta)} tokens`
|
|
52
|
+
: '';
|
|
53
|
+
const verb = VERBS[turn.verbIndex % VERBS.length] ?? VERBS[0];
|
|
54
|
+
return `${verb}… (${elapsed}${tokens})`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=working-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-line.js","sourceRoot":"","sources":["../src/working-line.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAsB;IACtC,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;IACX,SAAS;IACT,aAAa;IACb,cAAc;IACd,QAAQ;CACT,CAAA;AAkBD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACvD,IAAI,YAAY,GAAG,EAAE;QAAE,OAAO,GAAG,YAAY,GAAG,CAAA;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAC7C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,KAAK,YAAY,GAAG,EAAE,GAAG,CAAA;IAC3D,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAA;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,aAAqB,EAAE,GAAW;IACpF,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAA;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC;QACvD,CAAC,CAAC,QAAQ,YAAY,CAAC,KAAK,CAAC,SAAS;QACtC,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAA;IAC9D,OAAO,GAAG,IAAI,MAAM,OAAO,GAAG,MAAM,GAAG,CAAA;AACzC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dsh-cc/tui",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Claude Code-style terminal surface for the dsh tui profile (CC agent preset)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"lib",
|
|
10
|
+
"presets",
|
|
11
|
+
"scripts/stage-preset.mjs"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./lib/index.d.ts",
|
|
16
|
+
"default": "./lib/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./invariant": {
|
|
19
|
+
"types": "./lib/invariant.d.ts",
|
|
20
|
+
"default": "./lib/invariant.js"
|
|
21
|
+
},
|
|
22
|
+
"./src/*": "./src/*",
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/dsh-cc/dsh-cc.git",
|
|
28
|
+
"directory": "packages/ui/tui"
|
|
29
|
+
},
|
|
30
|
+
"license": "Apache-2.0",
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@deepseek-ai/cordis": ">=0.1.1-rc.2",
|
|
33
|
+
"@deepseek-ai/dsh-agent": ">=0.1.1-rc.2",
|
|
34
|
+
"@deepseek-ai/dsh-agent-presets": ">=0.1.1-rc.2",
|
|
35
|
+
"@deepseek-ai/dsh-commands": ">=0.1.1-rc.2",
|
|
36
|
+
"@deepseek-ai/dsh-invariants": ">=0.1.1-rc.2",
|
|
37
|
+
"@deepseek-ai/dsh-llm": ">=0.1.1-rc.2",
|
|
38
|
+
"@deepseek-ai/dsh-plan-mode": ">=0.1.1-rc.2",
|
|
39
|
+
"@deepseek-ai/dsh-session": ">=0.1.1-rc.2",
|
|
40
|
+
"@deepseek-ai/dsh-user-approval": ">=0.1.1-rc.2",
|
|
41
|
+
"@deepseek-ai/dsh-user-questions": ">=0.1.1-rc.2",
|
|
42
|
+
"@deepseek-ai/schemastery": ">=3.18.1"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"highlight.js": "11.12.0",
|
|
46
|
+
"@dsh-cc/command-agents": "^0.5.0",
|
|
47
|
+
"@dsh-cc/command-permissions": "^0.5.0",
|
|
48
|
+
"@dsh-cc/subagent-task": "^0.5.0",
|
|
49
|
+
"@dsh-cc/permission-rules": "^0.5.0",
|
|
50
|
+
"@dsh-cc/pi-tui": "^0.5.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@deepseek-ai/cordis": "link:../../../../deepseek-harness/vendor/cordis",
|
|
54
|
+
"@deepseek-ai/cordis-plugin-loader": "link:../../../../deepseek-harness/vendor/loader",
|
|
55
|
+
"@deepseek-ai/dsh-agent": "link:../../../../deepseek-harness/packages/core/agent",
|
|
56
|
+
"@deepseek-ai/dsh-agent-presets": "link:../../../../deepseek-harness/packages/preset/agent-presets",
|
|
57
|
+
"@deepseek-ai/dsh-commands": "link:../../../../deepseek-harness/packages/interaction/commands",
|
|
58
|
+
"@deepseek-ai/dsh-invariants": "link:../../../../deepseek-harness/packages/runtime-diagnostics/invariants",
|
|
59
|
+
"@deepseek-ai/dsh-llm": "link:../../../../deepseek-harness/packages/llm/llm",
|
|
60
|
+
"@deepseek-ai/dsh-plan-mode": "link:../../../../deepseek-harness/packages/plan/plan-mode",
|
|
61
|
+
"@deepseek-ai/dsh-session": "link:../../../../deepseek-harness/packages/core/session",
|
|
62
|
+
"@deepseek-ai/dsh-settings": "link:../../../../deepseek-harness/packages/settings/settings",
|
|
63
|
+
"@deepseek-ai/dsh-user-approval": "link:../../../../deepseek-harness/packages/interaction/user-approval",
|
|
64
|
+
"@deepseek-ai/dsh-user-questions": "link:../../../../deepseek-harness/packages/interaction/user-questions",
|
|
65
|
+
"@deepseek-ai/schemastery": "link:../../../../deepseek-harness/vendor/schemastery",
|
|
66
|
+
"@xterm/headless": "5.5.0"
|
|
67
|
+
},
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public"
|
|
70
|
+
},
|
|
71
|
+
"scripts": {}
|
|
72
|
+
}
|