@pellux/goodvibes-tui 2.0.20 → 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 +70 -0
- package/README.md +16 -16
- package/docs/README.md +4 -4
- package/docs/foundation-artifacts/operator-contract.json +59 -4
- 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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MODAL_TONES } from './modal-theme.ts';
|
|
2
|
-
import { infoRow } from './modal-surface-helpers.ts';
|
|
2
|
+
import { infoRow, headerRow } from './modal-surface-helpers.ts';
|
|
3
3
|
import type {
|
|
4
4
|
ConfigModalActionContext,
|
|
5
5
|
ConfigModalRow,
|
|
@@ -14,11 +14,11 @@ import type {
|
|
|
14
14
|
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// Plugins → config-modal surface (group-B port). Mirrors the retired
|
|
17
|
-
//
|
|
17
|
+
// the retired plugins view's read surface (list/capabilities/getTrustRecord/
|
|
18
18
|
// getQuarantineRecord) plus `verify` (a pure read-only signature check).
|
|
19
19
|
// enable/disable/liftQuarantine are DROPPED from the dep shape on purpose:
|
|
20
20
|
// those verbs are destructive/interactive mutations and route to the `/plugin`
|
|
21
|
-
// command path (action-parity charter rule). Selection-blind port: the
|
|
21
|
+
// command path (action-parity charter rule). Selection-blind port: the earlier view's
|
|
22
22
|
// selected-plugin signature/quarantine/verify detail is folded into row labels.
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
|
|
@@ -87,9 +87,9 @@ class PluginsModalSurface implements ConfigModalSurface {
|
|
|
87
87
|
|
|
88
88
|
if (all.length === 0) {
|
|
89
89
|
rows.push(infoRow('empty:0', 'No plugins discovered.'));
|
|
90
|
-
rows.push(
|
|
91
|
-
rows.push(infoRow('empty:list', '/plugin list — inspect plugin discovery paths and current registry state', {
|
|
92
|
-
rows.push(infoRow('empty:market', '/marketplace — review curated ecosystem entries and provenance posture', {
|
|
90
|
+
rows.push(headerRow('empty:title', 'Next steps'));
|
|
91
|
+
rows.push(infoRow('empty:list', '/plugin list — inspect plugin discovery paths and current registry state', { fg: MODAL_TONES.dim }));
|
|
92
|
+
rows.push(infoRow('empty:market', '/marketplace — review curated ecosystem entries and provenance posture', { fg: MODAL_TONES.dim }));
|
|
93
93
|
return { title: 'Plugins', tabs: [{ id: 'plugins', label: 'Plugins', rows, emptyText: '' }] };
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -9,7 +9,8 @@ import type {
|
|
|
9
9
|
PolicyPreflightReview,
|
|
10
10
|
PolicySimulationSummary,
|
|
11
11
|
} from '@/runtime/index.ts';
|
|
12
|
-
import
|
|
12
|
+
import { registerThemeRefresh } from '../../renderer/theme.ts';
|
|
13
|
+
import type { ModalSectionStyle } from '../../input/config-modal-types.ts';
|
|
13
14
|
import type {
|
|
14
15
|
ConfigModalActionContext,
|
|
15
16
|
ConfigModalRow,
|
|
@@ -22,9 +23,9 @@ import type {
|
|
|
22
23
|
// not a selectable list, current/candidate bundle state, diff, divergence
|
|
23
24
|
// gate, history, permission audit, lint findings, preflight review, and
|
|
24
25
|
// simulation samples render as non-selectable rows (the host windows/scrolls
|
|
25
|
-
// them). EVERY dispatchable key in the original
|
|
26
|
-
// routed to `/policy <sub>` via executeCommand, none were in-
|
|
27
|
-
// the
|
|
26
|
+
// them). EVERY dispatchable key in the original view (s/f/l/p/b) already
|
|
27
|
+
// routed to `/policy <sub>` via executeCommand, none were in-view mutations;
|
|
28
|
+
// the earlier view's promote/rollback confirm step is dropped per charter (never fold
|
|
28
29
|
// a confirm into a modal) and the command dispatches directly. Determinism:
|
|
29
30
|
// timestamps are formatted (fmtTime/fmtRate), never read from the clock.
|
|
30
31
|
// ---------------------------------------------------------------------------
|
|
@@ -49,7 +50,14 @@ export interface PolicyModalDeps {
|
|
|
49
50
|
const BAD: ModalSectionStyle = { fg: MODAL_TONES.bad };
|
|
50
51
|
const WARN: ModalSectionStyle = { fg: MODAL_TONES.warn };
|
|
51
52
|
const GOOD: ModalSectionStyle = { fg: MODAL_TONES.good };
|
|
52
|
-
|
|
53
|
+
// Rebuilt in place on theme change (MODAL_TONES refreshes first: it registers at its own module eval).
|
|
54
|
+
registerThemeRefresh(() => {
|
|
55
|
+
Object.assign(BAD, { fg: MODAL_TONES.bad });
|
|
56
|
+
Object.assign(WARN, { fg: MODAL_TONES.warn });
|
|
57
|
+
Object.assign(GOOD, { fg: MODAL_TONES.good });
|
|
58
|
+
Object.assign(DIM, { fg: MODAL_TONES.dim });
|
|
59
|
+
});
|
|
60
|
+
const DIM: ModalSectionStyle = { fg: MODAL_TONES.dim };
|
|
53
61
|
const MAX_ROWS = 5;
|
|
54
62
|
|
|
55
63
|
function fmtTime(value: string | undefined): string {
|
|
@@ -11,17 +11,17 @@ export interface ProviderRuntimeInspect {
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Provider-health config-modal surface (migrated from the `provider-health`
|
|
14
|
-
*
|
|
14
|
+
* view, the charter's live-modal exemplar; also the target of the `providers`
|
|
15
15
|
* and `accounts` redirects). providerRuntime.inspectAll() is async, so its
|
|
16
16
|
* result is cached and refreshed on open, on `r`, and on a 3s live tick (the
|
|
17
|
-
*
|
|
17
|
+
* view's display-tick cadence); buildView reads the cache synchronously so
|
|
18
18
|
* live status/model-count values update in place with a stable layout.
|
|
19
19
|
*
|
|
20
|
-
* Fidelity boundary (stated divergence): the
|
|
20
|
+
* Fidelity boundary (stated divergence): the earlier view's per-request latency
|
|
21
21
|
* timelines, auth-route table, and 8 repair-domain posture blocks are driven by
|
|
22
22
|
* an event-fed tracker + account-posture snapshots; those deep views remain on
|
|
23
23
|
* the `/health` and `/accounts` commands (which print them in full). The modal
|
|
24
|
-
* ports the live provider status list + the
|
|
24
|
+
* ports the live provider status list + the earlier view's one dispatch action
|
|
25
25
|
* (Enter → `/accounts repair <provider>`), across a Health and an Accounts tab.
|
|
26
26
|
*/
|
|
27
27
|
class ProviderHealthModalSurface implements ConfigModalSurface {
|
|
@@ -20,11 +20,11 @@ function stateTone(state: string): Tone {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
* Remote config-modal surface (migrated from the `remote`
|
|
23
|
+
* Remote config-modal surface (migrated from the `remote` view). The read-model
|
|
24
24
|
* snapshot is synchronous; a subscribe() keeps live transport/heartbeat values
|
|
25
|
-
* refreshing between key presses. The
|
|
25
|
+
* refreshing between key presses. The earlier view's `Tab` connections/contracts browse
|
|
26
26
|
* toggle becomes two real tabs. `r`/Enter dispatch `/remote recover` for the
|
|
27
|
-
* selected runner, the
|
|
27
|
+
* selected runner, the earlier view's only corrective keybinding; the richer
|
|
28
28
|
* `/remote` command set (show/supervisor/cancel/dispatch/artifact/…) stays on
|
|
29
29
|
* the command front-door.
|
|
30
30
|
*/
|
|
@@ -6,7 +6,7 @@ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
6
6
|
import { toneStyle, statusGlyph, pad, postureLine, kv, type Tone } from './modal-surface-helpers.ts';
|
|
7
7
|
|
|
8
8
|
/** SandboxSessionRegistry has no event subscription, poll at the same 3s
|
|
9
|
-
* cadence the retired
|
|
9
|
+
* cadence the retired view used (POLL_INTERVAL_MS in the sandbox modal's earlier view). */
|
|
10
10
|
const POLL_INTERVAL_MS = 3_000;
|
|
11
11
|
|
|
12
12
|
function sessionTone(state: SandboxSession['state']): Tone {
|
|
@@ -28,13 +28,13 @@ function sessionIdOf(row: ConfigModalRow | null): string | null {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* Sandbox config-modal surface (migrated from the `sandbox`
|
|
31
|
+
* Sandbox config-modal surface (migrated from the `sandbox` view). All reads
|
|
32
32
|
* (buildSandboxReview, listSandboxProfiles, sessions.list) are synchronous, so
|
|
33
|
-
* buildView reads them live each tick. The
|
|
33
|
+
* buildView reads them live each tick. The earlier view's single profile+session
|
|
34
34
|
* selectable list becomes two real tabs. s/x/e call the SandboxSessionRegistry
|
|
35
35
|
* directly (these were never slash commands), start/execute are wrapped so a
|
|
36
36
|
* rejection surfaces via ctx.setStatus instead of an unhandled rejection,
|
|
37
|
-
* matching the
|
|
37
|
+
* matching the earlier view's try/catch + setError behaviour.
|
|
38
38
|
*/
|
|
39
39
|
class SandboxModalSurface implements ConfigModalSurface {
|
|
40
40
|
readonly name = 'sandbox-modal';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { MODAL_TONES } from './modal-theme.ts';
|
|
2
|
-
import { infoRow } from './modal-surface-helpers.ts';
|
|
2
|
+
import { infoRow, headerRow } from './modal-surface-helpers.ts';
|
|
3
3
|
import type { TokenAuditResult } from '@pellux/goodvibes-sdk/platform/security';
|
|
4
|
-
import
|
|
4
|
+
import { registerThemeRefresh } from '../../renderer/theme.ts';
|
|
5
|
+
import type { ModalSectionStyle } from '../../input/config-modal-types.ts';
|
|
5
6
|
import type { UiReadModel, UiSecuritySnapshot } from '../../runtime/ui-read-models.ts';
|
|
6
7
|
import type {
|
|
7
8
|
ConfigModalActionContext,
|
|
@@ -18,7 +19,7 @@ import type {
|
|
|
18
19
|
// the MCP attack-path review). Read-model-backed, so refresh() is a no-op,
|
|
19
20
|
// buildView reads getSnapshot() fresh every render. 'f' (preflight) routes to
|
|
20
21
|
// its `/policy preflight` command path; 'i' jumps to the incident surface
|
|
21
|
-
// (fleet) via the command path. Selection-blind port: the
|
|
22
|
+
// (fleet) via the command path. Selection-blind port: the earlier view's
|
|
22
23
|
// selected-token scope/rotation detail is folded into each token row label.
|
|
23
24
|
// Determinism: absolute ISO timestamps (never Date.now()).
|
|
24
25
|
// ---------------------------------------------------------------------------
|
|
@@ -29,6 +30,11 @@ export interface SecurityModalDeps {
|
|
|
29
30
|
|
|
30
31
|
const BAD: ModalSectionStyle = { fg: MODAL_TONES.bad };
|
|
31
32
|
const WARN: ModalSectionStyle = { fg: MODAL_TONES.warn };
|
|
33
|
+
// Rebuilt in place on theme change (MODAL_TONES refreshes first: it registers at its own module eval).
|
|
34
|
+
registerThemeRefresh(() => {
|
|
35
|
+
Object.assign(BAD, { fg: MODAL_TONES.bad });
|
|
36
|
+
Object.assign(WARN, { fg: MODAL_TONES.warn });
|
|
37
|
+
});
|
|
32
38
|
const MAX_FINDINGS_SHOWN = 5;
|
|
33
39
|
|
|
34
40
|
function resultColor(result: TokenAuditResult): ModalSectionStyle | undefined {
|
|
@@ -105,11 +111,11 @@ class SecurityModalSurface implements ConfigModalSurface {
|
|
|
105
111
|
if (audit.results.length === 0) {
|
|
106
112
|
const quarantinedMcp = snapshot.mcpServers.filter((s) => s.schemaFreshness === 'quarantined');
|
|
107
113
|
rows.push(infoRow('empty:0', 'No API tokens are registered with the security auditor yet.'));
|
|
108
|
-
rows.push(infoRow('empty:1', 'The security control room can already review policy, MCP, plugin, and incident posture, but token-specific scope and rotation audit data has not been registered.', {
|
|
114
|
+
rows.push(infoRow('empty:1', 'The security control room can already review policy, MCP, plugin, and incident posture, but token-specific scope and rotation audit data has not been registered.', { fg: MODAL_TONES.dim }));
|
|
109
115
|
if (quarantinedMcp.length > 0) rows.push(infoRow('empty:mcp', 'MCP quarantine still active despite no registered tokens.', WARN));
|
|
110
|
-
rows.push(
|
|
111
|
-
rows.push(infoRow('empty:storage', '/storage review — inspect secure secret storage and environment overrides', {
|
|
112
|
-
rows.push(infoRow('empty:mcptrust', '/mcp trust — inspect active MCP trust and quarantine posture', {
|
|
116
|
+
rows.push(headerRow('empty:title', 'Inspect further'));
|
|
117
|
+
rows.push(infoRow('empty:storage', '/storage review — inspect secure secret storage and environment overrides', { fg: MODAL_TONES.dim }));
|
|
118
|
+
rows.push(infoRow('empty:mcptrust', '/mcp trust — inspect active MCP trust and quarantine posture', { fg: MODAL_TONES.dim }));
|
|
113
119
|
return { id: 'tokens', label: 'Tokens', header, rows, emptyText: '' };
|
|
114
120
|
}
|
|
115
121
|
|
|
@@ -121,7 +127,7 @@ class SecurityModalSurface implements ConfigModalSurface {
|
|
|
121
127
|
...(resultColor(result) ? { style: resultColor(result)! } : {}),
|
|
122
128
|
});
|
|
123
129
|
}
|
|
124
|
-
rows.push(infoRow('audit:when', `Last audit ${fmtIso(audit.lastAuditAt)}: press r to refresh`, {
|
|
130
|
+
rows.push(infoRow('audit:when', `Last audit ${fmtIso(audit.lastAuditAt)}: press r to refresh`, { fg: MODAL_TONES.dim }));
|
|
125
131
|
return { id: 'tokens', label: 'Tokens', header, rows, hints: ['f preflight'] };
|
|
126
132
|
}
|
|
127
133
|
|
|
@@ -144,18 +150,18 @@ class SecurityModalSurface implements ConfigModalSurface {
|
|
|
144
150
|
}
|
|
145
151
|
|
|
146
152
|
const review = snapshot.attackPathReview;
|
|
147
|
-
rows.push(
|
|
148
|
-
rows.push(infoRow('atk:counts', `critical ${review.criticalFindings} incoherent ${review.incoherentFindings}`, review.criticalFindings > 0 ? BAD : {
|
|
149
|
-
rows.push(infoRow('atk:summary', review.summary, {
|
|
153
|
+
rows.push(headerRow('atk:title', 'MCP Attack-Path Review'));
|
|
154
|
+
rows.push(infoRow('atk:counts', `critical ${review.criticalFindings} incoherent ${review.incoherentFindings}`, review.criticalFindings > 0 ? BAD : { fg: MODAL_TONES.dim }));
|
|
155
|
+
rows.push(infoRow('atk:summary', review.summary, { fg: MODAL_TONES.dim }));
|
|
150
156
|
const shown = review.findings.slice(0, MAX_FINDINGS_SHOWN);
|
|
151
157
|
shown.forEach((finding, i) => {
|
|
152
158
|
rows.push(infoRow(`atk:${i}:h`, `${finding.severity.toUpperCase()} ${finding.serverName}: ${finding.route}`, findingColor(finding.severity)));
|
|
153
|
-
rows.push(infoRow(`atk:${i}:r`, ` ${finding.reason}`, {
|
|
154
|
-
rows.push(infoRow(`atk:${i}:e`, ` evidence: ${finding.evidence.join(' | ')}`, {
|
|
159
|
+
rows.push(infoRow(`atk:${i}:r`, ` ${finding.reason}`, { fg: MODAL_TONES.dim }));
|
|
160
|
+
rows.push(infoRow(`atk:${i}:e`, ` evidence: ${finding.evidence.join(' | ')}`, { fg: MODAL_TONES.dim }));
|
|
155
161
|
});
|
|
156
162
|
if (review.findings.length > shown.length) {
|
|
157
163
|
const extra = review.findings.length - shown.length;
|
|
158
|
-
rows.push(infoRow('atk:more', `+${extra} more finding${extra === 1 ? '' : 's'} not shown`, {
|
|
164
|
+
rows.push(infoRow('atk:more', `+${extra} more finding${extra === 1 ? '' : 's'} not shown`, { fg: MODAL_TONES.dim }));
|
|
159
165
|
}
|
|
160
166
|
return { id: 'governance', label: 'Governance', rows, emptyText: 'No governance findings.' };
|
|
161
167
|
}
|
|
@@ -169,8 +175,8 @@ class SecurityModalSurface implements ConfigModalSurface {
|
|
|
169
175
|
if (id === 'refresh') { ctx.setStatus('Security posture is read live.'); ctx.requestRender(); return; }
|
|
170
176
|
if (id === 'preflight') { void ctx.executeCommand?.('policy', ['preflight']); ctx.setStatus('Dispatched /policy preflight.'); return; }
|
|
171
177
|
if (id === 'jumpToIncident' && this.deps.readModel.getSnapshot().latestIncident) {
|
|
172
|
-
void ctx.executeCommand?.('
|
|
173
|
-
ctx.setStatus('Opened the
|
|
178
|
+
void ctx.executeCommand?.('agents', []);
|
|
179
|
+
ctx.setStatus('Opened Agents on the running processes.');
|
|
174
180
|
return;
|
|
175
181
|
}
|
|
176
182
|
if (id === 'manageDevices') {
|
|
@@ -33,7 +33,7 @@ function statusDotTone(e: Entry): Tone {
|
|
|
33
33
|
return 'dim';
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
// Ported verbatim from
|
|
36
|
+
// Ported verbatim from the retired services view's authSummary derivation.
|
|
37
37
|
function authSummary(config: ServiceConfig, manager: SubscriptionAccessQuery): string {
|
|
38
38
|
const provider = config.providerId ?? config.name;
|
|
39
39
|
const hasOverride = manager.getAccessToken(provider) != null;
|
|
@@ -46,10 +46,10 @@ function authSummary(config: ServiceConfig, manager: SubscriptionAccessQuery): s
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* Services config-modal surface (migrated from the `services`
|
|
49
|
+
* Services config-modal surface (migrated from the `services` view). Reads the
|
|
50
50
|
* same ServiceInspectionQuery, getAll() is sync but inspect()/testConnection()
|
|
51
51
|
* are async, so an inspection cache is refreshed on open / `r` and read
|
|
52
|
-
* synchronously by buildView (mirrors the
|
|
52
|
+
* synchronously by buildView (mirrors the earlier view's own refresh contract).
|
|
53
53
|
* Actions map onto their existing behaviours; `s` jumps to the subscription
|
|
54
54
|
* surface, `t`/`T` run the same live connection tests, `r` re-inspects.
|
|
55
55
|
*/
|
|
@@ -14,13 +14,13 @@ function sourceTone(source: string, conflict: boolean, locked: boolean): Tone {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* Settings-sync config-modal surface (migrated from the `settings-sync`
|
|
18
|
-
* All reads are synchronous (getSettingsControlPlaneSnapshot). The
|
|
17
|
+
* Settings-sync config-modal surface (migrated from the `settings-sync` view).
|
|
18
|
+
* All reads are synchronous (getSettingsControlPlaneSnapshot). The earlier view's six
|
|
19
19
|
* Tab-cycled browse modes become six real tabs. Conflict resolution keeps the
|
|
20
|
-
*
|
|
20
|
+
* view's two-step shape: Enter on a conflicted key arms a resolve prompt, then
|
|
21
21
|
* l/s dispatch the existing `/settings-sync resolve <key> <local|synced>`
|
|
22
22
|
* command (the command owns the mutation + live-session refresh). `m` dispatches
|
|
23
|
-
* `/managed review`. push/pull remain CLI-only (they were never
|
|
23
|
+
* `/managed review`. push/pull remain CLI-only (they were never view actions).
|
|
24
24
|
*/
|
|
25
25
|
class SettingsSyncModalSurface implements ConfigModalSurface {
|
|
26
26
|
readonly name = 'settings-sync-modal';
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { MODAL_TONES } from './modal-theme.ts';
|
|
2
|
-
import { infoRow } from './modal-surface-helpers.ts';
|
|
2
|
+
import { infoRow, headerRow } from './modal-surface-helpers.ts';
|
|
3
3
|
import { readFileSync, readdirSync, mkdtempSync, rmSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join, sep } from 'node:path';
|
|
6
6
|
import type { ConfigModalActionContext, ConfigModalRow, ConfigModalSurface, ConfigModalView } from '../../input/config-modal-types.ts';
|
|
7
|
-
import type { SkillOrigin, SkillRecord } from '../skills-
|
|
7
|
+
import type { SkillOrigin, SkillRecord } from '../skills-discovery.ts';
|
|
8
8
|
import { listInstalledEcosystemEntries, type EcosystemCatalogPathOptions, type ShellPathService } from '@/runtime/index.ts';
|
|
9
9
|
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
11
|
// Skills → config-modal surface (group-B port). Project-local and global
|
|
12
12
|
// skill-pack discovery. Disk scans happen only in refresh() (never in
|
|
13
|
-
// buildView), mirroring the
|
|
14
|
-
// the
|
|
13
|
+
// buildView), mirroring the earlier view's onActivate()-triggered load. Browse-only:
|
|
14
|
+
// the earlier view never had a command-routable mutation verb (no /skills delete/remove
|
|
15
15
|
// subcommand exists), so the only action is refresh/navigate. Selection-blind
|
|
16
|
-
// port: the
|
|
16
|
+
// port: the earlier view's selected-skill path/deps/includes detail is folded into
|
|
17
17
|
// each row label.
|
|
18
18
|
//
|
|
19
|
-
// discoverSkills() in the
|
|
19
|
+
// discoverSkills() in the earlier view was async; the sync re-implementation below
|
|
20
20
|
// mirrors the same directory/frontmatter/marketplace-provenance conventions
|
|
21
21
|
// (the two are independent implementations of the same on-disk contract).
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
@@ -136,9 +136,9 @@ class SkillsModalSurface implements ConfigModalSurface {
|
|
|
136
136
|
const rows: ConfigModalRow[] = [];
|
|
137
137
|
if (this.cached.length === 0) {
|
|
138
138
|
rows.push(infoRow('empty:0', 'No skills discovered.'));
|
|
139
|
-
rows.push(
|
|
140
|
-
rows.push(infoRow('empty:dir', '.goodvibes/skills — place skill .md files here (project-local) or ~/.goodvibes/skills (global)', {
|
|
141
|
-
rows.push(infoRow('empty:registry', '/registry search skills — inspect the same skill directories from the shell', {
|
|
139
|
+
rows.push(headerRow('empty:title', 'Next steps'));
|
|
140
|
+
rows.push(infoRow('empty:dir', '.goodvibes/skills — place skill .md files here (project-local) or ~/.goodvibes/skills (global)', { fg: MODAL_TONES.dim }));
|
|
141
|
+
rows.push(infoRow('empty:registry', '/registry search skills — inspect the same skill directories from the shell', { fg: MODAL_TONES.dim }));
|
|
142
142
|
return { title: 'Skills', tabs: [{ id: 'skills', label: 'Skills', rows, emptyText: '' }] };
|
|
143
143
|
}
|
|
144
144
|
|
|
@@ -38,12 +38,12 @@ function isExpiringSoon(sub: ProviderSubscription | null): boolean {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
|
-
* Subscription config-modal surface (migrated from the `subscription`
|
|
41
|
+
* Subscription config-modal surface (migrated from the `subscription` view).
|
|
42
42
|
* All reads are synchronous (serviceRegistry.getAll + subscription-manager
|
|
43
43
|
* queries) so buildView reads them live each tick; a 5s timer keeps an
|
|
44
44
|
* externally-completed browser OAuth handshake visible without a keypress, the
|
|
45
|
-
* same cadence the
|
|
46
|
-
* matching the
|
|
45
|
+
* same cadence the earlier view used. Enter signs out (surface-managed confirm,
|
|
46
|
+
* matching the earlier view's ConfirmState) on an active row, or starts login via the
|
|
47
47
|
* existing `/subscription login <p> start` command on an available row.
|
|
48
48
|
*/
|
|
49
49
|
class SubscriptionModalSurface implements ConfigModalSurface {
|
|
@@ -11,10 +11,10 @@ import type { WorkPlanItemStatus } from '@pellux/goodvibes-sdk/platform/workflow
|
|
|
11
11
|
// persistent plan's checklist items with a progress summary + status counts.
|
|
12
12
|
// All mutations (add/edit item, cycle/set status, remove, clear-completed)
|
|
13
13
|
// route to the existing `/work-plan` command path (charter: no
|
|
14
|
-
// destructive/interactive mutation direct-called from a modal; the
|
|
14
|
+
// destructive/interactive mutation direct-called from a modal; the earlier view's
|
|
15
15
|
// inline add/edit draft form has no place in a read/navigate modal, the bare
|
|
16
16
|
// `/work-plan add` subcommand is the honest stand-in). Selection-blind port:
|
|
17
|
-
// the
|
|
17
|
+
// the earlier view's selected-item owner/source/notes/linked detail is folded into
|
|
18
18
|
// each row label.
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
|
|
@@ -64,11 +64,8 @@ class WorkPlanModalSurface implements ConfigModalSurface {
|
|
|
64
64
|
|
|
65
65
|
private readonly hasRow = (row: ConfigModalRow | null): boolean => row !== null;
|
|
66
66
|
|
|
67
|
-
/** 'i'/'w'
|
|
68
|
-
*
|
|
69
|
-
* lost when migrated this surface to a modal without it). Gated on
|
|
70
|
-
* the link actually being present, same as the retired panel gated the key
|
|
71
|
-
* on `item?.linked?.agentId`/`wrfcId` before ever reaching the jump. */
|
|
67
|
+
/** 'i'/'w' open the Agents modal on the selected item's linked agent or
|
|
68
|
+
* WRFC chain. Gated on the link actually being present. */
|
|
72
69
|
private readonly hasAgentLink = (row: ConfigModalRow | null): boolean =>
|
|
73
70
|
!!(row && this.itemFrom(row.id)?.linked?.agentId);
|
|
74
71
|
private readonly hasWrfcLink = (row: ConfigModalRow | null): boolean =>
|
|
@@ -137,17 +134,17 @@ class WorkPlanModalSurface implements ConfigModalSurface {
|
|
|
137
134
|
if (id === 'jumpAgent') {
|
|
138
135
|
const agentId = item.linked?.agentId;
|
|
139
136
|
if (!agentId) return;
|
|
140
|
-
// 'agent' matches the SDK's ProcessKind for a live agent node,
|
|
141
|
-
//
|
|
142
|
-
void ctx.executeCommand?.('
|
|
143
|
-
ctx.setStatus(`Opened
|
|
137
|
+
// 'agent' matches the SDK's ProcessKind for a live agent node, which
|
|
138
|
+
// AgentsModal.reveal matches on id and kind.
|
|
139
|
+
void ctx.executeCommand?.('agents', ['--target', `${agentId}:agent`]);
|
|
140
|
+
ctx.setStatus(`Opened Agents on agent ${agentId}.`);
|
|
144
141
|
return;
|
|
145
142
|
}
|
|
146
143
|
if (id === 'jumpWrfc') {
|
|
147
144
|
const wrfcId = item.linked?.wrfcId;
|
|
148
145
|
if (!wrfcId) return;
|
|
149
|
-
void ctx.executeCommand?.('
|
|
150
|
-
ctx.setStatus(`Opened
|
|
146
|
+
void ctx.executeCommand?.('agents', ['--target', `${wrfcId}:wrfc-chain`]);
|
|
147
|
+
ctx.setStatus(`Opened Agents on WRFC chain ${wrfcId}.`);
|
|
151
148
|
return;
|
|
152
149
|
}
|
|
153
150
|
const status: WorkPlanItemStatus | null =
|