@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
package/dist/ui/composer-rows.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composer layout (tui-paste-handling section 5.5) -- pure. No Ink, no React.
|
|
3
|
-
*
|
|
4
|
-
* THE ONE PLACE THAT MAPS A BUFFER INDEX TO A SCREEN CELL (I-9). The composer
|
|
5
|
-
* used to hand its buffer to Ink one `<Text>` per logical line and let Yoga wrap
|
|
6
|
-
* it, which is fine until the draft is taller than the frame: `AppShell` gives
|
|
7
|
-
* the bottom chrome `flexShrink={0}`, so a tall composer does not grow the frame
|
|
8
|
-
* -- Yoga takes the rows out of the transcript and `overflow: hidden` clips them
|
|
9
|
-
* away, while `layout/budget.ts` keeps telling five consumers the composer is
|
|
10
|
-
* three rows tall. Four hundred presses of `Shift+Enter` do it without pasting
|
|
11
|
-
* anything.
|
|
12
|
-
*
|
|
13
|
-
* So the wrap happens HERE, the row count is a number this module returns, and
|
|
14
|
-
* `budget.ts` is told that number (I-8).
|
|
15
|
-
*
|
|
16
|
-
* HARD WRAP BY DISPLAY COLUMN, NEVER `layout/wrap-rows.ts::wrapToRows` (D-15).
|
|
17
|
-
* That function is a PROSE wrapper: it splits on `/\s+/` and rejoins with single
|
|
18
|
-
* spaces, so it destroys indentation and makes the character-index-to-screen-cell
|
|
19
|
-
* mapping the caret depends on impossible to state, let alone compute.
|
|
20
|
-
*/
|
|
21
|
-
import { buildEditorVisualMap, graphemes, graphemeWidth } from './editor-navigation.js';
|
|
22
|
-
import { tokenSpans } from './paste-tokens.js';
|
|
23
|
-
/** Width of a displayed run, measured by complete graphemes. */
|
|
24
|
-
export function displayWidth(text) {
|
|
25
|
-
return graphemes(text).reduce((width, part) => width + graphemeWidth(part.text), 0);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Wrap `buffer` into rows, locate the caret, and select a window of at most
|
|
29
|
-
* `maxRows` rows that contains it.
|
|
30
|
-
*
|
|
31
|
-
* The window is pinned to the BOTTOM -- where the user is typing -- and pulled up
|
|
32
|
-
* only far enough to keep the caret visible. That is deterministic, which matters
|
|
33
|
-
* because this function holds no state between calls: a scroll offset would have
|
|
34
|
-
* to live in the reducer and would then need its own invalidation rules.
|
|
35
|
-
*/
|
|
36
|
-
export function layoutComposer(input) {
|
|
37
|
-
const { buffer, active } = input;
|
|
38
|
-
const maxRows = input.maxRows >= 1 ? Math.floor(input.maxRows) : 1;
|
|
39
|
-
const map = buildEditorVisualMap(input);
|
|
40
|
-
const cursorRowAbs = active ? map.cursor.row : -1;
|
|
41
|
-
const cursorCol = map.cursor.column;
|
|
42
|
-
const spans = tokenSpans(buffer);
|
|
43
|
-
let spanIndex = 0;
|
|
44
|
-
const rows = map.rows.map((cells) => {
|
|
45
|
-
const segments = [];
|
|
46
|
-
for (const cell of cells) {
|
|
47
|
-
while (spanIndex < spans.length && spans[spanIndex].end <= cell.index)
|
|
48
|
-
spanIndex += 1;
|
|
49
|
-
const span = spans[spanIndex];
|
|
50
|
-
const kind = span && cell.index >= span.start && cell.index < span.end ? 'token' : 'text';
|
|
51
|
-
const last = segments[segments.length - 1];
|
|
52
|
-
if (last && last.kind === kind)
|
|
53
|
-
segments[segments.length - 1] = {
|
|
54
|
-
text: last.text + cell.text, kind,
|
|
55
|
-
};
|
|
56
|
-
else
|
|
57
|
-
segments.push({ text: cell.text, kind });
|
|
58
|
-
}
|
|
59
|
-
return { segments };
|
|
60
|
-
});
|
|
61
|
-
const totalRows = rows.length;
|
|
62
|
-
const cap = Math.max(1, Math.min(maxRows, totalRows));
|
|
63
|
-
let start = Math.max(0, totalRows - cap);
|
|
64
|
-
if (cursorRowAbs >= 0) {
|
|
65
|
-
if (cursorRowAbs < start)
|
|
66
|
-
start = cursorRowAbs;
|
|
67
|
-
else if (cursorRowAbs >= start + cap)
|
|
68
|
-
start = Math.min(totalRows - cap, cursorRowAbs - cap + 1);
|
|
69
|
-
}
|
|
70
|
-
const windowed = rows.slice(start, start + cap);
|
|
71
|
-
return {
|
|
72
|
-
rows: windowed,
|
|
73
|
-
cursorRow: cursorRowAbs >= 0 ? cursorRowAbs - start : -1,
|
|
74
|
-
cursorCol,
|
|
75
|
-
totalRows,
|
|
76
|
-
hiddenAbove: start,
|
|
77
|
-
hiddenBelow: totalRows - start - windowed.length,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Split one row at a display column so the renderer can draw an inverse caret on
|
|
82
|
-
* exactly one cell.
|
|
83
|
-
*
|
|
84
|
-
* Lives here rather than in the component because it walks the SAME width table
|
|
85
|
-
* `layoutComposer` walked (I-9): a second, subtly different measurement is how
|
|
86
|
-
* the caret ends up drawn on a cell that does not hold the character it is on.
|
|
87
|
-
*/
|
|
88
|
-
export function splitRowAtColumn(row, column) {
|
|
89
|
-
const before = [];
|
|
90
|
-
const after = [];
|
|
91
|
-
let at = null;
|
|
92
|
-
let x = 0;
|
|
93
|
-
const push = (list, text, kind) => {
|
|
94
|
-
const last = list[list.length - 1];
|
|
95
|
-
if (last && last.kind === kind)
|
|
96
|
-
list[list.length - 1] = { text: last.text + text, kind };
|
|
97
|
-
else
|
|
98
|
-
list.push({ text, kind });
|
|
99
|
-
};
|
|
100
|
-
const cells = [];
|
|
101
|
-
let leading = '';
|
|
102
|
-
for (const segment of row.segments) {
|
|
103
|
-
for (const { text: ch } of graphemes(segment.text)) {
|
|
104
|
-
if (graphemeWidth(ch) === 0) {
|
|
105
|
-
const last = cells[cells.length - 1];
|
|
106
|
-
if (last)
|
|
107
|
-
cells[cells.length - 1] = { ...last, text: last.text + ch };
|
|
108
|
-
else
|
|
109
|
-
leading += ch;
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
cells.push({ text: leading + ch, kind: segment.kind });
|
|
113
|
-
leading = '';
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// A zero-width-only row keeps its text before the explicitly budgeted space.
|
|
118
|
-
if (leading)
|
|
119
|
-
push(before, leading, row.segments[0]?.kind ?? 'text');
|
|
120
|
-
for (const cell of cells) {
|
|
121
|
-
const width = displayWidth(cell.text);
|
|
122
|
-
if (at === null && column >= x && column < x + width)
|
|
123
|
-
at = cell;
|
|
124
|
-
else
|
|
125
|
-
push(at === null ? before : after, cell.text, cell.kind);
|
|
126
|
-
x += width;
|
|
127
|
-
}
|
|
128
|
-
return { before, at, after };
|
|
129
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Console bridge — invariant I-4 (spec §4.9).
|
|
3
|
-
*
|
|
4
|
-
* `patchConsole: true` makes Ink do `log.clear() → stdout.write(data) →
|
|
5
|
-
* log(lastOutput)`. Under a fixed frame that write pushes the frame down a row
|
|
6
|
-
* and permanently corrupts the line accounting described in §4.2: from then on
|
|
7
|
-
* `eraseLines(previousLineCount)` is off by one and the frame slowly eats the
|
|
8
|
-
* content above it.
|
|
9
|
-
*
|
|
10
|
-
* So full-screen mode runs with `patchConsole: false` and routes `console.*`
|
|
11
|
-
* into the transcript as notice entries, where the output is actually READABLE
|
|
12
|
-
* instead of merely being somewhere on screen. Inline mode keeps Ink's patching.
|
|
13
|
-
*/
|
|
14
|
-
import type { NoticeLevel } from '../agent/reducer.js';
|
|
15
|
-
/**
|
|
16
|
-
* Hijack `console.*` for the lifetime of the returned restore function.
|
|
17
|
-
* Returns a restore callback; calling it twice is harmless.
|
|
18
|
-
*/
|
|
19
|
-
export declare function installConsoleBridge(sink: (level: NoticeLevel, text: string) => void): () => void;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Console bridge — invariant I-4 (spec §4.9).
|
|
3
|
-
*
|
|
4
|
-
* `patchConsole: true` makes Ink do `log.clear() → stdout.write(data) →
|
|
5
|
-
* log(lastOutput)`. Under a fixed frame that write pushes the frame down a row
|
|
6
|
-
* and permanently corrupts the line accounting described in §4.2: from then on
|
|
7
|
-
* `eraseLines(previousLineCount)` is off by one and the frame slowly eats the
|
|
8
|
-
* content above it.
|
|
9
|
-
*
|
|
10
|
-
* So full-screen mode runs with `patchConsole: false` and routes `console.*`
|
|
11
|
-
* into the transcript as notice entries, where the output is actually READABLE
|
|
12
|
-
* instead of merely being somewhere on screen. Inline mode keeps Ink's patching.
|
|
13
|
-
*/
|
|
14
|
-
import { format } from 'node:util';
|
|
15
|
-
const LEVEL_BY_METHOD = {
|
|
16
|
-
log: 'info',
|
|
17
|
-
info: 'info',
|
|
18
|
-
warn: 'warn',
|
|
19
|
-
error: 'error',
|
|
20
|
-
debug: 'info',
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Hijack `console.*` for the lifetime of the returned restore function.
|
|
24
|
-
* Returns a restore callback; calling it twice is harmless.
|
|
25
|
-
*/
|
|
26
|
-
export function installConsoleBridge(sink) {
|
|
27
|
-
const methods = Object.keys(LEVEL_BY_METHOD);
|
|
28
|
-
const originals = new Map();
|
|
29
|
-
for (const method of methods) {
|
|
30
|
-
originals.set(method, console[method].bind(console));
|
|
31
|
-
console[method] = (...args) => {
|
|
32
|
-
const text = format(...args);
|
|
33
|
-
if (text.length === 0)
|
|
34
|
-
return;
|
|
35
|
-
try {
|
|
36
|
-
sink(LEVEL_BY_METHOD[method], text);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// A failing sink must never turn a stray console.log into a crash.
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
let restored = false;
|
|
44
|
-
return () => {
|
|
45
|
-
if (restored)
|
|
46
|
-
return;
|
|
47
|
-
restored = true;
|
|
48
|
-
for (const [method, original] of originals) {
|
|
49
|
-
console[method] = original;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
}
|
package/dist/ui/density.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entry spacing policy (spec §4.3).
|
|
3
|
-
*
|
|
4
|
-
* Replaces four unconditional `marginTop={1}` sites (`UserEntry`,
|
|
5
|
-
* `AssistantEntry`, `ToolCard`, the notice branch in `Transcript`). Those spent
|
|
6
|
-
* a blank row on EVERY entry, so a plain "ask -> read a file -> answer" turn was
|
|
7
|
-
* 17 rows tall against a 13-16 row viewport: the user could only ever see the
|
|
8
|
-
* current step.
|
|
9
|
-
*
|
|
10
|
-
* Blank space now marks the one boundary that means something — the start of a
|
|
11
|
-
* new user turn. Everything inside a turn stays contiguous, and the left rail
|
|
12
|
-
* (§4.3) provides the grouping the blank rows used to.
|
|
13
|
-
*
|
|
14
|
-
* Pure and free of React so `density.test.ts` can enumerate the whole matrix.
|
|
15
|
-
*/
|
|
16
|
-
import type { Entry } from '../agent/reducer.js';
|
|
17
|
-
import type { DensityMode } from '../config/schema.js';
|
|
18
|
-
export type { DensityMode };
|
|
19
|
-
/**
|
|
20
|
-
* Blank rows to insert BEFORE `next`. `prev === undefined` means `next` is the
|
|
21
|
-
* first item in the list.
|
|
22
|
-
*
|
|
23
|
-
* This is the ONLY place allowed to decide entry spacing: if a component also
|
|
24
|
-
* sets its own `marginTop`, the two stack and the turn boundary becomes 2 rows.
|
|
25
|
-
*/
|
|
26
|
-
export declare function separationRows(prev: Entry | undefined, next: Entry, mode: DensityMode): 0 | 1;
|
package/dist/ui/density.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entry spacing policy (spec §4.3).
|
|
3
|
-
*
|
|
4
|
-
* Replaces four unconditional `marginTop={1}` sites (`UserEntry`,
|
|
5
|
-
* `AssistantEntry`, `ToolCard`, the notice branch in `Transcript`). Those spent
|
|
6
|
-
* a blank row on EVERY entry, so a plain "ask -> read a file -> answer" turn was
|
|
7
|
-
* 17 rows tall against a 13-16 row viewport: the user could only ever see the
|
|
8
|
-
* current step.
|
|
9
|
-
*
|
|
10
|
-
* Blank space now marks the one boundary that means something — the start of a
|
|
11
|
-
* new user turn. Everything inside a turn stays contiguous, and the left rail
|
|
12
|
-
* (§4.3) provides the grouping the blank rows used to.
|
|
13
|
-
*
|
|
14
|
-
* Pure and free of React so `density.test.ts` can enumerate the whole matrix.
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Blank rows to insert BEFORE `next`. `prev === undefined` means `next` is the
|
|
18
|
-
* first item in the list.
|
|
19
|
-
*
|
|
20
|
-
* This is the ONLY place allowed to decide entry spacing: if a component also
|
|
21
|
-
* sets its own `marginTop`, the two stack and the turn boundary becomes 2 rows.
|
|
22
|
-
*/
|
|
23
|
-
export function separationRows(prev, next, mode) {
|
|
24
|
-
if (!prev)
|
|
25
|
-
return 0;
|
|
26
|
-
if (mode === 'compact')
|
|
27
|
-
return 0;
|
|
28
|
-
// Consecutive tool calls read as one action; keep them tight.
|
|
29
|
-
if (prev.kind === 'tool' && next.kind === 'tool')
|
|
30
|
-
return 0;
|
|
31
|
-
if (next.kind === 'user')
|
|
32
|
-
return 1;
|
|
33
|
-
return 0;
|
|
34
|
-
}
|
package/dist/ui/display-tab.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TAB expansion that agrees with the TERMINAL, not with UTF-16 (fix A'-2 of
|
|
3
|
-
* paste-control-sequence-residue).
|
|
4
|
-
*
|
|
5
|
-
* WHY THIS IS A MODULE OF ITS OWN. A TAB has no width; it advances the pen to
|
|
6
|
-
* the next tab stop, so what it occupies depends on where the line currently
|
|
7
|
-
* is. That makes "one TAB" a property of a CURSOR, and the same character was
|
|
8
|
-
* being read three different ways in this package:
|
|
9
|
-
*
|
|
10
|
-
* - `ui/editor-navigation.ts` painted it at FOUR-column stops in the composer,
|
|
11
|
-
* - `entries/UserEntry.tsx` handed the raw byte to `<Text>`, so the terminal
|
|
12
|
-
* painted it at EIGHT-column stops in the transcript,
|
|
13
|
-
* - `tools/terminal-output.ts` expanded it by UTF-16 code-unit count, so a
|
|
14
|
-
* pasted `中文<TAB>X` table came out two columns short.
|
|
15
|
-
*
|
|
16
|
-
* A user who pastes a TAB-indented block or an Excel/Word table therefore saw
|
|
17
|
-
* the draft and the sent message disagree about their own text. One function,
|
|
18
|
-
* used by the composer AND by every renderer of stored text, is what makes the
|
|
19
|
-
* "before send" and "after send" rows character-identical.
|
|
20
|
-
*
|
|
21
|
-
* `input/` is the wrong home for it: `cli/input` may depend on `node:stream`
|
|
22
|
-
* and nothing else (`.claude-index/index.md`), and column arithmetic needs the
|
|
23
|
-
* width table. `ui/` already owns that (`selection/selection.ts` uses
|
|
24
|
-
* `string-width` for exactly this reason).
|
|
25
|
-
*
|
|
26
|
-
* Pure, React-free, Ink-free.
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Tab stop width, matching every terminal's default.
|
|
30
|
-
*
|
|
31
|
-
* A COPY OF `tools/terminal-output.ts`'s number, on purpose and in the same
|
|
32
|
-
* shape `composer-limits.ts` copies `budget.ts::HINT_MIN_ROWS`: importing the
|
|
33
|
-
* tools module here would point an arrow from `ui/` into `tools/` for one
|
|
34
|
-
* integer, and the two are asserted equal by a test instead. (`tools/` keeps
|
|
35
|
-
* its own expander because its rows are clipped to 200 columns before anyone
|
|
36
|
-
* looks at them, so a code-unit approximation there cannot reach a user.)
|
|
37
|
-
*/
|
|
38
|
-
export declare const TAB_WIDTH = 8;
|
|
39
|
-
/**
|
|
40
|
-
* Expand every TAB in `text` to spaces up to the next `TAB_WIDTH` stop, given
|
|
41
|
-
* the display column the first character will be painted at.
|
|
42
|
-
*
|
|
43
|
-
* `fromColumn` is a DISPLAY column, not an offset: a caller that has already
|
|
44
|
-
* painted `中文` must pass 4. Lines are independent -- a `\n` resets the column
|
|
45
|
-
* to zero, because the terminal's pen returns to column 0.
|
|
46
|
-
*
|
|
47
|
-
* Non-ASCII text is measured with `string-width`, which is the whole point: a
|
|
48
|
-
* CJK glyph occupies two cells, and counting it as one space is what left
|
|
49
|
-
* CJK-plus-TAB tables misaligned.
|
|
50
|
-
*/
|
|
51
|
-
export declare function expandTabs(text: string, fromColumn?: number): string;
|
package/dist/ui/display-tab.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TAB expansion that agrees with the TERMINAL, not with UTF-16 (fix A'-2 of
|
|
3
|
-
* paste-control-sequence-residue).
|
|
4
|
-
*
|
|
5
|
-
* WHY THIS IS A MODULE OF ITS OWN. A TAB has no width; it advances the pen to
|
|
6
|
-
* the next tab stop, so what it occupies depends on where the line currently
|
|
7
|
-
* is. That makes "one TAB" a property of a CURSOR, and the same character was
|
|
8
|
-
* being read three different ways in this package:
|
|
9
|
-
*
|
|
10
|
-
* - `ui/editor-navigation.ts` painted it at FOUR-column stops in the composer,
|
|
11
|
-
* - `entries/UserEntry.tsx` handed the raw byte to `<Text>`, so the terminal
|
|
12
|
-
* painted it at EIGHT-column stops in the transcript,
|
|
13
|
-
* - `tools/terminal-output.ts` expanded it by UTF-16 code-unit count, so a
|
|
14
|
-
* pasted `中文<TAB>X` table came out two columns short.
|
|
15
|
-
*
|
|
16
|
-
* A user who pastes a TAB-indented block or an Excel/Word table therefore saw
|
|
17
|
-
* the draft and the sent message disagree about their own text. One function,
|
|
18
|
-
* used by the composer AND by every renderer of stored text, is what makes the
|
|
19
|
-
* "before send" and "after send" rows character-identical.
|
|
20
|
-
*
|
|
21
|
-
* `input/` is the wrong home for it: `cli/input` may depend on `node:stream`
|
|
22
|
-
* and nothing else (`.claude-index/index.md`), and column arithmetic needs the
|
|
23
|
-
* width table. `ui/` already owns that (`selection/selection.ts` uses
|
|
24
|
-
* `string-width` for exactly this reason).
|
|
25
|
-
*
|
|
26
|
-
* Pure, React-free, Ink-free.
|
|
27
|
-
*/
|
|
28
|
-
import stringWidth from 'string-width';
|
|
29
|
-
/**
|
|
30
|
-
* Tab stop width, matching every terminal's default.
|
|
31
|
-
*
|
|
32
|
-
* A COPY OF `tools/terminal-output.ts`'s number, on purpose and in the same
|
|
33
|
-
* shape `composer-limits.ts` copies `budget.ts::HINT_MIN_ROWS`: importing the
|
|
34
|
-
* tools module here would point an arrow from `ui/` into `tools/` for one
|
|
35
|
-
* integer, and the two are asserted equal by a test instead. (`tools/` keeps
|
|
36
|
-
* its own expander because its rows are clipped to 200 columns before anyone
|
|
37
|
-
* looks at them, so a code-unit approximation there cannot reach a user.)
|
|
38
|
-
*/
|
|
39
|
-
export const TAB_WIDTH = 8;
|
|
40
|
-
/**
|
|
41
|
-
* Expand every TAB in `text` to spaces up to the next `TAB_WIDTH` stop, given
|
|
42
|
-
* the display column the first character will be painted at.
|
|
43
|
-
*
|
|
44
|
-
* `fromColumn` is a DISPLAY column, not an offset: a caller that has already
|
|
45
|
-
* painted `中文` must pass 4. Lines are independent -- a `\n` resets the column
|
|
46
|
-
* to zero, because the terminal's pen returns to column 0.
|
|
47
|
-
*
|
|
48
|
-
* Non-ASCII text is measured with `string-width`, which is the whole point: a
|
|
49
|
-
* CJK glyph occupies two cells, and counting it as one space is what left
|
|
50
|
-
* CJK-plus-TAB tables misaligned.
|
|
51
|
-
*/
|
|
52
|
-
export function expandTabs(text, fromColumn = 0) {
|
|
53
|
-
if (text.indexOf('\t') === -1)
|
|
54
|
-
return text;
|
|
55
|
-
let out = '';
|
|
56
|
-
let column = Math.max(0, Math.floor(fromColumn));
|
|
57
|
-
let run = '';
|
|
58
|
-
for (const part of graphemesOf(text)) {
|
|
59
|
-
if (part === '\t') {
|
|
60
|
-
out += run;
|
|
61
|
-
run = '';
|
|
62
|
-
const width = TAB_WIDTH - (column % TAB_WIDTH);
|
|
63
|
-
out += ' '.repeat(width);
|
|
64
|
-
column += width;
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
run += part;
|
|
68
|
-
if (part === '\n')
|
|
69
|
-
column = 0;
|
|
70
|
-
else
|
|
71
|
-
column += stringWidth(part);
|
|
72
|
-
}
|
|
73
|
-
return out + run;
|
|
74
|
-
}
|
|
75
|
-
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
76
|
-
/**
|
|
77
|
-
* Grapheme clusters rather than code units, so a combining mark or an emoji ZWJ
|
|
78
|
-
* sequence advances the column once, exactly as the terminal draws it.
|
|
79
|
-
*/
|
|
80
|
-
function graphemesOf(text) {
|
|
81
|
-
return Array.from(segmenter.segment(text), ({ segment }) => segment);
|
|
82
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
export interface EditorGrapheme {
|
|
2
|
-
readonly text: string;
|
|
3
|
-
readonly index: number;
|
|
4
|
-
readonly end: number;
|
|
5
|
-
}
|
|
6
|
-
/** Segment text without changing its UTF-16 offsets or stored whitespace. */
|
|
7
|
-
export declare function graphemes(text: string): EditorGrapheme[];
|
|
8
|
-
/** Snap an arbitrary UTF-16 offset to a complete grapheme boundary. */
|
|
9
|
-
export declare function snapGrapheme(text: string, cursor: number, right?: boolean): number;
|
|
10
|
-
/** Move one complete grapheme, leaving the two buffer edges unchanged. */
|
|
11
|
-
export declare function stepGrapheme(text: string, cursor: number, direction: 'left' | 'right'): number;
|
|
12
|
-
/** Width of one grapheme (ASCII avoids the Unicode width-table lookup). */
|
|
13
|
-
export declare function graphemeWidth(text: string): number;
|
|
14
|
-
export interface VisualCell extends EditorGrapheme {
|
|
15
|
-
readonly column: number;
|
|
16
|
-
readonly width: number;
|
|
17
|
-
}
|
|
18
|
-
export interface VisualPosition {
|
|
19
|
-
readonly index: number;
|
|
20
|
-
readonly row: number;
|
|
21
|
-
readonly column: number;
|
|
22
|
-
}
|
|
23
|
-
export interface EditorVisualMap {
|
|
24
|
-
readonly rows: VisualCell[][];
|
|
25
|
-
readonly positions: VisualPosition[];
|
|
26
|
-
readonly cursor: VisualPosition;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Map graphemes to hard-wrapped rows, sharing tab stops and caret reservation.
|
|
30
|
-
*
|
|
31
|
-
* THE TAB STOP IS THE TERMINAL'S (`TAB_WIDTH`), NOT AN EDITOR-SIZED FOUR. It
|
|
32
|
-
* used to be four, while the transcript handed the raw `\t` to `<Text>` and
|
|
33
|
-
* the terminal painted it at eight: the same pasted table sat one column off
|
|
34
|
-
* from itself before and after sending. A tab that would cross the right edge
|
|
35
|
-
* is still clipped to the row (the caret cannot point past the last cell), so
|
|
36
|
-
* a tab STRADDLING the wrap is the one shape where the draft and the stored
|
|
37
|
-
* text can differ by the remainder of the advance.
|
|
38
|
-
*/
|
|
39
|
-
export declare function buildEditorVisualMap(input: {
|
|
40
|
-
buffer: string;
|
|
41
|
-
cols: number;
|
|
42
|
-
cursor: number;
|
|
43
|
-
active?: boolean;
|
|
44
|
-
}): EditorVisualMap;
|
|
45
|
-
/** Move to the closest boundary at or left of the preferred display column. */
|
|
46
|
-
export declare function moveVisualCursor(input: {
|
|
47
|
-
buffer: string;
|
|
48
|
-
cursor: number;
|
|
49
|
-
cols: number;
|
|
50
|
-
direction: 'up' | 'down';
|
|
51
|
-
preferredVisualColumn?: number;
|
|
52
|
-
}): {
|
|
53
|
-
cursor: number;
|
|
54
|
-
preferredVisualColumn: number;
|
|
55
|
-
} | null;
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/** Shared UTF-16 grapheme boundaries and terminal-cell layout for the editor. */
|
|
2
|
-
import stringWidth from 'string-width';
|
|
3
|
-
import { TAB_WIDTH } from './display-tab.js';
|
|
4
|
-
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
5
|
-
/** Segment text without changing its UTF-16 offsets or stored whitespace. */
|
|
6
|
-
export function graphemes(text) {
|
|
7
|
-
return Array.from(segmenter.segment(text), ({ segment, index }) => ({
|
|
8
|
-
text: segment, index, end: index + segment.length,
|
|
9
|
-
}));
|
|
10
|
-
}
|
|
11
|
-
/** Snap an arbitrary UTF-16 offset to a complete grapheme boundary. */
|
|
12
|
-
export function snapGrapheme(text, cursor, right = false) {
|
|
13
|
-
const clamped = Math.max(0, Math.min(text.length, cursor));
|
|
14
|
-
for (const part of segmenter.segment(text)) {
|
|
15
|
-
const end = part.index + part.segment.length;
|
|
16
|
-
if (clamped > part.index && clamped < end)
|
|
17
|
-
return right ? end : part.index;
|
|
18
|
-
if (part.index >= clamped)
|
|
19
|
-
break;
|
|
20
|
-
}
|
|
21
|
-
return clamped;
|
|
22
|
-
}
|
|
23
|
-
/** Move one complete grapheme, leaving the two buffer edges unchanged. */
|
|
24
|
-
export function stepGrapheme(text, cursor, direction) {
|
|
25
|
-
if (direction === 'left')
|
|
26
|
-
return snapGrapheme(text, Math.max(0, cursor - 1));
|
|
27
|
-
return snapGrapheme(text, Math.min(text.length, cursor + 1), true);
|
|
28
|
-
}
|
|
29
|
-
/** Width of one grapheme (ASCII avoids the Unicode width-table lookup). */
|
|
30
|
-
export function graphemeWidth(text) {
|
|
31
|
-
if (text.length === 1 && text >= ' ' && text <= '~')
|
|
32
|
-
return 1;
|
|
33
|
-
return stringWidth(text);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Map graphemes to hard-wrapped rows, sharing tab stops and caret reservation.
|
|
37
|
-
*
|
|
38
|
-
* THE TAB STOP IS THE TERMINAL'S (`TAB_WIDTH`), NOT AN EDITOR-SIZED FOUR. It
|
|
39
|
-
* used to be four, while the transcript handed the raw `\t` to `<Text>` and
|
|
40
|
-
* the terminal painted it at eight: the same pasted table sat one column off
|
|
41
|
-
* from itself before and after sending. A tab that would cross the right edge
|
|
42
|
-
* is still clipped to the row (the caret cannot point past the last cell), so
|
|
43
|
-
* a tab STRADDLING the wrap is the one shape where the draft and the stored
|
|
44
|
-
* text can differ by the remainder of the advance.
|
|
45
|
-
*/
|
|
46
|
-
export function buildEditorVisualMap(input) {
|
|
47
|
-
const cols = Math.max(1, Math.floor(input.cols));
|
|
48
|
-
const cursor = snapGrapheme(input.buffer, input.cursor);
|
|
49
|
-
const rows = [[]];
|
|
50
|
-
const positions = [];
|
|
51
|
-
let column = 0;
|
|
52
|
-
const breakRow = () => { rows.push([]); column = 0; };
|
|
53
|
-
const locate = (index) => {
|
|
54
|
-
positions.push({ index, row: rows.length - 1, column });
|
|
55
|
-
};
|
|
56
|
-
for (const part of graphemes(input.buffer)) {
|
|
57
|
-
if (part.text === '\n') {
|
|
58
|
-
if (input.active !== false && part.index === cursor && column >= cols)
|
|
59
|
-
breakRow();
|
|
60
|
-
locate(part.index);
|
|
61
|
-
breakRow();
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
let width = part.text === '\t' ? Math.min(cols, TAB_WIDTH - column % TAB_WIDTH)
|
|
65
|
-
: graphemeWidth(part.text);
|
|
66
|
-
if (column > 0 && column + width > cols) {
|
|
67
|
-
breakRow();
|
|
68
|
-
if (part.text === '\t')
|
|
69
|
-
width = Math.min(cols, TAB_WIDTH);
|
|
70
|
-
}
|
|
71
|
-
locate(part.index);
|
|
72
|
-
rows[rows.length - 1].push({ ...part,
|
|
73
|
-
text: part.text === '\t' ? ' '.repeat(width) : part.text, column, width });
|
|
74
|
-
column += width;
|
|
75
|
-
}
|
|
76
|
-
if (input.active !== false && cursor === input.buffer.length && column >= cols)
|
|
77
|
-
breakRow();
|
|
78
|
-
locate(input.buffer.length);
|
|
79
|
-
const caret = positions.find((position) => position.index === cursor);
|
|
80
|
-
return { rows, positions, cursor: caret };
|
|
81
|
-
}
|
|
82
|
-
/** Move to the closest boundary at or left of the preferred display column. */
|
|
83
|
-
export function moveVisualCursor(input) {
|
|
84
|
-
const map = buildEditorVisualMap(input);
|
|
85
|
-
const row = map.cursor.row + (input.direction === 'up' ? -1 : 1);
|
|
86
|
-
if (row < 0 || row >= map.rows.length)
|
|
87
|
-
return null;
|
|
88
|
-
const preferredVisualColumn = input.preferredVisualColumn ?? map.cursor.column;
|
|
89
|
-
const candidates = map.positions.filter((position) => position.row === row);
|
|
90
|
-
let target = candidates[0];
|
|
91
|
-
for (const position of candidates) {
|
|
92
|
-
if (position.column <= preferredVisualColumn)
|
|
93
|
-
target = position;
|
|
94
|
-
}
|
|
95
|
-
return target ? { cursor: target.index, preferredVisualColumn } : null;
|
|
96
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composer editor state — F3 of tui-input-flicker-fix (§3.4).
|
|
3
|
-
*
|
|
4
|
-
* Ink creates its container with tag `0` — a LEGACY React root
|
|
5
|
-
* (`ink/build/ink.js:59-61`). In a legacy root, `setState` called outside a
|
|
6
|
-
* React event handler is NOT batched: each call schedules and immediately
|
|
7
|
-
* flushes a synchronous render. `useInput`'s callback runs from a stdin
|
|
8
|
-
* `'data'` listener, which is outside React entirely, so `PromptInput.insert`'s
|
|
9
|
-
* five `setState` calls became five commits, five whole-tree Yoga layouts, and
|
|
10
|
-
* — through Ink's 32 ms leading+trailing throttle — TWO full-frame repaints per
|
|
11
|
-
* printable character (§2 R3). The flicker got worse the faster the user typed,
|
|
12
|
-
* which is exactly what the report described.
|
|
13
|
-
*
|
|
14
|
-
* Collapsing the five always-together pieces of state into one reducer makes a
|
|
15
|
-
* keystroke cost one commit. `fileMatches` deliberately stays a separate
|
|
16
|
-
* `useState` in the component: it is written from the debounced async glob
|
|
17
|
-
* effect, not from the key handler, so folding it in here would couple two
|
|
18
|
-
* unrelated update sources.
|
|
19
|
-
*
|
|
20
|
-
* THE RULE A REVIEWER SHOULD CHECK LINE BY LINE: every branch of the `useInput`
|
|
21
|
-
* callback performs at most ONE `dispatch` and then returns.
|
|
22
|
-
*
|
|
23
|
-
* Extracted from the component so it is unit-testable without mounting Ink.
|
|
24
|
-
*/
|
|
25
|
-
import { type PasteRecord } from './paste-tokens.js';
|
|
26
|
-
export interface EditorState {
|
|
27
|
-
buffer: string;
|
|
28
|
-
cursor: number;
|
|
29
|
-
preferredVisualColumn?: number;
|
|
30
|
-
historyIndex: number | null;
|
|
31
|
-
dismissed: boolean;
|
|
32
|
-
sel: number;
|
|
33
|
-
/**
|
|
34
|
-
* Payloads for the collapse tokens currently in `buffer`
|
|
35
|
-
* (tui-paste-handling section 5.3).
|
|
36
|
-
*
|
|
37
|
-
* Pruned to `referencedIds(buffer)` on EVERY buffer-changing action and
|
|
38
|
-
* emptied by `clear` (I-7). Without both, a payload outlives the draft that
|
|
39
|
-
* referenced it, unbounded, for the whole session.
|
|
40
|
-
*/
|
|
41
|
-
pastes: ReadonlyMap<number, PasteRecord>;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* One run of an `input` chunk that mixed typing and pasting.
|
|
45
|
-
*
|
|
46
|
-
* THE `id` IS ALLOCATED BY THE CALLER (P1-5). React may run a reducer more than
|
|
47
|
-
* once for a single action -- eager evaluation in `dispatchSetState`, base-queue
|
|
48
|
-
* replay after a bailout, StrictMode -- so a counter read and written inside one
|
|
49
|
-
* would skip ids and produce two computed states differing in the token TEXT.
|
|
50
|
-
* `PromptInput` calls `allocatePasteId()` while building these segments, and the
|
|
51
|
-
* reducer stays a pure function of `(state, action)`.
|
|
52
|
-
*/
|
|
53
|
-
export type InputSegment = {
|
|
54
|
-
readonly kind: 'text';
|
|
55
|
-
readonly text: string;
|
|
56
|
-
} | {
|
|
57
|
-
readonly kind: 'paste';
|
|
58
|
-
readonly text: string;
|
|
59
|
-
readonly id: number;
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* A `type` and not an `interface` because it is a discriminated union — the one
|
|
63
|
-
* documented exception to this package's interface-first convention.
|
|
64
|
-
*/
|
|
65
|
-
export type EditorAction = {
|
|
66
|
-
type: 'insert';
|
|
67
|
-
text: string;
|
|
68
|
-
} | {
|
|
69
|
-
type: 'replace';
|
|
70
|
-
buffer: string;
|
|
71
|
-
cursor: number;
|
|
72
|
-
} | {
|
|
73
|
-
type: 'backspace';
|
|
74
|
-
} | {
|
|
75
|
-
type: 'delete';
|
|
76
|
-
} | {
|
|
77
|
-
type: 'moveCursor';
|
|
78
|
-
cursor: number;
|
|
79
|
-
preferredVisualColumn?: number;
|
|
80
|
-
} | {
|
|
81
|
-
type: 'recall';
|
|
82
|
-
buffer: string;
|
|
83
|
-
cursor: number;
|
|
84
|
-
historyIndex: number | null;
|
|
85
|
-
} | {
|
|
86
|
-
type: 'select';
|
|
87
|
-
sel: number;
|
|
88
|
-
} | {
|
|
89
|
-
type: 'dismiss';
|
|
90
|
-
} | {
|
|
91
|
-
type: 'clear';
|
|
92
|
-
}
|
|
93
|
-
/** Only local reducer-planned states may be adopted; prune token payloads again. */
|
|
94
|
-
| {
|
|
95
|
-
type: 'adopt';
|
|
96
|
-
state: EditorState;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* ONE chunk of stdin, already split into ordered runs. The only new action,
|
|
100
|
-
* and it is what keeps the one-dispatch-per-key rule true for a chunk that
|
|
101
|
-
* carried both a paste and the keystrokes beside it.
|
|
102
|
-
*/
|
|
103
|
-
| {
|
|
104
|
-
type: 'input';
|
|
105
|
-
segments: InputSegment[];
|
|
106
|
-
};
|
|
107
|
-
export declare const INITIAL_EDITOR_STATE: EditorState;
|
|
108
|
-
export declare function editorReducer(state: EditorState, action: EditorAction): EditorState;
|