@pellux/goodvibes-tui 1.1.0 → 1.7.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.
Files changed (194) hide show
  1. package/CHANGELOG.md +85 -21
  2. package/README.md +20 -11
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +2 -2
  5. package/src/core/alert-gating.ts +67 -0
  6. package/src/core/approval-alert.ts +72 -0
  7. package/src/core/budget-breach-notifier.ts +106 -0
  8. package/src/core/conversation-rendering.ts +19 -0
  9. package/src/core/conversation.ts +18 -0
  10. package/src/core/focus-tracker.ts +41 -0
  11. package/src/core/long-task-notifier.ts +33 -6
  12. package/src/core/system-message-router.ts +37 -51
  13. package/src/core/turn-cancellation.ts +20 -0
  14. package/src/core/turn-event-wiring.ts +64 -3
  15. package/src/export/cost-utils.ts +36 -0
  16. package/src/input/command-registry.ts +38 -1
  17. package/src/input/commands/checkpoint-runtime.ts +280 -0
  18. package/src/input/commands/codebase-runtime.ts +192 -0
  19. package/src/input/commands/eval.ts +1 -1
  20. package/src/input/commands/health-runtime.ts +1 -1
  21. package/src/input/commands/image-runtime.ts +112 -0
  22. package/src/input/commands/intelligence-runtime.ts +11 -1
  23. package/src/input/commands/local-auth-runtime.ts +4 -1
  24. package/src/input/commands/local-runtime.ts +9 -3
  25. package/src/input/commands/marketplace-runtime.ts +2 -2
  26. package/src/input/commands/memory.ts +6 -1
  27. package/src/input/commands/operator-panel-runtime.ts +40 -24
  28. package/src/input/commands/planning-runtime.ts +26 -3
  29. package/src/input/commands/platform-sandbox-runtime.ts +1 -6
  30. package/src/input/commands/plugin-runtime.ts +2 -2
  31. package/src/input/commands/policy-dispatch.ts +21 -0
  32. package/src/input/commands/provider-accounts-runtime.ts +1 -1
  33. package/src/input/commands/qrcode-runtime.ts +3 -3
  34. package/src/input/commands/recall-review.ts +35 -0
  35. package/src/input/commands/remote-runtime.ts +3 -3
  36. package/src/input/commands/runtime-services.ts +54 -13
  37. package/src/input/commands/services-runtime.ts +1 -1
  38. package/src/input/commands/session-workflow.ts +16 -1
  39. package/src/input/commands/settings-sync-runtime.ts +1 -1
  40. package/src/input/commands/shell-core.ts +15 -7
  41. package/src/input/commands/skills-runtime.ts +2 -8
  42. package/src/input/commands/subscription-runtime.ts +2 -2
  43. package/src/input/commands/test-runtime.ts +277 -0
  44. package/src/input/commands/websearch-runtime.ts +101 -0
  45. package/src/input/commands/work-plan-runtime.ts +36 -10
  46. package/src/input/commands/workstream-runtime.ts +338 -0
  47. package/src/input/commands.ts +12 -0
  48. package/src/input/config-modal-types.ts +161 -0
  49. package/src/input/config-modal.ts +377 -0
  50. package/src/input/feed-context-factory.ts +7 -8
  51. package/src/input/handler-command-route.ts +27 -17
  52. package/src/input/handler-feed-routes.ts +61 -23
  53. package/src/input/handler-feed.ts +47 -23
  54. package/src/input/handler-interactions.ts +1 -3
  55. package/src/input/handler-modal-routes.ts +65 -0
  56. package/src/input/handler-modal-stack.ts +3 -5
  57. package/src/input/handler-modal-token-routes.ts +16 -49
  58. package/src/input/handler-picker-routes.ts +11 -94
  59. package/src/input/handler-shortcuts.ts +24 -14
  60. package/src/input/handler-types.ts +2 -6
  61. package/src/input/handler-ui-state.ts +10 -22
  62. package/src/input/handler.ts +6 -28
  63. package/src/input/keybindings.ts +22 -8
  64. package/src/input/model-picker-types.ts +24 -6
  65. package/src/input/model-picker.ts +58 -0
  66. package/src/input/panel-integration-actions.ts +9 -170
  67. package/src/input/settings-modal-data.ts +95 -0
  68. package/src/input/settings-modal-mutations.ts +6 -4
  69. package/src/main.ts +24 -27
  70. package/src/panels/agent-inspector-shared.ts +2 -1
  71. package/src/panels/base-panel.ts +22 -1
  72. package/src/panels/builtin/agent.ts +21 -107
  73. package/src/panels/builtin/development.ts +15 -61
  74. package/src/panels/builtin/knowledge.ts +8 -32
  75. package/src/panels/builtin/operations.ts +84 -428
  76. package/src/panels/builtin/session.ts +21 -112
  77. package/src/panels/builtin/shared.ts +9 -43
  78. package/src/panels/builtin-modals.ts +218 -0
  79. package/src/panels/builtin-panels.ts +5 -0
  80. package/src/panels/cost-tracker-panel.ts +36 -10
  81. package/src/panels/diff-panel.ts +12 -43
  82. package/src/panels/eval-registry.ts +60 -0
  83. package/src/panels/fleet-panel.ts +800 -0
  84. package/src/panels/fleet-read-model.ts +477 -0
  85. package/src/panels/fleet-steer.ts +92 -0
  86. package/src/panels/fleet-stop.ts +125 -0
  87. package/src/panels/fleet-tabs.ts +230 -0
  88. package/src/panels/fleet-transcript.ts +356 -0
  89. package/src/panels/index.ts +7 -31
  90. package/src/panels/modals/hooks-modal.ts +187 -0
  91. package/src/panels/modals/keybindings-modal.ts +151 -0
  92. package/src/panels/modals/knowledge-modal.ts +158 -0
  93. package/src/panels/modals/local-auth-modal.ts +132 -0
  94. package/src/panels/modals/marketplace-modal.ts +218 -0
  95. package/src/panels/modals/memory-modal.ts +180 -0
  96. package/src/panels/modals/modal-surface-helpers.ts +54 -0
  97. package/src/panels/modals/modal-theme.ts +36 -0
  98. package/src/panels/modals/pairing-modal.ts +144 -0
  99. package/src/panels/modals/planning-modal.ts +282 -0
  100. package/src/panels/modals/plugins-modal.ts +174 -0
  101. package/src/panels/modals/policy-modal.ts +256 -0
  102. package/src/panels/modals/provider-health-modal.ts +136 -0
  103. package/src/panels/modals/remote-modal.ts +115 -0
  104. package/src/panels/modals/sandbox-modal.ts +150 -0
  105. package/src/panels/modals/security-modal.ts +217 -0
  106. package/src/panels/modals/services-modal.ts +179 -0
  107. package/src/panels/modals/settings-sync-modal.ts +142 -0
  108. package/src/panels/modals/skills-modal.ts +189 -0
  109. package/src/panels/modals/subscription-modal.ts +172 -0
  110. package/src/panels/modals/work-plan-modal.ts +149 -0
  111. package/src/panels/panel-confirm-overlay.ts +72 -0
  112. package/src/panels/panel-manager.ts +108 -5
  113. package/src/panels/project-planning-answer-actions.ts +4 -2
  114. package/src/panels/skills-panel.ts +7 -51
  115. package/src/panels/types.ts +13 -0
  116. package/src/permissions/hunk-selection.ts +179 -0
  117. package/src/permissions/prompt.ts +60 -4
  118. package/src/renderer/compaction-history-modal.ts +19 -3
  119. package/src/renderer/compaction-preview.ts +13 -2
  120. package/src/renderer/compaction-quality.ts +100 -0
  121. package/src/renderer/config-modal.ts +81 -0
  122. package/src/renderer/conversation-overlays.ts +10 -17
  123. package/src/renderer/fleet-tab-strip.ts +56 -0
  124. package/src/renderer/footer-tips.ts +10 -2
  125. package/src/renderer/git-status.ts +40 -0
  126. package/src/renderer/help-overlay.ts +2 -2
  127. package/src/renderer/model-workspace.ts +44 -1
  128. package/src/renderer/panel-workspace-bar.ts +8 -2
  129. package/src/renderer/turn-injection.ts +114 -0
  130. package/src/runtime/bootstrap-command-context.ts +21 -1
  131. package/src/runtime/bootstrap-command-parts.ts +34 -7
  132. package/src/runtime/bootstrap-core.ts +14 -4
  133. package/src/runtime/bootstrap-shell.ts +29 -16
  134. package/src/runtime/bootstrap.ts +11 -17
  135. package/src/runtime/code-index-services.ts +112 -0
  136. package/src/runtime/orchestrator-core-services.ts +49 -0
  137. package/src/runtime/process-lifecycle.ts +3 -1
  138. package/src/runtime/services.ts +91 -43
  139. package/src/runtime/ui-services.ts +8 -0
  140. package/src/runtime/workstream-services.ts +195 -0
  141. package/src/shell/blocking-input.ts +22 -1
  142. package/src/shell/ui-openers.ts +129 -17
  143. package/src/utils/format-duration.ts +8 -18
  144. package/src/utils/splash-lines.ts +1 -1
  145. package/src/version.ts +1 -1
  146. package/src/panels/agent-inspector-panel.ts +0 -786
  147. package/src/panels/approval-panel.ts +0 -252
  148. package/src/panels/automation-control-panel.ts +0 -479
  149. package/src/panels/cockpit-panel.ts +0 -481
  150. package/src/panels/cockpit-read-model.ts +0 -238
  151. package/src/panels/communication-panel.ts +0 -256
  152. package/src/panels/control-plane-panel.ts +0 -470
  153. package/src/panels/debug-panel.ts +0 -615
  154. package/src/panels/docs-panel.ts +0 -384
  155. package/src/panels/eval-panel.ts +0 -627
  156. package/src/panels/file-explorer-panel.ts +0 -673
  157. package/src/panels/file-preview-panel.ts +0 -517
  158. package/src/panels/hooks-panel.ts +0 -401
  159. package/src/panels/incident-review-panel.ts +0 -406
  160. package/src/panels/intelligence-panel.ts +0 -383
  161. package/src/panels/knowledge-graph-panel.ts +0 -515
  162. package/src/panels/marketplace-panel.ts +0 -399
  163. package/src/panels/memory-panel.ts +0 -558
  164. package/src/panels/ops-control-panel.ts +0 -329
  165. package/src/panels/ops-strategy-panel.ts +0 -321
  166. package/src/panels/orchestration-panel.ts +0 -465
  167. package/src/panels/panel-list-panel.ts +0 -566
  168. package/src/panels/plan-dashboard-panel.ts +0 -707
  169. package/src/panels/policy-panel.ts +0 -517
  170. package/src/panels/project-planning-panel.ts +0 -731
  171. package/src/panels/provider-health-panel.ts +0 -678
  172. package/src/panels/provider-health-tracker.ts +0 -310
  173. package/src/panels/provider-health-views.ts +0 -567
  174. package/src/panels/qr-panel.ts +0 -280
  175. package/src/panels/remote-panel.ts +0 -534
  176. package/src/panels/routes-panel.ts +0 -241
  177. package/src/panels/sandbox-panel.ts +0 -456
  178. package/src/panels/security-panel.ts +0 -447
  179. package/src/panels/services-panel.ts +0 -329
  180. package/src/panels/session-browser-panel.ts +0 -496
  181. package/src/panels/settings-sync-panel.ts +0 -398
  182. package/src/panels/subscription-panel.ts +0 -342
  183. package/src/panels/symbol-outline-panel.ts +0 -619
  184. package/src/panels/system-messages-panel.ts +0 -364
  185. package/src/panels/tasks-panel.ts +0 -608
  186. package/src/panels/thinking-panel.ts +0 -333
  187. package/src/panels/tool-inspector-panel.ts +0 -537
  188. package/src/panels/work-plan-panel.ts +0 -540
  189. package/src/panels/worktree-panel.ts +0 -360
  190. package/src/panels/wrfc-panel.ts +0 -790
  191. package/src/renderer/agent-detail-modal.ts +0 -466
  192. package/src/renderer/live-tail-modal.ts +0 -156
  193. package/src/renderer/process-modal.ts +0 -671
  194. package/src/renderer/qr-renderer.ts +0 -120
@@ -1,450 +1,106 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
- import { CockpitPanel } from '../cockpit-panel.ts';
3
- import { AgentInspectorPanel } from '../agent-inspector-panel.ts';
4
- import { ApprovalPanel } from '../approval-panel.ts';
5
- import { PluginsPanel } from '../plugins-panel.ts';
6
- import { SkillsPanel } from '../skills-panel.ts';
7
- import { ServicesPanel } from '../services-panel.ts';
8
- import { AutomationControlPanel } from '../automation-control-panel.ts';
9
- import { RoutesPanel } from '../routes-panel.ts';
10
- import { ControlPlanePanel } from '../control-plane-panel.ts';
11
- import { SubscriptionPanel } from '../subscription-panel.ts';
2
+ import { FleetPanel } from '../fleet-panel.ts';
3
+ import { createFleetReadModel } from '../fleet-read-model.ts';
12
4
  import { LocalAuthPanel } from '../local-auth-panel.ts';
13
- import { SettingsSyncPanel } from '../settings-sync-panel.ts';
14
- import { WorktreePanel } from '../worktree-panel.ts';
15
- import { HooksPanel } from '../hooks-panel.ts';
16
- import { SecurityPanel } from '../security-panel.ts';
17
- import { MarketplacePanel } from '../marketplace-panel.ts';
18
- import { SandboxPanel } from '../sandbox-panel.ts';
19
- import { TasksPanel } from '../tasks-panel.ts';
20
- import { OrchestrationPanel } from '../orchestration-panel.ts';
21
- import { OpsStrategyPanel } from '../ops-strategy-panel.ts';
22
- import { OpsControlPanel } from '../ops-control-panel.ts';
23
- import { CommunicationPanel } from '../communication-panel.ts';
24
- import { RemotePanel } from '../remote-panel.ts';
25
- import { ProviderHealthPanel } from '../provider-health-panel.ts';
26
- import { DebugPanel } from '../debug-panel.ts';
27
- import { IncidentReviewPanel } from '../incident-review-panel.ts';
28
- import { PolicyPanel } from '../policy-panel.ts';
29
- import { EvalPanel } from '../eval-panel.ts';
30
- import { createProviderRuntimeInspectionQuery } from '../../runtime/ui-service-queries.ts';
31
- import { createRuntimeProviderApi } from '@/runtime/index.ts';
32
- import { selectModel } from '../../runtime/store/selectors/index.ts';
33
5
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
34
- import { requireAutomationManager, requireControlPlanePanelDeps, requireHookPanelDeps, requirePluginManager, requireUiServices, withUnconfiguredFallback } from './shared.ts';
35
- import { createCockpitRosterReadModel } from '../cockpit-read-model.ts';
6
+ import { requireUiServices } from './shared.ts';
36
7
 
37
8
  // WO-152: the former single 'monitoring' category (33 panels pre-merge) is
38
9
  // split into five operator domains, applied per-registration below. Kept in
39
10
  // this file's original registration order (rather than physically regrouped
40
11
  // by category) because several registrations below close over shared local
41
- // state — `ui`, `providerRuntime`, `runtimeStore`, `rosterReadModel` defined
42
- // once near the top of this function. Domain membership registered here:
43
- // providers: services, subscription, remote, provider-health
44
- // security-policy: approval, local-auth, settings-sync, security, sandbox, policy
45
- // automation-control: plugins, skills, automation, worktrees, hooks, marketplace
46
- // incidents-diagnostics: debug, incident, eval
47
- // runtime-ops: cockpit, routes, control-plane, tasks, orchestration,
48
- // ops, ops-control, communication (plus system-messages
49
- // and tokens/cost, registered in builtin/session.ts
50
- // and builtin/development.ts respectively)
12
+ // state — `ui` defined once near the top of this function.
13
+ //
14
+ // W6.1 (the purge): cockpit, approval, automation, routes, control-plane,
15
+ // worktrees, tasks, orchestration, ops, ops-control, and communication were
16
+ // RETIRE-INTO-FLEET (their live views are subsumed by the Fleet panel below
17
+ // — each id now redirects there via registerAlias); debug and eval were
18
+ // DELETE-disposition (no surviving human surface). See
19
+ // .goodvibes/audit/2026-07-04-wave6-briefs.json (W6.1) for the full
20
+ // disposition map. The rosterReadModel/agent-lifecycle wiring that used to
21
+ // feed CockpitPanel exclusively was removed along with it — Fleet reads the
22
+ // process registry directly via fleetReadModel below, not via the roster
23
+ // read-model.
24
+ //
25
+ // W6.1 MIGRATE-TO-MODAL: the Providers & Connectivity group (services,
26
+ // subscription, remote, provider-health) and Security group (settings-sync,
27
+ // sandbox) migrated to config-modal surfaces registered in builtin-modals.ts
28
+ // (WO-A); the Ecosystem & Governance group (plugins, skills, hooks, security,
29
+ // marketplace, policy, knowledge, memory, docs, qr-code, work-plan,
30
+ // project-planning) migrated to config-modal surfaces (WO-P). All surfaces AND
31
+ // their panel-id redirects are registered centrally in registerBuiltinModals
32
+ // (builtin-modals.ts) now — the interim ecosystem redirect bridge was deleted
33
+ // with the group-B port. local-auth is a DELIBERATE EXCEPTION — see below.
51
34
  export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
52
35
  const ui = requireUiServices(deps);
53
- const providerRuntime = createProviderRuntimeInspectionQuery(createRuntimeProviderApi({
54
- benchmarkStore: ui.providers.benchmarkStore,
55
- favoritesStore: ui.providers.favoritesStore,
56
- providerRegistry: ui.providers.providerRegistry,
57
- }));
58
- const runtimeStore = deps.runtimeStore;
59
36
 
60
- const rosterReadModel = createCockpitRosterReadModel(ui.agents.agentManager);
61
- // Subscribe to agent lifecycle events so the roster re-renders on state changes.
62
- // AGENT_RUNNING covers status transitions; AGENT_CANCELLED covers the cancellation
63
- // terminal state not emitted by AGENT_FAILED. Noisy mid-run events (STREAM_DELTA,
64
- // AWAITING_TOOL, etc.) are intentionally excluded they don't affect roster fields.
65
- // Note: stall detection is time-based, so stalled/stalledAgentCount will only refresh
66
- // on the next lifecycle event; a periodic tick would be needed for real-time stall display.
67
- ui.events.agents.on('AGENT_SPAWNING', () => rosterReadModel.markDirty());
68
- ui.events.agents.on('AGENT_RUNNING', () => rosterReadModel.markDirty());
69
- ui.events.agents.on('AGENT_COMPLETED', () => rosterReadModel.markDirty());
70
- ui.events.agents.on('AGENT_FAILED', () => rosterReadModel.markDirty());
71
- ui.events.agents.on('AGENT_CANCELLED', () => rosterReadModel.markDirty());
37
+ // W2.2: Fleet — the live unified process tree, read from the single
38
+ // process registry constructed once in runtime/services.ts (shared with
39
+ // every other consumer rather than duplicated here; the registry owns its
40
+ // own coalesced tick, so no manual lifecycle-event wiring is needed).
41
+ // Wave-3 (W3.2): runtimeBus is also passed so the read model can subscribe
42
+ // to the honest COMMUNICATION_CONSUMED steer-ack signal (fleet-read-model.ts).
43
+ const fleetReadModel = createFleetReadModel(ui.runtime.processRegistry, ui.runtime.runtimeBus);
72
44
 
73
45
  manager.registerType({
74
- id: 'cockpit',
75
- name: 'Cockpit',
76
- icon: 'O',
46
+ id: 'fleet',
47
+ name: 'Fleet',
48
+ // W2.2: '' verified free against the full icon registry at wiring time.
49
+ icon: '⊟',
77
50
  category: 'runtime-ops',
78
- description: 'Unified operator summary for orchestration, permissions, communication, MCP, plugins, and integrations',
79
- factory: () => new CockpitPanel(
80
- ui.readModels.cockpit,
81
- rosterReadModel,
82
- {
83
- openAgentDetail: (agentId: string) => deps.openAgentDetail?.(agentId),
84
- cancelAgent: (agentId: string) => ui.agents.agentManager.cancel(agentId),
85
- // WO-130: roster Enter jumps to the Inspector console (WO-110's
86
- // inspectAgent deep-link target) instead of only the quick-peek modal.
87
- inspectAgent: (agentId: string) => {
88
- const panel = manager.open('inspector');
89
- if (panel instanceof AgentInspectorPanel) panel.inspectAgent(agentId);
90
- },
91
- openPanel: (panelId: string) => deps.openPanel?.(panelId),
92
- },
93
- ),
94
- });
95
-
96
- manager.registerType({
97
- id: 'approval',
98
- name: 'Approval',
99
- icon: 'A',
100
- category: 'security-policy',
101
- description: 'Action-specific approval workspace for why-prompted, why-denied, and what-if review',
102
- factory: () => new ApprovalPanel(deps.policyRuntimeState),
103
- });
104
-
105
- manager.registerType({
106
- id: 'plugins',
107
- name: 'Plugins',
108
- // WO-152: was 'P' (collided with project-planning and preview).
109
- icon: '',
110
- category: 'automation-control',
111
- description: 'Plugin trust, quarantine, capability, and activation status',
112
- factory: () => new PluginsPanel(requirePluginManager(deps)),
113
- });
114
-
115
- manager.registerType({
116
- id: 'skills',
117
- name: 'Skills',
118
- // WO-152: was 'K' (collided with knowledge and tokens).
119
- icon: '▩',
120
- category: 'automation-control',
121
- description: 'Project-local and global skill discovery with origin and dependency details',
122
- factory: () => new SkillsPanel({
123
- componentHealthMonitor: deps.componentHealthMonitor,
124
- shellPaths: ui.environment.shellPaths,
125
- ecosystemPaths: {
126
- cwd: ui.environment.shellPaths.workingDirectory,
127
- homeDir: ui.environment.shellPaths.homeDirectory,
128
- projectCatalogRoot: ui.environment.shellPaths.resolveProjectPath('tui', 'ecosystem'),
129
- userCatalogRoot: ui.environment.shellPaths.resolveUserPath('tui', 'ecosystem'),
130
- },
131
- }),
132
- });
133
-
134
- manager.registerType({
135
- id: 'services',
136
- name: 'Services',
137
- icon: 'V',
138
- category: 'providers',
139
- description: 'Configured external services, credential presence, and connection health tests',
140
- factory: () => new ServicesPanel(deps.serviceRegistry, deps.subscriptionManager),
141
- });
142
-
143
- manager.registerType({
144
- id: 'automation',
145
- name: 'Automation',
146
- // WO-152: was 'M' (collided with memory and marketplace).
147
- icon: '◨',
148
- category: 'automation-control',
149
- description: 'Automation jobs, runs, deliveries, and watcher-fed sources across the control plane, with real enable/disable and run-now controls',
150
- factory: () => new AutomationControlPanel(ui.readModels.automation, ui.readModels.watchers, {
151
- automationManager: requireAutomationManager(deps),
152
- watcherRegistry: deps.watcherRegistry,
153
- }),
154
- });
155
-
156
- manager.registerType({
157
- id: 'routes',
158
- name: 'Routes',
159
- icon: 'R',
160
- category: 'runtime-ops',
161
- description: 'Cross-surface route bindings and shared session attachment state',
162
- factory: () => new RoutesPanel(ui.readModels.routes),
163
- });
164
-
165
- manager.registerType({
166
- id: 'control-plane',
167
- name: 'Control Plane',
168
- icon: 'C',
169
- category: 'runtime-ops',
170
- description: 'Daemon control-plane state, clients, approvals, and recent operator activity',
171
- factory: () => new ControlPlanePanel(ui.readModels.controlPlane, requireControlPlanePanelDeps(deps)),
172
- });
173
-
174
- manager.registerType({
175
- id: 'subscription',
176
- name: 'Subscriptions',
177
- icon: 'B',
178
- category: 'providers',
179
- description: 'OAuth-backed provider subscriptions and supported provider override posture',
180
- factory: () => new SubscriptionPanel(deps.serviceRegistry, deps.subscriptionManager),
181
- });
182
-
51
+ description: 'Live unified process tree: agents, WRFC chains, workflows, watchers, and background processes, with interrupt/kill/steer controls',
52
+ factory: () => new FleetPanel(fleetReadModel, {
53
+ interrupt: (id: string) => fleetReadModel.interrupt(id),
54
+ // Wave-6 (wo-F item d2): re-arm a paused trigger/schedule/automation job.
55
+ resume: (id: string) => fleetReadModel.resume(id),
56
+ kill: (id: string, opts: { cascade: boolean }) => fleetReadModel.kill(id, opts),
57
+ // Wave-3 (C6): full-fidelity transcript source for an attached agent
58
+ // tab live while the agent runs, frozen briefly after it completes
59
+ // (AgentManager's bounded retention ring), empty once evicted (the
60
+ // panel degrades to the on-disk ledger fallback in that case).
61
+ getConversationSnapshot: (agentId: string) => ui.agents.agentManager.getConversationSnapshot(agentId),
62
+ resolveSessionLogPath: (agentId: string) => ui.environment.shellPaths.resolveProjectPath('tui', 'sessions', `${agentId}.jsonl`),
63
+ // Wave-3 (W3.2): queue a message for a live in-process agent/wrfc-subtask member.
64
+ steer: (id: string, text: string) => fleetReadModel.steer(id, text),
65
+ }, deps.configManager),
66
+ });
67
+
68
+ // Compat: '/panel open <id>' (and any saved layout/muscle memory) for
69
+ // every retired runtime-ops console still resolves — redirected to fleet,
70
+ // which absorbs orchestration, permissions, communication, task, and
71
+ // process-tree views (see FleetPanel's own description above).
72
+ manager.registerAlias('cockpit', 'fleet');
73
+ manager.registerAlias('approval', 'fleet');
74
+ manager.registerAlias('automation', 'fleet');
75
+ manager.registerAlias('routes', 'fleet');
76
+ manager.registerAlias('control-plane', 'fleet');
77
+ manager.registerAlias('worktrees', 'fleet');
78
+ manager.registerAlias('tasks', 'fleet');
79
+ manager.registerAlias('orchestration', 'fleet');
80
+ manager.registerAlias('ops', 'fleet');
81
+ manager.registerAlias('ops-control', 'fleet');
82
+ manager.registerAlias('communication', 'fleet');
83
+ manager.registerAlias('incident', 'fleet');
84
+ // Re-pointed: forensics used to resolve to the (now-retired) incident
85
+ // workspace (WO-114); both ids now land on fleet directly — alias
86
+ // resolution is a single hop, so this cannot chain through 'incident'.
87
+ manager.registerAlias('forensics', 'fleet');
88
+
89
+ // local-auth is a DELIBERATE EXCEPTION to the W6.1 purge: it stays a
90
+ // registered panel because it is the host for the masked password-entry
91
+ // sub-mode (LocalAuthPanel.openMaskedEntry, driven by
92
+ // ctx.openLocalAuthMaskedEntry — the only path that keeps a plaintext
93
+ // password out of argv/history/scrollback). Its browse view is mirrored by
94
+ // local-auth-modal (reached via the /local-auth front-door), but the panel
95
+ // itself cannot be retired without regressing that secure input, and no
96
+ // 'local-auth' modal redirect is registered (so openLocalAuthMaskedEntry's
97
+ // showPanel('local-auth') + getPanel('local-auth') still resolve to it).
183
98
  manager.registerType({
184
99
  id: 'local-auth',
185
100
  name: 'Local Auth',
186
101
  icon: 'U',
187
102
  category: 'security-policy',
188
- description: 'Local daemon/listener auth users, bootstrap posture, and active sessions',
103
+ description: 'Local daemon/listener auth users, bootstrap posture, and active sessions (also the masked password-entry host)',
189
104
  factory: () => new LocalAuthPanel(deps.localUserAuthManager),
190
105
  });
191
-
192
- manager.registerType({
193
- id: 'settings-sync',
194
- name: 'Settings Sync',
195
- // WO-152: registry previously said 'Y' while the live panel's own
196
- // super() call used 'S' — a pre-existing registry/instance mismatch as
197
- // well as a collision ('Y' with communication/eval, 'S' with symbols).
198
- // Unified to a single unique glyph in both places.
199
- icon: '▱',
200
- category: 'security-policy',
201
- description: 'Local, synced, and managed settings posture with recent sync events and active locks',
202
- factory: () => new SettingsSyncPanel(deps.configManager),
203
- });
204
-
205
- manager.registerType({
206
- id: 'worktrees',
207
- name: 'Worktrees',
208
- // WO-152: was 'W' (collided with wrfc).
209
- icon: '▯',
210
- category: 'automation-control',
211
- description: 'Orchestrator-owned git worktree lifecycle, attachments, and cleanup state',
212
- factory: () => new WorktreePanel(deps.worktreeRegistry, deps.requestRender),
213
- });
214
-
215
- manager.registerType({
216
- id: 'hooks',
217
- name: 'Hooks',
218
- // WO-152: was 'H' (collided with sessions).
219
- icon: '▨',
220
- category: 'automation-control',
221
- description: 'Registered hooks, chains, contracts, and execution policy details',
222
- factory: () => {
223
- const hookDeps = requireHookPanelDeps(deps);
224
- return new HooksPanel(hookDeps.hookDispatcher, hookDeps.hookWorkbench, hookDeps.hookActivityTracker);
225
- },
226
- });
227
-
228
- manager.registerType({
229
- id: 'security',
230
- name: 'Security',
231
- // WO-152: was 'U' (collided with local-auth and policy).
232
- icon: '▬',
233
- category: 'security-policy',
234
- description: 'Security review workspace for token audit, policy posture, MCP quarantine, and incident pressure',
235
- factory: () => new SecurityPanel(ui.readModels.security),
236
- });
237
-
238
- manager.registerType({
239
- id: 'marketplace',
240
- name: 'Marketplace',
241
- // WO-152: was 'M' (collided with memory and automation).
242
- icon: '◩',
243
- category: 'automation-control',
244
- description: 'Curated plugin and skill marketplace with provenance, compatibility, and install posture',
245
- factory: () => {
246
- return new MarketplacePanel(ui.readModels.marketplace, {
247
- cwd: ui.environment.shellPaths.workingDirectory,
248
- homeDir: ui.environment.shellPaths.homeDirectory,
249
- projectCatalogRoot: ui.environment.shellPaths.resolveProjectPath('tui', 'ecosystem'),
250
- userCatalogRoot: ui.environment.shellPaths.resolveUserPath('tui', 'ecosystem'),
251
- });
252
- },
253
- });
254
-
255
- manager.registerType({
256
- id: 'sandbox',
257
- name: 'Sandbox',
258
- // WO-152: was 'X' (collided with tools).
259
- icon: '▪',
260
- category: 'security-policy',
261
- description: 'VM isolation posture for MCP servers and evaluation runtimes',
262
- factory: () => new SandboxPanel(deps.configManager, deps.sandboxSessionRegistry, deps.requestRender),
263
- });
264
-
265
- manager.registerType({
266
- id: 'tasks',
267
- name: 'Tasks',
268
- // WO-152: was 'J' (collided with intelligence and system-messages).
269
- icon: '▦',
270
- category: 'runtime-ops',
271
- description: 'Queued, running, blocked, failed, and completed task summaries from the runtime store',
272
- factory: () => new TasksPanel(ui.readModels.tasks, ui.readModels.worktrees, deps.opsApi),
273
- });
274
-
275
- manager.registerType({
276
- id: 'orchestration',
277
- name: 'Orchestration',
278
- // WO-152: was 'Q' (collided with qr-code and ops-control).
279
- icon: '◒',
280
- category: 'runtime-ops',
281
- description: 'Task-graph status, node roles, and bounded recursion guard activity',
282
- factory: () => new OrchestrationPanel(ui.readModels.orchestration),
283
- });
284
-
285
- manager.registerType({
286
- id: 'ops',
287
- name: 'Ops',
288
- // WO-152: was 'O' (collided with cockpit). Also unifies a pre-existing
289
- // registry ('monitoring') / live-instance (ops-strategy-panel.ts said
290
- // 'agent') category mismatch onto a single 'runtime-ops' value.
291
- icon: '◫',
292
- category: 'runtime-ops',
293
- description: 'Adaptive planner strategy timeline, override posture, and recent execution-mode decisions',
294
- factory: () => new OpsStrategyPanel(ui.events.planner, deps.adaptivePlanner, deps.planRuntime),
295
- });
296
-
297
- // WO-120: the operator intervention console behind the operator-control-plane
298
- // feature flag. Registration is unconditional (matching the ControlPlanePanel
299
- // pattern above) — the flag itself gates whether bootstrap.ts wires the
300
- // openOpsPanel command-context callback and the Ctrl+O / `/ops view` route,
301
- // not whether the panel type resolves for direct `/panel open ops-control`.
302
- manager.registerType({
303
- id: 'ops-control',
304
- name: 'Ops Control',
305
- // WO-152: was 'Q' (collided with qr-code and orchestration). Also unifies
306
- // a pre-existing registry ('monitoring') / live-instance (ops-control-panel.ts
307
- // said 'agent') category mismatch onto a single 'runtime-ops' value.
308
- icon: '◓',
309
- category: 'runtime-ops',
310
- description: 'Operator intervention console: audit log plus cancel/pause/resume/retry on tasks and cancel on agents',
311
- factory: () => new OpsControlPanel(ui.events.ops, deps.opsApi),
312
- });
313
-
314
- manager.registerType({
315
- id: 'communication',
316
- name: 'Communication',
317
- icon: 'Y',
318
- category: 'runtime-ops',
319
- description: 'Structured agent communication, blocked routes, and delivery status',
320
- preload: true,
321
- retainOnClose: true,
322
- factory: () => new CommunicationPanel(
323
- ui.readModels.communication,
324
- (agentId: string) => deps.openAgentDetail?.(agentId),
325
- ),
326
- });
327
-
328
- manager.registerType({
329
- id: 'remote',
330
- name: 'Remote',
331
- // WO-152: was 'R' (collided with routes).
332
- icon: '▰',
333
- category: 'providers',
334
- description: 'Self-hosted daemon and ACP transport state with active remote connections',
335
- factory: () => new RemotePanel(ui.readModels.remote),
336
- });
337
-
338
- manager.registerType({
339
- id: 'provider-health',
340
- name: 'Health',
341
- icon: 'N',
342
- category: 'providers',
343
- description: 'Provider console: status, latency timelines, error attribution, auth routes, fallback chain, and repair actions',
344
- preload: true,
345
- retainOnClose: true,
346
- factory: () => new ProviderHealthPanel(
347
- providerRuntime,
348
- {
349
- configManager: deps.configManager,
350
- turnEvents: ui.events.turns,
351
- providerEvents: ui.events.providers,
352
- providers: ui.readModels.providers,
353
- session: ui.readModels.session,
354
- security: ui.readModels.security,
355
- localAuth: ui.readModels.localAuth,
356
- settings: ui.readModels.settings,
357
- remote: ui.readModels.remote,
358
- intelligence: ui.readModels.intelligence,
359
- continuity: ui.readModels.continuity,
360
- worktrees: ui.readModels.worktrees,
361
- ...(runtimeStore
362
- ? {
363
- modelState: {
364
- get: () => selectModel(runtimeStore.getState()),
365
- subscribe: (listener: () => void) => runtimeStore.subscribe(listener),
366
- },
367
- }
368
- : {}),
369
- },
370
- deps.requestRender,
371
- ),
372
- });
373
-
374
- // WO-112 compat (wired at integration): the retired 'providers' and
375
- // 'accounts' panel ids still resolve — redirected to the merged
376
- // provider-health console. '/accounts panel|open' depends on the
377
- // 'accounts' alias.
378
- manager.registerAlias('providers', 'provider-health');
379
- manager.registerAlias('accounts', 'provider-health');
380
-
381
- manager.registerType({
382
- id: 'debug',
383
- name: 'Debug',
384
- // WO-152: was 'B' (collided with subscription).
385
- icon: '▧',
386
- category: 'incidents-diagnostics',
387
- description: 'API debug panel: per-call log with model, provider, tokens, latency, status, and error history',
388
- factory: () => {
389
- const panel = new DebugPanel(ui.events.turns, deps.requestRender);
390
- if (deps.orchestrator) panel.wireOrchestrator(deps.orchestrator);
391
- return panel;
392
- },
393
- });
394
-
395
- // WO-152: always registered (was gated behind `if (deps.forensicsRegistry)`,
396
- // so `/panel open incident` reported "Unknown panel" on builds without a
397
- // forensics registry wired). IncidentReviewPanel already accepts an
398
- // optional registry and renders its own "not configured" empty state when
399
- // it is absent, so no fallback wrapper is needed here — only the
400
- // conditional registration itself is removed.
401
- manager.registerType({
402
- id: 'incident',
403
- name: 'Incident',
404
- // WO-152: was 'N' (collided with provider-health).
405
- icon: '◪',
406
- category: 'incidents-diagnostics',
407
- description: 'Incident workspace with root cause, permission, budget, replay, causal-chain, phase-timing, and jump-link evidence',
408
- factory: () => new IncidentReviewPanel(deps.forensicsRegistry),
409
- });
410
- // WO-114 compat (Forensics merged into Incident): the retired 'forensics'
411
- // panel id still resolves — redirected to the merged Incident workspace so
412
- // pre-existing openForensicsPanel()/`/forensics` callers land on the same
413
- // Incident instance instead of stacking a duplicate registration.
414
- manager.registerAlias('forensics', 'incident');
415
-
416
- manager.registerType({
417
- id: 'policy',
418
- name: 'Policy',
419
- // WO-152: was 'U' (collided with local-auth and security).
420
- icon: '▭',
421
- category: 'security-policy',
422
- description: 'Policy governance: active/candidate bundles, divergence gate, rollout history, and simulation evidence',
423
- factory: () => new PolicyPanel(deps.policyRuntimeState),
424
- });
425
-
426
- // WO-152: always registered (was gated behind `if (deps.evalRegistry)`, so
427
- // `/panel open eval` reported "Unknown panel" on builds without an eval
428
- // registry wired). Falls back to a "dependency not configured" empty state.
429
- {
430
- const { evalRegistry } = deps;
431
- manager.registerType({
432
- id: 'eval',
433
- name: 'Eval',
434
- // WO-152: registry previously said 'Y' while the live panel's own
435
- // super() call used 'V' — a pre-existing registry/instance mismatch as
436
- // well as a collision ('Y' with communication/settings-sync, 'V' with
437
- // services). Unified to a single unique glyph in both places.
438
- icon: '▮',
439
- category: 'incidents-diagnostics',
440
- description: 'Evaluation harness: benchmark suite results, scorecards, and regression gates',
441
- factory: withUnconfiguredFallback(
442
- evalRegistry !== undefined,
443
- 'eval', 'Eval', '▮', 'incidents-diagnostics',
444
- ' Eval registry not configured for this session.',
445
- 'This runtime was not wired with an evaluation harness registry at bootstrap, so no eval data is available.',
446
- () => new EvalPanel(evalRegistry!, ui.environment.shellPaths.workingDirectory),
447
- ),
448
- });
449
- }
450
106
  }