@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,391 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The connection probe behind `Test connection` and `Discover models`
|
|
3
|
-
* (model-profile-connection-test §4.2-§4.8).
|
|
4
|
-
*
|
|
5
|
-
* WHY THIS IS NOT `ModelRegistry.discoverModels()`: that path folds every exception
|
|
6
|
-
* into `[]` and stores the result in a five-minute process-wide cache. Using it here
|
|
7
|
-
* would (a) collapse "wrong key", "wrong URL" and "this account owns no models" into
|
|
8
|
-
* one sentence, and (b) let a probe of an UNSAVED draft endpoint poison `/model`,
|
|
9
|
-
* `/context` and the main session's window resolution for five minutes. So the probe
|
|
10
|
-
* talks to the adapter directly and classifies by `LLMError.errorType`.
|
|
11
|
-
*
|
|
12
|
-
* WHY `complete()` AND NOT ONLY `listModels()`: a model can be listed and still be
|
|
13
|
-
* unable to generate (gateway aliases, permission layers). One real round trip is the
|
|
14
|
-
* only honest answer to "does this work right now", and it is also the only evidence
|
|
15
|
-
* that can produce `model_not_found`.
|
|
16
|
-
*
|
|
17
|
-
* ASCII ONLY: `agent/` is inside `glyphs.test.ts::inScope`.
|
|
18
|
-
*/
|
|
19
|
-
import { createHash } from 'node:crypto';
|
|
20
|
-
import { LLMError, MIN_MAX_OUTPUT_TOKENS, classifyOutputLimitFailure, } from '@aragon-agent/core';
|
|
21
|
-
import { isValidEndpointUrl } from '../config/model-profiles.js';
|
|
22
|
-
import { getLogger } from '../logging/logger.js';
|
|
23
|
-
import { PROBE_LIMITS } from './model-probe-limits.js';
|
|
24
|
-
/** `Reply with the single word OK.` - one isolated call, no tools, no system prompt. */
|
|
25
|
-
const PROBE_PROMPT = 'Reply with the single word OK.';
|
|
26
|
-
const UNKNOWN_DETAIL = 'The provider failed in an unrecognized way.';
|
|
27
|
-
const NO_KEY_DETAIL_SUFFIX = ' Set one here or in the environment.';
|
|
28
|
-
/**
|
|
29
|
-
* Which key this draft would actually use (§4.2.1).
|
|
30
|
-
*
|
|
31
|
-
* The editor's `apiKey` field is ALWAYS the empty string: it is the replacement
|
|
32
|
-
* input, not the live credential. `finishProfileEditor` resolves `keep` to the
|
|
33
|
-
* saved entry key and `shared` to `null`, and the runtime then falls back to the
|
|
34
|
-
* shared per-provider key. Without this table the most common path - editing an
|
|
35
|
-
* existing profile, whose credential mode defaults to `keep` - would report
|
|
36
|
-
* `(no key)` for a profile that has one.
|
|
37
|
-
*/
|
|
38
|
-
export function resolveDraftKey(input) {
|
|
39
|
-
const nonEmpty = (value) => value && value.trim().length > 0 ? value.trim() : null;
|
|
40
|
-
if (input.credentialMode === 'replace')
|
|
41
|
-
return nonEmpty(input.draftKey);
|
|
42
|
-
if (input.credentialMode === 'keep') {
|
|
43
|
-
return nonEmpty(input.existingKey) ?? nonEmpty(input.sharedKey);
|
|
44
|
-
}
|
|
45
|
-
return nonEmpty(input.sharedKey);
|
|
46
|
-
}
|
|
47
|
-
/** Trailing slashes are not part of an endpoint's identity. */
|
|
48
|
-
function normalizeBaseUrl(baseUrl) {
|
|
49
|
-
const trimmed = (baseUrl ?? '').trim();
|
|
50
|
-
if (trimmed.length === 0)
|
|
51
|
-
return null;
|
|
52
|
-
return trimmed.replace(/\/+$/, '');
|
|
53
|
-
}
|
|
54
|
-
function keyDigest(apiKey) {
|
|
55
|
-
const trimmed = (apiKey ?? '').trim();
|
|
56
|
-
if (trimmed.length === 0)
|
|
57
|
-
return 'none';
|
|
58
|
-
return createHash('sha256').update(trimmed).digest('hex').slice(0, 12);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* The host a failure sentence names - same four clauses as
|
|
62
|
-
* `profileEndpointSummary()` in `ui/overlays/ModelProfilePicker.tsx`, which this
|
|
63
|
-
* layer may not import (agent -> ui would invert the layering). `model-probe.test.ts`
|
|
64
|
-
* asserts the two agree, so the duplication cannot drift silently.
|
|
65
|
-
*/
|
|
66
|
-
export function endpointHost(baseUrl) {
|
|
67
|
-
if (!baseUrl || baseUrl.trim().length === 0)
|
|
68
|
-
return 'the provider';
|
|
69
|
-
try {
|
|
70
|
-
const url = new URL(baseUrl.trim());
|
|
71
|
-
return url.username || url.password || url.search || url.hash ? 'this endpoint'
|
|
72
|
-
: url.host || 'the provider';
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return 'this endpoint';
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function fingerprint(provider, baseUrl, apiKey, model) {
|
|
79
|
-
const connection = `${provider}|${normalizeBaseUrl(baseUrl) ?? ''}|${keyDigest(apiKey)}`;
|
|
80
|
-
return model === undefined ? connection : `${connection}|${model.trim()}`;
|
|
81
|
-
}
|
|
82
|
-
/** Absolute sentence so a redacted, truncated message can never show a key. */
|
|
83
|
-
function redactDetail(text, secrets) {
|
|
84
|
-
let safe = text;
|
|
85
|
-
for (const secret of secrets) {
|
|
86
|
-
if (secret.length > 0)
|
|
87
|
-
safe = safe.split(secret).join('[redacted]');
|
|
88
|
-
}
|
|
89
|
-
return safe.replace(/[\u0000-\u001f\u007f]/g, ' ').slice(0, PROBE_LIMITS.detailChars);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* One timer, two recorded facts. `cancelled` and `timeout` must be distinguishable
|
|
93
|
-
* AFTER the fact, because an aborted adapter may resolve quietly or throw something
|
|
94
|
-
* that looks like a network error (§4.3 step 6).
|
|
95
|
-
*/
|
|
96
|
-
function createDeadline(timeoutMs, parent) {
|
|
97
|
-
const controller = new AbortController();
|
|
98
|
-
let fired = false;
|
|
99
|
-
const onParentAbort = () => controller.abort();
|
|
100
|
-
if (parent) {
|
|
101
|
-
if (parent.aborted)
|
|
102
|
-
controller.abort();
|
|
103
|
-
else
|
|
104
|
-
parent.addEventListener('abort', onParentAbort, { once: true });
|
|
105
|
-
}
|
|
106
|
-
const handle = setTimeout(() => { fired = true; controller.abort(); }, timeoutMs);
|
|
107
|
-
unrefTimer(handle);
|
|
108
|
-
return {
|
|
109
|
-
signal: controller.signal,
|
|
110
|
-
isFired: () => fired,
|
|
111
|
-
isCancelled: () => parent?.aborted === true,
|
|
112
|
-
dispose: () => {
|
|
113
|
-
clearTimeout(handle);
|
|
114
|
-
parent?.removeEventListener('abort', onParentAbort);
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Run the best-effort model list under a cap. It never rejects and never vetoes.
|
|
120
|
-
*
|
|
121
|
-
* The cap timer is `unref`'d exactly like the deadline (§4.8): after a fast verdict the
|
|
122
|
-
* list is still in flight, and a referenced five-second timer would keep the process
|
|
123
|
-
* alive on exit for a number nobody is going to read.
|
|
124
|
-
*
|
|
125
|
-
* Taking a THUNK rather than a promise is what stops a synchronous throw (§4.3 step 3):
|
|
126
|
-
* an adapter that fails before its first `await` - a test double, or a guard clause -
|
|
127
|
-
* would otherwise escape past this layer and cancel a completion not yet attempted.
|
|
128
|
-
*/
|
|
129
|
-
function withCap(call, ms) {
|
|
130
|
-
let pending;
|
|
131
|
-
try {
|
|
132
|
-
pending = call();
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
return Promise.resolve(undefined);
|
|
136
|
-
}
|
|
137
|
-
return new Promise((resolve) => {
|
|
138
|
-
const handle = setTimeout(() => resolve(undefined), ms);
|
|
139
|
-
unrefTimer(handle);
|
|
140
|
-
const settle = (value) => { clearTimeout(handle); resolve(value); };
|
|
141
|
-
pending.then((value) => settle(value), () => settle(undefined));
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
/** Timers and immediates both expose `unref<Timer>`; neither may outlive the probe. */
|
|
145
|
-
function unrefTimer(handle) {
|
|
146
|
-
const unrefable = handle;
|
|
147
|
-
unrefable.unref?.();
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* The list AS IT STANDS when the verdict is reached.
|
|
151
|
-
*
|
|
152
|
-
* One macrotask of grace, so a list that resolved while the completion was in flight
|
|
153
|
-
* publishes itself before we judge - and a list still in flight is NOT waited for,
|
|
154
|
-
* because it has no veto over the verdict (§4.3 step 3 / RV-P1-1).
|
|
155
|
-
*/
|
|
156
|
-
function listAtVerdict(listing) {
|
|
157
|
-
const grant = new Promise((resolve) => {
|
|
158
|
-
unrefTimer(setImmediate(() => resolve(undefined)));
|
|
159
|
-
});
|
|
160
|
-
return Promise.race([listing, grant]);
|
|
161
|
-
}
|
|
162
|
-
function guardFailure(provider, request, targetId) {
|
|
163
|
-
const base = { ok: false, targetId, latencyMs: 0 };
|
|
164
|
-
if (!provider) {
|
|
165
|
-
return { ...base, kind: 'unsupported_provider',
|
|
166
|
-
detail: `This build has no adapter for ${request.provider}.` };
|
|
167
|
-
}
|
|
168
|
-
if (!request.apiKey || request.apiKey.trim().length === 0) {
|
|
169
|
-
return { ...base, kind: 'missing_key',
|
|
170
|
-
detail: `No API key for ${request.provider}.${NO_KEY_DETAIL_SUFFIX}` };
|
|
171
|
-
}
|
|
172
|
-
if (request.baseUrl && !isValidEndpointUrl(request.baseUrl)) {
|
|
173
|
-
return { ...base, kind: 'invalid_base_url',
|
|
174
|
-
detail: 'Base URL must be an http(s) URL without credentials, query or fragment.' };
|
|
175
|
-
}
|
|
176
|
-
return undefined;
|
|
177
|
-
}
|
|
178
|
-
function mentionsModel(err) {
|
|
179
|
-
return /model/i.test(err.message);
|
|
180
|
-
}
|
|
181
|
-
/** The ONE classification matrix (§4.4). Signal facts are checked by the caller. */
|
|
182
|
-
function classifyError(err, facts) {
|
|
183
|
-
if (!(err instanceof LLMError))
|
|
184
|
-
return { kind: 'unknown', detail: UNKNOWN_DETAIL };
|
|
185
|
-
const status = typeof err.statusCode === 'number' ? err.statusCode : undefined;
|
|
186
|
-
const suffix = status === undefined ? '' : ` (HTTP ${status})`;
|
|
187
|
-
switch (err.errorType) {
|
|
188
|
-
case 'auth_error':
|
|
189
|
-
return { kind: 'auth', detail: `Key rejected by ${facts.provider}${suffix}.` };
|
|
190
|
-
case 'invalid_request':
|
|
191
|
-
case 'context_overflow':
|
|
192
|
-
return mentionsModel(err)
|
|
193
|
-
? { kind: 'model_not_found',
|
|
194
|
-
detail: `The provider did not accept model "${facts.model}"${suffix}.` }
|
|
195
|
-
: { kind: 'invalid_request', detail: `The provider rejected the request${suffix}.` };
|
|
196
|
-
case 'rate_limit':
|
|
197
|
-
return { kind: 'rate_limit',
|
|
198
|
-
detail: `Rate limited by ${facts.provider}${suffix || ' (HTTP 429)'}. Try again shortly.` };
|
|
199
|
-
case 'overloaded':
|
|
200
|
-
case 'server_error':
|
|
201
|
-
return { kind: 'provider_unavailable',
|
|
202
|
-
detail: `${facts.provider} is unavailable right now${suffix}.` };
|
|
203
|
-
case 'network_error':
|
|
204
|
-
return { kind: 'network',
|
|
205
|
-
detail: `Could not reach ${facts.host}. Check the base URL, DNS, proxy or VPN.` };
|
|
206
|
-
case 'timeout':
|
|
207
|
-
return { kind: 'timeout',
|
|
208
|
-
detail: `No answer from ${facts.host} within ${facts.timeoutSeconds} s.` };
|
|
209
|
-
default:
|
|
210
|
-
return { kind: 'unknown', detail: UNKNOWN_DETAIL };
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
function firstText(message) {
|
|
214
|
-
const block = message.content.find((part) => part.type === 'text');
|
|
215
|
-
return block && block.type === 'text' ? block.text : undefined;
|
|
216
|
-
}
|
|
217
|
-
/** Only text literally present in the error body may count as "the field is wrong". */
|
|
218
|
-
function errorBody(err) {
|
|
219
|
-
return typeof err.raw === 'string' ? err.raw : err.message;
|
|
220
|
-
}
|
|
221
|
-
function isTokenFieldRejection(err, provider) {
|
|
222
|
-
if (!(err instanceof LLMError))
|
|
223
|
-
return false;
|
|
224
|
-
return classifyOutputLimitFailure(provider, err.statusCode ?? 0, errorBody(err)) !== undefined;
|
|
225
|
-
}
|
|
226
|
-
function requestFor(request, deadline, maxTokens) {
|
|
227
|
-
return {
|
|
228
|
-
model: request.model.trim(),
|
|
229
|
-
messages: [{ role: 'user', content: PROBE_PROMPT }],
|
|
230
|
-
apiKey: request.apiKey ?? '',
|
|
231
|
-
...(request.baseUrl ? { baseUrl: request.baseUrl } : {}),
|
|
232
|
-
signal: deadline.signal,
|
|
233
|
-
...(maxTokens === undefined ? {} : { maxTokens }),
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
function logProbe(facts, outcome, now) {
|
|
237
|
-
try {
|
|
238
|
-
getLogger().child('llm').info('probe_result', {
|
|
239
|
-
provider: facts.provider, model: facts.model, host: facts.host,
|
|
240
|
-
latencyMs: outcome.latencyMs, ok: outcome.ok, kind: outcome.kind ?? 'ok',
|
|
241
|
-
at: now,
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
catch { /* logging must never fail a probe */ }
|
|
245
|
-
}
|
|
246
|
-
function candidateOf(model) {
|
|
247
|
-
return {
|
|
248
|
-
id: model.id,
|
|
249
|
-
name: model.name && model.name !== model.id ? model.name : model.id,
|
|
250
|
-
...(model.contextWindowSource === 'api' && model.contextWindow
|
|
251
|
-
? { contextWindow: model.contextWindow } : {}),
|
|
252
|
-
supportsTools: model.supportsTools === true,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
async function runDiscovery(provider, request, connectionId) {
|
|
256
|
-
const guard = guardFailure(provider, request, connectionId);
|
|
257
|
-
if (guard) {
|
|
258
|
-
return { ok: false, connectionId, kind: guard.kind, detail: guard.detail, models: [],
|
|
259
|
-
truncated: false, total: 0 };
|
|
260
|
-
}
|
|
261
|
-
const deadline = createDeadline(PROBE_LIMITS.discoveryTimeoutMs, request.signal);
|
|
262
|
-
const facts = { provider: request.provider, model: request.model,
|
|
263
|
-
host: endpointHost(request.baseUrl), timeoutSeconds: PROBE_LIMITS.discoveryTimeoutMs / 1000 };
|
|
264
|
-
try {
|
|
265
|
-
const listed = await provider.listModels(request.apiKey, request.baseUrl ?? undefined, deadline.signal);
|
|
266
|
-
const candidates = (listed ?? []).map(candidateOf).filter((entry) => entry.id.length > 0);
|
|
267
|
-
return { ok: true, connectionId, total: candidates.length,
|
|
268
|
-
models: candidates.slice(0, PROBE_LIMITS.maxListedModels),
|
|
269
|
-
truncated: candidates.length > PROBE_LIMITS.maxListedModels };
|
|
270
|
-
}
|
|
271
|
-
catch (failure) {
|
|
272
|
-
const verdict = request.signal?.aborted ? { kind: 'cancelled', detail: 'Cancelled.' }
|
|
273
|
-
: deadline.isFired()
|
|
274
|
-
? { kind: 'timeout',
|
|
275
|
-
detail: `No answer from ${facts.host} within ${facts.timeoutSeconds} s.` }
|
|
276
|
-
: classifyError(failure, facts);
|
|
277
|
-
return { ok: false, connectionId, kind: verdict.kind, detail: verdict.detail, models: [],
|
|
278
|
-
truncated: false, total: 0 };
|
|
279
|
-
}
|
|
280
|
-
finally {
|
|
281
|
-
deadline.dispose();
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
/** Create the probe port. One instance per App; `SettingsScreen` only passes it down. */
|
|
285
|
-
export function createModelProbe(deps) {
|
|
286
|
-
const now = deps.now ?? Date.now;
|
|
287
|
-
return {
|
|
288
|
-
targetFingerprint: (target) => fingerprint(target.provider, target.baseUrl, target.apiKey, target.model),
|
|
289
|
-
connectionFingerprint: (target) => fingerprint(target.provider, target.baseUrl, target.apiKey),
|
|
290
|
-
discover: (request) => runDiscovery(deps.registry.get(request.provider), request, fingerprint(request.provider, request.baseUrl, request.apiKey)),
|
|
291
|
-
test: (request) => runTest(deps, request),
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
async function runTest(deps, request) {
|
|
295
|
-
const clock = deps.now ?? Date.now;
|
|
296
|
-
const started = clock();
|
|
297
|
-
const targetId = fingerprint(request.provider, request.baseUrl, request.apiKey, request.model);
|
|
298
|
-
const provider = deps.registry.get(request.provider);
|
|
299
|
-
const guard = guardFailure(provider, request, targetId);
|
|
300
|
-
if (guard)
|
|
301
|
-
return guard;
|
|
302
|
-
const adapter = provider;
|
|
303
|
-
const deadline = createDeadline(PROBE_LIMITS.testTimeoutMs, request.signal);
|
|
304
|
-
const facts = { provider: request.provider, model: request.model.trim(),
|
|
305
|
-
host: endpointHost(request.baseUrl), timeoutSeconds: PROBE_LIMITS.testTimeoutMs / 1000 };
|
|
306
|
-
// The list runs CONCURRENTLY and has no veto (§4.3 step 3): it may only decorate a
|
|
307
|
-
// verdict the completion already produced. Nothing waits for it except the
|
|
308
|
-
// model-less path, which has no completion to wait for.
|
|
309
|
-
const listing = withCap(() => adapter.listModels(request.apiKey, request.baseUrl ?? undefined, deadline.signal), PROBE_LIMITS.listModelsBudgetMs);
|
|
310
|
-
try {
|
|
311
|
-
return await completeAndJudge(adapter, request, deadline, facts, { targetId, started, now: clock, listing });
|
|
312
|
-
}
|
|
313
|
-
finally {
|
|
314
|
-
deadline.dispose();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
async function completeAndJudge(provider, request, deadline, facts, context) {
|
|
318
|
-
const base = { targetId: context.targetId };
|
|
319
|
-
if (request.model.trim().length === 0) {
|
|
320
|
-
// Nothing to complete: list only, and report what the key can reach.
|
|
321
|
-
const reachable = await context.listing;
|
|
322
|
-
const latencyMs = context.now() - context.started;
|
|
323
|
-
if (request.signal?.aborted) {
|
|
324
|
-
return { ...base, ok: false, latencyMs, kind: 'cancelled', detail: 'Cancelled.' };
|
|
325
|
-
}
|
|
326
|
-
if (deadline.isFired()) {
|
|
327
|
-
return { ...base, ok: false, latencyMs, kind: 'timeout',
|
|
328
|
-
detail: `No answer from ${facts.host} within ${facts.timeoutSeconds} s.` };
|
|
329
|
-
}
|
|
330
|
-
return { ...base, ok: true, latencyMs,
|
|
331
|
-
...(reachable ? { availableModels: reachable.length } : {}) };
|
|
332
|
-
}
|
|
333
|
-
let message;
|
|
334
|
-
let failure;
|
|
335
|
-
try {
|
|
336
|
-
message = await provider.complete(requestFor(request, deadline, MIN_MAX_OUTPUT_TOKENS));
|
|
337
|
-
}
|
|
338
|
-
catch (error) {
|
|
339
|
-
failure = error;
|
|
340
|
-
}
|
|
341
|
-
if (failure !== undefined && isTokenFieldRejection(failure, request.provider)) {
|
|
342
|
-
// Exactly ONE repair retry with the cap left to the adapter's own learned field.
|
|
343
|
-
try {
|
|
344
|
-
message = await provider.complete(requestFor(request, deadline));
|
|
345
|
-
failure = undefined;
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
failure = error;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
const latencyMs = context.now() - context.started;
|
|
352
|
-
if (request.signal?.aborted) {
|
|
353
|
-
return { ...base, ok: false, latencyMs, kind: 'cancelled', detail: 'Cancelled.' };
|
|
354
|
-
}
|
|
355
|
-
if (deadline.isFired()) {
|
|
356
|
-
return { ...base, ok: false, latencyMs, kind: 'timeout',
|
|
357
|
-
detail: `No answer from ${facts.host} within ${facts.timeoutSeconds} s.` };
|
|
358
|
-
}
|
|
359
|
-
if (failure !== undefined || !message) {
|
|
360
|
-
const verdict = classifyError(failure, facts);
|
|
361
|
-
const secrets = [request.apiKey ?? ''];
|
|
362
|
-
const outcome = { ...base, ok: false, latencyMs, kind: verdict.kind,
|
|
363
|
-
detail: redactDetail(verdict.detail, secrets) };
|
|
364
|
-
const reachable = await listAtVerdict(context.listing);
|
|
365
|
-
if (reachable)
|
|
366
|
-
outcome.availableModels = reachable.length;
|
|
367
|
-
if (verdict.kind === 'model_not_found' && reachable) {
|
|
368
|
-
outcome.modelListed = reachable.some((model) => model.id === facts.model);
|
|
369
|
-
}
|
|
370
|
-
logProbe(facts, outcome, context.now());
|
|
371
|
-
return outcome;
|
|
372
|
-
}
|
|
373
|
-
const text = firstText(message);
|
|
374
|
-
if (text === undefined) {
|
|
375
|
-
const outcome = { ...base, ok: false, latencyMs, kind: 'unknown',
|
|
376
|
-
detail: UNKNOWN_DETAIL };
|
|
377
|
-
logProbe(facts, outcome, context.now());
|
|
378
|
-
return outcome;
|
|
379
|
-
}
|
|
380
|
-
const reachable = await listAtVerdict(context.listing);
|
|
381
|
-
const outcome = {
|
|
382
|
-
...base, ok: true, latencyMs,
|
|
383
|
-
reply: text.trim().slice(0, PROBE_LIMITS.replyChars),
|
|
384
|
-
...(message.usage ? { usage: { inputTokens: message.usage.inputTokens,
|
|
385
|
-
outputTokens: message.usage.outputTokens } } : {}),
|
|
386
|
-
...(reachable ? { availableModels: reachable.length,
|
|
387
|
-
modelListed: reachable.some((model) => model.id === facts.model) } : {}),
|
|
388
|
-
};
|
|
389
|
-
logProbe(facts, outcome, context.now());
|
|
390
|
-
return outcome;
|
|
391
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Entry } from './reducer.js';
|
|
2
|
-
import type { InvocationCard } from './invocation-card.js';
|
|
3
|
-
/** Full user text retained until Core acknowledges its opaque ID. */
|
|
4
|
-
export interface PendingSteering {
|
|
5
|
-
readonly queueId: string;
|
|
6
|
-
readonly text: string;
|
|
7
|
-
/** Carried so the `queued -> user` rewrite keeps the card (tui-invocation-cards). */
|
|
8
|
-
readonly invocation?: InvocationCard;
|
|
9
|
-
}
|
|
10
|
-
/** Hide only active pending entries, using the same projection for measurement and paint. */
|
|
11
|
-
export declare function selectTranscriptEntries(entries: Entry[], pending: readonly PendingSteering[]): Entry[];
|
|
12
|
-
/** Restore trimmed messages in FIFO order before atomically accepting known receipts. */
|
|
13
|
-
export declare function reconcileSteeringReceipt(options: {
|
|
14
|
-
entries: Entry[];
|
|
15
|
-
pending: readonly PendingSteering[];
|
|
16
|
-
ids: readonly string[];
|
|
17
|
-
}): {
|
|
18
|
-
entries: Entry[];
|
|
19
|
-
pending: PendingSteering[];
|
|
20
|
-
changed: boolean;
|
|
21
|
-
};
|
|
22
|
-
/** Supplement trimmed/cleared history for save and exit without deduplicating text. */
|
|
23
|
-
export declare function mergePendingEntries(entries: Entry[], pending: readonly PendingSteering[]): Entry[];
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/** Hide only active pending entries, using the same projection for measurement and paint. */
|
|
2
|
-
export function selectTranscriptEntries(entries, pending) {
|
|
3
|
-
if (pending.length === 0)
|
|
4
|
-
return entries;
|
|
5
|
-
const ids = new Set(pending.map((item) => item.queueId));
|
|
6
|
-
return entries.filter((entry) => entry.kind !== 'queued' || !ids.has(entry.queueId ?? ''));
|
|
7
|
-
}
|
|
8
|
-
/** Restore trimmed messages in FIFO order before atomically accepting known receipts. */
|
|
9
|
-
export function reconcileSteeringReceipt(options) {
|
|
10
|
-
const receipts = new Set(options.ids);
|
|
11
|
-
const ids = new Set(options.pending.filter((item) => receipts.has(item.queueId))
|
|
12
|
-
.map((item) => item.queueId));
|
|
13
|
-
if (!ids.size)
|
|
14
|
-
return { entries: options.entries, pending: [...options.pending], changed: false };
|
|
15
|
-
const entries = mergePendingEntries(options.entries, options.pending).map((entry) => entry.kind === 'queued' && ids.has(entry.queueId ?? '')
|
|
16
|
-
? {
|
|
17
|
-
id: entry.id, kind: 'user', text: entry.text,
|
|
18
|
-
...(entry.invocation ? { invocation: entry.invocation } : {}),
|
|
19
|
-
} : entry);
|
|
20
|
-
return { entries, pending: options.pending.filter((item) => !ids.has(item.queueId)), changed: true };
|
|
21
|
-
}
|
|
22
|
-
/** Supplement trimmed/cleared history for save and exit without deduplicating text. */
|
|
23
|
-
export function mergePendingEntries(entries, pending) {
|
|
24
|
-
if (pending.length === 0)
|
|
25
|
-
return entries;
|
|
26
|
-
const positions = new Map(pending.map((item, index) => [item.queueId, index]));
|
|
27
|
-
const visible = new Map(entries.flatMap((entry) => entry.kind === 'queued' && entry.queueId !== undefined
|
|
28
|
-
? [[entry.queueId, entry]] : []));
|
|
29
|
-
const merged = [];
|
|
30
|
-
let cursor = 0;
|
|
31
|
-
const appendThrough = (last) => {
|
|
32
|
-
while (cursor <= last) {
|
|
33
|
-
const item = pending[cursor++];
|
|
34
|
-
const existing = visible.get(item.queueId);
|
|
35
|
-
merged.push(existing ? { ...existing, text: item.text } :
|
|
36
|
-
{ id: `pending:${item.queueId}`, kind: 'queued', ...item });
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
for (const entry of entries) {
|
|
40
|
-
const position = entry.kind === 'queued' && entry.queueId !== undefined
|
|
41
|
-
? positions.get(entry.queueId) : undefined;
|
|
42
|
-
if (position === undefined)
|
|
43
|
-
merged.push(entry);
|
|
44
|
-
else
|
|
45
|
-
appendThrough(position);
|
|
46
|
-
}
|
|
47
|
-
appendThrough(pending.length - 1);
|
|
48
|
-
return merged;
|
|
49
|
-
}
|