@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/PromptInput.js
DELETED
|
@@ -1,689 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* PromptInput (spec §3.6 / §3.10) — a controlled multiline input on Ink's
|
|
4
|
-
* `useInput` with: full line editing (Home/End, word jump/delete, kill-line via
|
|
5
|
-
* `input/keymap`), multi-line vertical cursor navigation, prompt-history recall
|
|
6
|
-
* at the edges, a slash-command palette, and `@file` path completion.
|
|
7
|
-
*
|
|
8
|
-
* The buffer/cursor transforms (`applyEdit`, `moveVertical`) and the suggestion
|
|
9
|
-
* computations (`slashSuggestions`, `fileTokenAt`) are pure module functions,
|
|
10
|
-
* exported for `input.test.ts`, so the component itself stays thin.
|
|
11
|
-
*
|
|
12
|
-
* THE EDITOR'S FIVE PIECES OF STATE LIVE IN ONE REDUCER, and every branch of the
|
|
13
|
-
* input handler performs AT MOST ONE `dispatch` (tui-input-flicker-fix §3.4).
|
|
14
|
-
* Ink mounts a LEGACY React root, where `setState` outside a React event handler
|
|
15
|
-
* is not batched — and `useInput` runs from a stdin `'data'` listener, which is
|
|
16
|
-
* outside React entirely. The five `setState` calls one keystroke used to make
|
|
17
|
-
* were five commits, five whole-tree Yoga layouts and, through Ink's 32 ms
|
|
18
|
-
* leading+trailing throttle, two full-frame repaints per character. `fileMatches`
|
|
19
|
-
* stays a plain `useState` because it is written from the debounced glob effect
|
|
20
|
-
* rather than from a key.
|
|
21
|
-
*/
|
|
22
|
-
import { useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from 'react';
|
|
23
|
-
import { Box, Text, useInput, useStdout } from 'ink';
|
|
24
|
-
import { popupCapacity } from './layout/budget.js';
|
|
25
|
-
import { glob as tinyGlob } from 'tinyglobby';
|
|
26
|
-
import { pickGlyphs } from './glyphs.js';
|
|
27
|
-
import { PromptCaret } from './PromptCaret.js';
|
|
28
|
-
import { recognize } from '../input/keymap.js';
|
|
29
|
-
import { AutocompletePopup } from './AutocompletePopup.js';
|
|
30
|
-
import { buildAutocompleteLayout } from './layout/autocomplete.js';
|
|
31
|
-
import { editorReducer, INITIAL_EDITOR_STATE, } from './editor-reducer.js';
|
|
32
|
-
import { hasPasteFrame } from './paste-frames.js';
|
|
33
|
-
import { hasEnterFrame, splitEnterFrames, } from './enter-frames.js';
|
|
34
|
-
import { planComposerInput } from './composer-input.js';
|
|
35
|
-
import { allocatePasteId, expandPastes, expandRangeOverTokens } from './paste-tokens.js';
|
|
36
|
-
import { draftMaxRows } from './composer-limits.js';
|
|
37
|
-
import { layoutComposer, splitRowAtColumn } from './composer-rows.js';
|
|
38
|
-
import { moveVisualCursor, snapGrapheme, stepGrapheme } from './editor-navigation.js';
|
|
39
|
-
import { interactionCopy } from './interaction-copy.js';
|
|
40
|
-
import { INDEX_KEY_FRAME, PASTE_DRAFT_MAX_BYTES, PASTE_MAX_BLOCKS, formatPasteSize, } from '../input/limits.js';
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
// The scroll chip (§4.2)
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
/** Below this the full sentence does not fit beside a draft; the chip goes terse. */
|
|
45
|
-
const CHIP_FULL_MIN_COLS = 64;
|
|
46
|
-
/**
|
|
47
|
-
* Ceiling on the number the chip prints, so `chipCells` is a CONSTANT per branch
|
|
48
|
-
* rather than a function of how far behind the user is (P2-4). Past it the chip
|
|
49
|
-
* reads `999+`.
|
|
50
|
-
*/
|
|
51
|
-
const CHIP_MAX_N = 999;
|
|
52
|
-
/** `↓ 999+ lines below · PgDn` — the widest form the full branch can produce. */
|
|
53
|
-
const CHIP_FULL_CELLS = 27;
|
|
54
|
-
/** `↓999+` — the widest form the terse branch can produce. */
|
|
55
|
-
const CHIP_TERSE_CELLS = 6;
|
|
56
|
-
/**
|
|
57
|
-
* Build the chip, or `null` when the viewport is pinned to the newest output.
|
|
58
|
-
*
|
|
59
|
-
* Every glyph comes from `pickGlyphs` and none from a literal (I-5): on a legacy
|
|
60
|
-
* console this renders `v12` rather than mojibake, and `glyphs.test.ts`'s static
|
|
61
|
-
* scan fails the build if that rule is broken here.
|
|
62
|
-
*/
|
|
63
|
-
export function scrollChip(scrolledLines, cols, glyphs) {
|
|
64
|
-
if (!Number.isFinite(scrolledLines) || scrolledLines <= 0)
|
|
65
|
-
return null;
|
|
66
|
-
const n = Math.floor(scrolledLines);
|
|
67
|
-
const shown = n > CHIP_MAX_N ? `${CHIP_MAX_N}+` : String(n);
|
|
68
|
-
if (cols < CHIP_FULL_MIN_COLS) {
|
|
69
|
-
return { text: `${glyphs.arrowDown}${shown}`, cells: CHIP_TERSE_CELLS };
|
|
70
|
-
}
|
|
71
|
-
const noun = n === 1 ? 'line' : 'lines';
|
|
72
|
-
return {
|
|
73
|
-
text: `${glyphs.arrowDown} ${shown} ${noun} below ${glyphs.midDot} PgDn`,
|
|
74
|
-
cells: CHIP_FULL_CELLS,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// The draft overflow indicator (section 5.5)
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
/** `^3 v7` at its widest, so the cell is a CONSTANT (the P2-4 discipline). */
|
|
81
|
-
const OVERFLOW_CELLS = 12;
|
|
82
|
-
const OVERFLOW_MAX_N = 999;
|
|
83
|
-
/**
|
|
84
|
-
* Build the "there is more draft above / below this window" indicator, or `null`
|
|
85
|
-
* when the whole draft is on screen.
|
|
86
|
-
*
|
|
87
|
-
* Every glyph comes from `pickGlyphs` and none from a literal (I-5): on a legacy
|
|
88
|
-
* console this renders `^3 v7` rather than mojibake, and `glyphs.test.ts`'s
|
|
89
|
-
* static scan fails the build if that rule is broken here.
|
|
90
|
-
*/
|
|
91
|
-
export function overflowChip(hiddenAbove, hiddenBelow, glyphs) {
|
|
92
|
-
if (hiddenAbove <= 0 && hiddenBelow <= 0)
|
|
93
|
-
return null;
|
|
94
|
-
const show = (n) => (n > OVERFLOW_MAX_N ? `${OVERFLOW_MAX_N}+` : String(n));
|
|
95
|
-
const parts = [];
|
|
96
|
-
if (hiddenAbove > 0)
|
|
97
|
-
parts.push(`${glyphs.arrowUp}${show(hiddenAbove)}`);
|
|
98
|
-
if (hiddenBelow > 0)
|
|
99
|
-
parts.push(`${glyphs.arrowDown}${show(hiddenBelow)}`);
|
|
100
|
-
return { text: parts.join(' '), cells: OVERFLOW_CELLS };
|
|
101
|
-
}
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
// Draft-level paste limits (section 5.3, the P1-4 enforcement point)
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
/**
|
|
106
|
-
* Would these segments push the draft past a limit? Returns the refusal text, or
|
|
107
|
-
* `null` when the paste is allowed.
|
|
108
|
-
*
|
|
109
|
-
* Checked BEFORE `dispatch`, so a refusal dispatches nothing at all and the draft
|
|
110
|
-
* is left byte-for-byte unchanged (AC-9). The one-dispatch-per-key rule is
|
|
111
|
-
* unaffected for the same reason.
|
|
112
|
-
*/
|
|
113
|
-
export function draftLimitRefusal(segments, editor) {
|
|
114
|
-
let liveBytes = 0;
|
|
115
|
-
for (const record of editor.pastes.values())
|
|
116
|
-
liveBytes += Buffer.byteLength(record.text, 'utf8');
|
|
117
|
-
let blocks = editor.pastes.size;
|
|
118
|
-
for (const segment of segments) {
|
|
119
|
-
if (segment.kind !== 'paste')
|
|
120
|
-
continue;
|
|
121
|
-
liveBytes += Buffer.byteLength(segment.text, 'utf8');
|
|
122
|
-
blocks += 1;
|
|
123
|
-
}
|
|
124
|
-
if (blocks > PASTE_MAX_BLOCKS) {
|
|
125
|
-
return (`Too many pasted blocks in one message (limit is ${PASTE_MAX_BLOCKS}). ` +
|
|
126
|
-
'Nothing was inserted.');
|
|
127
|
-
}
|
|
128
|
-
if (liveBytes > PASTE_DRAFT_MAX_BYTES) {
|
|
129
|
-
return (`Pasted content in this message would reach ${formatPasteSize(liveBytes)}; ` +
|
|
130
|
-
`limit is ${formatPasteSize(PASTE_DRAFT_MAX_BYTES)}. Nothing was inserted.`);
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
// ---------------------------------------------------------------------------
|
|
135
|
-
// Pure editing helpers (unit-tested in input.test.ts)
|
|
136
|
-
// ---------------------------------------------------------------------------
|
|
137
|
-
const isSpace = (ch) => !!ch && /\s/.test(ch);
|
|
138
|
-
function lineStart(buffer, cursor) {
|
|
139
|
-
if (cursor <= 0)
|
|
140
|
-
return 0;
|
|
141
|
-
const nl = buffer.lastIndexOf('\n', cursor - 1);
|
|
142
|
-
return nl === -1 ? 0 : nl + 1;
|
|
143
|
-
}
|
|
144
|
-
function lineEnd(buffer, cursor) {
|
|
145
|
-
const nl = buffer.indexOf('\n', cursor);
|
|
146
|
-
return nl === -1 ? buffer.length : nl;
|
|
147
|
-
}
|
|
148
|
-
function prevWord(buffer, cursor) {
|
|
149
|
-
let i = cursor;
|
|
150
|
-
while (i > 0 && isSpace(buffer[i - 1]))
|
|
151
|
-
i -= 1;
|
|
152
|
-
while (i > 0 && !isSpace(buffer[i - 1]))
|
|
153
|
-
i -= 1;
|
|
154
|
-
return i;
|
|
155
|
-
}
|
|
156
|
-
function nextWord(buffer, cursor) {
|
|
157
|
-
let i = cursor;
|
|
158
|
-
while (i < buffer.length && isSpace(buffer[i]))
|
|
159
|
-
i += 1;
|
|
160
|
-
while (i < buffer.length && !isSpace(buffer[i]))
|
|
161
|
-
i += 1;
|
|
162
|
-
return i;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Delete `[from, to)`, first growing the range over any token it clips (G5 /
|
|
166
|
-
* D-8).
|
|
167
|
-
*
|
|
168
|
-
* A no-op growth on a buffer with no tokens, so every pre-existing assertion in
|
|
169
|
-
* `input.test.ts` holds byte-for-byte. With a token present it is what stops
|
|
170
|
-
* `Ctrl+W` / `Ctrl+U` / `Ctrl+K` leaving half a label behind — which would be a
|
|
171
|
-
* label the user then sends INSTEAD of the text it stands for.
|
|
172
|
-
*/
|
|
173
|
-
function killRange(buffer, from, to) {
|
|
174
|
-
const range = expandRangeOverTokens(buffer, snapGrapheme(buffer, from), snapGrapheme(buffer, to, true));
|
|
175
|
-
return { buffer: buffer.slice(0, range.from) + buffer.slice(range.to), cursor: range.from };
|
|
176
|
-
}
|
|
177
|
-
/** Apply an edit intent as a pure buffer/cursor transform. */
|
|
178
|
-
export function applyEdit(buffer, cursor, intent) {
|
|
179
|
-
cursor = snapGrapheme(buffer, cursor);
|
|
180
|
-
switch (intent) {
|
|
181
|
-
// Navigation may enter a token label; insertion and range deletion retain
|
|
182
|
-
// the existing token snapping and expansion contracts.
|
|
183
|
-
case 'home':
|
|
184
|
-
return { buffer, cursor: lineStart(buffer, cursor) };
|
|
185
|
-
case 'end':
|
|
186
|
-
return { buffer, cursor: lineEnd(buffer, cursor) };
|
|
187
|
-
case 'wordLeft':
|
|
188
|
-
return { buffer, cursor: snapGrapheme(buffer, prevWord(buffer, cursor)) };
|
|
189
|
-
case 'wordRight':
|
|
190
|
-
return { buffer, cursor: snapGrapheme(buffer, nextWord(buffer, cursor), true) };
|
|
191
|
-
case 'deleteWordBack':
|
|
192
|
-
return killRange(buffer, prevWord(buffer, cursor), cursor);
|
|
193
|
-
case 'killToStart':
|
|
194
|
-
return killRange(buffer, lineStart(buffer, cursor), cursor);
|
|
195
|
-
case 'killToEnd':
|
|
196
|
-
return killRange(buffer, cursor, lineEnd(buffer, cursor));
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Move the cursor up/down one line preserving the column. Returns `null` at the
|
|
201
|
-
* top/bottom edge (or for a single-line buffer) so the caller can fall back to
|
|
202
|
-
* prompt-history recall.
|
|
203
|
-
*/
|
|
204
|
-
export function moveVertical(buffer, cursor, dir) {
|
|
205
|
-
const moved = moveVisualCursor({ buffer, cursor, direction: dir, cols: Number.MAX_SAFE_INTEGER });
|
|
206
|
-
return moved ? { cursor: moved.cursor } : null;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Slash-command suggestions when the buffer is a bare `/word` (no space yet).
|
|
210
|
-
*
|
|
211
|
-
* The character class covers `-` and `:` as well as `\w` (D16). Skill names are
|
|
212
|
-
* kebab-case and the namespaced fallback is `/skill:<name>`; with the original
|
|
213
|
-
* `^\/(\w*)$` a user typing `/my-sk` got NO popup at all — not an error message,
|
|
214
|
-
* just silence, which reads as "that command does not exist".
|
|
215
|
-
*/
|
|
216
|
-
export function slashSuggestions(buffer, commands) {
|
|
217
|
-
const m = /^\/([\w:-]*)$/.exec(buffer);
|
|
218
|
-
if (!m)
|
|
219
|
-
return null;
|
|
220
|
-
const q = m[1].toLowerCase();
|
|
221
|
-
return commands
|
|
222
|
-
.filter((c) => c.name.toLowerCase().startsWith(q))
|
|
223
|
-
.map((c) => ({ label: `/${c.name}`, hint: c.description }));
|
|
224
|
-
}
|
|
225
|
-
/** The `@file` token under the cursor (`@` + non-space run), if any. */
|
|
226
|
-
export function fileTokenAt(buffer, cursor) {
|
|
227
|
-
let start = cursor;
|
|
228
|
-
while (start > 0 && !isSpace(buffer[start - 1]))
|
|
229
|
-
start -= 1;
|
|
230
|
-
if (buffer[start] !== '@')
|
|
231
|
-
return null;
|
|
232
|
-
let end = cursor;
|
|
233
|
-
while (end < buffer.length && !isSpace(buffer[end]))
|
|
234
|
-
end += 1;
|
|
235
|
-
return { start, end, query: buffer.slice(start + 1, end) };
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* How many `@file` candidates reach the popup.
|
|
239
|
-
*
|
|
240
|
-
* The popup has its own row budget; this is the list it windows. Twenty ranked
|
|
241
|
-
* paths are enough to spot the one you meant, and it bounds the array that every
|
|
242
|
-
* draft edit re-renders.
|
|
243
|
-
*/
|
|
244
|
-
const FILE_MATCH_LIMIT = 20;
|
|
245
|
-
/**
|
|
246
|
-
* Segments in a path - the first ranking key for an EMPTY `@` query (defect 10).
|
|
247
|
-
*
|
|
248
|
-
* A bare `@` matches every file in the tree, and `tinyGlob` returns them in
|
|
249
|
-
* whatever order the filesystem walked, so opening the popup without a rank gave
|
|
250
|
-
* a correct-but-arbitrary twenty. Shallowest first, then shortest, then
|
|
251
|
-
* alphabetical: the paths a user is reaching for (`src/`, a root config) come
|
|
252
|
-
* before `packages/cli/src/ui/layout/deep/thing.ts`.
|
|
253
|
-
*/
|
|
254
|
-
function pathDepth(path) {
|
|
255
|
-
let depth = 1;
|
|
256
|
-
for (const char of path) {
|
|
257
|
-
if (char === '/' || char === '\\')
|
|
258
|
-
depth += 1;
|
|
259
|
-
}
|
|
260
|
-
return depth;
|
|
261
|
-
}
|
|
262
|
-
/** A leading C0 control byte or ESC sequence should never be inserted raw. */
|
|
263
|
-
function isControlSeq(input) {
|
|
264
|
-
if (input.length === 0)
|
|
265
|
-
return true;
|
|
266
|
-
const code = input.charCodeAt(0);
|
|
267
|
-
return code < 0x20 || code === 0x7f;
|
|
268
|
-
}
|
|
269
|
-
// ---------------------------------------------------------------------------
|
|
270
|
-
// Component
|
|
271
|
-
// ---------------------------------------------------------------------------
|
|
272
|
-
export function PromptInput({ cols: colsProp, terminalRows: terminalRowsProp, statusExpanded = false, cursorVisible = true, onInteraction, isActive, running, history, commands, cwd, theme, caps, popupMaxRows, popupMaxHeight, onPopupRowsChange, onCompletionContextChange, deleteDisambiguated = false, agentMode, onSubmit, onHelp, onEscape, onEscapeDismiss, reducedMotion = false, borderColor, onDraftChange, draftClearNonce, draftFill, insertMode = 'insert', onNotice, }) {
|
|
273
|
-
const { stdout } = useStdout();
|
|
274
|
-
const [editor, dispatch] = useReducer(editorReducer, INITIAL_EDITOR_STATE);
|
|
275
|
-
const { buffer, cursor, historyIndex, dismissed, sel } = editor;
|
|
276
|
-
const [fileMatches, setFileMatches] = useState([]);
|
|
277
|
-
// --- Derived suggestion state (shared by render + input handler). --------
|
|
278
|
-
const slashSug = dismissed ? null : slashSuggestions(buffer, commands);
|
|
279
|
-
const fileTok = fileTokenAt(buffer, cursor);
|
|
280
|
-
const fileQuery = fileTok ? fileTok.query : null;
|
|
281
|
-
// A BARE `@` OPENS THE POPUP (defect 10). The `query.length >= 1` gate here and
|
|
282
|
-
// the `< 1` early return in the scan effect below were the whole reason a lone
|
|
283
|
-
// `@` showed nothing while `README.md` promises "@ opens a file-path completion
|
|
284
|
-
// popup". An empty query is a legitimate one: it lists the shallowest paths.
|
|
285
|
-
const fileActive = !dismissed && !!fileTok && fileMatches.length > 0;
|
|
286
|
-
const popupKind = slashSug && slashSug.length > 0 ? 'slash' : fileActive ? 'file' : null;
|
|
287
|
-
const popupItems = popupKind === 'slash'
|
|
288
|
-
? slashSug
|
|
289
|
-
: popupKind === 'file'
|
|
290
|
-
? fileMatches.map((p) => ({ label: p }))
|
|
291
|
-
: [];
|
|
292
|
-
const clampedSel = popupItems.length > 0 ? Math.min(sel, popupItems.length - 1) : 0;
|
|
293
|
-
// --- Debounced `@file` scan. ---------------------------------------------
|
|
294
|
-
useEffect(() => {
|
|
295
|
-
if (fileQuery === null) {
|
|
296
|
-
setFileMatches([]);
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
let cancelled = false;
|
|
300
|
-
const id = setTimeout(() => {
|
|
301
|
-
tinyGlob('**/*', {
|
|
302
|
-
cwd,
|
|
303
|
-
dot: false,
|
|
304
|
-
onlyFiles: true,
|
|
305
|
-
ignore: ['**/node_modules/**', '**/.git/**'],
|
|
306
|
-
})
|
|
307
|
-
.then((matches) => {
|
|
308
|
-
if (cancelled)
|
|
309
|
-
return;
|
|
310
|
-
const q = fileQuery.toLowerCase();
|
|
311
|
-
// RANKED, NOT WALK ORDER (defect 10). An empty query matches every path
|
|
312
|
-
// in the tree, so without a sort the popup for a bare `@` was
|
|
313
|
-
// correct-but-arbitrary - the first twenty the filesystem happened to
|
|
314
|
-
// hand back.
|
|
315
|
-
const ranked = matches
|
|
316
|
-
.filter((m) => m.toLowerCase().includes(q))
|
|
317
|
-
.sort((a, b) => pathDepth(a) - pathDepth(b)
|
|
318
|
-
|| a.length - b.length || (a < b ? -1 : a > b ? 1 : 0))
|
|
319
|
-
.slice(0, FILE_MATCH_LIMIT);
|
|
320
|
-
setFileMatches(ranked);
|
|
321
|
-
})
|
|
322
|
-
.catch(() => {
|
|
323
|
-
if (!cancelled)
|
|
324
|
-
setFileMatches([]);
|
|
325
|
-
});
|
|
326
|
-
}, 120);
|
|
327
|
-
return () => {
|
|
328
|
-
cancelled = true;
|
|
329
|
-
clearTimeout(id);
|
|
330
|
-
};
|
|
331
|
-
}, [fileQuery, cwd]);
|
|
332
|
-
// --- Layout (section 5.5). -----------------------------------------------
|
|
333
|
-
//
|
|
334
|
-
// COMPUTED HERE, ABOVE THE REPORTING EFFECT, because the number the effect
|
|
335
|
-
// sends upward has to be the number this component actually renders (I-8).
|
|
336
|
-
// Deriving it twice — once for the frame and once for the budget — is exactly
|
|
337
|
-
// the trap `BottomStatusRow.tsx:5-27` documents.
|
|
338
|
-
const glyphs = pickGlyphs(caps);
|
|
339
|
-
const cols = colsProp ?? stdout?.columns ?? 80;
|
|
340
|
-
const terminalRows = terminalRowsProp ?? stdout?.rows ?? 24;
|
|
341
|
-
// Err NARROW. Wrapping wider than the box Ink gives us would make Ink wrap a
|
|
342
|
-
// second time, and then `layout.rows.length` is a lie — which is the one thing
|
|
343
|
-
// this module may not be.
|
|
344
|
-
const chromeCols = 2 /* border */ + 2 /* paddingX */ + 2 /* marker */;
|
|
345
|
-
const baseCols = Math.max(8, cols - chromeCols);
|
|
346
|
-
const measure = (wrapCols) => layoutComposer({
|
|
347
|
-
buffer,
|
|
348
|
-
cursor,
|
|
349
|
-
cols: wrapCols,
|
|
350
|
-
maxRows: draftMaxRows(terminalRows),
|
|
351
|
-
// Scrolling may hide the caret, but must not change the measured draft.
|
|
352
|
-
// Otherwise visibility can toggle wrapping and feed back into scrolling.
|
|
353
|
-
active: isActive,
|
|
354
|
-
});
|
|
355
|
-
// TWO PASSES, AND THE SECOND ONE IS LOAD-BEARING (I-8). The overflow indicator
|
|
356
|
-
// rides the last rendered row INSIDE the box the draft wraps in, so its cells
|
|
357
|
-
// have to come out of the wrap width. Measured at the full width instead, a
|
|
358
|
-
// last row that fills the line is wrapped a SECOND time by Ink, and the
|
|
359
|
-
// composer then draws one row more than `layout.rows.length` — which is the
|
|
360
|
-
// number this component hands to `viewportRows`. That is defect C again, in
|
|
361
|
-
// precisely the situation this feature exists for: a draft too tall to show.
|
|
362
|
-
//
|
|
363
|
-
// It settles in two. Narrowing can only ADD rows, so a draft that overflowed
|
|
364
|
-
// the first pass still overflows the second, and a third pass would measure
|
|
365
|
-
// the same width as the second.
|
|
366
|
-
const wide = measure(baseCols);
|
|
367
|
-
const overflows = wide.hiddenAbove > 0 || wide.hiddenBelow > 0;
|
|
368
|
-
const usableCols = overflows ? Math.max(8, baseCols - OVERFLOW_CELLS - 1) : baseCols;
|
|
369
|
-
const layout = overflows ? measure(usableCols) : wide;
|
|
370
|
-
const preferredColumnWidth = useRef();
|
|
371
|
-
useLayoutEffect(() => { preferredColumnWidth.current = undefined; }, [usableCols]);
|
|
372
|
-
const draftRowCount = Math.max(1, layout.rows.length);
|
|
373
|
-
const menuCapacity = Math.min(popupMaxHeight ?? Infinity, popupCapacity(terminalRows, draftRowCount, statusExpanded));
|
|
374
|
-
const popupLayout = buildAutocompleteLayout({
|
|
375
|
-
itemCount: isActive ? popupItems.length : 0,
|
|
376
|
-
selected: clampedSel,
|
|
377
|
-
maxRows: popupMaxRows,
|
|
378
|
-
maxHeight: menuCapacity,
|
|
379
|
-
});
|
|
380
|
-
const popupVisible = isActive && popupLayout.rowCount > 0;
|
|
381
|
-
// Report on every mount, including zero. Cleanup belongs to a separate
|
|
382
|
-
// effect so changing height does not publish an intermediate zero budget.
|
|
383
|
-
useLayoutEffect(() => {
|
|
384
|
-
onPopupRowsChange?.(popupLayout.rowCount);
|
|
385
|
-
}, [onPopupRowsChange, popupLayout.rowCount]);
|
|
386
|
-
useLayoutEffect(() => () => onPopupRowsChange?.(0), [onPopupRowsChange]);
|
|
387
|
-
const completion = popupVisible ? popupKind ?? 'none' : 'none';
|
|
388
|
-
const completionCallback = useRef(onCompletionContextChange);
|
|
389
|
-
completionCallback.current = onCompletionContextChange;
|
|
390
|
-
const lastCompletion = useRef();
|
|
391
|
-
useLayoutEffect(() => {
|
|
392
|
-
if (!onCompletionContextChange || lastCompletion.current === completion)
|
|
393
|
-
return;
|
|
394
|
-
lastCompletion.current = completion;
|
|
395
|
-
onCompletionContextChange?.(completion);
|
|
396
|
-
}, [onCompletionContextChange, completion]);
|
|
397
|
-
useLayoutEffect(() => () => completionCallback.current?.('none'), []);
|
|
398
|
-
const caretResetKey = useMemo(() => ({}), [buffer, cursor, isActive, usableCols]);
|
|
399
|
-
// --- Draft presence and height, reported only on a transition. -----------
|
|
400
|
-
// Notifying on every keystroke would re-render the whole App tree per key. The
|
|
401
|
-
// row count changes on a line break or a wrap boundary, not per character
|
|
402
|
-
// (R-6), so widening this callback does not widen how often it fires.
|
|
403
|
-
const hasDraft = buffer.length > 0;
|
|
404
|
-
const lastReportedDraft = useRef(null);
|
|
405
|
-
useLayoutEffect(() => {
|
|
406
|
-
if (!onDraftChange)
|
|
407
|
-
return;
|
|
408
|
-
const last = lastReportedDraft.current;
|
|
409
|
-
if (last && last.hasDraft === hasDraft && last.rows === draftRowCount)
|
|
410
|
-
return;
|
|
411
|
-
lastReportedDraft.current = { hasDraft, rows: draftRowCount };
|
|
412
|
-
onDraftChange({ hasDraft, rows: draftRowCount });
|
|
413
|
-
}, [hasDraft, draftRowCount, onDraftChange]);
|
|
414
|
-
// --- App-requested draft clear (ctrl-c-clear-draft-exit). --------
|
|
415
|
-
// The NONCE, not the buffer, is the dependency: App cannot reach this
|
|
416
|
-
// reducer directly, and keying on content would miss back-to-back
|
|
417
|
-
// requests that land on the same (empty) buffer. `'clear'` is
|
|
418
|
-
// idempotent, so a StrictMode double-invoked effect is harmless.
|
|
419
|
-
useEffect(() => {
|
|
420
|
-
if (draftClearNonce === undefined || draftClearNonce <= 0)
|
|
421
|
-
return;
|
|
422
|
-
dispatch({ type: 'clear' });
|
|
423
|
-
}, [draftClearNonce]);
|
|
424
|
-
// --- Mutators. -----------------------------------------------------------
|
|
425
|
-
// ONE DISPATCH EACH, and that is the rule §3.4 asks a reviewer to check line
|
|
426
|
-
// by line. Two dispatches from one key would put the legacy root back to two
|
|
427
|
-
// commits and undo the whole of F3 for that branch.
|
|
428
|
-
const insert = (text) => {
|
|
429
|
-
onInteraction?.();
|
|
430
|
-
dispatch({ type: 'insert', text });
|
|
431
|
-
};
|
|
432
|
-
const resolveSubmit = (state) => {
|
|
433
|
-
const suggestions = state.dismissed ? null : slashSuggestions(state.buffer, commands);
|
|
434
|
-
const selectedIndex = Math.min(state.sel, (suggestions?.length ?? 0) - 1);
|
|
435
|
-
const suggestionLayout = buildAutocompleteLayout({
|
|
436
|
-
itemCount: isActive ? suggestions?.length ?? 0 : 0,
|
|
437
|
-
selected: selectedIndex, maxRows: popupMaxRows, maxHeight: menuCapacity,
|
|
438
|
-
});
|
|
439
|
-
const selected = suggestionLayout.rowCount > 0 ? suggestions?.[selectedIndex] : undefined;
|
|
440
|
-
const text = selected?.label ?? expandPastes(state.buffer, state.pastes);
|
|
441
|
-
return text.trim().length > 0 ? text : null;
|
|
442
|
-
};
|
|
443
|
-
const transact = (intents) => {
|
|
444
|
-
const plan = planComposerInput({
|
|
445
|
-
editor, intents, resolveSubmit, checkPasteLimit: draftLimitRefusal,
|
|
446
|
-
});
|
|
447
|
-
if (plan.refusal) {
|
|
448
|
-
onNotice?.('warn', plan.refusal);
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
onInteraction?.();
|
|
452
|
-
let result = { accepted: true };
|
|
453
|
-
if (plan.submission !== undefined) {
|
|
454
|
-
try {
|
|
455
|
-
result = onSubmit(plan.submission);
|
|
456
|
-
}
|
|
457
|
-
catch (error) {
|
|
458
|
-
result = { accepted: false, reason: error instanceof Error ? error.message : String(error) };
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
dispatch({ type: 'adopt', state: result.accepted ? plan.nextEditor : plan.rejectedEditor });
|
|
462
|
-
if (!result.accepted) {
|
|
463
|
-
onNotice?.('error', result.reason ?? 'Message was not accepted; input is kept in the draft.');
|
|
464
|
-
}
|
|
465
|
-
else if (plan.notice) {
|
|
466
|
-
onNotice?.('warn', plan.notice);
|
|
467
|
-
}
|
|
468
|
-
};
|
|
469
|
-
// --- App-requested fill (quick-prompt-library §4.6 / D-6). -----------------
|
|
470
|
-
//
|
|
471
|
-
// THE NONCE IS THE DEPENDENCY, NOT THE TEXT, for the reason the clear effect above
|
|
472
|
-
// records: two fills of the same prompt in a row must both apply, and keying on the
|
|
473
|
-
// payload would silently drop the second one. `transact` is deliberately absent from
|
|
474
|
-
// the dependency list - it closes over THIS render's `editor`, and depending on it
|
|
475
|
-
// would re-run (and re-fill) the effect on every keystroke.
|
|
476
|
-
const appliedFill = useRef(0);
|
|
477
|
-
useEffect(() => {
|
|
478
|
-
if (!draftFill || draftFill.nonce <= appliedFill.current)
|
|
479
|
-
return;
|
|
480
|
-
appliedFill.current = draftFill.nonce;
|
|
481
|
-
transact([{
|
|
482
|
-
kind: 'fill',
|
|
483
|
-
text: draftFill.text,
|
|
484
|
-
mode: insertMode,
|
|
485
|
-
submit: draftFill.submit === true,
|
|
486
|
-
}]);
|
|
487
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- see the note above
|
|
488
|
-
}, [draftFill, insertMode]);
|
|
489
|
-
const recallUp = () => {
|
|
490
|
-
if (history.length === 0)
|
|
491
|
-
return;
|
|
492
|
-
const idx = historyIndex === null ? history.length - 1 : Math.max(0, historyIndex - 1);
|
|
493
|
-
const value = history[idx] ?? '';
|
|
494
|
-
dispatch({ type: 'recall', buffer: value, cursor: value.length, historyIndex: idx });
|
|
495
|
-
};
|
|
496
|
-
const recallDown = () => {
|
|
497
|
-
if (historyIndex === null)
|
|
498
|
-
return;
|
|
499
|
-
const idx = historyIndex + 1;
|
|
500
|
-
// Past the newest entry the walk ends and the draft goes back to empty —
|
|
501
|
-
// `historyIndex: null` is what tells `verticalOrHistory` the user is editing
|
|
502
|
-
// again rather than still stepping.
|
|
503
|
-
if (idx >= history.length) {
|
|
504
|
-
dispatch({ type: 'recall', buffer: '', cursor: 0, historyIndex: null });
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
const value = history[idx] ?? '';
|
|
508
|
-
dispatch({ type: 'recall', buffer: value, cursor: value.length, historyIndex: idx });
|
|
509
|
-
};
|
|
510
|
-
const completeSelection = () => {
|
|
511
|
-
onInteraction?.();
|
|
512
|
-
const chosen = popupItems[clampedSel];
|
|
513
|
-
if (!chosen)
|
|
514
|
-
return;
|
|
515
|
-
if (popupKind === 'slash') {
|
|
516
|
-
const next = `${chosen.label} `;
|
|
517
|
-
dispatch({ type: 'replace', buffer: next, cursor: next.length });
|
|
518
|
-
}
|
|
519
|
-
else if (popupKind === 'file' && fileTok) {
|
|
520
|
-
const next = buffer.slice(0, fileTok.start) + chosen.label + buffer.slice(fileTok.end);
|
|
521
|
-
dispatch({ type: 'replace', buffer: next, cursor: fileTok.start + chosen.label.length });
|
|
522
|
-
}
|
|
523
|
-
};
|
|
524
|
-
const verticalOrHistory = (dir) => {
|
|
525
|
-
onInteraction?.();
|
|
526
|
-
const moved = moveVisualCursor({ buffer, cursor, cols: usableCols, direction: dir,
|
|
527
|
-
preferredVisualColumn: preferredColumnWidth.current === usableCols
|
|
528
|
-
? editor.preferredVisualColumn : undefined });
|
|
529
|
-
if (moved) {
|
|
530
|
-
preferredColumnWidth.current = usableCols;
|
|
531
|
-
dispatch({ type: 'moveCursor', ...moved });
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
// At an edge: recall history only from an empty buffer or while already
|
|
535
|
-
// stepping through it — never clobber an in-progress draft (see spec note).
|
|
536
|
-
if (buffer.length === 0 || historyIndex !== null) {
|
|
537
|
-
if (dir === 'up')
|
|
538
|
-
recallUp();
|
|
539
|
-
else
|
|
540
|
-
recallDown();
|
|
541
|
-
}
|
|
542
|
-
};
|
|
543
|
-
// --- Input handling. -----------------------------------------------------
|
|
544
|
-
useInput((input, key) => {
|
|
545
|
-
// FIRST STATEMENT, BEFORE THE POPUP BRANCH, AND IT HAS TO STAY THERE.
|
|
546
|
-
// `App` owns the Shift+Tab mode toggle. The popup branch below treats
|
|
547
|
-
// `key.tab` as "accept the highlighted completion", so without this guard
|
|
548
|
-
// pressing Shift+Tab with the `/` palette or an `@` file popup open would
|
|
549
|
-
// BOTH rewrite the user's draft and change the mode — a bug that only
|
|
550
|
-
// appears with a popup open and is therefore easy to ship (AC-P3 / R-P2).
|
|
551
|
-
if (key.tab && key.shift)
|
|
552
|
-
return;
|
|
553
|
-
if (key.pageUp || key.pageDown || (key.shift && (key.upArrow || key.downArrow)))
|
|
554
|
-
return;
|
|
555
|
-
if ((key.return || input === '\r') && (key.meta || key.shift)) {
|
|
556
|
-
insert('\n');
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
|
-
// App owns the Ctrl+I index frame (see input/limits.ts). Standalone it
|
|
560
|
-
// never reaches here - isControlSeq drops it at the printable-insert
|
|
561
|
-
// branch below - but a frame glued to typed text in one chunk must
|
|
562
|
-
// insert ONLY the text, so strip it before any other interpretation.
|
|
563
|
-
if (input.includes(INDEX_KEY_FRAME)) {
|
|
564
|
-
const rest = input.split(INDEX_KEY_FRAME).join('');
|
|
565
|
-
if (rest.length > 0)
|
|
566
|
-
insert(rest);
|
|
567
|
-
return;
|
|
568
|
-
}
|
|
569
|
-
if (hasPasteFrame(input) || hasEnterFrame(input) || /[\r\n]/.test(input)) {
|
|
570
|
-
const intents = splitEnterFrames(input).map((frame) => frame.kind === 'paste' ? { ...frame, id: allocatePasteId() } : frame);
|
|
571
|
-
if (intents.length > 0)
|
|
572
|
-
transact(intents);
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
// Popup navigation owns Up/Down/Tab/→/Enter/Esc while it is open.
|
|
576
|
-
if (popupVisible) {
|
|
577
|
-
if (key.upArrow) {
|
|
578
|
-
onInteraction?.();
|
|
579
|
-
dispatch({ type: 'select', sel: Math.max(0, clampedSel - 1) });
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
if (key.downArrow) {
|
|
583
|
-
onInteraction?.();
|
|
584
|
-
dispatch({ type: 'select', sel: Math.min(popupItems.length - 1, clampedSel + 1) });
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
if (key.tab || (key.rightArrow && cursor >= buffer.length)) {
|
|
588
|
-
completeSelection();
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
if (key.return && popupKind === 'slash') {
|
|
592
|
-
transact([{ kind: 'submit' }]);
|
|
593
|
-
return;
|
|
594
|
-
}
|
|
595
|
-
if (key.escape) {
|
|
596
|
-
dispatch({ type: 'dismiss' });
|
|
597
|
-
onEscapeDismiss?.();
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
// Any other key falls through so typing keeps filtering the popup.
|
|
601
|
-
}
|
|
602
|
-
if (key.escape) {
|
|
603
|
-
onEscape?.();
|
|
604
|
-
return;
|
|
605
|
-
}
|
|
606
|
-
// Line-editing intents (Home/End/word/kill) recognized from raw keys.
|
|
607
|
-
const intent = key.meta && (key.backspace || key.delete)
|
|
608
|
-
? 'deleteWordBack' : recognize(input, key);
|
|
609
|
-
if (intent) {
|
|
610
|
-
onInteraction?.();
|
|
611
|
-
const next = applyEdit(buffer, cursor, intent);
|
|
612
|
-
const moving = intent === 'home' || intent === 'end'
|
|
613
|
-
|| intent === 'wordLeft' || intent === 'wordRight';
|
|
614
|
-
dispatch(moving ? { type: 'moveCursor', cursor: next.cursor }
|
|
615
|
-
: { type: 'replace', buffer: next.buffer, cursor: next.cursor });
|
|
616
|
-
return;
|
|
617
|
-
}
|
|
618
|
-
if (key.ctrl)
|
|
619
|
-
return; // App owns Ctrl+C / L / T / O, and now Ctrl+K (the kit picker).
|
|
620
|
-
if (key.return) {
|
|
621
|
-
if (key.meta || key.shift) {
|
|
622
|
-
insert('\n');
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
if (buffer.trim().length === 0)
|
|
626
|
-
return;
|
|
627
|
-
transact([{ kind: 'submit' }]);
|
|
628
|
-
return;
|
|
629
|
-
}
|
|
630
|
-
if (key.backspace || key.delete) {
|
|
631
|
-
onInteraction?.();
|
|
632
|
-
// The `cursor > 0` guard lives in the reducer now, so this branch is one
|
|
633
|
-
// unconditional dispatch and a no-op at the left edge returns the same
|
|
634
|
-
// state object — which React bails out on, exactly as the old
|
|
635
|
-
// `if (cursor > 0)` skipped the `setState`s.
|
|
636
|
-
dispatch({ type: key.delete && deleteDisambiguated ? 'delete' : 'backspace' });
|
|
637
|
-
return;
|
|
638
|
-
}
|
|
639
|
-
if (key.leftArrow) {
|
|
640
|
-
onInteraction?.();
|
|
641
|
-
dispatch({ type: 'moveCursor', cursor: stepGrapheme(buffer, cursor, 'left') });
|
|
642
|
-
return;
|
|
643
|
-
}
|
|
644
|
-
if (key.rightArrow) {
|
|
645
|
-
onInteraction?.();
|
|
646
|
-
dispatch({ type: 'moveCursor', cursor: stepGrapheme(buffer, cursor, 'right') });
|
|
647
|
-
return;
|
|
648
|
-
}
|
|
649
|
-
// `!key.shift` is load-bearing: Shift+↑/↓ is the viewport's line-scroll
|
|
650
|
-
// binding (§4.10). Without the guard the history recall below swallows it
|
|
651
|
-
// and scrolling appears to be broken for no visible reason.
|
|
652
|
-
if (key.upArrow && !key.shift) {
|
|
653
|
-
verticalOrHistory('up');
|
|
654
|
-
return;
|
|
655
|
-
}
|
|
656
|
-
if (key.downArrow && !key.shift) {
|
|
657
|
-
verticalOrHistory('down');
|
|
658
|
-
return;
|
|
659
|
-
}
|
|
660
|
-
// `?` on an empty idle input opens the help overlay.
|
|
661
|
-
if (input === '?' && buffer.length === 0 && !running && onHelp) {
|
|
662
|
-
onHelp();
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
// Printable input — drop any unrecognized control/escape byte.
|
|
666
|
-
if (input && !key.tab && !isControlSeq(input))
|
|
667
|
-
insert(input);
|
|
668
|
-
}, { isActive });
|
|
669
|
-
const marker = running ? glyphs.steer : glyphs.caret;
|
|
670
|
-
const markerColor = running ? theme.toolRunning : theme.primary;
|
|
671
|
-
const placeholder = running ? interactionCopy.runningPlaceholder : interactionCopy.idlePlaceholder;
|
|
672
|
-
const overflow = overflowChip(layout.hiddenAbove, layout.hiddenBelow, glyphs);
|
|
673
|
-
const tokenColor = theme.hintFg ?? theme.muted;
|
|
674
|
-
const renderSegments = (segments, keyPrefix) => segments.map((segment, i) => (_jsx(Text, { color: segment.kind === 'token' ? tokenColor : undefined, children: segment.text }, `${keyPrefix}${i}`)));
|
|
675
|
-
const rowNodes = layout.rows.map((row, i) => {
|
|
676
|
-
if (i !== layout.cursorRow)
|
|
677
|
-
return _jsx(_Fragment, { children: renderSegments(row.segments, `s${i}.`) });
|
|
678
|
-
// The caret is drawn as one inverse cell, split at the column
|
|
679
|
-
// `layoutComposer` reported — the same width table it wrapped with (I-9).
|
|
680
|
-
const split = splitRowAtColumn(row, layout.cursorCol);
|
|
681
|
-
return (_jsxs(_Fragment, { children: [renderSegments(split.before, `b${i}.`), _jsx(PromptCaret, { text: split.at ? split.at.text : ' ', active: isActive && cursorVisible, reducedMotion: reducedMotion, colorLevel: caps.colorLevel, resetKey: caretResetKey, color: split.at?.kind === 'token' ? tokenColor : undefined }), renderSegments(split.after, `a${i}.`)] }));
|
|
682
|
-
});
|
|
683
|
-
const inputRow = (_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: markerColor, bold: true, children: [marker, ' '] }), _jsx(Box, { flexDirection: "column", flexGrow: 1, flexShrink: 1, children: buffer.length === 0 ? (_jsxs(Text, { wrap: "truncate", color: theme.muted, children: [_jsx(PromptCaret, { text: String.fromCodePoint(placeholder.codePointAt(0)), active: isActive && cursorVisible, reducedMotion: reducedMotion, colorLevel: caps.colorLevel, color: theme.muted, resetKey: caretResetKey }), placeholder.slice(String.fromCodePoint(placeholder.codePointAt(0)).length)] })) : (rowNodes.map((node, i) => overflow && i === rowNodes.length - 1 ? (
|
|
684
|
-
// The overflow indicator rides the LAST rendered row rather than
|
|
685
|
-
// taking one of its own: an extra row would put the composer's
|
|
686
|
-
// real height one above the `draftRows` it just reported (I-8).
|
|
687
|
-
_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { children: node }) }), _jsx(Box, { flexShrink: 0, width: overflow.cells, justifyContent: "flex-end", children: _jsx(Text, { wrap: "truncate", color: theme.hintFg ?? theme.muted, children: overflow.text }) })] }, i)) : (_jsx(Text, { children: node }, i)))) })] }));
|
|
688
|
-
return (_jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [popupVisible && (_jsx(AutocompletePopup, { items: popupItems, selected: clampedSel, theme: theme, caps: caps, maxRows: popupMaxRows, layout: popupLayout })), (_jsx(Box, { flexDirection: "column", flexShrink: 0, borderStyle: glyphs.boxStyle, borderColor: borderColor, paddingX: 1, children: inputRow }))] }));
|
|
689
|
-
}
|