@sagmans/dsh-tui 0.12.1 → 0.14.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/.agents/skills/dsh-tui-dogfood/SKILL.md +18 -2
- package/.agents/skills/dsh-tui-dogfood/references/home-state.md +4 -4
- package/.agents/skills/dsh-tui-dogfood/scripts/clone-links.mjs +19 -11
- package/.agents/skills/dsh-tui-dogfood/scripts/run-plugin-from-worktree.sh +31 -9
- package/.agents/skills/dsh-tui-update-models/SKILL.md +1 -1
- package/.agents/skills/dsh-tui-update-models/references/model-wiring.md +6 -6
- package/.agents/skills/dsh-tui-update-models/scripts/dump-model-catalog.mjs +21 -13
- package/README.md +61 -23
- package/cordis.patch.yml +2 -0
- package/lib/agent/fork.d.ts +3 -1
- package/lib/agent/fork.d.ts.map +1 -1
- package/lib/agent/fork.js +2 -0
- package/lib/agent/fork.js.map +1 -1
- package/lib/agent/history.d.ts +14 -22
- package/lib/agent/history.d.ts.map +1 -1
- package/lib/agent/history.js +20 -14
- package/lib/agent/history.js.map +1 -1
- package/lib/agent/host.d.ts.map +1 -1
- package/lib/agent/host.js +6 -0
- package/lib/agent/host.js.map +1 -1
- package/lib/agent/model.d.ts +10 -8
- package/lib/agent/model.d.ts.map +1 -1
- package/lib/agent/model.js +9 -7
- package/lib/agent/model.js.map +1 -1
- package/lib/agent/present.d.ts +1 -1
- package/lib/agent/present.d.ts.map +1 -1
- package/lib/agent/present.js +1 -1
- package/lib/agent/present.js.map +1 -1
- package/lib/agent/presets.d.ts +4 -1
- package/lib/agent/presets.d.ts.map +1 -1
- package/lib/agent/presets.js +9 -2
- package/lib/agent/presets.js.map +1 -1
- package/lib/agent/projections.d.ts +8 -2
- package/lib/agent/projections.d.ts.map +1 -1
- package/lib/agent/projections.js +8 -2
- package/lib/agent/projections.js.map +1 -1
- package/lib/agent/prompt-history.d.ts +8 -48
- package/lib/agent/prompt-history.d.ts.map +1 -1
- package/lib/agent/prompt-history.js +34 -15
- package/lib/agent/prompt-history.js.map +1 -1
- package/lib/agent/status.d.ts +9 -24
- package/lib/agent/status.d.ts.map +1 -1
- package/lib/agent/status.js +7 -2
- package/lib/agent/status.js.map +1 -1
- package/lib/agent/undo.d.ts +2 -4
- package/lib/agent/undo.d.ts.map +1 -1
- package/lib/agent/undo.js +10 -5
- package/lib/agent/undo.js.map +1 -1
- package/lib/cards/composition.d.ts +7 -7
- package/lib/cards/composition.d.ts.map +1 -1
- package/lib/cards/composition.js +13 -12
- package/lib/cards/composition.js.map +1 -1
- package/lib/cards/presenter.d.ts +11 -14
- package/lib/cards/presenter.d.ts.map +1 -1
- package/lib/cards/presenter.js +40 -19
- package/lib/cards/presenter.js.map +1 -1
- package/lib/cards/preview.d.ts.map +1 -1
- package/lib/cards/preview.js +5 -1
- package/lib/cards/preview.js.map +1 -1
- package/lib/cards.d.ts +17 -23
- package/lib/cards.d.ts.map +1 -1
- package/lib/cards.js +27 -12
- package/lib/cards.js.map +1 -1
- package/lib/compat/probe.d.ts +2 -5
- package/lib/compat/probe.d.ts.map +1 -1
- package/lib/compat/probe.js +2 -2
- package/lib/compat/probe.js.map +1 -1
- package/lib/compat/section.d.ts +5 -4
- package/lib/compat/section.d.ts.map +1 -1
- package/lib/compat/section.js +4 -0
- package/lib/compat/section.js.map +1 -1
- package/lib/config.d.ts +0 -3
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +7 -1
- package/lib/config.js.map +1 -1
- package/lib/export.d.ts +5 -7
- package/lib/export.d.ts.map +1 -1
- package/lib/export.js +48 -10
- package/lib/export.js.map +1 -1
- package/lib/fold-cursor.d.ts +3 -3
- package/lib/fold-cursor.d.ts.map +1 -1
- package/lib/fold-cursor.js +5 -3
- package/lib/fold-cursor.js.map +1 -1
- package/lib/gates/question-card.d.ts +3 -38
- package/lib/gates/question-card.d.ts.map +1 -1
- package/lib/gates/question-card.js +13 -10
- package/lib/gates/question-card.js.map +1 -1
- package/lib/gates/questions.d.ts +14 -8
- package/lib/gates/questions.d.ts.map +1 -1
- package/lib/gates/questions.js +25 -18
- package/lib/gates/questions.js.map +1 -1
- package/lib/gates.d.ts +17 -25
- package/lib/gates.d.ts.map +1 -1
- package/lib/gates.js +2 -4
- package/lib/gates.js.map +1 -1
- package/lib/herdr/client.d.ts +10 -12
- package/lib/herdr/client.d.ts.map +1 -1
- package/lib/herdr/client.js +9 -8
- package/lib/herdr/client.js.map +1 -1
- package/lib/herdr/constants.d.ts +3 -2
- package/lib/herdr/constants.d.ts.map +1 -1
- package/lib/herdr/constants.js +3 -2
- package/lib/herdr/constants.js.map +1 -1
- package/lib/herdr/reporter.d.ts +4 -39
- package/lib/herdr/reporter.d.ts.map +1 -1
- package/lib/herdr/reporter.js +13 -19
- package/lib/herdr/reporter.js.map +1 -1
- package/lib/herdr/state.d.ts +4 -3
- package/lib/herdr/state.d.ts.map +1 -1
- package/lib/herdr/state.js +6 -5
- package/lib/herdr/state.js.map +1 -1
- package/lib/host/preset-files.d.ts +0 -17
- package/lib/host/preset-files.d.ts.map +1 -1
- package/lib/host/preset-files.js +7 -2
- package/lib/host/preset-files.js.map +1 -1
- package/lib/host/roster.d.ts +1 -1
- package/lib/host/roster.d.ts.map +1 -1
- package/lib/host/roster.js +3 -3
- package/lib/host/roster.js.map +1 -1
- package/lib/host/runner.d.ts +2 -5
- package/lib/host/runner.d.ts.map +1 -1
- package/lib/host/runner.js +2 -5
- package/lib/host/runner.js.map +1 -1
- package/lib/identity.d.ts +6 -3
- package/lib/identity.d.ts.map +1 -1
- package/lib/identity.js +18 -3
- package/lib/identity.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +42 -14
- package/lib/index.js.map +1 -1
- package/lib/injection.d.ts.map +1 -1
- package/lib/injection.js +1 -0
- package/lib/injection.js.map +1 -1
- package/lib/input/action-catalog.d.ts.map +1 -1
- package/lib/input/action-catalog.js +4 -0
- package/lib/input/action-catalog.js.map +1 -1
- package/lib/input/actions.d.ts +4 -3
- package/lib/input/actions.d.ts.map +1 -1
- package/lib/input/actions.js +8 -3
- package/lib/input/actions.js.map +1 -1
- package/lib/input/completion.d.ts +3 -11
- package/lib/input/completion.d.ts.map +1 -1
- package/lib/input/completion.js +8 -6
- package/lib/input/completion.js.map +1 -1
- package/lib/input/file-index.d.ts +1 -12
- package/lib/input/file-index.d.ts.map +1 -1
- package/lib/input/file-index.js +21 -17
- package/lib/input/file-index.js.map +1 -1
- package/lib/input/file-search.d.ts +6 -3
- package/lib/input/file-search.d.ts.map +1 -1
- package/lib/input/file-search.js +29 -10
- package/lib/input/file-search.js.map +1 -1
- package/lib/input/fuzzy.d.ts +6 -12
- package/lib/input/fuzzy.d.ts.map +1 -1
- package/lib/input/fuzzy.js +18 -27
- package/lib/input/fuzzy.js.map +1 -1
- package/lib/input/ghost.d.ts +5 -5
- package/lib/input/ghost.d.ts.map +1 -1
- package/lib/input/ghost.js +4 -3
- package/lib/input/ghost.js.map +1 -1
- package/lib/input/key-press.d.ts +8 -7
- package/lib/input/key-press.d.ts.map +1 -1
- package/lib/input/key-press.js +8 -6
- package/lib/input/key-press.js.map +1 -1
- package/lib/input/keymap-conflicts.d.ts +6 -6
- package/lib/input/keymap-conflicts.d.ts.map +1 -1
- package/lib/input/keymap-conflicts.js +6 -6
- package/lib/input/keymap-conflicts.js.map +1 -1
- package/lib/input/keymap.d.ts +6 -18
- package/lib/input/keymap.d.ts.map +1 -1
- package/lib/input/keymap.js +7 -10
- package/lib/input/keymap.js.map +1 -1
- package/lib/input/match.js +4 -4
- package/lib/input/match.js.map +1 -1
- package/lib/input/submission.d.ts +7 -3
- package/lib/input/submission.d.ts.map +1 -1
- package/lib/input/submission.js +2 -2
- package/lib/input/submission.js.map +1 -1
- package/lib/input/workspace-files.d.ts +1 -2
- package/lib/input/workspace-files.d.ts.map +1 -1
- package/lib/input/workspace-files.js +20 -11
- package/lib/input/workspace-files.js.map +1 -1
- package/lib/input.d.ts +6 -0
- package/lib/input.d.ts.map +1 -1
- package/lib/input.js +34 -1
- package/lib/input.js.map +1 -1
- package/lib/install-skills.d.ts +5 -22
- package/lib/install-skills.d.ts.map +1 -1
- package/lib/install-skills.js +18 -18
- package/lib/install-skills.js.map +1 -1
- package/lib/jobs.d.ts +10 -5
- package/lib/jobs.d.ts.map +1 -1
- package/lib/jobs.js +39 -13
- package/lib/jobs.js.map +1 -1
- package/lib/keymaps.d.ts.map +1 -1
- package/lib/keymaps.js +2 -0
- package/lib/keymaps.js.map +1 -1
- package/lib/keys-command.d.ts +1 -1
- package/lib/keys-command.d.ts.map +1 -1
- package/lib/model-list.d.ts +0 -27
- package/lib/model-list.d.ts.map +1 -1
- package/lib/model-list.js +1 -1
- package/lib/model-list.js.map +1 -1
- package/lib/moshi.d.ts +13 -0
- package/lib/moshi.d.ts.map +1 -0
- package/lib/moshi.js +130 -0
- package/lib/moshi.js.map +1 -0
- package/lib/spacing.d.ts +0 -7
- package/lib/spacing.d.ts.map +1 -1
- package/lib/spacing.js +1 -1
- package/lib/spacing.js.map +1 -1
- package/lib/startup.d.ts +1 -1
- package/lib/startup.d.ts.map +1 -1
- package/lib/startup.js +9 -1
- package/lib/startup.js.map +1 -1
- package/lib/stash/lock.d.ts +1 -37
- package/lib/stash/lock.d.ts.map +1 -1
- package/lib/stash/lock.js +41 -35
- package/lib/stash/lock.js.map +1 -1
- package/lib/stash/paths.d.ts +8 -7
- package/lib/stash/paths.d.ts.map +1 -1
- package/lib/stash/paths.js +21 -17
- package/lib/stash/paths.js.map +1 -1
- package/lib/stash/private-fs.d.ts +14 -5
- package/lib/stash/private-fs.d.ts.map +1 -1
- package/lib/stash/private-fs.js +30 -8
- package/lib/stash/private-fs.js.map +1 -1
- package/lib/stash/schema.d.ts +3 -6
- package/lib/stash/schema.d.ts.map +1 -1
- package/lib/stash/schema.js +11 -9
- package/lib/stash/schema.js.map +1 -1
- package/lib/stash/store.d.ts +9 -40
- package/lib/stash/store.d.ts.map +1 -1
- package/lib/stash/store.js +26 -24
- package/lib/stash/store.js.map +1 -1
- package/lib/stash.d.ts +7 -11
- package/lib/stash.d.ts.map +1 -1
- package/lib/stash.js +18 -11
- package/lib/stash.js.map +1 -1
- package/lib/subagents.d.ts +9 -9
- package/lib/subagents.d.ts.map +1 -1
- package/lib/subagents.js +19 -18
- package/lib/subagents.js.map +1 -1
- package/lib/surface/appearance-preferences.d.ts.map +1 -1
- package/lib/surface/appearance-preferences.js +7 -0
- package/lib/surface/appearance-preferences.js.map +1 -1
- package/lib/surface/appearance.d.ts.map +1 -1
- package/lib/surface/appearance.js +7 -2
- package/lib/surface/appearance.js.map +1 -1
- package/lib/surface/background-work.d.ts +2 -0
- package/lib/surface/background-work.d.ts.map +1 -1
- package/lib/surface/background-work.js +45 -36
- package/lib/surface/background-work.js.map +1 -1
- package/lib/surface/commands.d.ts.map +1 -1
- package/lib/surface/commands.js +17 -9
- package/lib/surface/commands.js.map +1 -1
- package/lib/surface/modal-input.d.ts +4 -0
- package/lib/surface/modal-input.d.ts.map +1 -1
- package/lib/surface/modal-input.js +81 -46
- package/lib/surface/modal-input.js.map +1 -1
- package/lib/surface/model-choice.d.ts.map +1 -1
- package/lib/surface/model-choice.js +10 -8
- package/lib/surface/model-choice.js.map +1 -1
- package/lib/surface/plugin-actions.d.ts.map +1 -1
- package/lib/surface/plugin-actions.js +4 -0
- package/lib/surface/plugin-actions.js.map +1 -1
- package/lib/surface/preset-choice.d.ts.map +1 -1
- package/lib/surface/preset-choice.js +15 -17
- package/lib/surface/preset-choice.js.map +1 -1
- package/lib/surface/prompt-input.js +1 -1
- package/lib/surface/prompt-input.js.map +1 -1
- package/lib/surface/prompt-memory.d.ts +7 -6
- package/lib/surface/prompt-memory.d.ts.map +1 -1
- package/lib/surface/prompt-memory.js +3 -3
- package/lib/surface/session-lifecycle.d.ts +7 -1
- package/lib/surface/session-lifecycle.d.ts.map +1 -1
- package/lib/surface/session-lifecycle.js +17 -12
- package/lib/surface/session-lifecycle.js.map +1 -1
- package/lib/surface/session-picker.js +1 -1
- package/lib/surface/session-picker.js.map +1 -1
- package/lib/surface/session-view.d.ts +1 -1
- package/lib/surface/session-view.d.ts.map +1 -1
- package/lib/surface/session-view.js +4 -5
- package/lib/surface/session-view.js.map +1 -1
- package/lib/surface/staged-turns.d.ts.map +1 -1
- package/lib/surface/staged-turns.js +8 -4
- package/lib/surface/staged-turns.js.map +1 -1
- package/lib/surface/terminal-lifecycle.d.ts +1 -1
- package/lib/surface/terminal-lifecycle.d.ts.map +1 -1
- package/lib/surface/terminal-lifecycle.js +8 -5
- package/lib/surface/terminal-lifecycle.js.map +1 -1
- package/lib/terminal/bell.d.ts +0 -2
- package/lib/terminal/bell.d.ts.map +1 -1
- package/lib/terminal/bell.js +2 -1
- package/lib/terminal/bell.js.map +1 -1
- package/lib/terminal/clipboard.d.ts +4 -4
- package/lib/terminal/clipboard.js +4 -4
- package/lib/terminal/external-editor.d.ts +4 -60
- package/lib/terminal/external-editor.d.ts.map +1 -1
- package/lib/terminal/external-editor.js +28 -40
- package/lib/terminal/external-editor.js.map +1 -1
- package/lib/terminal/host-writes.d.ts +7 -18
- package/lib/terminal/host-writes.d.ts.map +1 -1
- package/lib/terminal/host-writes.js +19 -18
- package/lib/terminal/host-writes.js.map +1 -1
- package/lib/terminal/input.d.ts +6 -0
- package/lib/terminal/input.d.ts.map +1 -0
- package/lib/terminal/input.js +15 -0
- package/lib/terminal/input.js.map +1 -0
- package/lib/terminal/restore.d.ts +2 -1
- package/lib/terminal/restore.d.ts.map +1 -1
- package/lib/terminal/signals.d.ts +2 -1
- package/lib/terminal/signals.d.ts.map +1 -1
- package/lib/terminal/signals.js +1 -1
- package/lib/terminal/signals.js.map +1 -1
- package/lib/terminal/title.d.ts +1 -11
- package/lib/terminal/title.d.ts.map +1 -1
- package/lib/terminal/title.js +5 -4
- package/lib/terminal/title.js.map +1 -1
- package/lib/terminal/warning-screen.d.ts +11 -2
- package/lib/terminal/warning-screen.d.ts.map +1 -1
- package/lib/terminal/warning-screen.js +166 -22
- package/lib/terminal/warning-screen.js.map +1 -1
- package/lib/terminal-text/scan.d.ts +4 -5
- package/lib/terminal-text/scan.d.ts.map +1 -1
- package/lib/terminal-text/scan.js +16 -9
- package/lib/terminal-text/scan.js.map +1 -1
- package/lib/terminal-text/sgr.d.ts +4 -3
- package/lib/terminal-text/sgr.d.ts.map +1 -1
- package/lib/terminal-text/sgr.js +9 -14
- package/lib/terminal-text/sgr.js.map +1 -1
- package/lib/terminal-text.d.ts +7 -12
- package/lib/terminal-text.d.ts.map +1 -1
- package/lib/terminal-text.js +32 -23
- package/lib/terminal-text.js.map +1 -1
- package/lib/text.d.ts +8 -14
- package/lib/text.d.ts.map +1 -1
- package/lib/text.js +14 -15
- package/lib/text.js.map +1 -1
- package/lib/theme-capability.d.ts +3 -15
- package/lib/theme-capability.d.ts.map +1 -1
- package/lib/theme-capability.js +18 -15
- package/lib/theme-capability.js.map +1 -1
- package/lib/theme-defaults.d.ts +3 -57
- package/lib/theme-defaults.d.ts.map +1 -1
- package/lib/theme-defaults.js +25 -14
- package/lib/theme-defaults.js.map +1 -1
- package/lib/theme-files.d.ts +16 -32
- package/lib/theme-files.d.ts.map +1 -1
- package/lib/theme-files.js +43 -27
- package/lib/theme-files.js.map +1 -1
- package/lib/theme-resolver.d.ts +3 -3
- package/lib/theme-resolver.d.ts.map +1 -1
- package/lib/theme-resolver.js +9 -6
- package/lib/theme-resolver.js.map +1 -1
- package/lib/theme-schema.d.ts +7 -42
- package/lib/theme-schema.d.ts.map +1 -1
- package/lib/theme-schema.js +9 -11
- package/lib/theme-schema.js.map +1 -1
- package/lib/theme-settings.d.ts +19 -10
- package/lib/theme-settings.d.ts.map +1 -1
- package/lib/theme-settings.js +23 -17
- package/lib/theme-settings.js.map +1 -1
- package/lib/theme-tokens.d.ts +6 -12
- package/lib/theme-tokens.d.ts.map +1 -1
- package/lib/theme-tokens.js +2 -2
- package/lib/theme-tokens.js.map +1 -1
- package/lib/theme.d.ts +5 -10
- package/lib/theme.d.ts.map +1 -1
- package/lib/theme.js +11 -18
- package/lib/theme.js.map +1 -1
- package/lib/todo-guard.d.ts +8 -4
- package/lib/todo-guard.d.ts.map +1 -1
- package/lib/todo-guard.js +17 -6
- package/lib/todo-guard.js.map +1 -1
- package/lib/tokens.d.ts +0 -2
- package/lib/tokens.d.ts.map +1 -1
- package/lib/tokens.js +1 -1
- package/lib/tokens.js.map +1 -1
- package/lib/tool-display.d.ts +1 -13
- package/lib/tool-display.d.ts.map +1 -1
- package/lib/tool-display.js +4 -4
- package/lib/tool-display.js.map +1 -1
- package/lib/transcript/message-content.d.ts.map +1 -1
- package/lib/transcript/message-content.js +31 -9
- package/lib/transcript/message-content.js.map +1 -1
- package/lib/transcript/tool-calls.d.ts +9 -7
- package/lib/transcript/tool-calls.d.ts.map +1 -1
- package/lib/transcript/tool-calls.js +27 -20
- package/lib/transcript/tool-calls.js.map +1 -1
- package/lib/transcript.d.ts +15 -18
- package/lib/transcript.d.ts.map +1 -1
- package/lib/transcript.js +70 -41
- package/lib/transcript.js.map +1 -1
- package/lib/ui/copy.d.ts +5 -4
- package/lib/ui/copy.d.ts.map +1 -1
- package/lib/ui/copy.js +9 -6
- package/lib/ui/copy.js.map +1 -1
- package/lib/ui/diff.d.ts +0 -30
- package/lib/ui/diff.d.ts.map +1 -1
- package/lib/ui/diff.js +16 -9
- package/lib/ui/diff.js.map +1 -1
- package/lib/ui/dock.d.ts +12 -10
- package/lib/ui/dock.d.ts.map +1 -1
- package/lib/ui/dock.js +27 -14
- package/lib/ui/dock.js.map +1 -1
- package/lib/ui/editor.d.ts +5 -4
- package/lib/ui/editor.d.ts.map +1 -1
- package/lib/ui/editor.js +17 -9
- package/lib/ui/editor.js.map +1 -1
- package/lib/ui/frame.d.ts +4 -12
- package/lib/ui/frame.d.ts.map +1 -1
- package/lib/ui/frame.js +6 -6
- package/lib/ui/frame.js.map +1 -1
- package/lib/ui/gap.d.ts +0 -4
- package/lib/ui/gap.d.ts.map +1 -1
- package/lib/ui/gap.js +4 -3
- package/lib/ui/gap.js.map +1 -1
- package/lib/ui/gate-input.d.ts +3 -3
- package/lib/ui/gate-input.d.ts.map +1 -1
- package/lib/ui/gate-input.js +9 -9
- package/lib/ui/gate-input.js.map +1 -1
- package/lib/ui/layout.d.ts +1 -8
- package/lib/ui/layout.d.ts.map +1 -1
- package/lib/ui/layout.js +10 -11
- package/lib/ui/layout.js.map +1 -1
- package/lib/ui/markdown.d.ts +3 -5
- package/lib/ui/markdown.d.ts.map +1 -1
- package/lib/ui/markdown.js +18 -7
- package/lib/ui/markdown.js.map +1 -1
- package/lib/ui/mermaid.d.ts +0 -11
- package/lib/ui/mermaid.d.ts.map +1 -1
- package/lib/ui/mermaid.js +32 -17
- package/lib/ui/mermaid.js.map +1 -1
- package/lib/ui/picker-card.d.ts +4 -8
- package/lib/ui/picker-card.d.ts.map +1 -1
- package/lib/ui/picker-card.js +17 -15
- package/lib/ui/picker-card.js.map +1 -1
- package/lib/ui/picker.d.ts +11 -17
- package/lib/ui/picker.d.ts.map +1 -1
- package/lib/ui/picker.js +36 -17
- package/lib/ui/picker.js.map +1 -1
- package/lib/ui/queue.d.ts.map +1 -1
- package/lib/ui/queue.js +11 -1
- package/lib/ui/queue.js.map +1 -1
- package/lib/ui/stash-picker.d.ts +1 -10
- package/lib/ui/stash-picker.d.ts.map +1 -1
- package/lib/ui/stash-picker.js +4 -4
- package/lib/ui/stash-picker.js.map +1 -1
- package/lib/ui/status.d.ts +2 -19
- package/lib/ui/status.d.ts.map +1 -1
- package/lib/ui/status.js +15 -17
- package/lib/ui/status.js.map +1 -1
- package/lib/ui/view/document.d.ts +33 -0
- package/lib/ui/view/document.d.ts.map +1 -0
- package/lib/ui/view/document.js +96 -0
- package/lib/ui/view/document.js.map +1 -0
- package/lib/ui/view/gate-card.d.ts +2 -0
- package/lib/ui/view/gate-card.d.ts.map +1 -1
- package/lib/ui/view/gate-card.js +12 -10
- package/lib/ui/view/gate-card.js.map +1 -1
- package/lib/ui/view/tool-card.d.ts +7 -4
- package/lib/ui/view/tool-card.d.ts.map +1 -1
- package/lib/ui/view/tool-card.js +12 -17
- package/lib/ui/view/tool-card.js.map +1 -1
- package/lib/ui/view/transcript-message.d.ts +7 -7
- package/lib/ui/view/transcript-message.d.ts.map +1 -1
- package/lib/ui/view/transcript-message.js +19 -10
- package/lib/ui/view/transcript-message.js.map +1 -1
- package/lib/ui/view.d.ts +53 -84
- package/lib/ui/view.d.ts.map +1 -1
- package/lib/ui/view.js +79 -158
- package/lib/ui/view.js.map +1 -1
- package/lib/work.d.ts +13 -10
- package/lib/work.d.ts.map +1 -1
- package/lib/work.js +30 -8
- package/lib/work.js.map +1 -1
- package/package.json +12 -7
- package/presets/cordis.patch.yml +1 -0
- package/presets/minimal.patch.yml +1 -0
- package/presets/ptc.patch.yml +1 -0
- package/presets/standard.patch.yml +1 -0
- package/themes/deepseek-blue.yaml +38 -51
- package/themes/marine-static.yaml +27 -35
- package/themes/pine-slope.yaml +13 -11
- package/themes/polar-drift.yaml +6 -0
- package/themes/violet-orbit.yaml +14 -18
- package/themes/wine-thicket.yaml +13 -13
package/lib/ui/queue.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { canFrame, frameText } from "./frame.js";
|
|
2
|
+
import { pushGap } from "./gap.js";
|
|
2
3
|
/** Queued prompts the bar draws; everything older becomes one count above them. */
|
|
3
4
|
const QUEUE_LIMIT = 3;
|
|
4
5
|
/** Text rows one queued prompt keeps before its own count takes over. */
|
|
@@ -45,13 +46,22 @@ export class QueueBar {
|
|
|
45
46
|
const framed = canFrame(width, this.theme.visible('editor.border'), true);
|
|
46
47
|
const shown = prompts.slice(-QUEUE_LIMIT);
|
|
47
48
|
const lines = [];
|
|
49
|
+
// Every queued prompt is an object the reader already submitted, so each
|
|
50
|
+
// block opens with the air a transcript card opens with: a rail drawn tight
|
|
51
|
+
// under the rows above it, or under the prompt before it, reads as part of
|
|
52
|
+
// them rather than as a prompt of its own. The bar cannot see the rows above
|
|
53
|
+
// it, so it draws its own break unconditionally — a fused block is the error
|
|
54
|
+
// a reader loses by.
|
|
48
55
|
// The reader typed the newest prompt last, so that is the row that must stay
|
|
49
56
|
// on screen; the ones dropped here are the ones a claim is about to take.
|
|
50
57
|
if (shown.length < prompts.length) {
|
|
58
|
+
pushGap(lines);
|
|
51
59
|
lines.push(this.theme.style('editor.queued.more', this.theme.cut(`… ${prompts.length - shown.length} queued earlier`, width, '…')));
|
|
52
60
|
}
|
|
53
|
-
for (const prompt of shown)
|
|
61
|
+
for (const prompt of shown) {
|
|
62
|
+
pushGap(lines);
|
|
54
63
|
lines.push(...this.box(prompt, width, framed));
|
|
64
|
+
}
|
|
55
65
|
return lines;
|
|
56
66
|
}
|
|
57
67
|
}
|
package/lib/ui/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/ui/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/ui/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC,mFAAmF;AACnF,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,yEAAyE;AACzE,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB;;;;;;;GAOG;AACH,MAAM,OAAO,QAAQ;IAEA;IACA;IAFnB,YACmB,OAAgC,EAChC,KAAe;QADf,YAAO,GAAP,OAAO,CAAyB;QAChC,UAAK,GAAL,KAAK,CAAU;IAC/B,CAAC;IAEJ,UAAU;QACR,gEAAgE;IAClE,CAAC;IAED,yEAAyE;IACjE,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,MAAe;QACtD,6EAA6E;QAC7E,4EAA4E;QAC5E,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC;YACrD,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;YACnD,MAAM;YACN,IAAI,EAAE,IAAI;SACX,EAAE,eAAe,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,EAAE,CAAA;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACnC,6EAA6E;QAC7E,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,OAAO,EAAE,CAAA;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAA;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAA;QACzC,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,yEAAyE;QACzE,4EAA4E;QAC5E,2EAA2E;QAC3E,6EAA6E;QAC7E,6EAA6E;QAC7E,qBAAqB;QACrB,6EAA6E;QAC7E,0EAA0E;QAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,iBAAiB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;QACrI,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
|
package/lib/ui/stash-picker.d.ts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import type { ResolvedEntry } from '../stash/schema.ts';
|
|
2
2
|
import { type Keymap } from '../input/actions.ts';
|
|
3
3
|
import { ListPicker } from './picker.ts';
|
|
4
|
-
/**
|
|
5
|
-
* The first line of a draft, as one list row can show it.
|
|
6
|
-
*
|
|
7
|
-
* A picker row is a single line, so line feeds and runs of whitespace collapse;
|
|
8
|
-
* a draft whose only line is blank still has to name itself.
|
|
9
|
-
*/
|
|
10
|
-
export declare function stashLabel(text: string): string;
|
|
11
4
|
/**
|
|
12
5
|
* The drafts of one bank, chosen by key press.
|
|
13
6
|
*
|
|
@@ -18,10 +11,8 @@ export declare function stashLabel(text: string): string;
|
|
|
18
11
|
* it into something a reader could type and miss.
|
|
19
12
|
*/
|
|
20
13
|
export declare class StashPicker extends ListPicker<ResolvedEntry> {
|
|
21
|
-
constructor(entries: readonly ResolvedEntry[], bankLabel: string, keys: () => Keymap
|
|
14
|
+
constructor(entries: readonly ResolvedEntry[], bankLabel: string, keys: () => Keymap);
|
|
22
15
|
}
|
|
23
|
-
/** The choice that clears the bank, as opposed to leaving it alone. */
|
|
24
|
-
export declare const STASH_CLEAR_CHOICE = "clear";
|
|
25
16
|
interface ConfirmChoice {
|
|
26
17
|
readonly id: string;
|
|
27
18
|
readonly label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stash-picker.d.ts","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAe,UAAU,EAAoC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"stash-picker.d.ts","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAe,UAAU,EAAoC,MAAM,aAAa,CAAA;AAiCvF;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,UAAU,CAAC,aAAa,CAAC;gBAEtD,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,MAAM;CAiBrB;AAMD,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElE;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;gBACnD,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM;CAmB9C"}
|
package/lib/ui/stash-picker.js
CHANGED
|
@@ -23,7 +23,7 @@ function stashHints(keys, verb) {
|
|
|
23
23
|
* A picker row is a single line, so line feeds and runs of whitespace collapse;
|
|
24
24
|
* a draft whose only line is blank still has to name itself.
|
|
25
25
|
*/
|
|
26
|
-
|
|
26
|
+
function stashLabel(text) {
|
|
27
27
|
const line = text.split('\n').find(candidate => candidate.trim() !== '')?.trim().replace(/\s+/gu, ' ');
|
|
28
28
|
if (line === undefined || line === '')
|
|
29
29
|
return EMPTY_LABEL;
|
|
@@ -39,17 +39,17 @@ export function stashLabel(text) {
|
|
|
39
39
|
* it into something a reader could type and miss.
|
|
40
40
|
*/
|
|
41
41
|
export class StashPicker extends ListPicker {
|
|
42
|
-
constructor(entries, bankLabel, keys
|
|
42
|
+
constructor(entries, bankLabel, keys) {
|
|
43
43
|
super(() => entries, () => `stash · ${bankLabel} · ${entries.length} draft${entries.length === 1 ? '' : 's'}`, row => row.entry.id, (row) => ({
|
|
44
44
|
label: `[${row.index}] ${stashLabel(row.entry.text)}`,
|
|
45
|
-
description: describeAge(row.entry.createdAt, now()),
|
|
45
|
+
description: describeAge(row.entry.createdAt, Date.now()),
|
|
46
46
|
// The card marks the row under the cursor, which the list decides.
|
|
47
47
|
current: false,
|
|
48
48
|
}), row => row.entry.text, stashHints(keys, 'pop'), keys);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
/** The choice that clears the bank, as opposed to leaving it alone. */
|
|
52
|
-
|
|
52
|
+
const STASH_CLEAR_CHOICE = 'clear';
|
|
53
53
|
const STASH_CANCEL_CHOICE = 'cancel';
|
|
54
54
|
/** Whether a settled confirm pick was the destructive one. */
|
|
55
55
|
export function confirmedClear(picked) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stash-picker.js","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAoC,MAAM,aAAa,CAAA;AAEvF,6DAA6D;AAC7D,MAAM,YAAY,GAAG,EAAE,CAAA;AACvB,qFAAqF;AACrF,MAAM,WAAW,GAAG,eAAe,CAAA;AACnC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAEpB;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAkB,EAAE,IAAY;IAClD,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,0CAA0C,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,SAAS;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,QAAQ,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,0BAA0B;KACpL,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"stash-picker.js","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"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"}
|
package/lib/ui/status.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Component } from '@earendil-works/pi-tui';
|
|
2
2
|
import type { TuiTheme } from '../theme.ts';
|
|
3
|
-
/**
|
|
3
|
+
/** Caller-supplied facts keep footer presentation independent of session services and activity tracking. */
|
|
4
4
|
export interface StatusFacts {
|
|
5
5
|
/** The chord waiting for its second key, when one is armed. */
|
|
6
6
|
readonly chord: string | undefined;
|
|
@@ -31,24 +31,7 @@ export interface StatusFacts {
|
|
|
31
31
|
readonly cwd: string;
|
|
32
32
|
readonly home: string | undefined;
|
|
33
33
|
}
|
|
34
|
-
/**
|
|
35
|
-
/**
|
|
36
|
-
* Shorten an absolute path for the footer: the reader's own home becomes `~`,
|
|
37
|
-
* and only a path from outside it is cut down to its tail.
|
|
38
|
-
*
|
|
39
|
-
* A home path keeps every directory between `~` and the leaf. Dropping those
|
|
40
|
-
* away would name a location that does not exist, which is worse than a long one.
|
|
41
|
-
*/
|
|
42
|
-
export declare function shortPath(path: string, home: string | undefined): string;
|
|
43
|
-
/**
|
|
44
|
-
* One line of state, ordered by what a reader asks first: is it working, what is
|
|
45
|
-
* it, how full is the context, and where am I.
|
|
46
|
-
*
|
|
47
|
-
* Each segment is its own element, so a reader can quiet the path without
|
|
48
|
-
* losing the model, and the separator is one too.
|
|
49
|
-
*/
|
|
50
|
-
export declare function formatStatus(facts: StatusFacts, width: number, theme: TuiTheme): string;
|
|
51
|
-
/** A one-row view of the state around the transcript. */
|
|
34
|
+
/** The session facts wrap so narrow terminals retain the same information as wide ones. */
|
|
52
35
|
export declare class StatusBar implements Component {
|
|
53
36
|
private readonly facts;
|
|
54
37
|
private readonly theme;
|
package/lib/ui/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAkC,MAAM,wBAAwB,CAAA;AAKvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,4GAA4G;AAC5G,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IACnD,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;IAChD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AA4ID,2FAA2F;AAC3F,qBAAa,SAAU,YAAW,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,MAAM,WAAW,EACxB,KAAK,EAAE,QAAQ;IAGlC,UAAU,IAAI,IAAI;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAGhC"}
|
package/lib/ui/status.js
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { visibleWidth } from '@earendil-works/pi-tui';
|
|
1
|
+
import { visibleWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
|
|
2
2
|
import { oneRow } from "../text.js";
|
|
3
|
-
import {
|
|
3
|
+
import { describeDuration } from "../jobs.js";
|
|
4
4
|
import { formatTokens } from "../tokens.js";
|
|
5
|
-
const SECOND_MS = 1000;
|
|
6
|
-
const MINUTE_MS = 60 * SECOND_MS;
|
|
7
5
|
/** Path segments kept for a directory outside the home; a terminal row is not a file browser. */
|
|
8
6
|
const PATH_SEGMENTS = 2;
|
|
9
7
|
/** What sits between two facts that do not qualify each other. */
|
|
10
8
|
const SEPARATOR_TEXT = ' · ';
|
|
11
9
|
/** Marks the point where a row was cut; the reader must know something is missing. */
|
|
12
10
|
const ELLIPSIS = '…';
|
|
11
|
+
/** Wrapping needs every fact before assigning terminal rows; clipping first loses the tail. */
|
|
12
|
+
const WRAPPING_WIDTH = Number.POSITIVE_INFINITY;
|
|
13
13
|
/** The mark that says which of the two activities the session is in. */
|
|
14
14
|
const WORKING_MARK = '▶';
|
|
15
15
|
const READY_MARK = '●';
|
|
16
16
|
/** What the parked-draft count is labelled, so the number is not mistaken for tokens. */
|
|
17
17
|
const STASH_LABEL = 'stash';
|
|
18
|
-
/** Compact a token count, because the exact number changes nothing a reader decides. */
|
|
19
18
|
/**
|
|
20
19
|
* Shorten an absolute path for the footer: the reader's own home becomes `~`,
|
|
21
20
|
* and only a path from outside it is cut down to its tail.
|
|
@@ -23,7 +22,7 @@ const STASH_LABEL = 'stash';
|
|
|
23
22
|
* A home path keeps every directory between `~` and the leaf. Dropping those
|
|
24
23
|
* away would name a location that does not exist, which is worse than a long one.
|
|
25
24
|
*/
|
|
26
|
-
|
|
25
|
+
function shortPath(path, home) {
|
|
27
26
|
if (home !== undefined && home !== '' && (path === home || path.startsWith(`${home}/`))) {
|
|
28
27
|
const rest = path.slice(home.length).replace(/^\//u, '');
|
|
29
28
|
return rest === '' ? '~/' : `~/${rest}`;
|
|
@@ -33,11 +32,6 @@ export function shortPath(path, home) {
|
|
|
33
32
|
return path;
|
|
34
33
|
return `…/${segments.slice(-PATH_SEGMENTS).join('/')}`;
|
|
35
34
|
}
|
|
36
|
-
function elapsed(ms) {
|
|
37
|
-
if (ms < MINUTE_MS)
|
|
38
|
-
return `${Math.max(1, Math.round(ms / SECOND_MS))}s`;
|
|
39
|
-
return `${Math.floor(ms / MINUTE_MS)}m${String(Math.round((ms % MINUTE_MS) / SECOND_MS)).padStart(2, '0')}s`;
|
|
40
|
-
}
|
|
41
35
|
/**
|
|
42
36
|
* One line of state, ordered by what a reader asks first: is it working, what is
|
|
43
37
|
* it, how full is the context, and where am I.
|
|
@@ -45,7 +39,7 @@ function elapsed(ms) {
|
|
|
45
39
|
* Each segment is its own element, so a reader can quiet the path without
|
|
46
40
|
* losing the model, and the separator is one too.
|
|
47
41
|
*/
|
|
48
|
-
|
|
42
|
+
function formatStatus(facts, width, theme) {
|
|
49
43
|
const segments = [];
|
|
50
44
|
/**
|
|
51
45
|
* A segment is collected as its source wrote it and drawn when the row is
|
|
@@ -70,7 +64,7 @@ export function formatStatus(facts, width, theme) {
|
|
|
70
64
|
// Elapsed carries its own token so it can be toned apart from the activity,
|
|
71
65
|
// but it qualifies that activity, so it attaches rather than standing alone.
|
|
72
66
|
if (facts.elapsedMs !== undefined)
|
|
73
|
-
push('status.elapsed', ` ${
|
|
67
|
+
push('status.elapsed', ` ${describeDuration(facts.elapsedMs)}`, true);
|
|
74
68
|
}
|
|
75
69
|
else {
|
|
76
70
|
push('status.activity.ready', `${READY_MARK} ready`);
|
|
@@ -94,6 +88,7 @@ export function formatStatus(facts, width, theme) {
|
|
|
94
88
|
// holding work they meant to come back to.
|
|
95
89
|
if (facts.stashed !== undefined && facts.stashed > 0)
|
|
96
90
|
push('status.stash', `${STASH_LABEL} ${facts.stashed}`);
|
|
91
|
+
// Compact context counts so the model and directory can share the footer with them.
|
|
97
92
|
if (facts.contextTokens !== undefined) {
|
|
98
93
|
push('status.context', facts.contextWindow === undefined
|
|
99
94
|
? `ctx ${formatTokens(facts.contextTokens)}`
|
|
@@ -122,6 +117,8 @@ function renderSegments(segments, width, theme) {
|
|
|
122
117
|
const ellipsisWidth = visibleWidth(ELLIPSIS);
|
|
123
118
|
let out = '';
|
|
124
119
|
let budget = width;
|
|
120
|
+
// An unbounded row still needs a finite column so tabs retain their terminal stops.
|
|
121
|
+
let column = 0;
|
|
125
122
|
for (const [index, segment] of segments.entries()) {
|
|
126
123
|
const joining = index === 0 || segment.join;
|
|
127
124
|
const lead = joining || !showSeparator ? 0 : visibleWidth(SEPARATOR_TEXT);
|
|
@@ -130,19 +127,20 @@ function renderSegments(segments, width, theme) {
|
|
|
130
127
|
if (budget - lead < ellipsisWidth)
|
|
131
128
|
break;
|
|
132
129
|
const room = budget - lead;
|
|
133
|
-
|
|
130
|
+
// Flatten before measuring: a retained line break becomes a visible space in the status row.
|
|
131
|
+
const drawn = oneRow(theme.rich(segment.text, { token: segment.token, column }));
|
|
134
132
|
const textWidth = visibleWidth(drawn);
|
|
135
133
|
if (textWidth > room) {
|
|
136
|
-
// Not the last segment: the rest is omitted, so the row must show it.
|
|
137
134
|
out += `${lead > 0 ? separator : ''}${theme.cut(drawn, room, ELLIPSIS)}`;
|
|
138
135
|
return out;
|
|
139
136
|
}
|
|
140
137
|
out += `${lead > 0 ? separator : ''}${drawn}`;
|
|
141
138
|
budget -= lead + textWidth;
|
|
139
|
+
column += lead + textWidth;
|
|
142
140
|
}
|
|
143
141
|
return out === '' ? theme.cut('', Math.max(0, width), ELLIPSIS) : out;
|
|
144
142
|
}
|
|
145
|
-
/**
|
|
143
|
+
/** The session facts wrap so narrow terminals retain the same information as wide ones. */
|
|
146
144
|
export class StatusBar {
|
|
147
145
|
facts;
|
|
148
146
|
theme;
|
|
@@ -154,7 +152,7 @@ export class StatusBar {
|
|
|
154
152
|
// The facts are read on every render; nothing is cached.
|
|
155
153
|
}
|
|
156
154
|
render(width) {
|
|
157
|
-
return width <= 0 ? [] :
|
|
155
|
+
return width <= 0 ? [] : wrapTextWithAnsi(formatStatus(this.facts(), WRAPPING_WIDTH, this.theme), width);
|
|
158
156
|
}
|
|
159
157
|
}
|
|
160
158
|
//# sourceMappingURL=status.js.map
|
package/lib/ui/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type TranscriptEntry, type TranscriptModel } from '../../transcript.ts';
|
|
2
|
+
import { type FrameRow } from '../frame.ts';
|
|
3
|
+
import { type ClickSpan } from '../view.ts';
|
|
4
|
+
/** Entry renderers keep presentation policy; this owner retains rows and their matching hit/copy accounts. */
|
|
5
|
+
export interface DocumentContext {
|
|
6
|
+
readonly model: TranscriptModel;
|
|
7
|
+
readonly entryTag: (entry: TranscriptEntry, base: string) => string;
|
|
8
|
+
readonly clocked: (entry: TranscriptEntry) => boolean;
|
|
9
|
+
readonly renderEntry: (entry: TranscriptEntry, lines: string[], width: number, live: boolean, spans: ClickSpan[], copy: FrameRow[]) => void;
|
|
10
|
+
}
|
|
11
|
+
/** Draft-only frames must not traverse history or format unchanged stream snapshots. */
|
|
12
|
+
export declare class TranscriptDocument {
|
|
13
|
+
private readonly context;
|
|
14
|
+
private readonly rows;
|
|
15
|
+
private readonly entrySpans;
|
|
16
|
+
private readonly entryCopy;
|
|
17
|
+
private frame;
|
|
18
|
+
private clickSpans;
|
|
19
|
+
private copied;
|
|
20
|
+
constructor(context: DocumentContext);
|
|
21
|
+
/** Clicks belong to the frame actually drawn, including cached entries and seam offsets. */
|
|
22
|
+
get spans(): readonly ClickSpan[];
|
|
23
|
+
/** Explicit restyling must rebuild both settled entries and the assembled document. */
|
|
24
|
+
invalidate(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Reuse unchanged frames without scanning history. The caller must include width and other
|
|
27
|
+
* non-model layout inputs in tag because rows and their hit/copy metadata depend on them.
|
|
28
|
+
*/
|
|
29
|
+
render(width: number, tag: string, presentation: number): readonly string[];
|
|
30
|
+
/** Frame metadata must remain paired with the retained rows, including live message copies. */
|
|
31
|
+
copyRows(): readonly FrameRow[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/ui/view/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEhF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,8GAA8G;AAC9G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IACnE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAA;IACrD,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAA;CAC5I;AAUD,wFAAwF;AACxF,qBAAa,kBAAkB;IASjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IAEvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsD;IAChF,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAA0B;gBAEX,OAAO,EAAE,eAAe;IAErD,4FAA4F;IAC5F,IAAI,KAAK,IAAI,SAAS,SAAS,EAAE,CAEhC;IAED,uFAAuF;IACvF,UAAU,IAAI,IAAI;IAKlB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAmD3E,+FAA+F;IAC/F,QAAQ,IAAI,SAAS,QAAQ,EAAE;CAGhC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {} from "../../transcript.js";
|
|
2
|
+
import { SECOND_MS } from "../../transcript/tool-calls.js";
|
|
3
|
+
import {} from "../frame.js";
|
|
4
|
+
import { placeGap } from "../gap.js";
|
|
5
|
+
import { RowCache } from "../rows.js";
|
|
6
|
+
import {} from "../view.js";
|
|
7
|
+
/** Draft-only frames must not traverse history or format unchanged stream snapshots. */
|
|
8
|
+
export class TranscriptDocument {
|
|
9
|
+
context;
|
|
10
|
+
rows = new RowCache();
|
|
11
|
+
// Match RowCache's weak entry lifetime so metadata does not retain entries after the model drops them.
|
|
12
|
+
entrySpans = new WeakMap();
|
|
13
|
+
entryCopy = new WeakMap();
|
|
14
|
+
frame;
|
|
15
|
+
clickSpans = [];
|
|
16
|
+
copied = [];
|
|
17
|
+
constructor(context) {
|
|
18
|
+
this.context = context;
|
|
19
|
+
}
|
|
20
|
+
/** Clicks belong to the frame actually drawn, including cached entries and seam offsets. */
|
|
21
|
+
get spans() {
|
|
22
|
+
return this.clickSpans;
|
|
23
|
+
}
|
|
24
|
+
/** Explicit restyling must rebuild both settled entries and the assembled document. */
|
|
25
|
+
invalidate() {
|
|
26
|
+
this.rows.clear();
|
|
27
|
+
this.frame = undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reuse unchanged frames without scanning history. The caller must include width and other
|
|
31
|
+
* non-model layout inputs in tag because rows and their hit/copy metadata depend on them.
|
|
32
|
+
*/
|
|
33
|
+
render(width, tag, presentation) {
|
|
34
|
+
const revision = this.context.model.revision;
|
|
35
|
+
const tick = Math.floor(this.context.model.now() / SECOND_MS);
|
|
36
|
+
const frame = this.frame;
|
|
37
|
+
if (frame !== undefined && frame.tag === tag && frame.revision === revision && frame.presentation === presentation
|
|
38
|
+
&& (frame.tick === undefined || frame.tick === tick))
|
|
39
|
+
return frame.lines;
|
|
40
|
+
const lines = [];
|
|
41
|
+
const spans = [];
|
|
42
|
+
const copied = [];
|
|
43
|
+
const settled = this.context.model.settledCount();
|
|
44
|
+
let clocked = false;
|
|
45
|
+
for (const [index, entry] of this.context.model.entries().entries()) {
|
|
46
|
+
const start = lines.length;
|
|
47
|
+
const entryTag = this.context.entryTag(entry, tag);
|
|
48
|
+
clocked ||= this.context.clocked(entry);
|
|
49
|
+
const local = [];
|
|
50
|
+
const copy = [];
|
|
51
|
+
const rows = [];
|
|
52
|
+
if (index >= settled) {
|
|
53
|
+
// Only the current live frame survives; obsolete streaming prefixes never enter the settled cache.
|
|
54
|
+
this.context.renderEntry(entry, rows, width, true, local, copy);
|
|
55
|
+
for (const row of copy)
|
|
56
|
+
copied.push(row);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const cached = this.rows.lookup(entry, entryTag);
|
|
60
|
+
const saved = this.entrySpans.get(entry);
|
|
61
|
+
const savedCopy = this.entryCopy.get(entry);
|
|
62
|
+
if (cached !== undefined && saved !== undefined && savedCopy !== undefined) {
|
|
63
|
+
for (const row of cached)
|
|
64
|
+
rows.push(row);
|
|
65
|
+
for (const span of saved)
|
|
66
|
+
local.push(span);
|
|
67
|
+
for (const row of savedCopy)
|
|
68
|
+
copied.push(row);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.context.renderEntry(entry, rows, width, false, local, copy);
|
|
72
|
+
this.rows.store(entry, entryTag, rows);
|
|
73
|
+
this.entrySpans.set(entry, local);
|
|
74
|
+
this.entryCopy.set(entry, copy);
|
|
75
|
+
for (const row of copy)
|
|
76
|
+
copied.push(row);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Seam air changes row offsets, so hit spans follow placement rather than cached local coordinates.
|
|
80
|
+
const base = start - placeGap(lines, rows);
|
|
81
|
+
for (const span of local)
|
|
82
|
+
spans.push({ ...span, start: span.start + base, end: span.end + base });
|
|
83
|
+
}
|
|
84
|
+
this.clickSpans = spans;
|
|
85
|
+
this.copied = copied;
|
|
86
|
+
// Component's mutable return type must not let a borrower corrupt cached rows and their hit/copy accounts.
|
|
87
|
+
Object.freeze(lines);
|
|
88
|
+
this.frame = { tag, revision, presentation, tick: clocked ? tick : undefined, lines };
|
|
89
|
+
return lines;
|
|
90
|
+
}
|
|
91
|
+
/** Frame metadata must remain paired with the retained rows, including live message copies. */
|
|
92
|
+
copyRows() {
|
|
93
|
+
return this.copied;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/ui/view/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { type GateCard } from '../../gates.ts';
|
|
2
2
|
import { type TuiToken } from '../../theme-tokens.ts';
|
|
3
3
|
import { type TuiTheme } from '../../theme.ts';
|
|
4
|
+
/** Borrow the transcript view's theme and wrapper so gates share its styling and width constraints. */
|
|
4
5
|
export interface GateCardsContext {
|
|
5
6
|
readonly theme: TuiTheme;
|
|
6
7
|
readonly pushWrapped: (lines: string[], text: string, width: number, prefix: string, token: TuiToken) => void;
|
|
7
8
|
}
|
|
9
|
+
/** Honor the shared theme's visibility preferences, not an always-visible gate policy. */
|
|
8
10
|
export declare class GateCards {
|
|
9
11
|
private readonly context;
|
|
10
12
|
constructor(context: GateCardsContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-card.d.ts","sourceRoot":"","sources":["../../../src/ui/view/gate-card.ts"],"names":[],"mappings":"AAQA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"gate-card.d.ts","sourceRoot":"","sources":["../../../src/ui/view/gate-card.ts"],"names":[],"mappings":"AAQA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAyB9C,uGAAuG;AACvG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC9G;AAED,0FAA0F;AAC1F,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEtD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA0D9D;;;;;;SAMK;IACH,OAAO,CAAC,WAAW;CAUtB"}
|
package/lib/ui/view/gate-card.js
CHANGED
|
@@ -9,7 +9,9 @@ import { visibleWidth } from '@earendil-works/pi-tui';
|
|
|
9
9
|
import { CUSTOM_ROW_NUMBER } from "../../gates.js";
|
|
10
10
|
import {} from "../../theme-tokens.js";
|
|
11
11
|
import {} from "../../theme.js";
|
|
12
|
+
import { displayText } from "../../text.js";
|
|
12
13
|
import { pushGap } from "../gap.js";
|
|
14
|
+
/** Inset choices, answers, and hints to group them under the question, at the cost of text width. */
|
|
13
15
|
const OPTION_INDENT = ' ';
|
|
14
16
|
/** The mark a cursor falls back to when the reader has not set one, so no literal lives in a template. */
|
|
15
17
|
const CURSOR_MARK = '❯';
|
|
@@ -19,8 +21,9 @@ const CHECKBOX_ON = '[x]';
|
|
|
19
21
|
const CHECKBOX_OFF = '[ ]';
|
|
20
22
|
/** An unselected row has no cursor, and a blank column is not a value to configure. */
|
|
21
23
|
const NO_CURSOR = ' ';
|
|
22
|
-
/**
|
|
24
|
+
/** Inset supporting detail to distinguish question context from another decision, at the cost of text width. */
|
|
23
25
|
const DETAIL_INDENT = ' ';
|
|
26
|
+
/** Honor the shared theme's visibility preferences, not an always-visible gate policy. */
|
|
24
27
|
export class GateCards {
|
|
25
28
|
context;
|
|
26
29
|
constructor(context) {
|
|
@@ -33,13 +36,13 @@ export class GateCards {
|
|
|
33
36
|
if (this.context.theme.visible('gate.title')) {
|
|
34
37
|
const glyphToken = gate.kind === 'approval' ? 'gate.glyphApproval' : 'gate.glyphQuestion';
|
|
35
38
|
const glyph = this.context.theme.glyph(glyphToken) || (gate.kind === 'approval' ? APPROVAL_MARK : QUESTION_MARK);
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
this.context.pushWrapped(lines, gate.title, width, `${glyph} `, 'gate.title');
|
|
39
|
+
// A visible question needs its wording for the decision, so prefer wrapping
|
|
40
|
+
// within the shared wrapper's width limit; theme visibility can still omit it.
|
|
41
|
+
this.context.pushWrapped(lines, displayText(gate.title, { column: visibleWidth(`${glyph} `) }), width, `${glyph} `, 'gate.title');
|
|
39
42
|
}
|
|
40
43
|
if (this.context.theme.visible('gate.detail')) {
|
|
41
44
|
for (const detail of gate.detail) {
|
|
42
|
-
this.context.pushWrapped(lines, detail, width, DETAIL_INDENT, 'gate.detail');
|
|
45
|
+
this.context.pushWrapped(lines, displayText(detail, { column: visibleWidth(DETAIL_INDENT) }), width, DETAIL_INDENT, 'gate.detail');
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
gate.options.forEach((option, position) => {
|
|
@@ -78,8 +81,8 @@ export class GateCards {
|
|
|
78
81
|
lines.push(visibleWidth(placed) <= width ? placed : this.context.theme.cut(placed, width, ''));
|
|
79
82
|
}
|
|
80
83
|
}
|
|
81
|
-
//
|
|
82
|
-
//
|
|
84
|
+
// Visible key hints help the reader answer, so prefer wrapping within the
|
|
85
|
+
// shared width limit; hidden hints and widths smaller than the lead can omit text.
|
|
83
86
|
if (this.context.theme.visible('gate.hint')) {
|
|
84
87
|
this.context.pushWrapped(lines, gate.hint, width, OPTION_INDENT, 'gate.hint');
|
|
85
88
|
}
|
|
@@ -99,9 +102,8 @@ export class GateCards {
|
|
|
99
102
|
const box = row.selected ? CHECKBOX_ON : CHECKBOX_OFF;
|
|
100
103
|
const lead = `${OPTION_INDENT}${cursor} ${box} ${row.number}. `;
|
|
101
104
|
const text = row.description === undefined ? row.label : `${row.label} — ${row.description}`;
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
this.context.pushWrapped(lines, text, width, lead, token);
|
|
105
|
+
// Expose controls literally so choice text cannot repaint neighboring rows.
|
|
106
|
+
this.context.pushWrapped(lines, displayText(text, { column: visibleWidth(lead) }), width, lead, token);
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
//# sourceMappingURL=gate-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-card.js","sourceRoot":"","sources":["../../../src/ui/view/gate-card.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAiB,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAiB,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAiB,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,aAAa,GAAG,KAAK,CAAA;AAC3B,0GAA0G;AAC1G,MAAM,WAAW,GAAG,GAAG,CAAA;AACvB,MAAM,aAAa,GAAG,GAAG,CAAA;AACzB,MAAM,aAAa,GAAG,GAAG,CAAA;AACzB,MAAM,WAAW,GAAG,KAAK,CAAA;AACzB,MAAM,YAAY,GAAG,KAAK,CAAA;AAC1B,uFAAuF;AACvF,MAAM,SAAS,GAAG,GAAG,CAAA;AASrB,
|
|
1
|
+
{"version":3,"file":"gate-card.js","sourceRoot":"","sources":["../../../src/ui/view/gate-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ import { type LiveCallState } from '../../transcript/tool-calls.ts';
|
|
|
4
4
|
import { type ToolDisplaySpec } from '../../tool-display.ts';
|
|
5
5
|
import { type TuiTheme } from '../../theme.ts';
|
|
6
6
|
import { type ClickSpan } from '../view.ts';
|
|
7
|
+
/**
|
|
8
|
+
* Read current policy and interaction state through callbacks rather than capturing them when the view creates its renderer.
|
|
9
|
+
* Parent-scoped nested-call keys keep one program's expansion state separate from another's.
|
|
10
|
+
*/
|
|
7
11
|
export interface ToolCardsContext {
|
|
8
12
|
readonly theme: TuiTheme;
|
|
9
13
|
readonly keymap: () => Keymap;
|
|
@@ -84,7 +88,7 @@ export declare class ToolCards {
|
|
|
84
88
|
* because of its first character.
|
|
85
89
|
*/
|
|
86
90
|
private detailRow;
|
|
87
|
-
/** The
|
|
91
|
+
/** The glyph introduces the label, so hiding that label must not leave an orphaned mark beside arguments or facts. */
|
|
88
92
|
private cardLead;
|
|
89
93
|
/** A card's label, styled, or nothing when the theme hides it. */
|
|
90
94
|
private cardTitle;
|
|
@@ -144,9 +148,8 @@ export declare class ToolCards {
|
|
|
144
148
|
/**
|
|
145
149
|
* The measured facts, each in its own colour, or nothing when none is visible.
|
|
146
150
|
*
|
|
147
|
-
* The
|
|
148
|
-
*
|
|
149
|
-
* on a row of their own stand apart with blank columns.
|
|
151
|
+
* The hidden-line count uses an empty lead because the collapsed header supplies
|
|
152
|
+
* its separator; adding the usual blank columns would separate it twice.
|
|
150
153
|
*/
|
|
151
154
|
private renderStats;
|
|
152
155
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../src/ui/view/tool-card.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../src/ui/view/tool-card.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAwC3C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAA;IACvD,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,OAAO,CAAA;IACpF;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,OAAO,CAAA;IACrF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAA;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IACpD,uGAAuG;IACvG,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IACxD,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IAC7D,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CAChE;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEtD;;;;;;;;SAQK;IACH,OAAO,CAAC,iBAAiB;IAQ3B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI;IAmFrH;;;;;;;SAOK;IACH,OAAO,CAAC,YAAY;IA4CtB;;;;;;;SAOK;IACH,OAAO,CAAC,iBAAiB;IAkB3B;;;;;;;;;;;SAWK;IACH,OAAO,CAAC,mBAAmB;IA8B7B;;;;;;SAMK;IACH,OAAO,CAAC,SAAS;IAQnB,sHAAsH;IACpH,OAAO,CAAC,QAAQ;IAGlB,kEAAkE;IAChE,OAAO,CAAC,SAAS;IAGnB,gFAAgF;IAC9E,OAAO,CAAC,SAAS;IASnB,6EAA6E;IAC3E,OAAO,CAAC,SAAS;IAGnB,qFAAqF;IACnF,OAAO,CAAC,YAAY;IAOtB;;;;;;;SAOK;IACH,OAAO,CAAC,UAAU;IASpB;;;;;;;;;;SAUK;IACH,OAAO,CAAC,UAAU;IAQpB;;;;;;;SAOK;IACH,OAAO,CAAC,WAAW;IAWrB;;;;;SAKK;IACH,OAAO,CAAC,eAAe;IAGzB;;;;;;SAMK;IACH,OAAO,CAAC,MAAM;IAIhB,iFAAiF;IAC/E,OAAO,CAAC,aAAa;IAGvB;;;;;SAKK;IACH,OAAO,CAAC,WAAW;CAQtB"}
|