@aragon-agent/cli 0.6.46 → 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 +28 -0
- package/README.md +80 -12
- package/dist/agent/coalesce.d.ts +5 -1
- package/dist/agent/coalesce.js +13 -0
- package/dist/agent/controller.d.ts +41 -20
- package/dist/agent/controller.js +68 -15
- 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/agent/user-attention.d.ts +17 -0
- package/dist/agent/user-attention.js +32 -0
- package/dist/{ui → app}/App.d.ts +9 -9
- package/dist/{ui → app}/App.js +113 -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 +31 -32
- 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 +10 -31
- 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 +8 -5
- package/dist/proc/readiness.js +1 -1
- package/dist/proc/supervisor.d.ts +1 -1
- package/dist/proc/supervisor.js +10 -4
- package/dist/proc/wait-plan.d.ts +39 -0
- package/dist/proc/wait-plan.js +77 -0
- package/dist/proc/wait.d.ts +37 -4
- package/dist/proc/wait.js +68 -5
- 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/checkpoint.js +2 -0
- package/dist/session/clear-archive.d.ts +2 -2
- package/dist/session/persist.d.ts +2 -2
- package/dist/session/persist.js +20 -3
- package/dist/session/startup-session.d.ts +2 -2
- package/dist/session/validate-session.js +6 -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 +14 -3
- package/dist/tools/job-tools.js +158 -35
- 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 -837
- package/dist/agent/reducer.js +0 -1617
- 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 -1377
- 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 -200
- package/dist/proc/limits.js +0 -207
- package/dist/proc/progress.d.ts +0 -40
- package/dist/proc/progress.js +0 -135
- package/dist/proc/types.d.ts +0 -263
- package/dist/proc/types.js +0 -15
- 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 -48
- 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 -129
- 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 -251
- 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 -160
- 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/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 -82
- package/dist/ui/interaction-copy.js +0 -38
- 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 -139
- package/dist/ui/layout/status-layout.js +0 -253
- 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 -488
- 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 -61
- 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 -118
- package/dist/ui/scrollback/overflow-print.d.ts +0 -108
- package/dist/ui/scrollback/overflow-print.js +0 -120
- package/dist/ui/scrollback/renderer.d.ts +0 -48
- package/dist/ui/scrollback/renderer.js +0 -186
- package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
- package/dist/ui/scrollback/scrollback-writer.js +0 -648
- package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
- package/dist/ui/scrollback/settled-boundary.js +0 -109
- package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
- package/dist/ui/scrollback/tail-anchor.js +0 -79
- package/dist/ui/scrollback/tail-window.d.ts +0 -73
- package/dist/ui/scrollback/tail-window.js +0 -89
- package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
- package/dist/ui/scrollback/use-scrollback-view.js +0 -601
- package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
- package/dist/ui/scrollback/writer-shapes.js +0 -159
- package/dist/ui/scrollbar-controller.d.ts +0 -30
- package/dist/ui/scrollbar-controller.js +0 -124
- package/dist/ui/selection/highlight.d.ts +0 -39
- package/dist/ui/selection/highlight.js +0 -64
- package/dist/ui/selection/screen-mirror.d.ts +0 -24
- package/dist/ui/selection/screen-mirror.js +0 -35
- package/dist/ui/selection/selection-controller.d.ts +0 -104
- package/dist/ui/selection/selection-controller.js +0 -372
- package/dist/ui/selection/selection.d.ts +0 -90
- package/dist/ui/selection/selection.js +0 -223
- package/dist/ui/shortcuts.d.ts +0 -81
- package/dist/ui/shortcuts.js +0 -221
- package/dist/ui/status-feedback.d.ts +0 -35
- package/dist/ui/status-feedback.js +0 -38
- package/dist/ui/stdout-frame-writer.d.ts +0 -74
- package/dist/ui/stdout-frame-writer.js +0 -155
- package/dist/ui/team-status.d.ts +0 -166
- package/dist/ui/team-status.js +0 -252
- package/dist/ui/terminal-plan.d.ts +0 -52
- package/dist/ui/terminal-plan.js +0 -49
- package/dist/ui/theme.d.ts +0 -96
- package/dist/ui/theme.js +0 -130
- package/dist/ui/transcript-text.d.ts +0 -41
- package/dist/ui/transcript-text.js +0 -282
- package/dist/ui/use-height-store.d.ts +0 -31
- package/dist/ui/use-height-store.js +0 -76
- package/dist/ui/use-render-governor.d.ts +0 -39
- package/dist/ui/use-render-governor.js +0 -57
- package/dist/ui/use-wheel-routing.d.ts +0 -57
- package/dist/ui/use-wheel-routing.js +0 -152
- package/dist/ui/win-vt-force.d.ts +0 -136
- package/dist/ui/win-vt-force.js +0 -237
- package/dist/ui/win-vt-input.d.ts +0 -57
- package/dist/ui/win-vt-input.js +0 -62
- package/dist/update/limits.d.ts +0 -111
- package/dist/update/limits.js +0 -111
- package/dist/update/semver.d.ts +0 -89
- package/dist/update/semver.js +0 -295
- package/dist/update/types.d.ts +0 -169
- package/dist/update/types.js +0 -68
- /package/dist/{ui → app}/session-bridge.d.ts +0 -0
- /package/dist/{ui → app}/session-bridge.js +0 -0
|
@@ -1,657 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stdin filter (mouse-wheel-region-routing section 4.2 / 5.2, extended by
|
|
3
|
-
* tui-paste-handling section 5.1).
|
|
4
|
-
*
|
|
5
|
-
* WHY A WRAPPER AND NOT A SECOND LISTENER. Ink 5.2.1 owns stdin in a way that
|
|
6
|
-
* forbids a second reader: `components/App.js` calls `setEncoding('utf8')`,
|
|
7
|
-
* `ref()`, `setRawMode(true)`, subscribes to `'readable'` and drains with
|
|
8
|
-
* `read()`. Attaching our own `'data'` listener to the same `process.stdin`
|
|
9
|
-
* would switch the stream into flowing mode and RACE Ink's `read()` for chunks
|
|
10
|
-
* -- some keystrokes would reach Ink, some would not, non-deterministically
|
|
11
|
-
* (D-3). So the filter REPLACES the stream Ink is given: it reads the real
|
|
12
|
-
* stdin, strips every mouse report, frames every paste, and writes the
|
|
13
|
-
* remainder into a `PassThrough` that carries the surface Ink requires.
|
|
14
|
-
*
|
|
15
|
-
* ONE CHANNEL, NOT TWO, AND THAT NOW COVERS PASTES AS WELL (D-2 / D-3). A second
|
|
16
|
-
* chained filter would need a second `PassThrough` and would reopen the ordering
|
|
17
|
-
* hazard this note closes; a side-channel paste emit would apply the payload
|
|
18
|
-
* BEFORE text that preceded it in the same chunk, because `wrapper.write` is
|
|
19
|
-
* asynchronous and a synchronous emit is not. The paste therefore travels
|
|
20
|
-
* INLINE, wrapped in `PASTE_OPEN` / `PASTE_CLOSE` (I-5).
|
|
21
|
-
*
|
|
22
|
-
* ORDERING IS AN INVARIANT, NOT A CONVENTION (I-8). The caller must build this
|
|
23
|
-
* filter BEFORE anything writes `\x1b[?1000h` or `\x1b[?2004h`. Reporting or
|
|
24
|
-
* bracketed paste enabled while Ink still holds the raw stream does not degrade
|
|
25
|
-
* the feature -- it types `[<0;12;5M` or `[200~` into the user's message, which
|
|
26
|
-
* is strictly worse than the bug being fixed.
|
|
27
|
-
*
|
|
28
|
-
* THE HANDLE ANSWERS EXACTLY ONE QUESTION: "is a stream wrapped?" (I-11 / D-17).
|
|
29
|
-
* It stopped being the answer to "is the mouse on?" the moment paste could build
|
|
30
|
-
* a filter on its own -- `paste` defaults to `true`, so `aragon --no-mouse`
|
|
31
|
-
* builds one. `cli.tsx` reads its own `mouseOn` / `pasteOn` booleans; this module
|
|
32
|
-
* is told which features it is running and never derives them.
|
|
33
|
-
*/
|
|
34
|
-
import { PassThrough } from 'node:stream';
|
|
35
|
-
import { MAX_PENDING_MOUSE_CHARS, splitMouseEvents, isMousePrefix, } from './mouse-events.js';
|
|
36
|
-
import { ENTER_NEWLINE_FRAME, INDEX_KEY_FRAME, PASTE_ASSEMBLY_MAX_MS, PASTE_BURST_MS, PASTE_CLOSE, PASTE_MARKER_RESCAN_TTL_MS, PASTE_MAX_BYTES, PASTE_OPEN, formatPasteSize, } from './limits.js';
|
|
37
|
-
import { PASTE_BEGIN_MARK, PASTE_END_MARK, classifyChunk, isPastePrefix, sanitisePaste, trailingPastePrefixLength, } from './paste-parse.js';
|
|
38
|
-
import { hasPasteOnlySequence } from './control-sequences.js';
|
|
39
|
-
import { splitCursorReports, trailingCprPrefixLength } from './cursor-report.js';
|
|
40
|
-
import { splitEnterSequences, trailingEnterPrefixLength } from './enter-sequences.js';
|
|
41
|
-
import { splitCsiUKeys, trailingCsiUPrefixLength, translateCsiUKey } from './csiu-keys.js';
|
|
42
|
-
import { splitWin32KeySequences, trailingWin32PrefixLength, translateWin32Key, } from './win32-input-mode.js';
|
|
43
|
-
/**
|
|
44
|
-
* How long a possible-prefix tail is held before being flushed as text.
|
|
45
|
-
*
|
|
46
|
-
* This is what stops a lone `\x1b` -- the Esc key, which aborts a run -- from
|
|
47
|
-
* being held hostage waiting for a `[` that will never arrive. Worst-case Esc
|
|
48
|
-
* latency becomes 12 ms, and only for the keystroke that is literally a bare
|
|
49
|
-
* ESC; every other key resolves both prefix tests to false immediately.
|
|
50
|
-
*/
|
|
51
|
-
const PENDING_FLUSH_MS = 12;
|
|
52
|
-
/**
|
|
53
|
-
* Ceiling on the held-back tail, shared by both prefix families.
|
|
54
|
-
*
|
|
55
|
-
* NO CHANGE IS NEEDED HERE FOR PASTE (P2-5). `MAX_PENDING_MOUSE_CHARS` is 32 and
|
|
56
|
-
* the longest paste marker is 6, so 32 already covers both. v1 of the design said
|
|
57
|
-
* the ceiling "becomes `max(MAX_PENDING_MOUSE_CHARS, PASTE_BEGIN_MARK.length)`",
|
|
58
|
-
* which is the same number written in a way that invites someone to edit the
|
|
59
|
-
* constant.
|
|
60
|
-
*
|
|
61
|
-
* TAKEN FROM THE MODULE THAT OWNS IT rather than written again: this file already
|
|
62
|
-
* imports from `mouse-events.js`, so there is no cycle to dodge here and no
|
|
63
|
-
* reason for a second copy of a number whose only justification is that it equals
|
|
64
|
-
* that one.
|
|
65
|
-
*/
|
|
66
|
-
const MAX_PENDING_CHARS = MAX_PENDING_MOUSE_CHARS;
|
|
67
|
-
/** Assign a method onto the PassThrough without widening its public type. */
|
|
68
|
-
function define(target, name, value) {
|
|
69
|
-
Object.defineProperty(target, name, { value, writable: true, configurable: true });
|
|
70
|
-
}
|
|
71
|
-
const byteLength = (s) => Buffer.byteLength(s, 'utf8');
|
|
72
|
-
/**
|
|
73
|
-
* Length of the trailing run of `text` that is a proper prefix of a mouse
|
|
74
|
-
* report, or 0. Shortest match wins, mirroring `trailingPastePrefixLength`.
|
|
75
|
-
*
|
|
76
|
-
* MEASURED SEPARATELY FROM THE PASTE FAMILY, and the longer hold wins.
|
|
77
|
-
* `isMousePrefix` does not match `\x1b[2`, which IS a prefix of both paste
|
|
78
|
-
* markers, so a single combined test would leak half a marker into the draft.
|
|
79
|
-
*/
|
|
80
|
-
function trailingMousePrefixLength(text) {
|
|
81
|
-
const max = Math.min(text.length, MAX_PENDING_CHARS);
|
|
82
|
-
for (let k = 1; k <= max; k += 1) {
|
|
83
|
-
if (isMousePrefix(text.slice(text.length - k)))
|
|
84
|
-
return k;
|
|
85
|
-
}
|
|
86
|
-
return 0;
|
|
87
|
-
}
|
|
88
|
-
export function createStdinFilter(real, features, bridge, onWarn) {
|
|
89
|
-
const enhancedKeys = features.enhancedKeys === true;
|
|
90
|
-
const wrapper = new PassThrough();
|
|
91
|
-
const listeners = new Set();
|
|
92
|
-
let pending = '';
|
|
93
|
-
let flushTimer = null;
|
|
94
|
-
let burstTimer = null;
|
|
95
|
-
let assemblyTimer = null;
|
|
96
|
-
let disposed = false;
|
|
97
|
-
let finished = false;
|
|
98
|
-
let paste = { kind: 'idle' };
|
|
99
|
-
/**
|
|
100
|
-
* The probe window (R3). While true a possible report prefix is held until the
|
|
101
|
-
* probe settles instead of being flushed after `PENDING_FLUSH_MS`, because a
|
|
102
|
-
* half `ESC[12` reaching Ink hits an undefined branch of its key parser.
|
|
103
|
-
*/
|
|
104
|
-
let expectingCursorReport = false;
|
|
105
|
-
let discardBracketed = false;
|
|
106
|
-
let outputBatch = null;
|
|
107
|
-
/**
|
|
108
|
-
* A marker head that has ALREADY been released to Ink, kept for one more
|
|
109
|
-
* chunk (defect 2: the torn-marker rescue in `onData`).
|
|
110
|
-
*
|
|
111
|
-
* WHY IT EXISTS. `flushPending` releases a lone ESC after 12 ms because the
|
|
112
|
-
* Esc key must not be held hostage. When the split point lands inside a paste
|
|
113
|
-
* marker -- `ESC` in one read and `[200~hello` in the next, which is ordinary
|
|
114
|
-
* for a Windows console, SSH or tmux under load -- `feed` can no longer find
|
|
115
|
-
* the marker and `[200~` is typed into the draft. Nothing downstream can undo
|
|
116
|
-
* that: the marker has to be recognised BEFORE its bytes become text.
|
|
117
|
-
*
|
|
118
|
-
* WHAT IT CANNOT DO, STATED HONESTLY. The released ESC has already reached Ink
|
|
119
|
-
* as an Esc key press and this filter cannot retract a write. The rescue
|
|
120
|
-
* guarantees the marker CHARACTERS never become draft text; it does NOT undo
|
|
121
|
-
* that keypress (an armed interrupt gesture, a dismissed popup).
|
|
122
|
-
*/
|
|
123
|
-
let rescuedPrefix = null;
|
|
124
|
-
const writeInput = (text) => {
|
|
125
|
-
if (disposed || outputBatch?.refused)
|
|
126
|
-
return;
|
|
127
|
-
if (outputBatch)
|
|
128
|
-
outputBatch.chunks.push(text);
|
|
129
|
-
else
|
|
130
|
-
wrapper.write(text);
|
|
131
|
-
};
|
|
132
|
-
// --- The surface Ink reads off the stream it is handed. ------------------
|
|
133
|
-
// `isRawModeSupported()` reads `props.stdin.isTTY` (App.js:34), so this has
|
|
134
|
-
// to be a DELEGATING GETTER rather than a snapshot: a stdin that is not a TTY
|
|
135
|
-
// must still report so through the wrapper, or Ink throws instead of falling
|
|
136
|
-
// back.
|
|
137
|
-
Object.defineProperty(wrapper, 'isTTY', {
|
|
138
|
-
get: () => real.isTTY,
|
|
139
|
-
configurable: true,
|
|
140
|
-
});
|
|
141
|
-
define(wrapper, 'setRawMode', (mode) => {
|
|
142
|
-
real.setRawMode?.(mode);
|
|
143
|
-
return wrapper;
|
|
144
|
-
});
|
|
145
|
-
define(wrapper, 'ref', () => {
|
|
146
|
-
real.ref?.();
|
|
147
|
-
return wrapper;
|
|
148
|
-
});
|
|
149
|
-
define(wrapper, 'unref', () => {
|
|
150
|
-
real.unref?.();
|
|
151
|
-
return wrapper;
|
|
152
|
-
});
|
|
153
|
-
const emit = (event) => {
|
|
154
|
-
for (const listener of [...listeners])
|
|
155
|
-
listener(event);
|
|
156
|
-
};
|
|
157
|
-
const clearTimer = (t) => {
|
|
158
|
-
if (t)
|
|
159
|
-
clearTimeout(t);
|
|
160
|
-
return null;
|
|
161
|
-
};
|
|
162
|
-
/** `.unref()` so a held tail can never keep the process alive on its own. */
|
|
163
|
-
const arm = (fn, ms) => {
|
|
164
|
-
if (finished || disposed)
|
|
165
|
-
return null;
|
|
166
|
-
const t = setTimeout(fn, ms);
|
|
167
|
-
t.unref?.();
|
|
168
|
-
return t;
|
|
169
|
-
};
|
|
170
|
-
// -----------------------------------------------------------------------
|
|
171
|
-
// Paste emission
|
|
172
|
-
// -----------------------------------------------------------------------
|
|
173
|
-
/**
|
|
174
|
-
* Write one frame, or refuse the paste and say so.
|
|
175
|
-
*
|
|
176
|
-
* D-11: above `PASTE_MAX_BYTES` the body is DROPPED and the user gets a toast
|
|
177
|
-
* naming the size and the limit. Truncating would lose their data and look
|
|
178
|
-
* like success. The body stops being accumulated the moment it goes over
|
|
179
|
-
* (`overflow`), so memory stays bounded while the rest of the payload is still
|
|
180
|
-
* being consumed -- consuming it is not optional, because the alternative is
|
|
181
|
-
* two megabytes of the user's file arriving as keystrokes.
|
|
182
|
-
*/
|
|
183
|
-
const emitPaste = (body, bytes, overflow) => {
|
|
184
|
-
if (disposed)
|
|
185
|
-
return;
|
|
186
|
-
if (overflow || bytes > PASTE_MAX_BYTES) {
|
|
187
|
-
if (outputBatch?.refused)
|
|
188
|
-
return;
|
|
189
|
-
if (outputBatch)
|
|
190
|
-
outputBatch.refused = true;
|
|
191
|
-
const text = `Paste too large (${formatPasteSize(bytes)}); limit is ` +
|
|
192
|
-
`${formatPasteSize(PASTE_MAX_BYTES)}. Nothing was inserted.`;
|
|
193
|
-
onWarn?.(text);
|
|
194
|
-
bridge?.notify?.('warn', text);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
const payload = sanitisePaste(body);
|
|
198
|
-
if (payload.length === 0)
|
|
199
|
-
return;
|
|
200
|
-
// ONE `write()` call, at the position the paste occupied in the stream.
|
|
201
|
-
writeInput(PASTE_OPEN + payload + PASTE_CLOSE);
|
|
202
|
-
};
|
|
203
|
-
const flushBurst = () => {
|
|
204
|
-
burstTimer = clearTimer(burstTimer);
|
|
205
|
-
if (paste.kind !== 'burst')
|
|
206
|
-
return;
|
|
207
|
-
const { body, bytes } = paste;
|
|
208
|
-
paste = { kind: 'idle' };
|
|
209
|
-
emitPaste(body, bytes, false);
|
|
210
|
-
};
|
|
211
|
-
const flushBracketed = (reason) => {
|
|
212
|
-
assemblyTimer = clearTimer(assemblyTimer);
|
|
213
|
-
if (paste.kind !== 'bracketed')
|
|
214
|
-
return;
|
|
215
|
-
const { body, bytes, overflow } = paste;
|
|
216
|
-
paste = { kind: 'idle' };
|
|
217
|
-
if (discardBracketed) {
|
|
218
|
-
discardBracketed = false;
|
|
219
|
-
if (outputBatch)
|
|
220
|
-
outputBatch.refused = true;
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
if (reason === 'timeout') {
|
|
224
|
-
// I-4: an unterminated marker must never wedge input. Emitting what
|
|
225
|
-
// arrived is strictly better than holding the keyboard hostage.
|
|
226
|
-
onWarn?.('bracketed paste never terminated; flushing what arrived');
|
|
227
|
-
}
|
|
228
|
-
emitPaste(body, bytes, overflow);
|
|
229
|
-
};
|
|
230
|
-
// -----------------------------------------------------------------------
|
|
231
|
-
// The scan (section 5.1, and the ORDER below is the specification)
|
|
232
|
-
// -----------------------------------------------------------------------
|
|
233
|
-
/**
|
|
234
|
-
* Text that reached the pass-through: a sequence a KEYBOARD cannot produce
|
|
235
|
-
* first (R-2), then Tier 2 classification, then mouse stripping, then Ink.
|
|
236
|
-
*
|
|
237
|
-
* MOUSE PARSING IS SUSPENDED FOR THE DURATION OF ANY PASTE BODY (I-3), burst
|
|
238
|
-
* and bracketed alike. The Tier 2 population is precisely the terminals with
|
|
239
|
-
* no bracketed paste, and the likeliest thing such a user pastes into a TUI
|
|
240
|
-
* dev tool is a terminal log full of `\x1b[<0;12;5M`-shaped bytes. Eating
|
|
241
|
-
* those would corrupt their data silently. v1 covered only Tier 1, which left
|
|
242
|
-
* the loss in place for exactly the terminals Tier 2 exists to serve (P1-7).
|
|
243
|
-
*/
|
|
244
|
-
const handleText = (text, holdTail) => {
|
|
245
|
-
if (text.length === 0)
|
|
246
|
-
return;
|
|
247
|
-
if (paste.kind === 'burst') {
|
|
248
|
-
paste = { kind: 'burst', body: paste.body + text, bytes: paste.bytes + byteLength(text) };
|
|
249
|
-
burstTimer = clearTimer(burstTimer);
|
|
250
|
-
burstTimer = arm(flushBurst, PASTE_BURST_MS);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
// A SEQUENCE A KEYBOARD CANNOT PRODUCE IS A PASTE, FRAMED OR NOT (R-2).
|
|
254
|
-
//
|
|
255
|
-
// WHY THE CLASSIFIER BELOW IS NOT ENOUGH. `classifyChunk` needs either a
|
|
256
|
-
// line break or a chunk with no control byte but TAB, and a SINGLE-LINE
|
|
257
|
-
// paste carrying ESC satisfies neither -- so it travels the keystroke path
|
|
258
|
-
// with `sanitisePaste` never called. Measured on the real component that
|
|
259
|
-
// cost either a draft holding `[38;2;18;52;86m` ALONGSIDE A LIVE ESC (which
|
|
260
|
-
// then reached the model, the history and the session file) or an uncaught
|
|
261
|
-
// `TypeError` in Ink's parser, because `parse-keypress.js` maps `ESC [ 3 2 m`
|
|
262
|
-
// to a ctrl key whose `name` is undefined. Framing it here routes it through
|
|
263
|
-
// the ONE cleaning path every other paste already takes.
|
|
264
|
-
if (features.paste && hasPasteOnlySequence(text)) {
|
|
265
|
-
paste = { kind: 'burst', body: text, bytes: byteLength(text) };
|
|
266
|
-
burstTimer = clearTimer(burstTimer);
|
|
267
|
-
burstTimer = arm(flushBurst, PASTE_BURST_MS);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
if (features.paste && classifyChunk(text) === 'paste') {
|
|
271
|
-
paste = { kind: 'burst', body: text, bytes: byteLength(text) };
|
|
272
|
-
burstTimer = clearTimer(burstTimer);
|
|
273
|
-
burstTimer = arm(flushBurst, PASTE_BURST_MS);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
// FOURTH PREFIX FAMILY: the terminal's answer to `ESC[6n`
|
|
277
|
-
// (tui-bottom-anchored-live-region §4.5). AFTER the paste tests, and that order
|
|
278
|
-
// is the specification: a user who pastes a terminal log containing `ESC[12;1R`
|
|
279
|
-
// is pasting DATA, and a paste body is the one place such a sequence is kept
|
|
280
|
-
// verbatim (I-3, the same rule that suspends mouse parsing inside a body).
|
|
281
|
-
if (features.cursorReport) {
|
|
282
|
-
const report = splitCursorReports(text);
|
|
283
|
-
text = report.text;
|
|
284
|
-
if (report.pending.length > 0) {
|
|
285
|
-
// Not text yet: it joins the cross-chunk buffer the mouse family uses.
|
|
286
|
-
// `holdTail` false means a paste marker follows in this very chunk, so no
|
|
287
|
-
// later byte can complete the prefix and holding it would reorder it (I-5).
|
|
288
|
-
if (holdTail)
|
|
289
|
-
pending += report.pending;
|
|
290
|
-
else
|
|
291
|
-
writeInput(report.pending);
|
|
292
|
-
}
|
|
293
|
-
if (text.length === 0)
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
// Ink conflates DEL Backspace with CSI Delete. Normalize only keyboard
|
|
297
|
-
// text, after burst classification, preserving ESC for Alt+Backspace.
|
|
298
|
-
text = text.replace(/\x7f/g, '\x08');
|
|
299
|
-
if (!features.mouse) {
|
|
300
|
-
writeInput(text);
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
const split = splitMouseEvents(text);
|
|
304
|
-
if (split.text.length > 0)
|
|
305
|
-
writeInput(split.text);
|
|
306
|
-
for (const event of split.events)
|
|
307
|
-
emit(event);
|
|
308
|
-
if (split.pending.length === 0)
|
|
309
|
-
return;
|
|
310
|
-
// `holdTail` is false when a paste marker follows this run in the SAME
|
|
311
|
-
// chunk: no later byte can complete the mouse prefix, so holding it would
|
|
312
|
-
// reorder it behind the paste. Appending (never prepending) is what keeps
|
|
313
|
-
// `pending` in stream order when both prefix families fire at once.
|
|
314
|
-
if (holdTail)
|
|
315
|
-
pending += split.pending;
|
|
316
|
-
else
|
|
317
|
-
writeInput(split.pending);
|
|
318
|
-
};
|
|
319
|
-
/**
|
|
320
|
-
* THE ENHANCED-KEY WALK, OUTSIDE PASTES ONLY. win32-input-mode records are
|
|
321
|
-
* split first (their bodies are digits/semicolons, so no paste marker or
|
|
322
|
-
* CSI-u sequence can live inside one), then CSI-u sequences in the
|
|
323
|
-
* remaining text, and only then the legacy Enter family. Each translated
|
|
324
|
-
* key terminates a heuristic burst exactly like an Enter frame does -- a
|
|
325
|
-
* keystroke mid-burst is the definition of "not a paste".
|
|
326
|
-
*/
|
|
327
|
-
const writeEnhancedKey = (legacy) => {
|
|
328
|
-
if (legacy.length === 0)
|
|
329
|
-
return;
|
|
330
|
-
flushBurst();
|
|
331
|
-
writeInput(legacy);
|
|
332
|
-
};
|
|
333
|
-
const handleOutsidePaste = (text, holdTail) => {
|
|
334
|
-
const win32 = enhancedKeys ? splitWin32KeySequences(text)
|
|
335
|
-
: [{ kind: 'text', text }];
|
|
336
|
-
for (let w = 0; w < win32.length; w += 1) {
|
|
337
|
-
const wSeg = win32[w];
|
|
338
|
-
const wLast = holdTail && w === win32.length - 1;
|
|
339
|
-
if (wSeg.kind === 'key') {
|
|
340
|
-
writeEnhancedKey(translateWin32Key(wSeg.record));
|
|
341
|
-
continue;
|
|
342
|
-
}
|
|
343
|
-
const csiu = enhancedKeys ? splitCsiUKeys(wSeg.text)
|
|
344
|
-
: [{ kind: 'text', text: wSeg.text }];
|
|
345
|
-
for (let c = 0; c < csiu.length; c += 1) {
|
|
346
|
-
const cSeg = csiu[c];
|
|
347
|
-
if (cSeg.kind === 'key') {
|
|
348
|
-
writeEnhancedKey(translateCsiUKey(cSeg.key));
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
const segments = splitEnterSequences(cSeg.text);
|
|
352
|
-
for (let index = 0; index < segments.length; index += 1) {
|
|
353
|
-
const segment = segments[index];
|
|
354
|
-
if (segment.kind === 'text') {
|
|
355
|
-
handleText(segment.text, wLast && c === csiu.length - 1
|
|
356
|
-
&& index === segments.length - 1);
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
|
-
// A key terminates the heuristic paste before its internal frame is written.
|
|
360
|
-
writeEnhancedKey(segment.kind === 'submit' ? '\r' : ENTER_NEWLINE_FRAME);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
};
|
|
365
|
-
/**
|
|
366
|
-
* win32-input-mode records that arrived INSIDE a paste frame (R-4).
|
|
367
|
-
*
|
|
368
|
-
* DATA FIDELITY, NOT POLISH. Every character of a `?9001h` session arrives as
|
|
369
|
-
* `ESC [ vk ; sc ; char ; down ; mods ; rep _`, and once the frame opens
|
|
370
|
-
* nothing translated them: `sanitisePaste` then removed each record's ESC and
|
|
371
|
-
* left 15 visible characters of digits per key. Translating them is also what
|
|
372
|
-
* keeps the fix honest in the OTHER direction -- a whole-sequence stripper
|
|
373
|
-
* deletes such a record outright, so "clean" would have meant the user's
|
|
374
|
-
* characters silently vanishing. A record carrying a key FRAME (modified
|
|
375
|
-
* Enter, Ctrl+I) becomes the byte that frame stands for, because a frame
|
|
376
|
-
* inside a body is content and never a key.
|
|
377
|
-
*/
|
|
378
|
-
const translateInPaste = (text) => {
|
|
379
|
-
if (!enhancedKeys || !text.includes('\x1b['))
|
|
380
|
-
return text;
|
|
381
|
-
let out = '';
|
|
382
|
-
for (const segment of splitWin32KeySequences(text)) {
|
|
383
|
-
if (segment.kind === 'text') {
|
|
384
|
-
out += segment.text;
|
|
385
|
-
continue;
|
|
386
|
-
}
|
|
387
|
-
const legacy = translateWin32Key(segment.record);
|
|
388
|
-
if (legacy === ENTER_NEWLINE_FRAME)
|
|
389
|
-
out += '\n';
|
|
390
|
-
else if (legacy === INDEX_KEY_FRAME)
|
|
391
|
-
out += '\t';
|
|
392
|
-
else
|
|
393
|
-
out += legacy;
|
|
394
|
-
}
|
|
395
|
-
return out;
|
|
396
|
-
};
|
|
397
|
-
const appendBracketed = (text) => {
|
|
398
|
-
if (paste.kind !== 'bracketed' || text.length === 0 || discardBracketed)
|
|
399
|
-
return;
|
|
400
|
-
const body = translateInPaste(text);
|
|
401
|
-
const bytes = paste.bytes + byteLength(body);
|
|
402
|
-
const overflow = paste.overflow || bytes > PASTE_MAX_BYTES;
|
|
403
|
-
paste = {
|
|
404
|
-
kind: 'bracketed',
|
|
405
|
-
body: overflow ? paste.body : paste.body + body,
|
|
406
|
-
bytes,
|
|
407
|
-
overflow,
|
|
408
|
-
};
|
|
409
|
-
};
|
|
410
|
-
const feed = (raw) => {
|
|
411
|
-
let rest = raw;
|
|
412
|
-
while (rest.length > 0) {
|
|
413
|
-
if (paste.kind === 'bracketed') {
|
|
414
|
-
const end = rest.indexOf(PASTE_END_MARK);
|
|
415
|
-
if (end === -1) {
|
|
416
|
-
// Hold a trailing strict prefix of the END marker for the next chunk.
|
|
417
|
-
// NO 12 ms FLUSH TIMER HERE: inside a body every byte is payload, so
|
|
418
|
-
// nothing is being kept from the keyboard, and `assemblyTimer` is the
|
|
419
|
-
// bound that matters (I-4).
|
|
420
|
-
const hold = trailingPastePrefixLength(rest);
|
|
421
|
-
appendBracketed(rest.slice(0, rest.length - hold));
|
|
422
|
-
pending = rest.slice(rest.length - hold);
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
appendBracketed(rest.slice(0, end));
|
|
426
|
-
flushBracketed('end');
|
|
427
|
-
rest = rest.slice(end + PASTE_END_MARK.length);
|
|
428
|
-
continue;
|
|
429
|
-
}
|
|
430
|
-
// idle | burst. BOTH markers are consumed unconditionally, in every mode
|
|
431
|
-
// and whether or not this process enabled DEC 2004 (I-16): something else
|
|
432
|
-
// may have left it on, and a stray END typed into the draft is the same
|
|
433
|
-
// failure arriving from outside.
|
|
434
|
-
const begin = rest.indexOf(PASTE_BEGIN_MARK);
|
|
435
|
-
const strayEnd = rest.indexOf(PASTE_END_MARK);
|
|
436
|
-
const first = begin === -1 ? strayEnd : strayEnd === -1 ? begin : Math.min(begin, strayEnd);
|
|
437
|
-
if (first === -1) {
|
|
438
|
-
// THIRD PREFIX FAMILY: a torn CSI-u Enter sequence
|
|
439
|
-
// (tui-shift-enter-copy-queue 3.4). `keep = max(...)` holds the longest
|
|
440
|
-
// tail any family might still complete; the three families share only
|
|
441
|
-
// the ESC / ESC-[ head bytes, which the max keeps for whoever needs
|
|
442
|
-
// them. The existing 12 ms flush and the 32-char ceiling bound the
|
|
443
|
-
// hold, so no new timer is needed.
|
|
444
|
-
const keep = Math.max(trailingPastePrefixLength(rest), features.mouse ? trailingMousePrefixLength(rest) : 0, features.cursorReport ? trailingCprPrefixLength(rest) : 0, trailingEnterPrefixLength(rest), enhancedKeys ? trailingWin32PrefixLength(rest) : 0, enhancedKeys ? trailingCsiUPrefixLength(rest) : 0);
|
|
445
|
-
const tail = rest.slice(rest.length - keep);
|
|
446
|
-
handleOutsidePaste(rest.slice(0, rest.length - keep), true);
|
|
447
|
-
pending += tail;
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
handleOutsidePaste(rest.slice(0, first), false);
|
|
451
|
-
if (begin === -1 || first < begin) {
|
|
452
|
-
rest = rest.slice(first + PASTE_END_MARK.length);
|
|
453
|
-
continue;
|
|
454
|
-
}
|
|
455
|
-
// P2-4: the burst is flushed FIRST, so two bodies can never be
|
|
456
|
-
// concatenated into one token out of order.
|
|
457
|
-
flushBurst();
|
|
458
|
-
paste = { kind: 'bracketed', body: '', bytes: 0, overflow: false };
|
|
459
|
-
assemblyTimer = clearTimer(assemblyTimer);
|
|
460
|
-
assemblyTimer = arm(() => flushBracketed('timeout'), PASTE_ASSEMBLY_MAX_MS);
|
|
461
|
-
rest = rest.slice(first + PASTE_BEGIN_MARK.length);
|
|
462
|
-
}
|
|
463
|
-
};
|
|
464
|
-
/**
|
|
465
|
-
* Hand a held tail to the ordinary text path, remembering it when it could
|
|
466
|
-
* still be the head of a paste marker.
|
|
467
|
-
*
|
|
468
|
-
* THE TAIL IS RELEASED EXACTLY AS BEFORE. Remembering it costs no latency: a
|
|
469
|
-
* real Esc keypress still reaches Ink after `PENDING_FLUSH_MS`, and the
|
|
470
|
-
* remembered head is only ever consulted for the NEXT chunk.
|
|
471
|
-
*/
|
|
472
|
-
const flushTailAsText = (text) => {
|
|
473
|
-
rescuedPrefix = isPastePrefix(text) ? { text, at: Date.now() } : null;
|
|
474
|
-
handleOutsidePaste(text, false);
|
|
475
|
-
};
|
|
476
|
-
const flushPending = () => {
|
|
477
|
-
flushTimer = clearTimer(flushTimer);
|
|
478
|
-
if (pending.length === 0 || disposed)
|
|
479
|
-
return;
|
|
480
|
-
// The probe owes us an answer: releasing a half report now would type it into
|
|
481
|
-
// the draft. `setExpectingCursorReport(false)` flushes whatever is left.
|
|
482
|
-
if (expectingCursorReport)
|
|
483
|
-
return;
|
|
484
|
-
const text = pending;
|
|
485
|
-
pending = '';
|
|
486
|
-
// A tail that never completed is ordinary text; it goes through the same
|
|
487
|
-
// scan so a burst already open keeps coalescing it.
|
|
488
|
-
flushTailAsText(text);
|
|
489
|
-
};
|
|
490
|
-
/**
|
|
491
|
-
* One-shot rescue of a marker whose ESC was already flushed as text.
|
|
492
|
-
*
|
|
493
|
-
* Returns the string `feed` should scan -- the remembered head followed by
|
|
494
|
-
* this chunk -- when the chunk COMPLETES that head into a whole marker, and
|
|
495
|
-
* `null` otherwise. On `null` the chunk travels the normal path: the head has
|
|
496
|
-
* already been emitted, so re-feeding it would type its bytes twice, and
|
|
497
|
-
* holding the chunk instead would swallow characters the user really typed.
|
|
498
|
-
*
|
|
499
|
-
* STARTS WITH, NOT CONTAINS. A marker completed at the junction starts at
|
|
500
|
-
* index 0 of the joined text; one starting anywhere later lies wholly inside
|
|
501
|
-
* `chunk` (the head holds an ESC at index 0 and nothing else that could begin
|
|
502
|
-
* a marker), and `feed` finds that on its own. Only the junction case needs
|
|
503
|
-
* re-scanning, and it is the only case where prepending cannot duplicate a
|
|
504
|
-
* byte that Ink has already seen.
|
|
505
|
-
*
|
|
506
|
-
* ONE-SHOT BY CONSTRUCTION: the remembered head is cleared here on every call,
|
|
507
|
-
* whether or not the rescue fired, so at most one chunk is ever re-scanned
|
|
508
|
-
* against it and no stale head can outlive its `PASTE_MARKER_RESCAN_TTL_MS`.
|
|
509
|
-
*/
|
|
510
|
-
const takeRescuedPrefix = (carried, chunk) => {
|
|
511
|
-
const rescue = rescuedPrefix;
|
|
512
|
-
rescuedPrefix = null;
|
|
513
|
-
if (rescue === null || carried.length > 0 || !features.paste)
|
|
514
|
-
return null;
|
|
515
|
-
if (Date.now() - rescue.at > PASTE_MARKER_RESCAN_TTL_MS)
|
|
516
|
-
return null;
|
|
517
|
-
const joined = rescue.text + chunk;
|
|
518
|
-
const completes = joined.startsWith(PASTE_BEGIN_MARK) || joined.startsWith(PASTE_END_MARK);
|
|
519
|
-
return completes ? joined : null;
|
|
520
|
-
};
|
|
521
|
-
const onData = (chunk) => {
|
|
522
|
-
if (disposed || finished)
|
|
523
|
-
return;
|
|
524
|
-
flushTimer = clearTimer(flushTimer);
|
|
525
|
-
const decoded = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
526
|
-
// Stripped on BOTH paths, because a NUL in a payload must never be able to
|
|
527
|
-
// forge a `PASTE_OPEN` frame boundary.
|
|
528
|
-
const cleaned = decoded.replace(/\u0000/g, '');
|
|
529
|
-
const carried = pending;
|
|
530
|
-
pending = '';
|
|
531
|
-
// A rejected paste must not leave earlier text or a later Enter executable.
|
|
532
|
-
const batch = { chunks: [], refused: false };
|
|
533
|
-
outputBatch = batch;
|
|
534
|
-
try {
|
|
535
|
-
feed(takeRescuedPrefix(carried, cleaned) ?? (carried + cleaned));
|
|
536
|
-
}
|
|
537
|
-
finally {
|
|
538
|
-
outputBatch = null;
|
|
539
|
-
}
|
|
540
|
-
if (batch.refused) {
|
|
541
|
-
burstTimer = clearTimer(burstTimer);
|
|
542
|
-
if (paste.kind === 'bracketed') {
|
|
543
|
-
// Keep consuming an unfinished body so its next chunk cannot become keys.
|
|
544
|
-
discardBracketed = true;
|
|
545
|
-
paste = { kind: 'bracketed', body: '', bytes: 0, overflow: false };
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
pending = '';
|
|
549
|
-
paste = { kind: 'idle' };
|
|
550
|
-
assemblyTimer = clearTimer(assemblyTimer);
|
|
551
|
-
}
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
if (disposed || finished)
|
|
555
|
-
return;
|
|
556
|
-
for (const text of batch.chunks)
|
|
557
|
-
wrapper.write(text);
|
|
558
|
-
if (paste.kind === 'bracketed' || pending.length === 0)
|
|
559
|
-
return;
|
|
560
|
-
if (pending.length > MAX_PENDING_CHARS && !expectingCursorReport) {
|
|
561
|
-
// A malformed sequence that looks like a prefix forever must never wedge
|
|
562
|
-
// input: past the ceiling the tail becomes ordinary text. NOT DURING THE
|
|
563
|
-
// PROBE WINDOW THOUGH (L8): there the ceiling could push half a report into
|
|
564
|
-
// Ink, which is the failure this whole family exists to prevent. The window
|
|
565
|
-
// is bounded by the probe timeout, after which the ceiling applies again.
|
|
566
|
-
const text = pending;
|
|
567
|
-
pending = '';
|
|
568
|
-
flushTailAsText(text);
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
flushTimer = arm(flushPending, PENDING_FLUSH_MS);
|
|
572
|
-
};
|
|
573
|
-
// P2-7: a closed stdin must still terminate Ink's reader, or it waits forever
|
|
574
|
-
// on a stream that will never produce another byte.
|
|
575
|
-
const onEnd = () => {
|
|
576
|
-
if (finished || disposed)
|
|
577
|
-
return;
|
|
578
|
-
finished = true;
|
|
579
|
-
flushTimer = clearTimer(flushTimer);
|
|
580
|
-
burstTimer = clearTimer(burstTimer);
|
|
581
|
-
assemblyTimer = clearTimer(assemblyTimer);
|
|
582
|
-
const tail = pending;
|
|
583
|
-
pending = '';
|
|
584
|
-
if (paste.kind === 'bracketed') {
|
|
585
|
-
appendBracketed(tail);
|
|
586
|
-
flushBracketed('timeout');
|
|
587
|
-
}
|
|
588
|
-
else {
|
|
589
|
-
// The pending prefix belongs to the currently open burst, if any.
|
|
590
|
-
handleOutsidePaste(tail, false);
|
|
591
|
-
flushBurst();
|
|
592
|
-
}
|
|
593
|
-
wrapper.end();
|
|
594
|
-
};
|
|
595
|
-
// `setEncoding('utf8')` on the REAL stream so Node's StringDecoder handles
|
|
596
|
-
// multi-byte boundaries for us -- the scan works on characters, and a UTF-8
|
|
597
|
-
// sequence split across two chunks would otherwise become two mojibake
|
|
598
|
-
// characters before it ever reached `splitMouseEvents`.
|
|
599
|
-
real.setEncoding?.('utf8');
|
|
600
|
-
real.on('data', onData);
|
|
601
|
-
real.once('end', onEnd);
|
|
602
|
-
real.once('close', onEnd);
|
|
603
|
-
return {
|
|
604
|
-
stdin: wrapper,
|
|
605
|
-
source: {
|
|
606
|
-
subscribe(listener) {
|
|
607
|
-
listeners.add(listener);
|
|
608
|
-
return () => listeners.delete(listener);
|
|
609
|
-
},
|
|
610
|
-
},
|
|
611
|
-
setExpectingCursorReport(on) {
|
|
612
|
-
if (expectingCursorReport === on)
|
|
613
|
-
return;
|
|
614
|
-
expectingCursorReport = on;
|
|
615
|
-
if (on || disposed)
|
|
616
|
-
return;
|
|
617
|
-
// Settled: nothing that is still held was a report. Release it as text, so a
|
|
618
|
-
// probe that never got an answer costs its own timeout and not a dead keyboard.
|
|
619
|
-
flushTimer = clearTimer(flushTimer);
|
|
620
|
-
flushPending();
|
|
621
|
-
},
|
|
622
|
-
dispose() {
|
|
623
|
-
if (disposed)
|
|
624
|
-
return;
|
|
625
|
-
disposed = true;
|
|
626
|
-
flushTimer = clearTimer(flushTimer);
|
|
627
|
-
burstTimer = clearTimer(burstTimer);
|
|
628
|
-
assemblyTimer = clearTimer(assemblyTimer);
|
|
629
|
-
real.removeListener('data', onData);
|
|
630
|
-
real.removeListener('end', onEnd);
|
|
631
|
-
real.removeListener('close', onEnd);
|
|
632
|
-
listeners.clear();
|
|
633
|
-
// I-7: a live `'data'` listener on stdin keeps the event loop alive, and
|
|
634
|
-
// `aragon` would hang on exit instead of returning to the shell.
|
|
635
|
-
real.pause?.();
|
|
636
|
-
real.unref?.();
|
|
637
|
-
},
|
|
638
|
-
};
|
|
639
|
-
}
|
|
640
|
-
/**
|
|
641
|
-
* Build a filter, or `null` if construction throws.
|
|
642
|
-
*
|
|
643
|
-
* The `null` return is the whole point (P0-1): a construction failure must
|
|
644
|
-
* degrade to "the wheel is inert and pastes are keystrokes" -- a supported,
|
|
645
|
-
* tested rung of the fail-safe ladder -- rather than leaving `?1000h` or `?2004h`
|
|
646
|
-
* on with no filter in front of Ink. `cli.tsx` derives BOTH `mouseOn` and
|
|
647
|
-
* `pasteOn` from the returned handle for exactly that reason.
|
|
648
|
-
*/
|
|
649
|
-
export function tryCreateStdinFilter(real, features, onError, bridge) {
|
|
650
|
-
try {
|
|
651
|
-
return createStdinFilter(real, features, bridge, onError);
|
|
652
|
-
}
|
|
653
|
-
catch (err) {
|
|
654
|
-
onError?.(err instanceof Error ? err.message : String(err));
|
|
655
|
-
return null;
|
|
656
|
-
}
|
|
657
|
-
}
|