@aragon-agent/cli 0.6.47 → 0.6.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +27 -6
- package/dist/agent/coalesce.d.ts +1 -1
- package/dist/agent/controller.d.ts +21 -21
- package/dist/agent/controller.js +13 -13
- package/dist/agent/conversation-reset.d.ts +1 -1
- package/dist/agent/governance-wiring.d.ts +6 -6
- package/dist/agent/governance-wiring.js +4 -4
- package/dist/agent/headless.d.ts +5 -5
- package/dist/agent/headless.js +4 -4
- package/dist/agent/job-notices.d.ts +1 -1
- package/dist/agent/job-notices.js +1 -1
- package/dist/agent/kit-apply.d.ts +3 -3
- package/dist/agent/kit-apply.js +3 -3
- package/dist/agent/model-profile-settings.d.ts +2 -2
- package/dist/agent/model-profile-settings.js +6 -6
- package/dist/agent/prompt-options.d.ts +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/{ui → app}/App.d.ts +9 -9
- package/dist/{ui → app}/App.js +79 -79
- package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
- package/dist/{ui → app}/use-startup-notices.js +2 -2
- package/dist/cli.js +29 -29
- package/dist/commands/agents-command.js +1 -1
- package/dist/commands/builtins.js +9 -9
- package/dist/commands/governance-command.js +2 -2
- package/dist/commands/governance-runs-table.js +1 -1
- package/dist/commands/kit-command.js +1 -1
- package/dist/commands/perf.d.ts +3 -3
- package/dist/commands/perf.js +1 -1
- package/dist/commands/registry.d.ts +8 -8
- package/dist/commands/skills.js +2 -2
- package/dist/commands/team-command.js +1 -1
- package/dist/compaction/archive.d.ts +1 -1
- package/dist/compaction/archive.js +1 -1
- package/dist/compaction/child.d.ts +3 -3
- package/dist/compaction/child.js +4 -4
- package/dist/compaction/command.js +5 -5
- package/dist/compaction/compactor.d.ts +6 -6
- package/dist/compaction/compactor.js +6 -6
- package/dist/compaction/context-command.js +1 -1
- package/dist/compaction/digest.js +1 -1
- package/dist/compaction/memory-input.js +1 -1
- package/dist/compaction/memory-validation.js +1 -1
- package/dist/compaction/memory.js +1 -1
- package/dist/compaction/summarize-call.js +1 -1
- package/dist/compaction/summary-prompt.js +1 -1
- package/dist/compaction/tail-budget.js +2 -2
- package/dist/compaction/wiring.d.ts +5 -5
- package/dist/compaction/wiring.js +2 -2
- package/dist/config/cli-commands.d.ts +1 -1
- package/dist/config/cli-commands.js +3 -3
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.js +4 -4
- package/dist/config/load.d.ts +2 -2
- package/dist/config/load.js +6 -6
- package/dist/config/migrate-state-out-of-config.js +1 -1
- package/dist/config/model-profile-store.d.ts +4 -54
- package/dist/config/model-profile-store.js +3 -3
- package/dist/config/prompt-history.js +1 -1
- package/dist/config/store.d.ts +2 -2
- package/dist/config/store.js +3 -3
- package/dist/diagnostics/doctor.js +4 -4
- package/dist/exec/bridge/decisions.d.ts +1 -1
- package/dist/exec/bridge/human-answers.d.ts +1 -1
- package/dist/exec/bridge/human-answers.js +1 -1
- package/dist/exec/bridge/protocol.d.ts +1 -1
- package/dist/exec/bridge/server.js +1 -1
- package/dist/exec/events.d.ts +2 -2
- package/dist/exec/index.d.ts +1 -1
- package/dist/exec/index.js +1 -1
- package/dist/exec/permission.js +1 -1
- package/dist/exec/runner.d.ts +3 -3
- package/dist/exec/runner.js +2 -2
- package/dist/exec/threads/runtime.js +1 -1
- package/dist/fast/digest.d.ts +1 -1
- package/dist/fast/digest.js +1 -1
- package/dist/fast/frames.d.ts +1 -1
- package/dist/fast/frames.js +1 -1
- package/dist/fast/prompt.d.ts +1 -1
- package/dist/fast/prompt.js +1 -1
- package/dist/fast/review-call.js +1 -1
- package/dist/fast/reviewer.d.ts +3 -3
- package/dist/fast/reviewer.js +1 -1
- package/dist/fast/summary-call.d.ts +3 -3
- package/dist/fast/summary-call.js +2 -2
- package/dist/fast/summary-prompt.d.ts +1 -1
- package/dist/fast/summary-prompt.js +1 -1
- package/dist/fast/wiring.d.ts +4 -4
- package/dist/fast/wiring.js +1 -1
- package/dist/governance/card-normalize.d.ts +1 -1
- package/dist/governance/copy.d.ts +1 -1
- package/dist/governance/copy.js +2 -2
- package/dist/governance/engine/artifact-persist.d.ts +1 -1
- package/dist/governance/engine/budget.d.ts +1 -1
- package/dist/governance/engine/budget.js +1 -1
- package/dist/governance/engine/cards.d.ts +1 -1
- package/dist/governance/engine/digest.js +1 -1
- package/dist/governance/engine/engine-core.d.ts +5 -5
- package/dist/governance/engine/engine-core.js +1 -1
- package/dist/governance/engine/engine.d.ts +1 -1
- package/dist/governance/engine/engine.js +1 -1
- package/dist/governance/engine/estimate.d.ts +1 -1
- package/dist/governance/engine/estimate.js +1 -1
- package/dist/governance/engine/inspector.js +2 -2
- package/dist/governance/engine/integration.d.ts +1 -1
- package/dist/governance/engine/lifecycle.d.ts +1 -1
- package/dist/governance/engine/lifecycle.js +1 -1
- package/dist/governance/engine/phase-members.d.ts +1 -1
- package/dist/governance/engine/phase-planner.d.ts +1 -1
- package/dist/governance/engine/phase-planner.js +1 -1
- package/dist/governance/engine/rebuild.d.ts +1 -1
- package/dist/governance/engine/report.d.ts +1 -1
- package/dist/governance/engine/report.js +1 -1
- package/dist/governance/engine/run-digest.d.ts +1 -1
- package/dist/governance/engine/spec-builder.d.ts +2 -2
- package/dist/governance/engine/spec-builder.js +2 -2
- package/dist/governance/engine/stage-runner.js +2 -2
- package/dist/governance/engine/start-input.d.ts +1 -1
- package/dist/governance/engine/start-input.js +1 -1
- package/dist/governance/engine/state-machine.d.ts +1 -1
- package/dist/governance/engine/state-machine.js +3 -3
- package/dist/governance/engine/submission-queries.d.ts +1 -1
- package/dist/governance/engine/submission-render.d.ts +1 -1
- package/dist/governance/engine/submissions.d.ts +1 -1
- package/dist/governance/engine/submissions.js +1 -1
- package/dist/governance/engine/visibility.d.ts +1 -1
- package/dist/governance/engine/visibility.js +1 -1
- package/dist/governance/posture-transition.d.ts +2 -2
- package/dist/governance/posture-transition.js +1 -1
- package/dist/governance/profiles.d.ts +1 -1
- package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
- package/dist/governance/prompts/orchestrator-block.js +2 -2
- package/dist/governance/prompts/plan-addendum.d.ts +1 -1
- package/dist/governance/prompts/plan-addendum.js +1 -1
- package/dist/governance/prompts/role-blocks.d.ts +2 -2
- package/dist/governance/prompts/role-blocks.js +1 -1
- package/dist/governance/report-reader.js +1 -1
- package/dist/governance/roles.d.ts +1 -1
- package/dist/governance/rules/claims.d.ts +1 -1
- package/dist/governance/rules/claims.js +1 -1
- package/dist/governance/rules/elimination.d.ts +1 -1
- package/dist/governance/rules/elimination.js +1 -1
- package/dist/governance/rules/failure-analysis.d.ts +2 -2
- package/dist/governance/rules/failure-analysis.js +1 -1
- package/dist/governance/rules/ledger-replay.d.ts +1 -1
- package/dist/governance/rules/ledger-state.d.ts +1 -1
- package/dist/governance/rules/ledger-state.js +1 -1
- package/dist/governance/rules/ledger.d.ts +2 -2
- package/dist/governance/rules/ledger.js +2 -2
- package/dist/governance/rules/rca.d.ts +1 -1
- package/dist/governance/rules/rca.js +1 -1
- package/dist/governance/rules/settlement.d.ts +2 -2
- package/dist/governance/rules/settlement.js +2 -2
- package/dist/governance/rules/suspicion.d.ts +1 -1
- package/dist/governance/store/artifacts.d.ts +1 -1
- package/dist/governance/store/artifacts.js +1 -1
- package/dist/governance/store/events-log.d.ts +1 -1
- package/dist/governance/store/run-store.d.ts +1 -1
- package/dist/governance/store/run-store.js +1 -1
- package/dist/governance/store/scoreboard-export.d.ts +1 -1
- package/dist/governance/tools/child-tools.d.ts +1 -1
- package/dist/governance/tools/guard.d.ts +1 -1
- package/dist/governance/tools/guard.js +1 -1
- package/dist/governance/tools/inspector-tools.d.ts +2 -2
- package/dist/governance/tools/inspector-tools.js +2 -2
- package/dist/governance/tools/lead-tools.d.ts +1 -1
- package/dist/governance/tools/lead-tools.js +1 -1
- package/dist/governance/tools/normalize-util.js +1 -1
- package/dist/governance/tools/scan-incomplete.js +1 -1
- package/dist/governance/tools/shared-tools.d.ts +1 -1
- package/dist/governance/tools/shared-tools.js +1 -1
- package/dist/governance/tools/submit-normalizers.d.ts +1 -1
- package/dist/governance/tools/submit-normalizers.js +1 -1
- package/dist/governance/tools/submit-tools.d.ts +1 -1
- package/dist/logging/cli-commands.js +1 -1
- package/dist/logging/install.d.ts +1 -1
- package/dist/logging/install.js +3 -3
- package/dist/logging/logger.d.ts +2 -2
- package/dist/logging/logger.js +31 -2
- package/dist/proc/kill-tree.js +1 -1
- package/dist/proc/log-mirror.js +1 -1
- package/dist/proc/log-ring.js +2 -2
- package/dist/proc/notices.d.ts +1 -1
- package/dist/proc/notices.js +2 -2
- package/dist/proc/prompt.d.ts +1 -1
- package/dist/proc/prompt.js +1 -1
- package/dist/proc/readiness.js +1 -1
- package/dist/proc/supervisor.d.ts +1 -1
- package/dist/proc/supervisor.js +3 -3
- package/dist/proc/wait.d.ts +1 -1
- package/dist/proc/wait.js +1 -1
- package/dist/prompts/command.d.ts +1 -1
- package/dist/prompts/command.js +1 -1
- package/dist/prompts/normalize.d.ts +1 -1
- package/dist/prompts/normalize.js +1 -1
- package/dist/prompts/resolve.d.ts +1 -1
- package/dist/prompts/store.d.ts +2 -12
- package/dist/prompts/store.js +6 -60
- package/dist/session/checkpoint.d.ts +2 -2
- package/dist/session/clear-archive.d.ts +2 -2
- package/dist/session/persist.d.ts +2 -2
- package/dist/session/persist.js +1 -1
- package/dist/session/startup-session.d.ts +2 -2
- package/dist/session/validate-session.js +3 -3
- package/dist/skills/service.d.ts +2 -2
- package/dist/team/bus.d.ts +1 -1
- package/dist/team/bus.js +1 -1
- package/dist/team/child-reviewer.d.ts +2 -2
- package/dist/team/child-reviewer.js +1 -1
- package/dist/team/comm-tools.js +1 -1
- package/dist/team/dispatch-gate.js +1 -1
- package/dist/team/forced-dispatch.js +1 -1
- package/dist/team/forced-mode.d.ts +1 -1
- package/dist/team/forced-prompt.d.ts +1 -1
- package/dist/team/forced-prompt.js +1 -1
- package/dist/team/normalize.d.ts +1 -1
- package/dist/team/normalize.js +1 -1
- package/dist/team/overseer.d.ts +3 -3
- package/dist/team/overseer.js +3 -3
- package/dist/team/prompt.d.ts +1 -1
- package/dist/team/prompt.js +1 -1
- package/dist/team/report.d.ts +2 -2
- package/dist/team/report.js +2 -2
- package/dist/team/retry.d.ts +1 -1
- package/dist/team/retry.js +1 -1
- package/dist/team/runtime.d.ts +4 -4
- package/dist/team/runtime.js +2 -2
- package/dist/team/settled.d.ts +2 -2
- package/dist/team/subagent.d.ts +4 -4
- package/dist/team/subagent.js +5 -5
- package/dist/team/task-tool.d.ts +1 -1
- package/dist/team/task-tool.js +1 -1
- package/dist/todo/normalize.d.ts +1 -1
- package/dist/todo/normalize.js +1 -1
- package/dist/todo/prompt.d.ts +1 -1
- package/dist/todo/prompt.js +1 -1
- package/dist/todo/store.d.ts +1 -1
- package/dist/todo/store.js +2 -2
- package/dist/todo/todo-tool.d.ts +1 -1
- package/dist/todo/todo-tool.js +2 -2
- package/dist/tools/bash-tool.d.ts +1 -1
- package/dist/tools/bash-tool.js +2 -2
- package/dist/tools/diff.d.ts +1 -1
- package/dist/tools/diff.js +1 -1
- package/dist/tools/file-change-store.d.ts +1 -1
- package/dist/tools/fs-tools.d.ts +2 -2
- package/dist/tools/fs-tools.js +1 -1
- package/dist/tools/index.d.ts +3 -3
- package/dist/tools/index.js +1 -1
- package/dist/tools/job-tools.d.ts +2 -2
- package/dist/tools/job-tools.js +4 -4
- package/dist/tools/plan-tools.d.ts +1 -1
- package/dist/tools/plan-tools.js +1 -1
- package/dist/tools/proc-tools.d.ts +1 -1
- package/dist/tools/proc-tools.js +2 -2
- package/dist/update/classify-failure.d.ts +1 -1
- package/dist/update/install-lock.js +1 -1
- package/dist/update/install-source.d.ts +1 -1
- package/dist/update/installer.js +2 -2
- package/dist/update/npm-view.d.ts +1 -1
- package/dist/update/npm-view.js +1 -1
- package/dist/update/registry.d.ts +1 -1
- package/dist/update/registry.js +1 -1
- package/dist/update/service.d.ts +2 -2
- package/dist/update/service.js +2 -2
- package/package.json +7 -7
- package/dist/agent/agent-mode.d.ts +0 -108
- package/dist/agent/agent-mode.js +0 -121
- package/dist/agent/entry-limits.d.ts +0 -65
- package/dist/agent/entry-limits.js +0 -133
- package/dist/agent/governance-view.d.ts +0 -40
- package/dist/agent/governance-view.js +0 -40
- package/dist/agent/invocation-card.d.ts +0 -77
- package/dist/agent/invocation-card.js +0 -169
- package/dist/agent/model-probe-limits.d.ts +0 -39
- package/dist/agent/model-probe-limits.js +0 -25
- package/dist/agent/model-probe.d.ts +0 -104
- package/dist/agent/model-probe.js +0 -391
- package/dist/agent/queued-messages.d.ts +0 -23
- package/dist/agent/queued-messages.js +0 -49
- package/dist/agent/reducer.d.ts +0 -857
- package/dist/agent/reducer.js +0 -1646
- package/dist/agent/retry-view.d.ts +0 -68
- package/dist/agent/retry-view.js +0 -95
- package/dist/agent/usage.d.ts +0 -47
- package/dist/agent/usage.js +0 -84
- package/dist/compaction/limits.d.ts +0 -61
- package/dist/compaction/limits.js +0 -64
- package/dist/compaction/meter.d.ts +0 -276
- package/dist/compaction/meter.js +0 -512
- package/dist/compaction/pressure.d.ts +0 -163
- package/dist/compaction/pressure.js +0 -199
- package/dist/compaction/reason-text.d.ts +0 -36
- package/dist/compaction/reason-text.js +0 -78
- package/dist/compaction/types.d.ts +0 -360
- package/dist/compaction/types.js +0 -22
- package/dist/config/governance-config.d.ts +0 -125
- package/dist/config/governance-config.js +0 -164
- package/dist/config/kit-resolution.d.ts +0 -93
- package/dist/config/kit-resolution.js +0 -226
- package/dist/config/model-kits.d.ts +0 -225
- package/dist/config/model-kits.js +0 -302
- package/dist/config/model-profile-resolution.d.ts +0 -28
- package/dist/config/model-profile-resolution.js +0 -88
- package/dist/config/model-profiles.d.ts +0 -103
- package/dist/config/model-profiles.js +0 -188
- package/dist/config/schema.d.ts +0 -1645
- package/dist/config/schema.js +0 -1383
- package/dist/fast/limits.d.ts +0 -152
- package/dist/fast/limits.js +0 -152
- package/dist/fast/resolve.d.ts +0 -44
- package/dist/fast/resolve.js +0 -107
- package/dist/fast/task-summary-types.d.ts +0 -66
- package/dist/fast/task-summary-types.js +0 -17
- package/dist/fast/types.d.ts +0 -141
- package/dist/fast/types.js +0 -14
- package/dist/governance/governed-dispatch.d.ts +0 -19
- package/dist/governance/governed-dispatch.js +0 -17
- package/dist/governance/limits.d.ts +0 -107
- package/dist/governance/limits.js +0 -131
- package/dist/governance/posture.d.ts +0 -35
- package/dist/governance/posture.js +0 -59
- package/dist/governance/rules/events-table.d.ts +0 -46
- package/dist/governance/rules/events-table.js +0 -94
- package/dist/governance/types.d.ts +0 -661
- package/dist/governance/types.js +0 -27
- package/dist/input/control-sequences.d.ts +0 -71
- package/dist/input/control-sequences.js +0 -222
- package/dist/input/csiu-keys.d.ts +0 -66
- package/dist/input/csiu-keys.js +0 -181
- package/dist/input/cursor-report.d.ts +0 -61
- package/dist/input/cursor-report.js +0 -97
- package/dist/input/enter-sequences.d.ts +0 -64
- package/dist/input/enter-sequences.js +0 -153
- package/dist/input/interrupt-gesture.d.ts +0 -18
- package/dist/input/interrupt-gesture.js +0 -19
- package/dist/input/keyboard-enhancement.d.ts +0 -42
- package/dist/input/keyboard-enhancement.js +0 -65
- package/dist/input/keymap.d.ts +0 -20
- package/dist/input/keymap.js +0 -99
- package/dist/input/limits.d.ts +0 -118
- package/dist/input/limits.js +0 -109
- package/dist/input/mouse-events.d.ts +0 -87
- package/dist/input/mouse-events.js +0 -212
- package/dist/input/paste-parse.d.ts +0 -83
- package/dist/input/paste-parse.js +0 -107
- package/dist/input/pointer-router.d.ts +0 -11
- package/dist/input/pointer-router.js +0 -14
- package/dist/input/stdin-filter.d.ts +0 -112
- package/dist/input/stdin-filter.js +0 -657
- package/dist/input/win32-input-mode.d.ts +0 -61
- package/dist/input/win32-input-mode.js +0 -269
- package/dist/logging/levels.d.ts +0 -40
- package/dist/logging/levels.js +0 -59
- package/dist/logging/secret-registry.d.ts +0 -32
- package/dist/logging/secret-registry.js +0 -73
- package/dist/proc/limits.d.ts +0 -214
- package/dist/proc/limits.js +0 -221
- package/dist/proc/progress.d.ts +0 -47
- package/dist/proc/progress.js +0 -163
- package/dist/proc/types.d.ts +0 -269
- package/dist/proc/types.js +0 -15
- package/dist/proc/wait-view.d.ts +0 -65
- package/dist/proc/wait-view.js +0 -66
- package/dist/prompts/copy.d.ts +0 -89
- package/dist/prompts/copy.js +0 -131
- package/dist/prompts/fill.d.ts +0 -51
- package/dist/prompts/fill.js +0 -46
- package/dist/prompts/limits.d.ts +0 -53
- package/dist/prompts/limits.js +0 -53
- package/dist/prompts/search.d.ts +0 -58
- package/dist/prompts/search.js +0 -146
- package/dist/prompts/types.d.ts +0 -204
- package/dist/prompts/types.js +0 -13
- package/dist/team/activity.d.ts +0 -67
- package/dist/team/activity.js +0 -130
- package/dist/team/limits.d.ts +0 -308
- package/dist/team/limits.js +0 -330
- package/dist/team/model.d.ts +0 -104
- package/dist/team/model.js +0 -150
- package/dist/team/panel-rows.d.ts +0 -48
- package/dist/team/panel-rows.js +0 -75
- package/dist/team/timeline.d.ts +0 -74
- package/dist/team/timeline.js +0 -101
- package/dist/team/types.d.ts +0 -354
- package/dist/team/types.js +0 -13
- package/dist/todo/acceptance.d.ts +0 -120
- package/dist/todo/acceptance.js +0 -399
- package/dist/todo/follow-through.d.ts +0 -138
- package/dist/todo/follow-through.js +0 -248
- package/dist/todo/limits.d.ts +0 -152
- package/dist/todo/limits.js +0 -152
- package/dist/todo/panel-rows.d.ts +0 -45
- package/dist/todo/panel-rows.js +0 -70
- package/dist/todo/plan-sections.d.ts +0 -60
- package/dist/todo/plan-sections.js +0 -108
- package/dist/todo/row-window.d.ts +0 -51
- package/dist/todo/row-window.js +0 -107
- package/dist/todo/types.d.ts +0 -124
- package/dist/todo/types.js +0 -12
- package/dist/tools/human-input.d.ts +0 -212
- package/dist/tools/human-input.js +0 -265
- package/dist/tools/patch.d.ts +0 -115
- package/dist/tools/patch.js +0 -453
- package/dist/tools/terminal-output.d.ts +0 -115
- package/dist/tools/terminal-output.js +0 -201
- package/dist/tools/tool-output-store.d.ts +0 -68
- package/dist/tools/tool-output-store.js +0 -102
- package/dist/ui/ActivityLine.d.ts +0 -26
- package/dist/ui/ActivityLine.js +0 -51
- package/dist/ui/AutocompletePopup.d.ts +0 -23
- package/dist/ui/AutocompletePopup.js +0 -17
- package/dist/ui/BottomStatusRow.d.ts +0 -10
- package/dist/ui/BottomStatusRow.js +0 -9
- package/dist/ui/Composer.d.ts +0 -115
- package/dist/ui/Composer.js +0 -64
- package/dist/ui/GovernancePanel.d.ts +0 -50
- package/dist/ui/GovernancePanel.js +0 -77
- package/dist/ui/GovernanceRun.d.ts +0 -18
- package/dist/ui/GovernanceRun.js +0 -11
- package/dist/ui/Header.d.ts +0 -48
- package/dist/ui/Header.js +0 -27
- package/dist/ui/Logo.d.ts +0 -32
- package/dist/ui/Logo.js +0 -65
- package/dist/ui/Markdown.d.ts +0 -29
- package/dist/ui/Markdown.js +0 -116
- package/dist/ui/PromptCaret.d.ts +0 -11
- package/dist/ui/PromptCaret.js +0 -31
- package/dist/ui/PromptInput.d.ts +0 -192
- package/dist/ui/PromptInput.js +0 -689
- package/dist/ui/QueuePanel.d.ts +0 -8
- package/dist/ui/QueuePanel.js +0 -9
- package/dist/ui/QueueStatusRow.d.ts +0 -24
- package/dist/ui/QueueStatusRow.js +0 -51
- package/dist/ui/ScrollbackShell.d.ts +0 -132
- package/dist/ui/ScrollbackShell.js +0 -26
- package/dist/ui/SessionOpener.d.ts +0 -30
- package/dist/ui/SessionOpener.js +0 -12
- package/dist/ui/StatusBar.d.ts +0 -130
- package/dist/ui/StatusBar.js +0 -61
- package/dist/ui/TeamPanel.d.ts +0 -76
- package/dist/ui/TeamPanel.js +0 -103
- package/dist/ui/ToastStack.d.ts +0 -8
- package/dist/ui/ToastStack.js +0 -31
- package/dist/ui/TodoPanel.d.ts +0 -52
- package/dist/ui/TodoPanel.js +0 -214
- package/dist/ui/Transcript.d.ts +0 -105
- package/dist/ui/Transcript.js +0 -258
- package/dist/ui/UpdateLine.d.ts +0 -44
- package/dist/ui/UpdateLine.js +0 -129
- package/dist/ui/activity-phrases.d.ts +0 -33
- package/dist/ui/activity-phrases.js +0 -50
- package/dist/ui/capabilities.d.ts +0 -27
- package/dist/ui/capabilities.js +0 -65
- package/dist/ui/clipboard-task.d.ts +0 -29
- package/dist/ui/clipboard-task.js +0 -66
- package/dist/ui/clipboard.d.ts +0 -31
- package/dist/ui/clipboard.js +0 -157
- package/dist/ui/color-runtime.d.ts +0 -5
- package/dist/ui/color-runtime.js +0 -29
- package/dist/ui/composer-input.d.ts +0 -38
- package/dist/ui/composer-input.js +0 -79
- package/dist/ui/composer-limits.d.ts +0 -30
- package/dist/ui/composer-limits.js +0 -45
- package/dist/ui/composer-rows.d.ts +0 -73
- package/dist/ui/composer-rows.js +0 -129
- package/dist/ui/console-bridge.d.ts +0 -19
- package/dist/ui/console-bridge.js +0 -52
- package/dist/ui/density.d.ts +0 -26
- package/dist/ui/density.js +0 -34
- package/dist/ui/display-tab.d.ts +0 -51
- package/dist/ui/display-tab.js +0 -82
- package/dist/ui/editor-navigation.d.ts +0 -55
- package/dist/ui/editor-navigation.js +0 -96
- package/dist/ui/editor-reducer.d.ts +0 -108
- package/dist/ui/editor-reducer.js +0 -187
- package/dist/ui/enter-frames.d.ts +0 -47
- package/dist/ui/enter-frames.js +0 -117
- package/dist/ui/entries/AssistantEntry.d.ts +0 -37
- package/dist/ui/entries/AssistantEntry.js +0 -43
- package/dist/ui/entries/CompactionCard.d.ts +0 -88
- package/dist/ui/entries/CompactionCard.js +0 -222
- package/dist/ui/entries/DiffView.d.ts +0 -61
- package/dist/ui/entries/DiffView.js +0 -103
- package/dist/ui/entries/EntryFrame.d.ts +0 -23
- package/dist/ui/entries/EntryFrame.js +0 -6
- package/dist/ui/entries/FastCard.d.ts +0 -53
- package/dist/ui/entries/FastCard.js +0 -105
- package/dist/ui/entries/GovernanceCard.d.ts +0 -30
- package/dist/ui/entries/GovernanceCard.js +0 -32
- package/dist/ui/entries/InvocationCard.d.ts +0 -20
- package/dist/ui/entries/InvocationCard.js +0 -32
- package/dist/ui/entries/QueuedEntry.d.ts +0 -27
- package/dist/ui/entries/QueuedEntry.js +0 -33
- package/dist/ui/entries/RetryCard.d.ts +0 -56
- package/dist/ui/entries/RetryCard.js +0 -60
- package/dist/ui/entries/ServiceCard.d.ts +0 -82
- package/dist/ui/entries/ServiceCard.js +0 -151
- package/dist/ui/entries/TeamCard.d.ts +0 -55
- package/dist/ui/entries/TeamCard.js +0 -94
- package/dist/ui/entries/TodoCard.d.ts +0 -54
- package/dist/ui/entries/TodoCard.js +0 -98
- package/dist/ui/entries/ToolCard.d.ts +0 -81
- package/dist/ui/entries/ToolCard.js +0 -169
- package/dist/ui/entries/ToolPreview.d.ts +0 -59
- package/dist/ui/entries/ToolPreview.js +0 -208
- package/dist/ui/entries/UserEntry.d.ts +0 -36
- package/dist/ui/entries/UserEntry.js +0 -57
- package/dist/ui/entries/WaitCard.d.ts +0 -37
- package/dist/ui/entries/WaitCard.js +0 -92
- package/dist/ui/exit-snapshot.d.ts +0 -43
- package/dist/ui/exit-snapshot.js +0 -26
- package/dist/ui/frame-differ.d.ts +0 -166
- package/dist/ui/frame-differ.js +0 -354
- package/dist/ui/frame-observer.d.ts +0 -17
- package/dist/ui/frame-observer.js +0 -94
- package/dist/ui/frame-parser.d.ts +0 -7
- package/dist/ui/frame-parser.js +0 -18
- package/dist/ui/gauge.d.ts +0 -39
- package/dist/ui/gauge.js +0 -55
- package/dist/ui/glyphs.d.ts +0 -178
- package/dist/ui/glyphs.js +0 -165
- package/dist/ui/governance-copy.d.ts +0 -69
- package/dist/ui/governance-copy.js +0 -104
- package/dist/ui/governance-status.d.ts +0 -145
- package/dist/ui/governance-status.js +0 -326
- package/dist/ui/gradient.d.ts +0 -11
- package/dist/ui/gradient.js +0 -50
- package/dist/ui/ink-runtime.d.ts +0 -4
- package/dist/ui/ink-runtime.js +0 -51
- package/dist/ui/interaction-copy.d.ts +0 -84
- package/dist/ui/interaction-copy.js +0 -41
- package/dist/ui/interaction-hints.d.ts +0 -44
- package/dist/ui/interaction-hints.js +0 -97
- package/dist/ui/layout/AppShell.d.ts +0 -17
- package/dist/ui/layout/AppShell.js +0 -6
- package/dist/ui/layout/Gutter.d.ts +0 -67
- package/dist/ui/layout/Gutter.js +0 -42
- package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
- package/dist/ui/layout/MeasuredEntry.js +0 -30
- package/dist/ui/layout/OverlayFrame.d.ts +0 -73
- package/dist/ui/layout/OverlayFrame.js +0 -110
- package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
- package/dist/ui/layout/ScrollIndicator.js +0 -22
- package/dist/ui/layout/ScrollViewport.d.ts +0 -40
- package/dist/ui/layout/ScrollViewport.js +0 -222
- package/dist/ui/layout/agents-board.d.ts +0 -102
- package/dist/ui/layout/agents-board.js +0 -389
- package/dist/ui/layout/autocomplete.d.ts +0 -18
- package/dist/ui/layout/autocomplete.js +0 -26
- package/dist/ui/layout/budget.d.ts +0 -43
- package/dist/ui/layout/budget.js +0 -52
- package/dist/ui/layout/cells.d.ts +0 -61
- package/dist/ui/layout/cells.js +0 -156
- package/dist/ui/layout/document-layout.d.ts +0 -13
- package/dist/ui/layout/document-layout.js +0 -10
- package/dist/ui/layout/follow-state.d.ts +0 -138
- package/dist/ui/layout/follow-state.js +0 -148
- package/dist/ui/layout/frame.d.ts +0 -36
- package/dist/ui/layout/frame.js +0 -39
- package/dist/ui/layout/governance-board.d.ts +0 -121
- package/dist/ui/layout/governance-board.js +0 -382
- package/dist/ui/layout/governance-card.d.ts +0 -53
- package/dist/ui/layout/governance-card.js +0 -134
- package/dist/ui/layout/governance-chip.d.ts +0 -38
- package/dist/ui/layout/governance-chip.js +0 -64
- package/dist/ui/layout/governance-panel.d.ts +0 -85
- package/dist/ui/layout/governance-panel.js +0 -358
- package/dist/ui/layout/governance-roster.d.ts +0 -65
- package/dist/ui/layout/governance-roster.js +0 -275
- package/dist/ui/layout/header-hints.d.ts +0 -90
- package/dist/ui/layout/header-hints.js +0 -110
- package/dist/ui/layout/header-left.d.ts +0 -115
- package/dist/ui/layout/header-left.js +0 -206
- package/dist/ui/layout/invocation-card.d.ts +0 -41
- package/dist/ui/layout/invocation-card.js +0 -91
- package/dist/ui/layout/kit-chip.d.ts +0 -50
- package/dist/ui/layout/kit-chip.js +0 -81
- package/dist/ui/layout/overlay-window.d.ts +0 -43
- package/dist/ui/layout/overlay-window.js +0 -51
- package/dist/ui/layout/queue-layout.d.ts +0 -19
- package/dist/ui/layout/queue-layout.js +0 -26
- package/dist/ui/layout/rail.d.ts +0 -7
- package/dist/ui/layout/rail.js +0 -16
- package/dist/ui/layout/scroll-indicator.d.ts +0 -27
- package/dist/ui/layout/scroll-indicator.js +0 -36
- package/dist/ui/layout/scroll.d.ts +0 -37
- package/dist/ui/layout/scroll.js +0 -99
- package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
- package/dist/ui/layout/scrollbar-geometry.js +0 -13
- package/dist/ui/layout/session-chip.d.ts +0 -52
- package/dist/ui/layout/session-chip.js +0 -64
- package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
- package/dist/ui/layout/shortcut-panel-layout.js +0 -321
- package/dist/ui/layout/status-detail-layout.d.ts +0 -9
- package/dist/ui/layout/status-detail-layout.js +0 -79
- package/dist/ui/layout/status-layout.d.ts +0 -140
- package/dist/ui/layout/status-layout.js +0 -262
- package/dist/ui/layout/task-summary-cell.d.ts +0 -61
- package/dist/ui/layout/task-summary-cell.js +0 -65
- package/dist/ui/layout/team-panel.d.ts +0 -18
- package/dist/ui/layout/team-panel.js +0 -25
- package/dist/ui/layout/team-row.d.ts +0 -139
- package/dist/ui/layout/team-row.js +0 -246
- package/dist/ui/layout/todo-layout.d.ts +0 -62
- package/dist/ui/layout/todo-layout.js +0 -102
- package/dist/ui/layout/useTerminalSize.d.ts +0 -13
- package/dist/ui/layout/useTerminalSize.js +0 -50
- package/dist/ui/layout/viewport-geometry.d.ts +0 -29
- package/dist/ui/layout/viewport-geometry.js +0 -28
- package/dist/ui/layout/virtual-window.d.ts +0 -112
- package/dist/ui/layout/virtual-window.js +0 -494
- package/dist/ui/layout/wait-bar.d.ts +0 -34
- package/dist/ui/layout/wait-bar.js +0 -48
- package/dist/ui/layout/wrap-rows.d.ts +0 -26
- package/dist/ui/layout/wrap-rows.js +0 -88
- package/dist/ui/live-clamp.d.ts +0 -14
- package/dist/ui/live-clamp.js +0 -46
- package/dist/ui/markdown-blocks.d.ts +0 -107
- package/dist/ui/markdown-blocks.js +0 -240
- package/dist/ui/overlays/AgentsBoardOverlay.d.ts +0 -57
- package/dist/ui/overlays/AgentsBoardOverlay.js +0 -183
- package/dist/ui/overlays/ConfirmDialog.d.ts +0 -31
- package/dist/ui/overlays/ConfirmDialog.js +0 -44
- package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +0 -41
- package/dist/ui/overlays/GovernanceBoardOverlay.js +0 -76
- package/dist/ui/overlays/GovernanceSettingsPage.d.ts +0 -48
- package/dist/ui/overlays/GovernanceSettingsPage.js +0 -93
- package/dist/ui/overlays/HelpOverlay.d.ts +0 -29
- package/dist/ui/overlays/HelpOverlay.js +0 -232
- package/dist/ui/overlays/KitEditor.d.ts +0 -23
- package/dist/ui/overlays/KitEditor.js +0 -101
- package/dist/ui/overlays/KitManager.d.ts +0 -23
- package/dist/ui/overlays/KitManager.js +0 -104
- package/dist/ui/overlays/KitPicker.d.ts +0 -49
- package/dist/ui/overlays/KitPicker.js +0 -58
- package/dist/ui/overlays/ModelDiscoveryList.d.ts +0 -23
- package/dist/ui/overlays/ModelDiscoveryList.js +0 -161
- package/dist/ui/overlays/ModelPicker.d.ts +0 -26
- package/dist/ui/overlays/ModelPicker.js +0 -63
- package/dist/ui/overlays/ModelProfileEditor.d.ts +0 -29
- package/dist/ui/overlays/ModelProfileEditor.js +0 -168
- package/dist/ui/overlays/ModelProfilePicker.d.ts +0 -48
- package/dist/ui/overlays/ModelProfilePicker.js +0 -231
- package/dist/ui/overlays/PlanReviewOverlay.d.ts +0 -51
- package/dist/ui/overlays/PlanReviewOverlay.js +0 -132
- package/dist/ui/overlays/PromptEditorPage.d.ts +0 -48
- package/dist/ui/overlays/PromptEditorPage.js +0 -227
- package/dist/ui/overlays/PromptLibraryOverlay.d.ts +0 -37
- package/dist/ui/overlays/PromptLibraryOverlay.js +0 -191
- package/dist/ui/overlays/PromptPicker.d.ts +0 -36
- package/dist/ui/overlays/PromptPicker.js +0 -129
- package/dist/ui/overlays/PromptTextArea.d.ts +0 -86
- package/dist/ui/overlays/PromptTextArea.js +0 -141
- package/dist/ui/overlays/QuestionOverlay.d.ts +0 -39
- package/dist/ui/overlays/QuestionOverlay.js +0 -258
- package/dist/ui/overlays/QueueOverlay.d.ts +0 -22
- package/dist/ui/overlays/QueueOverlay.js +0 -79
- package/dist/ui/overlays/SettingsScreen.d.ts +0 -228
- package/dist/ui/overlays/SettingsScreen.js +0 -1037
- package/dist/ui/overlays/ShortcutPanel.d.ts +0 -39
- package/dist/ui/overlays/ShortcutPanel.js +0 -106
- package/dist/ui/overlays/TeamFanoutPage.d.ts +0 -51
- package/dist/ui/overlays/TeamFanoutPage.js +0 -90
- package/dist/ui/overlays/governance-settings.d.ts +0 -79
- package/dist/ui/overlays/governance-settings.js +0 -140
- package/dist/ui/overlays/kit-picker-state.d.ts +0 -87
- package/dist/ui/overlays/kit-picker-state.js +0 -136
- package/dist/ui/overlays/kit-settings-state.d.ts +0 -129
- package/dist/ui/overlays/kit-settings-state.js +0 -268
- package/dist/ui/overlays/model-probe-view.d.ts +0 -128
- package/dist/ui/overlays/model-probe-view.js +0 -225
- package/dist/ui/overlays/model-profile-state.d.ts +0 -177
- package/dist/ui/overlays/model-profile-state.js +0 -301
- package/dist/ui/overlays/prompt-library-state.d.ts +0 -162
- package/dist/ui/overlays/prompt-library-state.js +0 -335
- package/dist/ui/overlays/prompt-picker-state.d.ts +0 -71
- package/dist/ui/overlays/prompt-picker-state.js +0 -98
- package/dist/ui/overlays/team-fanout-state.d.ts +0 -106
- package/dist/ui/overlays/team-fanout-state.js +0 -155
- package/dist/ui/overlays/use-model-probe.d.ts +0 -30
- package/dist/ui/overlays/use-model-probe.js +0 -109
- package/dist/ui/palettes.d.ts +0 -112
- package/dist/ui/palettes.js +0 -130
- package/dist/ui/paste-frames.d.ts +0 -91
- package/dist/ui/paste-frames.js +0 -117
- package/dist/ui/paste-tokens.d.ts +0 -90
- package/dist/ui/paste-tokens.js +0 -147
- package/dist/ui/render-cache.d.ts +0 -81
- package/dist/ui/render-cache.js +0 -196
- package/dist/ui/render-governor.d.ts +0 -54
- package/dist/ui/render-governor.js +0 -78
- package/dist/ui/run-metrics.d.ts +0 -23
- package/dist/ui/run-metrics.js +0 -27
- package/dist/ui/run-status-row.d.ts +0 -63
- package/dist/ui/run-status-row.js +0 -54
- package/dist/ui/screen.d.ts +0 -107
- package/dist/ui/screen.js +0 -234
- package/dist/ui/scrollback/LiveTail.d.ts +0 -115
- package/dist/ui/scrollback/LiveTail.js +0 -48
- package/dist/ui/scrollback/band.d.ts +0 -114
- package/dist/ui/scrollback/band.js +0 -143
- package/dist/ui/scrollback/budget.d.ts +0 -90
- package/dist/ui/scrollback/budget.js +0 -100
- package/dist/ui/scrollback/canvas.d.ts +0 -100
- package/dist/ui/scrollback/canvas.js +0 -114
- package/dist/ui/scrollback/cursor-probe.d.ts +0 -71
- package/dist/ui/scrollback/cursor-probe.js +0 -133
- package/dist/ui/scrollback/drain.d.ts +0 -32
- package/dist/ui/scrollback/drain.js +0 -64
- package/dist/ui/scrollback/exit-summary.d.ts +0 -23
- package/dist/ui/scrollback/exit-summary.js +0 -25
- package/dist/ui/scrollback/limits.d.ts +0 -98
- package/dist/ui/scrollback/limits.js +0 -98
- package/dist/ui/scrollback/live-preview.d.ts +0 -34
- package/dist/ui/scrollback/live-preview.js +0 -130
- package/dist/ui/scrollback/overflow-print.d.ts +0 -108
- package/dist/ui/scrollback/overflow-print.js +0 -120
- package/dist/ui/scrollback/renderer.d.ts +0 -48
- package/dist/ui/scrollback/renderer.js +0 -186
- package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
- package/dist/ui/scrollback/scrollback-writer.js +0 -648
- package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
- package/dist/ui/scrollback/settled-boundary.js +0 -109
- package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
- package/dist/ui/scrollback/tail-anchor.js +0 -79
- package/dist/ui/scrollback/tail-window.d.ts +0 -73
- package/dist/ui/scrollback/tail-window.js +0 -89
- package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
- package/dist/ui/scrollback/use-scrollback-view.js +0 -601
- package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
- package/dist/ui/scrollback/writer-shapes.js +0 -159
- package/dist/ui/scrollbar-controller.d.ts +0 -30
- package/dist/ui/scrollbar-controller.js +0 -124
- package/dist/ui/selection/highlight.d.ts +0 -39
- package/dist/ui/selection/highlight.js +0 -64
- package/dist/ui/selection/screen-mirror.d.ts +0 -24
- package/dist/ui/selection/screen-mirror.js +0 -35
- package/dist/ui/selection/selection-controller.d.ts +0 -104
- package/dist/ui/selection/selection-controller.js +0 -372
- package/dist/ui/selection/selection.d.ts +0 -90
- package/dist/ui/selection/selection.js +0 -223
- package/dist/ui/shortcuts.d.ts +0 -81
- package/dist/ui/shortcuts.js +0 -221
- package/dist/ui/status-feedback.d.ts +0 -35
- package/dist/ui/status-feedback.js +0 -38
- package/dist/ui/stdout-frame-writer.d.ts +0 -74
- package/dist/ui/stdout-frame-writer.js +0 -155
- package/dist/ui/team-status.d.ts +0 -166
- package/dist/ui/team-status.js +0 -252
- package/dist/ui/terminal-plan.d.ts +0 -52
- package/dist/ui/terminal-plan.js +0 -49
- package/dist/ui/theme.d.ts +0 -96
- package/dist/ui/theme.js +0 -130
- package/dist/ui/transcript-text.d.ts +0 -41
- package/dist/ui/transcript-text.js +0 -282
- package/dist/ui/use-height-store.d.ts +0 -31
- package/dist/ui/use-height-store.js +0 -76
- package/dist/ui/use-render-governor.d.ts +0 -39
- package/dist/ui/use-render-governor.js +0 -57
- package/dist/ui/use-wheel-routing.d.ts +0 -57
- package/dist/ui/use-wheel-routing.js +0 -152
- package/dist/ui/win-vt-force.d.ts +0 -136
- package/dist/ui/win-vt-force.js +0 -237
- package/dist/ui/win-vt-input.d.ts +0 -57
- package/dist/ui/win-vt-input.js +0 -62
- package/dist/update/limits.d.ts +0 -111
- package/dist/update/limits.js +0 -111
- package/dist/update/semver.d.ts +0 -89
- package/dist/update/semver.js +0 -295
- package/dist/update/types.d.ts +0 -169
- package/dist/update/types.js +0 -68
- /package/dist/{ui → app}/session-bridge.d.ts +0 -0
- /package/dist/{ui → app}/session-bridge.js +0 -0
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Viewport virtualisation maths (tui-render-performance L3 / R1). Pure,
|
|
3
|
-
* React-free, unit-tested.
|
|
4
|
-
*
|
|
5
|
-
* THE STRUCTURAL FIX. Ink's `renderNodeToOutput` has no early-out for clipped
|
|
6
|
-
* subtrees: for every `ink-text` node it runs `squashTextNodes`, `widestLine`
|
|
7
|
-
* and possibly `wrapText` — all O(chars) — and `Output.get()` then evaluates
|
|
8
|
-
* `widestLine` a SECOND time before it is allowed to skip an out-of-clip
|
|
9
|
-
* operation. A clipped 50 000-character entry therefore costs two full string
|
|
10
|
-
* scans per frame and buys nothing. Bounding the ENTRY COUNT (`transcriptWindow`)
|
|
11
|
-
* never bounded that, because one entry can be fifty thousand lines.
|
|
12
|
-
*
|
|
13
|
-
* So entries outside the visible band are not mounted at all. They are replaced
|
|
14
|
-
* by two spacer boxes whose heights come from a height cache, which makes the
|
|
15
|
-
* per-frame cost O(visible rows) instead of O(characters ever produced).
|
|
16
|
-
*
|
|
17
|
-
* V-4 — `offset` counts rows FROM THE BOTTOM (`layout/scroll.ts:1-13`), and that
|
|
18
|
-
* is what makes virtualisation safe here for free: a height correction on an
|
|
19
|
-
* entry ABOVE the viewport changes the content height and therefore
|
|
20
|
-
* `overflowLines`, while `offset` — and hence what the user is looking at — is
|
|
21
|
-
* unchanged. No scroll-anchoring compensation pass is required. Do NOT
|
|
22
|
-
* "simplify" `offset` to count from the top.
|
|
23
|
-
*
|
|
24
|
-
* V-4 AS AMENDED BY tui-selection-and-scroll-follow (§4.3.1a). There is now
|
|
25
|
-
* exactly ONE compensation pass — `follow-state.ts`'s Rule A — and it is
|
|
26
|
-
* deliberately restricted to rows appended AT THE TAIL, published by
|
|
27
|
-
* `Transcript.tsx` from the height table below. Everything the paragraph above
|
|
28
|
-
* describes still self-compensates and is still not compensated for again.
|
|
29
|
-
* The restriction is the whole of V-4's survival: an offset that reacted to
|
|
30
|
-
* TOTAL measured height would turn every above-the-viewport correction into a
|
|
31
|
-
* jump, would read a horizon front-drop as new output — and, because
|
|
32
|
-
* `selectWindow` takes `offset` as an INPUT, would close a loop from the offset
|
|
33
|
-
* through the mounted set and the measured heights back to the offset.
|
|
34
|
-
*/
|
|
35
|
-
import stringWidth from 'string-width';
|
|
36
|
-
import { governanceCardRows } from './governance-card.js';
|
|
37
|
-
import { WAIT_CARD_ROWS } from './wait-bar.js';
|
|
38
|
-
import { FAST_LIMITS } from '../../fast/limits.js';
|
|
39
|
-
import { COMPACTION_LIMITS } from '../../compaction/limits.js';
|
|
40
|
-
import { GUTTER_WIDTH } from './Gutter.js';
|
|
41
|
-
import { expandTabs } from '../display-tab.js';
|
|
42
|
-
import { USER_ENTRY_MAX_ROWS } from '../composer-limits.js';
|
|
43
|
-
import { isLiveTeamCard } from '../team-status.js';
|
|
44
|
-
import { invocationCardRows } from './invocation-card.js';
|
|
45
|
-
export const VIRTUAL_LIMITS = {
|
|
46
|
-
/**
|
|
47
|
-
* Entries kept mounted on each side of the visible band.
|
|
48
|
-
*
|
|
49
|
-
* V-2 — must stay `>= 2`, so a one-row scroll can never expose an entry whose
|
|
50
|
-
* height has never been measured at the very edge of the viewport.
|
|
51
|
-
*/
|
|
52
|
-
overscan: 2,
|
|
53
|
-
/** Height-cache ceiling (LRU). Four thousand numbers, not four thousand strings. */
|
|
54
|
-
heightEntries: 4096,
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* A cheap content version: it changes exactly when the rendered content does.
|
|
58
|
-
*
|
|
59
|
-
* DERIVED, NEVER HASHED. Hashing a 256 KiB string once per entry per frame would
|
|
60
|
-
* recreate the very cost this module exists to remove, so every field below is
|
|
61
|
-
* an O(1) read of a length or a scalar.
|
|
62
|
-
*
|
|
63
|
-
* I-L3-1 — this must change whenever the rendered output changes. The only lossy
|
|
64
|
-
* case is a same-LENGTH text replacement, which the reducer cannot produce: all
|
|
65
|
-
* text fields are append-only (`appendBounded` only ever elides the middle,
|
|
66
|
-
* which changes the length). A future NON-APPEND mutation MUST extend the
|
|
67
|
-
* revision, or the entry freezes at a stale height AND a stale rendered subtree
|
|
68
|
-
* with nothing anywhere reporting it. `virtual-window.test.ts` enumerates every
|
|
69
|
-
* kind against every mutating action.
|
|
70
|
-
*/
|
|
71
|
-
export function entryRevision(entry) {
|
|
72
|
-
switch (entry.kind) {
|
|
73
|
-
// A card's shape is fixed at creation; the suffix only tells "card" from "plain" (and
|
|
74
|
-
// the three row-bearing parts), which is what makes a `queued -> user` rewrite re-measure.
|
|
75
|
-
case 'user':
|
|
76
|
-
return entry.invocation
|
|
77
|
-
? `i${entry.invocation.input.length}.${entry.invocation.inputHidden > 0 ? 1 : 0}.${entry.invocation.note ? 1 : 0}`
|
|
78
|
-
: 'u';
|
|
79
|
-
case 'notice':
|
|
80
|
-
return 'n';
|
|
81
|
-
// `thinkingMs` is O(1) and it CHANGES THE ROW: sealing the clock turns
|
|
82
|
-
// `* thought` into `* thought for 12s`, and with thinking hidden that row is
|
|
83
|
-
// the entry's whole rendered height.
|
|
84
|
-
case 'assistant':
|
|
85
|
-
return `a${entry.text.length}.${entry.thinking?.length ?? 0}.${entry.streaming ? 1 : 0}.${entry.aborted ? 1 : 0}.${entry.thinkingMs ?? -1}`;
|
|
86
|
-
// `patch.lineCount` is PRECOMPUTED for exactly this term: summing
|
|
87
|
-
// `hunks[].lines.length` per entry per frame is the cost the height cache
|
|
88
|
-
// exists to remove, and I-L3-1 forbids hashing.
|
|
89
|
-
// `liveSeq` IS A COUNTER AND NOT `live.length`, and that is precisely the
|
|
90
|
-
// NON-APPEND mutation I-L3-1 above says must extend the revision: a
|
|
91
|
-
// fixed-size tail evicting its oldest row while appending a new one of the
|
|
92
|
-
// same width leaves the joined length unchanged, so a length term would go
|
|
93
|
-
// on matching while the card's content changed under it.
|
|
94
|
-
//
|
|
95
|
-
// SIX TERMS NOW, the longest revision in this file (P2-12). Still O(1) per
|
|
96
|
-
// entry per frame, which is the property I-L3-1 requires -- but the next
|
|
97
|
-
// field makes it seven, and a term that is not O(1) would put the cost this
|
|
98
|
-
// module exists to remove back on every frame.
|
|
99
|
-
case 'tool':
|
|
100
|
-
return `t${entry.status}.${entry.argsRaw.length}.${entry.preview?.length ?? 0}.${entry.durationMs ?? -1}.${entry.patch?.lineCount ?? -1}.${entry.liveSeq ?? -1}.w${entry.waitSeq ?? -1}`;
|
|
101
|
-
case 'team':
|
|
102
|
-
return `m${entry.active ? 1 : 0}.${entry.runs.length}.${entry.runs
|
|
103
|
-
.map((r) => r.phase[0])
|
|
104
|
-
.join('')}.${entry.runs.reduce((acc, r) => acc + r.toolCalls, 0)}`;
|
|
105
|
-
case 'todo':
|
|
106
|
-
// REVISION MUST COVER EVERY FIELD THAT CAN CHANGE THE HEIGHT (§6.10.1). A
|
|
107
|
-
// criterion going `pending` -> `failed` changes NONE of `items.length`,
|
|
108
|
-
// `doneCount` or `total`, yet it adds an evidence row; without
|
|
109
|
-
// `checkedCount` and `failedCount` here the height cache would keep the old
|
|
110
|
-
// measurement and the cache would be silently wrong - textbook form of "add a
|
|
111
|
-
// field, forget the revision".
|
|
112
|
-
return `d${entry.live ? 1 : 0}.${entry.doneCount}.${entry.total}.${entry.items.length}`
|
|
113
|
-
+ `.a${entry.acceptance
|
|
114
|
-
? `${entry.acceptance.items.length}.${entry.acceptance.checkedCount}` +
|
|
115
|
-
`.${entry.acceptance.failedCount}`
|
|
116
|
-
: '-'}`;
|
|
117
|
-
/**
|
|
118
|
-
* The retry card is ONE ROW IN EVERY PHASE, so its revision carries the phase
|
|
119
|
-
* and the counter but deliberately NOT the countdown: `resumeAt` changes the
|
|
120
|
-
* rendered SECONDS once a second while the height stays 1, and folding it in
|
|
121
|
-
* here would invalidate the height cache 30 times per backoff to re-measure a
|
|
122
|
-
* number that cannot change the answer.
|
|
123
|
-
*
|
|
124
|
-
* `phase` and `attempt` ARE in, because they change the row's text and a stale
|
|
125
|
-
* measurement would be wrong in a way nothing reports (I-L3-1).
|
|
126
|
-
*/
|
|
127
|
-
case 'retry':
|
|
128
|
-
return `r${entry.phase}.${entry.attempt}.${entry.maxRetries}`;
|
|
129
|
-
/**
|
|
130
|
-
* `status`, `live` and the TEXT LENGTH, because all three change the rows the
|
|
131
|
-
* card draws: `advice` renders a body, everything else renders one line, and
|
|
132
|
-
* the body's length decides how many rows it wraps to. `durationMs` is in the
|
|
133
|
-
* header, which is `wrap="truncate"`, so it can never change the height.
|
|
134
|
-
*/
|
|
135
|
-
case 'fast':
|
|
136
|
-
return `f${entry.status}.${entry.live ? 1 : 0}.${entry.text?.length ?? 0}.${entry.detail?.length ?? 0}`;
|
|
137
|
-
/**
|
|
138
|
-
* `live`, the SUMMARY LENGTH and `mode`, because all three change the rows the
|
|
139
|
-
* card draws: a live card renders a headline and no body, a settled one
|
|
140
|
-
* renders the summary (whose length decides how many rows it wraps to), and
|
|
141
|
-
* `mode` selects between the "summarized N messages" and "dropped N WITHOUT a
|
|
142
|
-
* summary" detail lines. `durationMs` is inside the `wrap="truncate"`
|
|
143
|
-
* headline, so it can never change the height.
|
|
144
|
-
*/
|
|
145
|
-
case 'compaction':
|
|
146
|
-
return `c${entry.live ? 1 : 0}.${entry.summary?.length ?? 0}.${entry.mode}.${entry.applied ? 1 : 0}`;
|
|
147
|
-
/**
|
|
148
|
-
* `rowsSeen`, AND NEVER `rows.length` (background-service-supervision P0-3).
|
|
149
|
-
*
|
|
150
|
-
* The service tail is a FIXED-SIZE RING: it evicts its oldest row while
|
|
151
|
-
* appending a new one, so the joined length is unchanged while the content is
|
|
152
|
-
* not. That is verbatim the NON-APPEND mutation I-L3-1 above says must extend
|
|
153
|
-
* the revision, and it is the same trap — and the same fix — as the `tool`
|
|
154
|
-
* branch's `liveSeq` two cases up. A length term would go on matching while
|
|
155
|
-
* the card changed underneath it, and the card would freeze at a stale height
|
|
156
|
-
* AND a stale rendered subtree with nothing anywhere reporting it.
|
|
157
|
-
*
|
|
158
|
-
* `status` and the presence of a URL are in because both change the rows the
|
|
159
|
-
* card draws; `exitCode` is in because the terminal row names it.
|
|
160
|
-
*/
|
|
161
|
-
case 'service':
|
|
162
|
-
return `v${entry.status}.${entry.rowsSeen}.${entry.url ? 1 : 0}.${entry.exitCode ?? -1}.${entry.terminal ? 1 : 0}`;
|
|
163
|
-
// A governance card is IMMUTABLE once appended (it is a settled record), so its
|
|
164
|
-
// revision only has to tell two cards apart: the shape terms below are what decide
|
|
165
|
-
// its height (`governanceCardRows`), and they cannot change without a new entry.
|
|
166
|
-
case 'governance':
|
|
167
|
-
return `g${entry.card.rows.length}.${entry.card.notes.length}.${entry.card.headline.length}`;
|
|
168
|
-
default:
|
|
169
|
-
return 'x';
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* The height-cache key.
|
|
174
|
-
*
|
|
175
|
-
* V-5 — `cols` is part of the key, so a resize invalidates every entry. The
|
|
176
|
-
* frame after a resize renders from estimates and re-measures lazily: one
|
|
177
|
-
* reflow, no crash, no stale layout.
|
|
178
|
-
*
|
|
179
|
-
* `flags` carries the render-affecting switches that are neither per-entry nor
|
|
180
|
-
* part of `density` — today only `thinkingVisible` (Ctrl+T). It is a parameter
|
|
181
|
-
* rather than a fifth positional scalar so a future switch costs one character
|
|
182
|
-
* at the call site instead of a signature change at four.
|
|
183
|
-
*/
|
|
184
|
-
export function heightKey(entry, cols, expanded, density, flags = '') {
|
|
185
|
-
return `${entry.id}|${entryRevision(entry)}|${cols}|${expanded ? 1 : 0}|${density}|${flags}`;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Rows a string occupies at `usable` columns, wrapping included. At least 1.
|
|
189
|
-
*
|
|
190
|
-
* COUNTED IN DISPLAY COLUMNS, NOT UTF-16 CODE UNITS, and the difference is a
|
|
191
|
-
* correctness bug rather than a nicety: a CJK glyph is one code unit and two
|
|
192
|
-
* cells, and a TAB is one code unit and up to `TAB_WIDTH` cells. Counting code
|
|
193
|
-
* units therefore UNDER-estimates, which this file's own note names as the
|
|
194
|
-
* unsafe direction ("an over-estimate makes the scroll position slightly
|
|
195
|
-
* conservative and self-corrects ... an under-estimate can put the newest
|
|
196
|
-
* output off the bottom of a viewport the user believes is pinned"). It also
|
|
197
|
-
* had to change together with the renderers: a stored `\t` is now expanded at
|
|
198
|
-
* paint time, so measuring the unexpanded string would keep the estimate short
|
|
199
|
-
* while the painted row got taller.
|
|
200
|
-
*/
|
|
201
|
-
function wrappedRows(text, usable) {
|
|
202
|
-
const width = Math.max(1, usable);
|
|
203
|
-
let rows = 0;
|
|
204
|
-
let start = 0;
|
|
205
|
-
for (;;) {
|
|
206
|
-
const end = text.indexOf('\n', start);
|
|
207
|
-
const line = end === -1 ? text.slice(start) : text.slice(start, end);
|
|
208
|
-
rows += Math.max(1, Math.ceil(displayColumns(line) / width));
|
|
209
|
-
if (end === -1)
|
|
210
|
-
return rows;
|
|
211
|
-
start = end + 1;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Printable ASCII with no TAB: one code unit is one cell, so the width table is
|
|
216
|
-
* not consulted at all.
|
|
217
|
-
*
|
|
218
|
-
* THE FAST PATH IS LOAD-BEARING, not a micro-optimisation. `stringWidth`
|
|
219
|
-
* strips ANSI and walks the East-Asian width table for every code point, and
|
|
220
|
-
* this function runs over EVERY unmeasured entry of a 10 000-entry document
|
|
221
|
-
* (`render-budget.test.tsx` mounts exactly that); measuring them all with the
|
|
222
|
-
* table turned that test into a timeout. Transcript text is overwhelmingly
|
|
223
|
-
* ASCII, so the branch is taken almost always.
|
|
224
|
-
*/
|
|
225
|
-
const PLAIN_ASCII = /^[\x20-\x7e]*$/;
|
|
226
|
-
/** Display columns of one logical line: TABs expanded, CJK counted twice. */
|
|
227
|
-
function displayColumns(line) {
|
|
228
|
-
if (line.indexOf('\t') === -1 && PLAIN_ASCII.test(line))
|
|
229
|
-
return line.length;
|
|
230
|
-
// `expandTabs` mirrors what `entries/*` paints; `stringWidth` is the width
|
|
231
|
-
// table the composer already wraps with, so the two agree on CJK and emoji.
|
|
232
|
-
return stringWidth(expandTabs(line));
|
|
233
|
-
}
|
|
234
|
-
/** Collapsed preview rows in `ToolCard`; duplicated as a NUMBER, not imported. */
|
|
235
|
-
const TOOL_COLLAPSED_LINES = 8;
|
|
236
|
-
/** Collapsed diff rows in `DiffView`; duplicated for the same reason as above. */
|
|
237
|
-
const DIFF_COLLAPSED_LINES = 12;
|
|
238
|
-
/** Live tail rows in `ToolCard`; duplicated as a NUMBER, for the same reason. */
|
|
239
|
-
const TOOL_LIVE_TAIL_ROWS = 8;
|
|
240
|
-
/** Tail rows a COLLAPSED `ServiceCard` draws; duplicated for the same reason. */
|
|
241
|
-
const SERVICE_COLLAPSED_TAIL_ROWS = 2;
|
|
242
|
-
/** Tail rows an EXPANDED `ServiceCard` draws; the snapshot cap (8). */
|
|
243
|
-
const SERVICE_EXPANDED_TAIL_ROWS = 8;
|
|
244
|
-
/**
|
|
245
|
-
* The progress row the live `ServiceCard` draws when `progress` or `stalled` is
|
|
246
|
-
* set (long-task-jobs §4.9), duplicated as the number `1` for the same reason as
|
|
247
|
-
* the two constants above: `virtual-window.ts` counts lines, `ServiceCard.tsx`
|
|
248
|
-
* draws them, and the pairing is kept by a test (AC-27) rather than by an import.
|
|
249
|
-
*/
|
|
250
|
-
const SERVICE_PROGRESS_ROWS = 1;
|
|
251
|
-
/**
|
|
252
|
-
* Pure UPPER-BOUND estimate of an entry's height, used until a real measurement
|
|
253
|
-
* exists.
|
|
254
|
-
*
|
|
255
|
-
* Upper bound rather than best guess, and deliberately so: an over-estimate
|
|
256
|
-
* makes the scroll position slightly conservative and self-corrects the frame
|
|
257
|
-
* after the entry is measured, while an under-estimate can put the newest output
|
|
258
|
-
* off the bottom of a viewport the user believes is pinned.
|
|
259
|
-
*/
|
|
260
|
-
export function estimateEntryRows(entry, cols, density, expanded, thinkingVisible = true) {
|
|
261
|
-
const usable = Math.max(1, cols - GUTTER_WIDTH);
|
|
262
|
-
// `separationRows` needs the PRECEDING entry, which a per-entry estimate does
|
|
263
|
-
// not have. One row is its maximum, so charging it unconditionally keeps this
|
|
264
|
-
// an upper bound (`compact` never spends it at all).
|
|
265
|
-
const separation = density === 'comfortable' ? 1 : 0;
|
|
266
|
-
switch (entry.kind) {
|
|
267
|
-
case 'user':
|
|
268
|
-
// A CARD HAS ITS OWN, BOUNDED HEIGHT (tui-invocation-cards I-4): the same
|
|
269
|
-
// `invocationCardRows` the painter is built from, never the command line's wrapped rows.
|
|
270
|
-
if (entry.invocation) {
|
|
271
|
-
return separation + invocationCardRows(entry.invocation, usable, wrappedRows);
|
|
272
|
-
}
|
|
273
|
-
// MIRRORS `UserEntry`'s RENDER CAP (+1 for the `... +N more lines` tail).
|
|
274
|
-
// THESE TWO NUMBERS ARE ONE NUMBER (I-13). Capping the renderer alone
|
|
275
|
-
// would leave this function believing a 5 000-line message is 5 000 rows
|
|
276
|
-
// tall -- and unlike an ordinary over-estimate that failure does NOT
|
|
277
|
-
// self-correct: this file's own note above records that "an entry
|
|
278
|
-
// estimated at 400 rows is exactly the one that never gets mounted", and
|
|
279
|
-
// an unmounted entry is never measured.
|
|
280
|
-
return (separation + Math.min(wrappedRows(entry.text, usable), USER_ENTRY_MAX_ROWS + 1));
|
|
281
|
-
case 'notice':
|
|
282
|
-
return separation + wrappedRows(entry.text, usable);
|
|
283
|
-
case 'assistant': {
|
|
284
|
-
// THE PARAMETER'S `true` DEFAULT IS A FAIL-SAFE FOR A FORGOTTEN CALLER,
|
|
285
|
-
// NOT THE PLAN FOR THE ONE THERE IS (P1-6a). `Transcript.tsx` holds
|
|
286
|
-
// `thinkingVisible` as a prop and MUST pass it: with thinking hidden by
|
|
287
|
-
// default, an unpassed flag inflates every assistant entry that thought by
|
|
288
|
-
// `1 + wrappedRows(thinking)` — hundreds of rows at `thinkingLevel: high`
|
|
289
|
-
// against a real height of one. The self-correction argument does not
|
|
290
|
-
// rescue that, because an entry is only measured once `selectWindow`
|
|
291
|
-
// mounts it, and an entry estimated at 400 rows is exactly the one that
|
|
292
|
-
// never gets mounted.
|
|
293
|
-
const thinking = !entry.thinking
|
|
294
|
-
? 0
|
|
295
|
-
: thinkingVisible
|
|
296
|
-
? 1 + wrappedRows(entry.thinking, usable)
|
|
297
|
-
: // The collapsed `thought for Ns` marker is exactly one row, and it is
|
|
298
|
-
// suppressed while the entry is still streaming (the activity line is
|
|
299
|
-
// the live surface then).
|
|
300
|
-
entry.streaming
|
|
301
|
-
? 0
|
|
302
|
-
: 1;
|
|
303
|
-
const body = entry.text.length > 0 ? wrappedRows(entry.text, usable) : 1;
|
|
304
|
-
return separation + thinking + body + (entry.aborted ? 1 : 0);
|
|
305
|
-
}
|
|
306
|
-
case 'tool': {
|
|
307
|
-
const settled = entry.status === 'done' || entry.status === 'error';
|
|
308
|
-
// WHEN A PATCH IS PRESENT IT, NOT THE PREVIEW, IS WHAT DRAWS (§3.4): the
|
|
309
|
-
// stored preview is one line by then, so estimating from it would report a
|
|
310
|
-
// 3-row card for a 12-row diff — an UNDER-estimate, the direction this
|
|
311
|
-
// file names as unsafe.
|
|
312
|
-
if (settled && entry.patch) {
|
|
313
|
-
const rows = entry.patch.lineCount + Math.max(0, entry.patch.hunks.length - 1);
|
|
314
|
-
const shown = expanded ? rows : Math.min(rows, DIFF_COLLAPSED_LINES);
|
|
315
|
-
// card header + `+N -M` summary + rows + footer
|
|
316
|
-
return separation + 1 + 1 + shown + 1;
|
|
317
|
-
}
|
|
318
|
-
// THE ONE-LINE `if (!entry.preview || !settled)` THIS REPLACES COVERED TWO
|
|
319
|
-
// CASES, and both must survive the split (P1-4): not settled, and settled
|
|
320
|
-
// with nothing to draw (an aborted call, a tool that returned an empty
|
|
321
|
-
// string). A `!settled` block alone would drop the second into
|
|
322
|
-
// `wrappedRows(entry.preview, usable)` with `undefined`.
|
|
323
|
-
if (!settled) {
|
|
324
|
-
// A RUNNING `job_wait` WITH A VIEW IS THE FIVE-ROW WAIT CARD, EXACTLY
|
|
325
|
-
// (extended-job-wait I-10): constant height is what lets this be an
|
|
326
|
-
// equality rather than an upper bound. Keep in step with `WAIT_CARD_ROWS`.
|
|
327
|
-
if (entry.name === 'job_wait' && entry.wait)
|
|
328
|
-
return separation + WAIT_CARD_ROWS;
|
|
329
|
-
const live = entry.live?.length ?? 0;
|
|
330
|
-
if (live === 0)
|
|
331
|
-
return separation + 1;
|
|
332
|
-
// Header + tail rows + the unconditional stall/`(running)` footer row.
|
|
333
|
-
//
|
|
334
|
-
// ROWS ARE COUNTED, NOT WRAPPED, which is legitimate only because every
|
|
335
|
-
// live row is rendered `wrap="truncate"` AND clipped at
|
|
336
|
-
// `LIVE_ROW_MAX_CHARS` on the way into the store -- the same argument
|
|
337
|
-
// `DiffView.tsx:6-11` makes for itself, and the same coupling: if a
|
|
338
|
-
// future change lets a live row wrap, this silently UNDER-counts, the
|
|
339
|
-
// direction this file names as the one the layout cannot absorb.
|
|
340
|
-
return separation + 1 + Math.min(live, TOOL_LIVE_TAIL_ROWS) + 1;
|
|
341
|
-
}
|
|
342
|
-
if (!entry.preview) {
|
|
343
|
-
return separation + 1;
|
|
344
|
-
}
|
|
345
|
-
const lines = wrappedRows(entry.preview, usable);
|
|
346
|
-
const shown = expanded ? lines : Math.min(lines, TOOL_COLLAPSED_LINES);
|
|
347
|
-
// header + body + the `+N lines (Ctrl+O)` / `(Ctrl+O to collapse)` footer
|
|
348
|
-
return separation + 1 + shown + 1;
|
|
349
|
-
}
|
|
350
|
-
case 'team':
|
|
351
|
-
// A LIVE DISPATCH CARD IS NOT DRAWN AT ALL (tui-subagent-double-roster A-2):
|
|
352
|
-
// the roster is the only live subagent surface, so this entry owes the window
|
|
353
|
-
// ZERO rows. Estimating it at its real height while `EntryView` renders nothing
|
|
354
|
-
// would make `selectWindow` reserve four rows for a card that is not on screen -
|
|
355
|
-
// blank space at the bottom of every dispatch frame, and a window boundary that
|
|
356
|
-
// disagrees with what the printer measures.
|
|
357
|
-
if (isLiveTeamCard(entry))
|
|
358
|
-
return 0;
|
|
359
|
-
return separation + 1 + entry.runs.length + (expanded ? entry.runs.length * 3 + 1 : 1);
|
|
360
|
-
case 'todo': {
|
|
361
|
-
// THE ACCEPTANCE BLOCK'S ROWS, EXACTLY (§6.10.1): one title row plus one row
|
|
362
|
-
// per criterion plus one row per FAILED criterion's evidence. Exact because
|
|
363
|
-
// every one of those lines is `wrap="truncate"`; the moment one of them wraps,
|
|
364
|
-
// this stops being an equality and becomes an upper bound - and the failure
|
|
365
|
-
// mode is scroll drift, which nothing reports.
|
|
366
|
-
const acceptance = entry.acceptance;
|
|
367
|
-
const acceptanceRows = acceptance && acceptance.total > 0
|
|
368
|
-
? 1 + acceptance.items.length + acceptance.failedCount
|
|
369
|
-
: 0;
|
|
370
|
-
return separation + 1 + entry.items.length + acceptanceRows;
|
|
371
|
-
}
|
|
372
|
-
// ONE ROW, ALWAYS. The card is `wrap="truncate"` in every phase, so this is an
|
|
373
|
-
// exact height rather than an upper bound.
|
|
374
|
-
case 'retry':
|
|
375
|
-
return separation + 1;
|
|
376
|
-
// ADDING THE CASE TO ONLY ONE OF THIS FILE'S TWO SWITCHES YIELDS A
|
|
377
|
-
// TRANSCRIPT WHOSE SCROLL ARITHMETIC DISAGREES WITH WHAT IT DREW, which
|
|
378
|
-
// manifests as drift rather than as an error (RV-13). Header row, then
|
|
379
|
-
// either the wrapped critique (clamped to `cardTextRows`) or one status
|
|
380
|
-
// line — an upper bound, which is what this function owes its caller.
|
|
381
|
-
case 'fast': {
|
|
382
|
-
const body = entry.status === 'advice' && entry.text
|
|
383
|
-
? Math.min(FAST_LIMITS.cardTextRows, wrappedRows(entry.text, usable))
|
|
384
|
-
: 1;
|
|
385
|
-
return separation + 1 + body;
|
|
386
|
-
}
|
|
387
|
-
// THE SECOND SWITCH, and adding the case to only one of the two yields a
|
|
388
|
-
// transcript whose scroll arithmetic disagrees with what it drew — drift
|
|
389
|
-
// rather than an error (C-9 / RV-13). Headline row, one detail row, then the
|
|
390
|
-
// summary clamped to `cardTextRows` (or unclamped when expanded) plus the
|
|
391
|
-
// `+N more lines` footer. An UPPER BOUND, which is what this function owes
|
|
392
|
-
// its caller.
|
|
393
|
-
case 'compaction': {
|
|
394
|
-
const lines = entry.summary ? wrappedRows(entry.summary, usable) : 0;
|
|
395
|
-
const body = expanded ? lines : Math.min(lines, COMPACTION_LIMITS.cardTextRows);
|
|
396
|
-
const footer = lines > body || (expanded && lines > COMPACTION_LIMITS.cardTextRows) ? 1 : 0;
|
|
397
|
-
return separation + 1 + 1 + body + footer;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* THE THIRD SWITCH, and adding the case to only one of this file's two
|
|
401
|
-
* yields a transcript whose scroll arithmetic disagrees with what it drew —
|
|
402
|
-
* drift rather than an error (P0-3 / RV-13). Both `default` branches swallow
|
|
403
|
-
* an unknown kind silently, and `virtual-window.test.ts` hand-enumerates
|
|
404
|
-
* kinds, so neither omission turns anything red on its own.
|
|
405
|
-
*
|
|
406
|
-
* A terminal record is exactly one row. A live card is the status row, the
|
|
407
|
-
* URL row when there is one, and the tail — counted, not wrapped, which is
|
|
408
|
-
* legitimate only because every row is `wrap="truncate"` AND clipped at
|
|
409
|
-
* `LIVE_ROW_MAX_CHARS` on the way into the ring, the same coupling the
|
|
410
|
-
* `tool` branch above records for itself.
|
|
411
|
-
*/
|
|
412
|
-
case 'service': {
|
|
413
|
-
if (entry.terminal)
|
|
414
|
-
return separation + 1;
|
|
415
|
-
const url = entry.url ? 1 : 0;
|
|
416
|
-
const tail = expanded
|
|
417
|
-
? Math.min(entry.rows.length, SERVICE_EXPANDED_TAIL_ROWS)
|
|
418
|
-
: Math.min(entry.rows.length, SERVICE_COLLAPSED_TAIL_ROWS);
|
|
419
|
-
// THE PROGRESS ROW IS ONE MORE LINE (long-task-jobs AC-27), and it is only
|
|
420
|
-
// ever one because `ServiceCard` draws it with `wrap="truncate"` and the
|
|
421
|
-
// supervisor clips it to `PROC_LIMITS.waitProgressChars`. A `stalled` badge
|
|
422
|
-
// REPLACES it rather than adding to it - the two can never both be drawn,
|
|
423
|
-
// so this stays a single term.
|
|
424
|
-
const progress = entry.progress || entry.stalled ? SERVICE_PROGRESS_ROWS : 0;
|
|
425
|
-
return separation + 1 + progress + url + tail;
|
|
426
|
-
}
|
|
427
|
-
// EXACT, not an upper bound: every line of the card is `wrap="truncate"`, so its
|
|
428
|
-
// height is a function of its data alone (`layout/governance-card.ts`). It has to
|
|
429
|
-
// be added to BOTH of this file's switches - one alone yields scroll drift.
|
|
430
|
-
case 'governance':
|
|
431
|
-
return separation + governanceCardRows(entry.card);
|
|
432
|
-
default:
|
|
433
|
-
return separation + 1;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
/** Choose which entries to mount, and how tall the two spacers must be. */
|
|
437
|
-
export function selectWindow(input) {
|
|
438
|
-
const { entries, heightOf } = input;
|
|
439
|
-
const n = entries.length;
|
|
440
|
-
if (n === 0) {
|
|
441
|
-
return { startIndex: 0, endIndex: 0, leadingRows: 0, trailingRows: 0, totalRows: 0 };
|
|
442
|
-
}
|
|
443
|
-
const heights = new Array(n);
|
|
444
|
-
let totalRows = 0;
|
|
445
|
-
for (let i = 0; i < n; i += 1) {
|
|
446
|
-
const h = heightOf(i);
|
|
447
|
-
const rows = Number.isFinite(h) && h > 0 ? Math.floor(h) : 1;
|
|
448
|
-
heights[i] = rows;
|
|
449
|
-
totalRows += rows;
|
|
450
|
-
}
|
|
451
|
-
// A viewport of 0 is the FIRST FRAME, before `measureElement` has run. Falling
|
|
452
|
-
// back to 1 keeps the live tail mounted through it, so the first paint is real
|
|
453
|
-
// content rather than a blank rectangle that only fills in on the second.
|
|
454
|
-
const viewport = Math.max(1, Math.floor(input.viewportRows) || 0);
|
|
455
|
-
const offset = Math.max(0, Math.floor(input.offset) || 0);
|
|
456
|
-
const overscan = Math.max(VIRTUAL_LIMITS.overscan, Math.floor(input.overscan) || 0);
|
|
457
|
-
const bottom = totalRows + (input.trailingContentRows ?? 0) - offset;
|
|
458
|
-
const top = bottom - viewport;
|
|
459
|
-
let start = n - 1;
|
|
460
|
-
let acc = 0;
|
|
461
|
-
for (let i = 0; i < n; i += 1) {
|
|
462
|
-
const next = acc + heights[i];
|
|
463
|
-
if (next > top) {
|
|
464
|
-
start = i;
|
|
465
|
-
break;
|
|
466
|
-
}
|
|
467
|
-
acc = next;
|
|
468
|
-
}
|
|
469
|
-
let end = n;
|
|
470
|
-
acc = 0;
|
|
471
|
-
for (let i = 0; i < n; i += 1) {
|
|
472
|
-
if (acc >= bottom) {
|
|
473
|
-
end = i;
|
|
474
|
-
break;
|
|
475
|
-
}
|
|
476
|
-
acc += heights[i];
|
|
477
|
-
}
|
|
478
|
-
start = Math.max(0, start - overscan);
|
|
479
|
-
end = Math.min(n, end + overscan);
|
|
480
|
-
// V-3 — while pinned, the LAST entry is always inside the window, whatever its
|
|
481
|
-
// height. The live tail must be real content and never a spacer, or a
|
|
482
|
-
// streaming answer renders as a growing blank rectangle.
|
|
483
|
-
if (offset <= 0)
|
|
484
|
-
end = n;
|
|
485
|
-
if (end <= start)
|
|
486
|
-
end = Math.min(n, start + 1);
|
|
487
|
-
let leadingRows = 0;
|
|
488
|
-
for (let i = 0; i < start; i += 1)
|
|
489
|
-
leadingRows += heights[i];
|
|
490
|
-
let trailingRows = 0;
|
|
491
|
-
for (let i = end; i < n; i += 1)
|
|
492
|
-
trailingRows += heights[i];
|
|
493
|
-
return { startIndex: start, endIndex: end, leadingRows, trailingRows, totalRows };
|
|
494
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure pieces of the wait card (extended-job-wait §3.8.2).
|
|
3
|
-
*
|
|
4
|
-
* ASCII ONLY: `src/ui/**` is inside the glyph scanner's scope, so every
|
|
5
|
-
* non-ASCII cell arrives as an argument from `pickGlyphs`.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Rows the wait card occupies, header included, in every state (I-10).
|
|
9
|
-
* Here rather than beside the component so `virtual-window.ts` can import it
|
|
10
|
-
* without pulling React into a pure layout module.
|
|
11
|
-
*/
|
|
12
|
-
export declare const WAIT_CARD_ROWS = 5;
|
|
13
|
-
/** The two glyphs a bar is made of; a subset of the `pickGlyphs` result. */
|
|
14
|
-
export interface BarGlyphs {
|
|
15
|
-
gaugeFull: string;
|
|
16
|
-
gaugeEmpty: string;
|
|
17
|
-
}
|
|
18
|
-
/** Narrowest terminal that still gets a bar; below it the row is text only. */
|
|
19
|
-
export declare const WAIT_BAR_MIN_COLS = 40;
|
|
20
|
-
/** Bar width for a terminal `cols` wide: about a third of the row, 8..28 cells. */
|
|
21
|
-
export declare function barCellsFor(cols: number): number;
|
|
22
|
-
/**
|
|
23
|
-
* A `cells`-wide bar for `fraction` in 0..1.
|
|
24
|
-
*
|
|
25
|
-
* AN UNFINISHED BAR IS NEVER FULL (I-8): anything strictly between 0 and 1 shows
|
|
26
|
-
* at least one filled and at least one empty cell, so a 99.9% job does not read
|
|
27
|
-
* as done. `NaN`, negatives and non-finite values are an empty bar rather than a
|
|
28
|
-
* throw - this runs inside a render.
|
|
29
|
-
*/
|
|
30
|
-
export declare function renderBar(fraction: number, cells: number, glyphs: BarGlyphs): string;
|
|
31
|
-
/** `4m12s`, `10m00s`, `45s` - the one clock format of the card and the status bar. */
|
|
32
|
-
export declare function formatWaitClock(ms: number): string;
|
|
33
|
-
/** Whole percent for a 0..1 fraction, clamped. */
|
|
34
|
-
export declare function percentOf(fraction: number): number;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure pieces of the wait card (extended-job-wait §3.8.2).
|
|
3
|
-
*
|
|
4
|
-
* ASCII ONLY: `src/ui/**` is inside the glyph scanner's scope, so every
|
|
5
|
-
* non-ASCII cell arrives as an argument from `pickGlyphs`.
|
|
6
|
-
*/
|
|
7
|
-
import { shortDuration } from './status-layout.js';
|
|
8
|
-
/**
|
|
9
|
-
* Rows the wait card occupies, header included, in every state (I-10).
|
|
10
|
-
* Here rather than beside the component so `virtual-window.ts` can import it
|
|
11
|
-
* without pulling React into a pure layout module.
|
|
12
|
-
*/
|
|
13
|
-
export const WAIT_CARD_ROWS = 5;
|
|
14
|
-
/** Narrowest terminal that still gets a bar; below it the row is text only. */
|
|
15
|
-
export const WAIT_BAR_MIN_COLS = 40;
|
|
16
|
-
/** Bar width for a terminal `cols` wide: about a third of the row, 8..28 cells. */
|
|
17
|
-
export function barCellsFor(cols) {
|
|
18
|
-
if (!Number.isFinite(cols))
|
|
19
|
-
return 8;
|
|
20
|
-
return Math.max(8, Math.min(28, Math.floor((cols - 4) * 0.35)));
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* A `cells`-wide bar for `fraction` in 0..1.
|
|
24
|
-
*
|
|
25
|
-
* AN UNFINISHED BAR IS NEVER FULL (I-8): anything strictly between 0 and 1 shows
|
|
26
|
-
* at least one filled and at least one empty cell, so a 99.9% job does not read
|
|
27
|
-
* as done. `NaN`, negatives and non-finite values are an empty bar rather than a
|
|
28
|
-
* throw - this runs inside a render.
|
|
29
|
-
*/
|
|
30
|
-
export function renderBar(fraction, cells, glyphs) {
|
|
31
|
-
const width = Math.max(1, Math.floor(cells));
|
|
32
|
-
if (!Number.isFinite(fraction) || fraction <= 0)
|
|
33
|
-
return glyphs.gaugeEmpty.repeat(width);
|
|
34
|
-
if (fraction >= 1)
|
|
35
|
-
return glyphs.gaugeFull.repeat(width);
|
|
36
|
-
const filled = Math.min(width - 1, Math.max(1, Math.round(fraction * width)));
|
|
37
|
-
return glyphs.gaugeFull.repeat(filled) + glyphs.gaugeEmpty.repeat(width - filled);
|
|
38
|
-
}
|
|
39
|
-
/** `4m12s`, `10m00s`, `45s` - the one clock format of the card and the status bar. */
|
|
40
|
-
export function formatWaitClock(ms) {
|
|
41
|
-
return shortDuration(ms);
|
|
42
|
-
}
|
|
43
|
-
/** Whole percent for a 0..1 fraction, clamped. */
|
|
44
|
-
export function percentOf(fraction) {
|
|
45
|
-
if (!Number.isFinite(fraction))
|
|
46
|
-
return 0;
|
|
47
|
-
return Math.max(0, Math.min(100, Math.floor(fraction * 100)));
|
|
48
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `wrapToRows` — the prose wrapper for `OverlayFrame`'s controlled (mode A)
|
|
3
|
-
* content (plan-mode §6.6).
|
|
4
|
-
*
|
|
5
|
-
* Mode A's contract is *one element per row, each already `wrap="truncate"`*,
|
|
6
|
-
* and `sliceWindow` counts ELEMENTS, not lines. Help and Settings satisfy that
|
|
7
|
-
* naturally because their content is a list of short rows. A plan is not: its
|
|
8
|
-
* summary runs to 600 characters and a step detail to 400, so handing either
|
|
9
|
-
* over as a single `<Text>` renders the whole paragraph as one truncated line —
|
|
10
|
-
* the single worst failure available to a plan review card, and one that also
|
|
11
|
-
* makes the frame's `1-14/22` position indicator a false statement.
|
|
12
|
-
*
|
|
13
|
-
* The repo had no wrapper before this (no `wrapText`, no `wordWrap`), so here is
|
|
14
|
-
* one: pure, no Ink, unit-tested.
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Break `text` into lines of at most `width` columns.
|
|
18
|
-
*
|
|
19
|
-
* Prefers spaces; hard-breaks any single token longer than `width` (a URL or a
|
|
20
|
-
* long path, which must not be dropped and cannot be wrapped politely).
|
|
21
|
-
* Width is measured in terminal cells and hard breaks preserve graphemes. A
|
|
22
|
-
* single grapheme wider than the limit stays intact on its own row.
|
|
23
|
-
* Existing newlines are honoured as paragraph breaks. Returns `[]` for empty
|
|
24
|
-
* input so callers can splice the result without an emptiness branch.
|
|
25
|
-
*/
|
|
26
|
-
export declare function wrapToRows(text: string, width: number): string[];
|