@pellux/goodvibes-tui 2.0.21 → 2.1.0
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 +58 -0
- package/README.md +16 -16
- package/docs/README.md +4 -4
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +16 -6
- package/src/cli/management.ts +5 -2
- package/src/cli/tui-startup.ts +34 -39
- package/src/core/agent-view-render.ts +157 -0
- package/src/core/approval-alert.ts +49 -11
- package/src/core/bookmark-navigation.ts +7 -1
- package/src/core/budget-breach-notifier.ts +27 -8
- package/src/core/compaction-receipt.ts +1 -1
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-display-only.ts +86 -0
- package/src/core/conversation-event-navigation.ts +27 -0
- package/src/core/conversation-line-cache.ts +216 -447
- package/src/core/conversation-render-context.ts +20 -27
- package/src/core/conversation-rendering.ts +157 -575
- package/src/core/conversation-splash-state.ts +6 -1
- package/src/core/conversation-types.ts +35 -0
- package/src/core/conversation-usage.ts +12 -0
- package/src/core/conversation.ts +130 -131
- package/src/core/long-task-notifier.ts +100 -31
- package/src/core/notices.ts +75 -0
- package/src/core/pairing-tailscale-gateway.ts +1 -1
- package/src/core/process-output-log.ts +143 -0
- package/src/core/rewind-receipt.ts +1 -1
- package/src/core/session-focus.ts +190 -0
- package/src/core/session-resume-core.ts +23 -81
- package/src/core/stream-event-wiring.ts +31 -5
- package/src/core/system-message-noise.ts +2 -2
- package/src/core/system-message-router.ts +16 -18
- package/src/core/turn-event-wiring.ts +272 -33
- package/src/core/work-tree-focus.ts +290 -0
- package/src/core/work-tree-fold-store.ts +143 -0
- package/src/core/work-tree-model.ts +799 -0
- package/src/core/work-tree-render.ts +384 -0
- package/src/core/work-tree-sources.ts +184 -0
- package/src/core/work-tree-wiring.ts +176 -0
- package/src/core/workstream-notification.ts +36 -6
- package/src/core/wrfc-notice-titles.ts +37 -0
- package/src/input/agents-modal-text.ts +119 -0
- package/src/input/agents-modal.ts +699 -0
- package/src/input/bookmark-modal.ts +33 -9
- package/src/input/changes-git.ts +251 -0
- package/src/input/changes-modal.ts +629 -0
- package/src/input/changes-model.ts +125 -0
- package/src/input/command-palette-types.ts +41 -0
- package/src/input/command-palette.ts +272 -0
- package/src/input/command-registry.ts +77 -35
- package/src/input/commands/acp-runtime.ts +19 -9
- package/src/input/commands/channel-runtime.ts +2 -2
- package/src/input/commands/ci-runtime.ts +1 -1
- package/src/input/commands/codebase-runtime.ts +1 -1
- package/src/input/commands/config.ts +7 -1
- package/src/input/commands/context-window.ts +25 -19
- package/src/input/commands/control-room-runtime.ts +18 -18
- package/src/input/commands/conversation-runtime.ts +0 -1
- package/src/input/commands/cost-runtime.ts +29 -20
- package/src/input/commands/diff-runtime.ts +35 -181
- package/src/input/commands/eval.ts +1 -1
- package/src/input/commands/experience-runtime.ts +3 -7
- package/src/input/commands/fresh-conversation.ts +86 -0
- package/src/input/commands/git-runtime.ts +5 -22
- package/src/input/commands/graph-runtime.ts +1 -1
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +8 -9
- package/src/input/commands/hooks-runtime.ts +2 -2
- package/src/input/commands/hosted-runtime.ts +3 -3
- package/src/input/commands/incident-runtime.ts +3 -3
- package/src/input/commands/intelligence-runtime.ts +6 -9
- package/src/input/commands/knowledge.ts +2 -2
- package/src/input/commands/legacy-panel-command.ts +57 -0
- package/src/input/commands/local-auth-runtime.ts +8 -9
- package/src/input/commands/local-provider-runtime.ts +7 -4
- package/src/input/commands/local-runtime.ts +12 -15
- package/src/input/commands/local-setup-review.ts +1 -1
- package/src/input/commands/local-setup.ts +13 -19
- package/src/input/commands/memory.ts +1 -1
- package/src/input/commands/notify-runtime.ts +9 -0
- package/src/input/commands/operator-runtime.ts +10 -12
- package/src/input/commands/permissions-provenance.ts +3 -3
- package/src/input/commands/planning-runtime.ts +7 -7
- package/src/input/commands/platform-sandbox-runtime.ts +2 -2
- package/src/input/commands/platform-services-runtime.ts +1 -1
- package/src/input/commands/policy-dispatch.ts +2 -2
- package/src/input/commands/policy.ts +3 -3
- package/src/input/commands/provider.ts +1 -1
- package/src/input/commands/remote-runtime.ts +1 -1
- package/src/input/commands/review-runtime.ts +39 -94
- package/src/input/commands/rewind-runtime.ts +81 -108
- package/src/input/commands/runtime-services.ts +15 -17
- package/src/input/commands/services-runtime.ts +2 -2
- package/src/input/commands/session-content.ts +21 -5
- package/src/input/commands/session-workflow.ts +13 -38
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/shell-core.ts +19 -4
- package/src/input/commands/skills-runtime.ts +2 -2
- package/src/input/commands/status-runtime.ts +13 -0
- package/src/input/commands/subscription-runtime.ts +1 -1
- package/src/input/commands/tasks-runtime.ts +2 -8
- package/src/input/commands/work-plan-runtime.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +24 -47
- package/src/input/commands/workstream-runtime.ts +2 -2
- package/src/input/commands/worktree-runtime.ts +3 -3
- package/src/input/commands.ts +3 -1
- package/src/input/composer-editor.ts +44 -0
- package/src/input/concealed-input.ts +1 -1
- package/src/input/config-modal-types.ts +20 -8
- package/src/input/config-modal.ts +106 -105
- package/src/input/confirm-dialog-types.ts +28 -0
- package/src/input/confirm-dialog.ts +70 -0
- package/src/input/delete-key-policy.ts +3 -3
- package/src/input/feed-context-factory.ts +15 -16
- package/src/input/handler-command-route.ts +7 -42
- package/src/input/handler-content-actions.ts +16 -15
- package/src/input/handler-feed-routes.ts +26 -211
- package/src/input/handler-feed.ts +68 -95
- package/src/input/handler-interactions.ts +5 -3
- package/src/input/handler-modal-routes.ts +215 -216
- package/src/input/handler-modal-stack.ts +81 -11
- package/src/input/handler-modal-token-routes.ts +4 -0
- package/src/input/handler-onboarding.ts +0 -1
- package/src/input/handler-picker-routes.ts +65 -107
- package/src/input/handler-session-view-route.ts +149 -0
- package/src/input/handler-shortcuts.ts +16 -154
- package/src/input/handler-types.ts +4 -2
- package/src/input/handler-ui-state.ts +45 -15
- package/src/input/handler-work-tree-route.ts +123 -0
- package/src/input/handler.ts +25 -70
- package/src/input/keybindings.ts +16 -71
- package/src/input/masked-entry-modal.ts +117 -0
- package/src/input/mcp-workspace.ts +48 -17
- package/src/input/model-picker-filter.ts +8 -0
- package/src/input/model-picker-open.ts +99 -0
- package/src/input/model-picker-types.ts +1 -1
- package/src/input/model-picker.ts +92 -9
- package/src/input/notifications-modal.ts +123 -0
- package/src/input/overlay-filter.ts +26 -0
- package/src/input/profile-picker-modal.ts +37 -8
- package/src/input/search.ts +3 -3
- package/src/input/selection-modal-queue.ts +2 -0
- package/src/input/selection-modal.ts +28 -16
- package/src/input/session-picker-modal.ts +33 -8
- package/src/input/settings-modal-activation.ts +7 -2
- package/src/input/settings-modal-data.ts +11 -6
- package/src/input/settings-modal-types.ts +1 -1
- package/src/input/settings-modal.ts +20 -20
- package/src/input/submission-intent.ts +1 -1
- package/src/input/submission-router.ts +4 -9
- package/src/input/surface-modal-host.ts +110 -0
- package/src/input/theme-settings-actions.ts +82 -0
- package/src/input/usage-modal.ts +183 -0
- package/src/input/views.ts +97 -0
- package/src/main.ts +175 -165
- package/src/permissions/hunk-selection.ts +1 -1
- package/src/permissions/prompt-card.ts +511 -0
- package/src/permissions/prompt.ts +59 -622
- package/src/renderer/agents-modal.ts +310 -0
- package/src/renderer/autocomplete-overlay.ts +42 -220
- package/src/renderer/back-to-bottom.ts +80 -0
- package/src/renderer/block-actions-overlay.ts +30 -48
- package/src/renderer/bookmark-modal.ts +48 -79
- package/src/renderer/changes-modal.ts +325 -0
- package/src/renderer/code-block.ts +184 -106
- package/src/renderer/command-palette.ts +93 -0
- package/src/renderer/composer-fragments.ts +4 -4
- package/src/renderer/composer.ts +146 -0
- package/src/renderer/compositor.ts +26 -160
- package/src/renderer/config-modal.ts +185 -81
- package/src/renderer/confirm-dialog.ts +50 -0
- package/src/renderer/context-inspector.ts +116 -154
- package/src/renderer/context-status-hint.ts +4 -4
- package/src/renderer/conversation-layout.ts +20 -0
- package/src/renderer/conversation-overlays.ts +94 -84
- package/src/renderer/conversation-surface.ts +19 -38
- package/src/renderer/diff-tint.ts +98 -0
- package/src/renderer/file-picker-overlay.ts +63 -90
- package/src/renderer/footer-targets.ts +38 -0
- package/src/renderer/git-status.ts +3 -4
- package/src/renderer/header-line.ts +140 -117
- package/src/renderer/help-overlay.ts +133 -219
- package/src/renderer/history-search-overlay.ts +15 -12
- package/src/renderer/lane-graph/bead.ts +800 -0
- package/src/renderer/lane-graph/glyphs.ts +134 -0
- package/src/renderer/lane-graph/layout.ts +248 -0
- package/src/renderer/lane-graph/paint.ts +537 -0
- package/src/renderer/lane-graph/semantic-memo.ts +77 -0
- package/src/renderer/layout-engine.ts +2 -57
- package/src/renderer/layout.ts +7 -13
- package/src/renderer/markdown-inline.ts +2 -1
- package/src/renderer/markdown-table.ts +17 -12
- package/src/renderer/markdown.ts +92 -34
- package/src/renderer/masked-entry-modal.ts +78 -0
- package/src/renderer/mcp-workspace.ts +166 -203
- package/src/renderer/model-workspace.ts +381 -436
- package/src/renderer/notifications-modal.ts +116 -0
- package/src/renderer/onboarding/onboarding-wizard.ts +178 -588
- package/src/renderer/process-view.ts +192 -0
- package/src/renderer/profile-picker-modal.ts +58 -110
- package/src/renderer/search-overlay.ts +6 -3
- package/src/renderer/selection-modal-overlay.ts +87 -327
- package/src/renderer/semantic-diff.ts +2 -2
- package/src/renderer/session-chips.ts +102 -0
- package/src/renderer/session-picker-modal.ts +177 -297
- package/src/renderer/settings-modal-connections.ts +14 -23
- package/src/renderer/settings-modal-context.ts +367 -0
- package/src/renderer/settings-modal-helpers.ts +6 -11
- package/src/renderer/settings-modal.ts +322 -726
- package/src/renderer/shell-surface.ts +277 -175
- package/src/renderer/shortcuts-overlay.ts +217 -0
- package/src/renderer/status-line.ts +475 -0
- package/src/renderer/surface-compose.ts +174 -0
- package/src/renderer/surface-kit-extra.ts +303 -0
- package/src/renderer/surface-kit-list.ts +366 -0
- package/src/renderer/surface-kit-parts.ts +360 -0
- package/src/renderer/surface-kit.ts +568 -0
- package/src/renderer/syntax-highlighter.ts +280 -197
- package/src/renderer/syntax-theme.ts +51 -0
- package/src/renderer/system-message.ts +0 -1
- package/src/renderer/term-caps.ts +42 -1
- package/src/renderer/terminal-bg-probe.ts +116 -19
- package/src/renderer/terminal-palette-probe.ts +322 -0
- package/src/renderer/terminal-palette-reader.ts +183 -0
- package/src/renderer/terminal-palette.ts +58 -0
- package/src/renderer/theme-mode-config.ts +16 -1
- package/src/renderer/theme.ts +234 -207
- package/src/renderer/thinking.ts +0 -1
- package/src/renderer/throbber.ts +188 -0
- package/src/renderer/toast-center.ts +119 -0
- package/src/renderer/ui-factory.ts +39 -602
- package/src/renderer/ui-primitives.ts +8 -25
- package/src/renderer/usage-modal.ts +353 -0
- package/src/renderer/user-message.ts +58 -0
- package/src/renderer/voice-capture-chip.ts +53 -0
- package/src/runtime/bootstrap-command-context.ts +0 -5
- package/src/runtime/bootstrap-command-parts.ts +38 -89
- package/src/runtime/bootstrap-core.ts +13 -15
- package/src/runtime/bootstrap-hook-bridge.ts +12 -21
- package/src/runtime/bootstrap-notifier-sync.ts +17 -1
- package/src/runtime/bootstrap-shell.ts +16 -50
- package/src/runtime/bootstrap.ts +14 -14
- package/src/runtime/client/fleet-union.ts +5 -5
- package/src/runtime/client/hosted-exit.ts +2 -2
- package/src/runtime/client/hosted-sessions.ts +1 -1
- package/src/runtime/client/spine-adoption.ts +1 -1
- package/src/runtime/context-accounting-source.ts +5 -4
- package/src/runtime/index.ts +1 -0
- package/src/runtime/notification-dispatch.ts +102 -29
- package/src/runtime/recovery-offer-wiring.ts +4 -1
- package/src/runtime/recovery-prompt.ts +31 -15
- package/src/runtime/runtime-services-types.ts +10 -6
- package/src/runtime/services.ts +17 -12
- package/src/runtime/session-continuity-hints.ts +2 -5
- package/src/runtime/session-inbound-inputs.ts +1 -1
- package/src/runtime/session-resume-liveness-confirm.ts +14 -2
- package/src/runtime/startup-typeahead-gate.ts +103 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +0 -1
- package/src/runtime/store/domains/index.ts +0 -8
- package/src/runtime/store/selectors/index.ts +0 -28
- package/src/runtime/store/state.ts +0 -8
- package/src/runtime/ui-services.ts +4 -6
- package/src/runtime/usage-tracker.ts +348 -0
- package/src/runtime/wrfc-persistence.ts +4 -4
- package/src/shell/blocking-input.ts +92 -2
- package/src/shell/recovery-input-helpers.ts +1 -1
- package/src/shell/session-views.ts +539 -0
- package/src/shell/status-report.ts +86 -0
- package/src/shell/transcript-scroll.ts +68 -0
- package/src/shell/ui-openers.ts +84 -172
- package/src/shell/view-openers.ts +205 -0
- package/src/tools/wrfc-agent-guard.ts +22 -2
- package/src/utils/format-duration.ts +4 -8
- package/src/utils/splash-lines.ts +9 -1
- package/src/utils/terminal-width.ts +56 -0
- package/src/verification/verification-ledger.ts +18 -16
- package/src/{panels → views}/agent-inspector-shared.ts +2 -2
- package/src/{panels → views}/builtin-modals.ts +22 -21
- package/src/views/builtin-views.ts +135 -0
- package/src/{panels → views}/confirm-state.ts +9 -9
- package/src/{panels → views}/diff-review-model.ts +10 -3
- package/src/{panels → views}/eval-registry.ts +1 -1
- package/src/{panels → views}/fleet-acts.ts +49 -85
- package/src/{panels/fleet-panel-format.ts → views/fleet-format.ts} +40 -40
- package/src/{panels → views}/fleet-gateway.ts +5 -5
- package/src/{panels → views}/fleet-observed-render.ts +16 -16
- package/src/{panels → views}/fleet-read-model.ts +9 -9
- package/src/{panels/fleet-tabs.ts → views/fleet-session-tabs.ts} +13 -13
- package/src/{panels → views}/fleet-spawn.ts +33 -49
- package/src/{panels → views}/fleet-steer.ts +12 -12
- package/src/{panels → views}/fleet-stop.ts +4 -4
- package/src/{panels → views}/fleet-transcript.ts +26 -27
- package/src/{panels/fleet-panel-worktree-detail.ts → views/fleet-worktree-detail.ts} +7 -7
- package/src/{panels → views}/hosted-session-feed.ts +6 -6
- package/src/views/modal-surface-registry.ts +41 -0
- package/src/{panels → views}/modals/devices-modal.ts +2 -2
- package/src/{panels → views}/modals/hooks-modal.ts +13 -13
- package/src/{panels → views}/modals/keybindings-modal.ts +19 -27
- package/src/{panels → views}/modals/knowledge-modal.ts +6 -5
- package/src/{panels → views}/modals/local-auth-modal.ts +22 -21
- package/src/{panels → views}/modals/marketplace-modal.ts +11 -11
- package/src/{panels → views}/modals/memory-modal.ts +8 -8
- package/src/{panels → views}/modals/modal-surface-helpers.ts +15 -5
- package/src/{panels → views}/modals/pairing-modal.ts +9 -9
- package/src/{panels → views}/modals/planning-modal.ts +15 -20
- package/src/{panels → views}/modals/plugins-modal.ts +6 -6
- package/src/{panels → views}/modals/policy-modal.ts +13 -5
- package/src/{panels → views}/modals/provider-health-modal.ts +4 -4
- package/src/{panels → views}/modals/remote-modal.ts +3 -3
- package/src/{panels → views}/modals/sandbox-modal.ts +4 -4
- package/src/{panels → views}/modals/security-modal.ts +22 -16
- package/src/{panels → views}/modals/services-modal.ts +3 -3
- package/src/{panels → views}/modals/settings-sync-modal.ts +4 -4
- package/src/{panels → views}/modals/skills-modal.ts +9 -9
- package/src/{panels → views}/modals/subscription-modal.ts +3 -3
- package/src/{panels → views}/modals/work-plan-modal.ts +10 -13
- package/src/views/notifications-feed.ts +314 -0
- package/src/{panels → views}/polish-core.ts +38 -36
- package/src/{panels → views}/polish-tables.ts +35 -26
- package/src/{panels → views}/polish.ts +101 -95
- package/src/{panels → views}/project-planning-answer-actions.ts +3 -3
- package/src/{panels → views}/provider-health-routes.ts +14 -14
- package/src/{panels → views}/search-focus.ts +8 -8
- package/src/{panels → views}/session-maintenance.ts +11 -11
- package/src/views/skills-discovery.ts +159 -0
- package/src/views/view-deps.ts +80 -0
- package/src/views/view-panel-adapter.ts +53 -0
- package/src/{panels → views}/workstream-graph-render.ts +1 -1
- package/src/core/conversation-fold.ts +0 -101
- package/src/core/conversation-turn-structure.ts +0 -464
- package/src/core/conversation-user-receipts.ts +0 -42
- package/src/input/commands/operator-panel-runtime.ts +0 -186
- package/src/input/panel-integration-actions.ts +0 -33
- package/src/input/panel-mouse-geometry.ts +0 -97
- package/src/input/panel-paste-flood-guard.ts +0 -86
- package/src/panels/base-panel.ts +0 -301
- package/src/panels/builtin/agent.ts +0 -27
- package/src/panels/builtin/development.ts +0 -92
- package/src/panels/builtin/knowledge.ts +0 -12
- package/src/panels/builtin/operations.ts +0 -177
- package/src/panels/builtin/session.ts +0 -81
- package/src/panels/builtin/shared.ts +0 -357
- package/src/panels/builtin-panels.ts +0 -28
- package/src/panels/cost-tracker-panel.ts +0 -746
- package/src/panels/diff-panel.ts +0 -797
- package/src/panels/diff-review-panel.ts +0 -395
- package/src/panels/expandable-list-panel.ts +0 -189
- package/src/panels/fleet-deep-link.ts +0 -31
- package/src/panels/fleet-panel.ts +0 -799
- package/src/panels/git-panel.ts +0 -800
- package/src/panels/hosted-session-panel.ts +0 -221
- package/src/panels/index.ts +0 -21
- package/src/panels/local-auth-panel.ts +0 -478
- package/src/panels/notifications-feed.ts +0 -127
- package/src/panels/notifications-panel.ts +0 -160
- package/src/panels/panel-confirm-overlay.ts +0 -72
- package/src/panels/panel-manager.ts +0 -791
- package/src/panels/plugins-panel.ts +0 -371
- package/src/panels/scrollable-list-panel.ts +0 -498
- package/src/panels/skills-panel.ts +0 -454
- package/src/panels/token-budget-panel.ts +0 -688
- package/src/panels/types.ts +0 -191
- package/src/panels/wrfc-panel-format.ts +0 -133
- package/src/renderer/diff-view.ts +0 -134
- package/src/renderer/fleet-tab-strip.ts +0 -56
- package/src/renderer/footer-tips.ts +0 -53
- package/src/renderer/fullscreen-primitives.ts +0 -146
- package/src/renderer/fullscreen-workspace.ts +0 -194
- package/src/renderer/hint-grammar.ts +0 -52
- package/src/renderer/modal-factory.ts +0 -480
- package/src/renderer/overlay-box.ts +0 -154
- package/src/renderer/overlay-viewport.ts +0 -104
- package/src/renderer/panel-composite.ts +0 -145
- package/src/renderer/panel-workspace-bar.ts +0 -54
- package/src/renderer/process-indicator.ts +0 -163
- package/src/renderer/tab-strip.ts +0 -222
- package/src/renderer/text-layout.ts +0 -31
- package/src/renderer/tool-call.ts +0 -276
- package/src/renderer/tool-result-expanded-lines.ts +0 -48
- package/src/renderer/tool-result-summary.ts +0 -219
- package/src/runtime/diagnostics/panels/index.ts +0 -21
- package/src/runtime/diagnostics/panels/ops.ts +0 -156
- package/src/runtime/perf/panel-contracts.ts +0 -32
- package/src/runtime/store/domains/panels.ts +0 -117
- /package/src/{panels → views}/memory-consolidation-gateway.ts +0 -0
- /package/src/{panels → views}/modals/modal-theme.ts +0 -0
- /package/src/{panels → views}/provider-health-domains.ts +0 -0
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
// pickAttemptWinner, the same seam the fleet.attempts.* gateway verbs use).
|
|
8
8
|
// This module drives that seam from the /workstream command:
|
|
9
9
|
// • list , the held-merge groups awaiting a pick, with candidates.
|
|
10
|
-
// • diff <c> , one candidate's worktree diff in
|
|
10
|
+
// • diff <c> , one candidate's worktree diff in a Changes preview.
|
|
11
11
|
// • judge , the OPTIONAL model proposal, clearly labelled a model
|
|
12
12
|
// judgment (scoredBy 'model'), with its reasons; never a pick.
|
|
13
|
-
// • pick <c> , behind a
|
|
13
|
+
// • pick <c> , behind a question on its Changes preview; merges the winner and lets
|
|
14
14
|
// the engine clean the losers, then renders the receipt.
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
|
|
@@ -24,7 +24,6 @@ import { AttemptError } from '@pellux/goodvibes-sdk/platform/orchestration';
|
|
|
24
24
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
25
25
|
import type { CommandContext } from '../command-registry.ts';
|
|
26
26
|
import type { WorkstreamCommandService } from '@pellux/goodvibes-sdk/platform/orchestration';
|
|
27
|
-
import { requirePanelManager } from './runtime-services.ts';
|
|
28
27
|
import { describeFailureReason, isTurnBudgetReason } from '../../core/turn-budget-outcome.ts';
|
|
29
28
|
import { type AttemptGraphItem, renderDependentHoldLines } from './workstream-attempt-dependents.ts';
|
|
30
29
|
|
|
@@ -183,15 +182,9 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
|
|
|
183
182
|
ctx.print(`Attempt ${cand.attemptIndex + 1} has no viewable diff (${cand.state === 'failed' ? 'it failed' : 'its worktree was already cleaned'}).`);
|
|
184
183
|
return true;
|
|
185
184
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (!panel) { try { panel = pm.open('diff'); } catch { ctx.print('Could not open the diff panel.'); return true; } }
|
|
190
|
-
pm.activateById('diff');
|
|
191
|
-
if (!pm.isVisible()) pm.show();
|
|
192
|
-
ctx.focusPanels?.();
|
|
193
|
-
(panel as InstanceType<typeof DiffPanel>).loadRawDiff(cand.diff.unifiedDiff);
|
|
194
|
-
ctx.print(`Showing attempt ${cand.attemptIndex + 1} ("${cand.title}") diff in the diff panel.`);
|
|
185
|
+
if (!ctx.previewChanges) { ctx.print('Showing a diff needs the Changes view, which is not available in this session.'); return true; }
|
|
186
|
+
void ctx.previewChanges({ title: `attempt ${cand.attemptIndex + 1}: ${cand.title}`, diff: cand.diff.unifiedDiff });
|
|
187
|
+
ctx.print(`Showing attempt ${cand.attemptIndex + 1} ("${cand.title}") in Changes.`);
|
|
195
188
|
ctx.renderRequest();
|
|
196
189
|
return true;
|
|
197
190
|
}
|
|
@@ -204,42 +197,26 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
|
|
|
204
197
|
if ('error' in cand) { ctx.print(cand.error); return true; }
|
|
205
198
|
if (cand.state !== 'held-merge') { ctx.print(`Attempt ${cand.attemptIndex + 1} failed: only a held (pick-ready) candidate can win.`); return true; }
|
|
206
199
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (cand.diff?.unifiedDiff.trim()) diffPanel.loadRawDiff(cand.diff.unifiedDiff);
|
|
216
|
-
else diffPanel.showDiff(cand.title, '@@ pick @@\n (no diff to preview for this candidate)');
|
|
217
|
-
|
|
218
|
-
diffPanel.confirmOverlay.arm({
|
|
219
|
-
id: `${group.groupId}:${cand.itemId}`,
|
|
220
|
-
label: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}"): merge it, clean the ${group.candidates.length - 1} other worktree(s)`,
|
|
221
|
-
verb: 'Pick',
|
|
222
|
-
onConfirm: async () => {
|
|
223
|
-
try {
|
|
224
|
-
const result = await service.engine.pickAttemptWinner(group.groupId, cand.itemId);
|
|
225
|
-
pm.close('diff');
|
|
226
|
-
ctx.focusPrompt?.();
|
|
227
|
-
ctx.print(renderPickReceipt(result));
|
|
228
|
-
} catch (err) {
|
|
229
|
-
pm.close('diff');
|
|
230
|
-
ctx.focusPrompt?.();
|
|
231
|
-
ctx.print(err instanceof AttemptError ? `Pick refused: ${err.message}` : `Pick failed: ${summarizeError(err)}`);
|
|
232
|
-
}
|
|
233
|
-
ctx.renderRequest();
|
|
234
|
-
},
|
|
235
|
-
onCancel: () => {
|
|
236
|
-
pm.close('diff');
|
|
237
|
-
ctx.focusPrompt?.();
|
|
238
|
-
ctx.print('Pick cancelled: nothing merged, no worktree cleaned.');
|
|
239
|
-
ctx.renderRequest();
|
|
240
|
-
},
|
|
200
|
+
if (!ctx.previewChanges) { ctx.print('Confirming a pick needs the Changes view, which is not available in this session.'); return true; }
|
|
201
|
+
ctx.print(`Confirm the pick in Changes: Enter or y merges attempt ${cand.attemptIndex + 1} and cleans the losers, n or Esc cancels.`);
|
|
202
|
+
ctx.renderRequest();
|
|
203
|
+
const confirmed = await ctx.previewChanges({
|
|
204
|
+
title: `attempt ${cand.attemptIndex + 1}: ${cand.title}`,
|
|
205
|
+
diff: cand.diff?.unifiedDiff.trim() ? cand.diff.unifiedDiff : undefined,
|
|
206
|
+
note: cand.diff?.unifiedDiff.trim() ? undefined : 'This candidate has no diff to preview.',
|
|
207
|
+
question: { text: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}")? It merges, and the ${group.candidates.length - 1} other worktree(s) are cleaned.`, confirmLabel: 'Pick', tone: 'warning' },
|
|
241
208
|
});
|
|
242
|
-
|
|
209
|
+
if (!confirmed) {
|
|
210
|
+
ctx.print('Pick cancelled: nothing merged, no worktree cleaned.');
|
|
211
|
+
ctx.renderRequest();
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const result = await service.engine.pickAttemptWinner(group.groupId, cand.itemId);
|
|
216
|
+
ctx.print(renderPickReceipt(result));
|
|
217
|
+
} catch (err) {
|
|
218
|
+
ctx.print(err instanceof AttemptError ? `Pick refused: ${err.message}` : `Pick failed: ${summarizeError(err)}`);
|
|
219
|
+
}
|
|
243
220
|
ctx.renderRequest();
|
|
244
221
|
return true;
|
|
245
222
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// already is (bootstrap-command-context.ts).
|
|
9
9
|
//
|
|
10
10
|
// Render precedent: TRANSCRIPT + subcommand approve (like /plan approve,
|
|
11
|
-
// planning-runtime.ts), NOT a
|
|
11
|
+
// planning-runtime.ts), NOT a modal, a multi-phase proposal is too rich for
|
|
12
12
|
// a one-line confirm overlay, and Pillar-3 doctrine keeps work visible in the
|
|
13
13
|
// transcript. create -> approve -> launch is a real three-step flow (edit and
|
|
14
14
|
// cancel apply to the pending proposal too). The transcript IS the plan-review
|
|
@@ -126,7 +126,7 @@ async function launchApprovedDraft(ctx: CommandContext, service: WorkstreamComma
|
|
|
126
126
|
ctx.print(`Could not launch ${id}.`);
|
|
127
127
|
return;
|
|
128
128
|
}
|
|
129
|
-
ctx.print(`Launched workstream ${result.workstreamId}: track it with /workstream status ${result.workstreamId} or
|
|
129
|
+
ctx.print(`Launched workstream ${result.workstreamId}: track it with /workstream status ${result.workstreamId} or in Agents (F2).`);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getPersistedWorktreeMeta, reviewWorktreeAttachments, summarizeWorktreeOwnership } from '@/runtime/index.ts';
|
|
2
2
|
import type { ManagedWorktreeMeta } from '@/runtime/index.ts';
|
|
3
3
|
import type { CommandRegistry } from '../command-registry.ts';
|
|
4
|
-
import {
|
|
4
|
+
import { openCommandView, requireShellPaths } from './runtime-services.ts';
|
|
5
5
|
import { describeOperatorRpcError, getOperatorRpc } from './operator-rpc.ts';
|
|
6
6
|
|
|
7
7
|
/** Compact per-row setup-state tag for /worktree review, absent when setup has never run; failure stands out. */
|
|
@@ -43,7 +43,7 @@ export function registerWorktreeRuntimeCommands(registry: CommandRegistry): void
|
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
if (sub === 'panel' || sub === 'open') {
|
|
46
|
-
|
|
46
|
+
openCommandView(ctx, 'worktrees');
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
if (sub === 'inspect') {
|
|
@@ -149,7 +149,7 @@ export function registerWorktreeRuntimeCommands(registry: CommandRegistry): void
|
|
|
149
149
|
// Discard is a real destructive act, not a metadata flip: route it
|
|
150
150
|
// through the worktrees.discard operator verb (preservation commit,
|
|
151
151
|
// git worktree removal, honest receipt), the SAME behavior as the
|
|
152
|
-
//
|
|
152
|
+
// Agents modal's D key. Typing the verb with an explicit path is the
|
|
153
153
|
// confirmation.
|
|
154
154
|
const path = args[1];
|
|
155
155
|
if (!path) {
|
package/src/input/commands.ts
CHANGED
|
@@ -57,6 +57,7 @@ import { registerServicesRuntimeCommands } from './commands/services-runtime.ts'
|
|
|
57
57
|
import { registerTasksRuntimeCommands } from './commands/tasks-runtime.ts';
|
|
58
58
|
import { registerLocalProviderRuntimeCommands } from './commands/local-provider-runtime.ts';
|
|
59
59
|
import { registerHealthRuntimeCommands } from './commands/health-runtime.ts';
|
|
60
|
+
import { registerStatusRuntimeCommands } from './commands/status-runtime.ts';
|
|
60
61
|
import { registerClusterRuntimeCommands } from './commands/cluster-runtime.ts';
|
|
61
62
|
import { registerSettingsSyncRuntimeCommands } from './commands/settings-sync-runtime.ts';
|
|
62
63
|
import { registerWorktreeRuntimeCommands } from './commands/worktree-runtime.ts';
|
|
@@ -145,10 +146,11 @@ export const BUILTIN_COMMAND_GROUPS: readonly BuiltinCommandGroup[] = [
|
|
|
145
146
|
{ category: 'Tasks', register: registerTasksRuntimeCommands },
|
|
146
147
|
{ category: 'Local Providers', register: registerLocalProviderRuntimeCommands },
|
|
147
148
|
{ category: 'Health', register: registerHealthRuntimeCommands },
|
|
149
|
+
{ category: 'Health', register: registerStatusRuntimeCommands },
|
|
148
150
|
{ category: 'Cluster', register: registerClusterRuntimeCommands },
|
|
149
151
|
{ category: 'Settings Sync', register: registerSettingsSyncRuntimeCommands },
|
|
150
152
|
{ category: 'Worktrees', register: registerWorktreeRuntimeCommands },
|
|
151
|
-
{ category: '
|
|
153
|
+
{ category: 'Agents', register: registerAcpRuntimeCommands },
|
|
152
154
|
{ category: 'Provider Accounts', register: registerProviderAccountsRuntimeCommands },
|
|
153
155
|
{ category: 'Local Auth', register: registerLocalAuthRuntimeCommands },
|
|
154
156
|
{ category: 'Intelligence', register: registerIntelligenceRuntimeCommands },
|
|
@@ -136,3 +136,47 @@ export function makeComposerEditorOpener(deps: ComposerEditorOpenerDeps): () =>
|
|
|
136
136
|
},
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
|
+
|
|
140
|
+
/** Editors known to take `+<line> <file>` to open at a line. */
|
|
141
|
+
const LINE_ARG_EDITORS = new Set(['vi', 'vim', 'nvim', 'nano', 'emacs', 'micro', 'kak', 'hx', 'helix', 'ne', 'joe', 'mg']);
|
|
142
|
+
|
|
143
|
+
export interface FileEditorOpenerDeps {
|
|
144
|
+
readonly stdin: { setRawMode(on: boolean): unknown };
|
|
145
|
+
readonly stdout: { write(seq: string): unknown };
|
|
146
|
+
readonly writeGuard: (fn: () => void) => void;
|
|
147
|
+
readonly repaint: () => void;
|
|
148
|
+
readonly cwd: string;
|
|
149
|
+
readonly env: NodeJS.ProcessEnv;
|
|
150
|
+
readonly notify: (message: string) => void;
|
|
151
|
+
readonly spawn?: EditorSpawn;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Build `openFileInEditor`: suspend the TUI, run $VISUAL / $EDITOR on a file
|
|
156
|
+
* (at a line when the editor is known to take `+<line>`), then restore and
|
|
157
|
+
* repaint. The Changes modal's `o` uses this.
|
|
158
|
+
*/
|
|
159
|
+
export function makeFileEditorOpener(deps: FileEditorOpenerDeps): (path: string, line?: number) => void {
|
|
160
|
+
return (path, line) => {
|
|
161
|
+
const editor = resolveEditorCommand(deps.env);
|
|
162
|
+
if (!editor) {
|
|
163
|
+
deps.notify('[Editor] Set $EDITOR or $VISUAL to open files in an external editor.');
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const base = editor.cmd.split('/').pop() ?? editor.cmd;
|
|
167
|
+
const lineArgs = line !== undefined && line > 0 && LINE_ARG_EDITORS.has(base) ? [`+${line}`] : [];
|
|
168
|
+
const spawn = deps.spawn ?? defaultSpawn;
|
|
169
|
+
try { deps.stdin.setRawMode(false); } catch { /* stdin may not be a TTY */ }
|
|
170
|
+
deps.writeGuard(() => deps.stdout.write(LEAVE_TUI));
|
|
171
|
+
let result: EditorSpawnResult;
|
|
172
|
+
try {
|
|
173
|
+
result = spawn(editor.cmd, [...editor.args, ...lineArgs, path], { cwd: deps.cwd, env: deps.env });
|
|
174
|
+
} finally {
|
|
175
|
+
deps.writeGuard(() => deps.stdout.write(ENTER_TUI));
|
|
176
|
+
try { deps.stdin.setRawMode(true); } catch { /* stdin may not be a TTY */ }
|
|
177
|
+
deps.repaint();
|
|
178
|
+
}
|
|
179
|
+
if (result.error) deps.notify(`[Editor] Failed to launch ${editor.cmd}: ${result.error.message}`);
|
|
180
|
+
else if (result.status !== 0 && result.status !== null) deps.notify(`[Editor] ${editor.cmd} exited with code ${result.status}.`);
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Composer concealed-input mode.
|
|
3
3
|
*
|
|
4
4
|
* Generalizes the masking that previously lived only on the two purpose-built
|
|
5
|
-
* auth surfaces (local-auth
|
|
5
|
+
* auth surfaces (local-auth modal, onboarding wizard) into the MAIN composer,
|
|
6
6
|
* so any password-like prompt can request concealed entry: the typed text is
|
|
7
7
|
* masked in the composer AND never reaches input history or the transcript
|
|
8
8
|
* plaintext. The plaintext is delivered exactly once, to the requester's
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/** A row's text style in a config modal (foreground, background, weight). */
|
|
2
|
+
export interface ModalSectionStyle {
|
|
3
|
+
fg?: string;
|
|
4
|
+
bg?: string;
|
|
5
|
+
bold?: boolean;
|
|
6
|
+
dim?: boolean;
|
|
7
|
+
}
|
|
2
8
|
|
|
3
9
|
/**
|
|
4
10
|
* Config-modal host, the shared seam every MIGRATE-TO-MODAL surface
|
|
@@ -37,6 +43,12 @@ export interface ConfigModalRow {
|
|
|
37
43
|
* up/down navigation and never receives an action. Defaults to selectable.
|
|
38
44
|
*/
|
|
39
45
|
readonly selectable?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* A group header (a section title such as "Next steps"): drawn as a kit
|
|
48
|
+
* group header (✦ lowercase accent) with a blank row above it. Always
|
|
49
|
+
* non-selectable and never filtered out.
|
|
50
|
+
*/
|
|
51
|
+
readonly header?: boolean;
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
/** One tab (section) of a surface. Tabs are switched with left/right or Tab. */
|
|
@@ -79,8 +91,8 @@ export interface ConfigModalActionContext {
|
|
|
79
91
|
/** Print a line to the conversation transcript. */
|
|
80
92
|
readonly print: (message: string) => void;
|
|
81
93
|
/**
|
|
82
|
-
* Execute a slash command, the
|
|
83
|
-
*
|
|
94
|
+
* Execute a slash command, the seam a migrated action
|
|
95
|
+
* uses to reach its existing command. This is how a migrated action
|
|
84
96
|
* preserves parity: the mutation still runs through its existing, tested
|
|
85
97
|
* command (e.g. `/settings-sync resolve`, `/local-auth delete-user`).
|
|
86
98
|
*/
|
|
@@ -124,10 +136,10 @@ export interface ConfigModalAction {
|
|
|
124
136
|
/**
|
|
125
137
|
* Trigger key: a single printable char ('r', 'd') or a named key ('enter').
|
|
126
138
|
* Must not collide with the host-reserved nav keys (up/down/left/right/tab/
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
139
|
+
* escape), those are consumed by the host before actions are consulted.
|
|
140
|
+
* The search row is always live: a printable key that matches an action
|
|
141
|
+
* fires the action only while the query is empty; otherwise it is typed
|
|
142
|
+
* into the query, see handleConfigModalToken.
|
|
131
143
|
*/
|
|
132
144
|
readonly key: string;
|
|
133
145
|
/** Action id passed to `onAction`. */
|
|
@@ -151,7 +163,7 @@ export interface ConfigModalAction {
|
|
|
151
163
|
/**
|
|
152
164
|
* A named config-modal surface. Pure seam, the host knows nothing about the
|
|
153
165
|
* surface's data. Built once (closing over its read-models) and registered on
|
|
154
|
-
*
|
|
166
|
+
* the panel manager via `registerModalSurface`; opened by name from a view-id
|
|
155
167
|
* redirect hit or `ctx.openModal(name)`.
|
|
156
168
|
*/
|
|
157
169
|
export interface ConfigModalSurface {
|