@pellux/goodvibes-tui 1.1.0 → 1.9.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 (267) hide show
  1. package/CHANGELOG.md +85 -21
  2. package/README.md +28 -18
  3. package/docs/foundation-artifacts/operator-contract.json +4045 -1763
  4. package/package.json +2 -2
  5. package/src/audio/spoken-turn-controller.ts +12 -2
  6. package/src/audio/spoken-turn-wiring.ts +2 -1
  7. package/src/cli/help.ts +8 -1
  8. package/src/cli/service-posture.ts +2 -1
  9. package/src/cli/status.ts +2 -1
  10. package/src/cli/surface-command.ts +2 -2
  11. package/src/core/alert-gating.ts +67 -0
  12. package/src/core/approval-alert.ts +72 -0
  13. package/src/core/budget-breach-notifier.ts +106 -0
  14. package/src/core/composer-state.ts +11 -3
  15. package/src/core/conversation-line-cache.ts +27 -3
  16. package/src/core/conversation-rendering.ts +90 -14
  17. package/src/core/conversation.ts +18 -0
  18. package/src/core/focus-tracker.ts +41 -0
  19. package/src/core/long-task-notifier.ts +33 -6
  20. package/src/core/stream-event-wiring.ts +20 -1
  21. package/src/core/system-message-noise.ts +87 -0
  22. package/src/core/system-message-router.ts +104 -51
  23. package/src/core/turn-cancellation.ts +25 -0
  24. package/src/core/turn-event-wiring.ts +72 -3
  25. package/src/daemon/cli.ts +29 -2
  26. package/src/daemon/handlers/register.ts +8 -1
  27. package/src/daemon/service-commands.ts +329 -0
  28. package/src/export/cost-utils.ts +36 -0
  29. package/src/input/autocomplete.ts +27 -1
  30. package/src/input/command-registry.ts +84 -5
  31. package/src/input/commands/checkpoint-runtime.ts +280 -0
  32. package/src/input/commands/codebase-runtime.ts +232 -0
  33. package/src/input/commands/config.ts +43 -3
  34. package/src/input/commands/eval.ts +1 -1
  35. package/src/input/commands/health-runtime.ts +10 -2
  36. package/src/input/commands/image-runtime.ts +112 -0
  37. package/src/input/commands/intelligence-runtime.ts +11 -1
  38. package/src/input/commands/local-auth-runtime.ts +4 -1
  39. package/src/input/commands/local-runtime.ts +9 -3
  40. package/src/input/commands/marketplace-runtime.ts +2 -2
  41. package/src/input/commands/memory.ts +73 -35
  42. package/src/input/commands/operator-panel-runtime.ts +71 -31
  43. package/src/input/commands/planning-runtime.ts +116 -4
  44. package/src/input/commands/platform-sandbox-runtime.ts +1 -6
  45. package/src/input/commands/plugin-runtime.ts +2 -2
  46. package/src/input/commands/policy-dispatch.ts +21 -0
  47. package/src/input/commands/provider-accounts-runtime.ts +1 -1
  48. package/src/input/commands/qrcode-runtime.ts +26 -6
  49. package/src/input/commands/recall-review.ts +35 -0
  50. package/src/input/commands/remote-runtime-setup.ts +5 -3
  51. package/src/input/commands/remote-runtime.ts +3 -3
  52. package/src/input/commands/runtime-services.ts +54 -13
  53. package/src/input/commands/services-runtime.ts +1 -1
  54. package/src/input/commands/session-content.ts +20 -9
  55. package/src/input/commands/session-workflow.ts +16 -1
  56. package/src/input/commands/settings-sync-runtime.ts +16 -4
  57. package/src/input/commands/shell-core.ts +25 -8
  58. package/src/input/commands/skills-runtime.ts +2 -8
  59. package/src/input/commands/subscription-runtime.ts +2 -2
  60. package/src/input/commands/test-runtime.ts +277 -0
  61. package/src/input/commands/websearch-runtime.ts +101 -0
  62. package/src/input/commands/work-plan-runtime.ts +36 -10
  63. package/src/input/commands/workstream-runtime.ts +488 -0
  64. package/src/input/commands.ts +12 -0
  65. package/src/input/config-modal-types.ts +175 -0
  66. package/src/input/config-modal.ts +592 -0
  67. package/src/input/feed-context-factory.ts +10 -8
  68. package/src/input/handler-command-route.ts +37 -20
  69. package/src/input/handler-content-actions.ts +17 -2
  70. package/src/input/handler-feed-routes.ts +74 -114
  71. package/src/input/handler-feed.ts +79 -27
  72. package/src/input/handler-interactions.ts +1 -3
  73. package/src/input/handler-modal-routes.ts +136 -6
  74. package/src/input/handler-modal-stack.ts +14 -7
  75. package/src/input/handler-modal-token-routes.ts +16 -49
  76. package/src/input/handler-onboarding-daemon-adopt.ts +149 -0
  77. package/src/input/handler-onboarding.ts +71 -59
  78. package/src/input/handler-picker-routes.ts +26 -102
  79. package/src/input/handler-shortcuts.ts +74 -14
  80. package/src/input/handler-types.ts +2 -6
  81. package/src/input/handler-ui-state.ts +10 -22
  82. package/src/input/handler.ts +12 -29
  83. package/src/input/keybindings.ts +23 -8
  84. package/src/input/model-picker-types.ts +24 -6
  85. package/src/input/model-picker.ts +77 -2
  86. package/src/input/onboarding/onboarding-runtime-status.ts +10 -1
  87. package/src/input/onboarding/onboarding-wizard-apply.ts +8 -1
  88. package/src/input/onboarding/onboarding-wizard-constants.ts +4 -1
  89. package/src/input/onboarding/onboarding-wizard-network-adopt.ts +136 -0
  90. package/src/input/onboarding/onboarding-wizard-steps.ts +9 -6
  91. package/src/input/onboarding/onboarding-wizard-types.ts +3 -1
  92. package/src/input/panel-integration-actions.ts +9 -170
  93. package/src/input/panel-mouse-geometry.ts +97 -0
  94. package/src/input/panel-paste-flood-guard.ts +86 -0
  95. package/src/input/selection-modal.ts +11 -0
  96. package/src/input/session-picker-modal.ts +44 -4
  97. package/src/input/settings-modal-data.ts +146 -2
  98. package/src/input/settings-modal-mutations.ts +6 -4
  99. package/src/input/settings-modal-types.ts +4 -2
  100. package/src/main.ts +49 -51
  101. package/src/panels/agent-inspector-shared.ts +2 -1
  102. package/src/panels/base-panel.ts +22 -1
  103. package/src/panels/builtin/agent.ts +21 -107
  104. package/src/panels/builtin/development.ts +15 -61
  105. package/src/panels/builtin/knowledge.ts +8 -32
  106. package/src/panels/builtin/operations.ts +84 -428
  107. package/src/panels/builtin/session.ts +21 -112
  108. package/src/panels/builtin/shared.ts +18 -46
  109. package/src/panels/builtin-modals.ts +218 -0
  110. package/src/panels/builtin-panels.ts +5 -0
  111. package/src/panels/cost-tracker-panel.ts +36 -10
  112. package/src/panels/diff-panel.ts +12 -43
  113. package/src/panels/eval-registry.ts +60 -0
  114. package/src/panels/fleet-deep-link.ts +31 -0
  115. package/src/panels/fleet-panel-format.ts +62 -0
  116. package/src/panels/fleet-panel-worktree-detail.ts +48 -0
  117. package/src/panels/fleet-panel.ts +758 -0
  118. package/src/panels/fleet-read-model.ts +520 -0
  119. package/src/panels/fleet-steer.ts +125 -0
  120. package/src/panels/fleet-stop.ts +153 -0
  121. package/src/panels/fleet-tabs.ts +230 -0
  122. package/src/panels/fleet-transcript.ts +356 -0
  123. package/src/panels/index.ts +7 -31
  124. package/src/panels/modals/hooks-modal.ts +187 -0
  125. package/src/panels/modals/keybindings-modal.ts +166 -0
  126. package/src/panels/modals/knowledge-modal.ts +158 -0
  127. package/src/panels/modals/local-auth-modal.ts +132 -0
  128. package/src/panels/modals/marketplace-modal.ts +218 -0
  129. package/src/panels/modals/memory-modal.ts +180 -0
  130. package/src/panels/modals/modal-surface-helpers.ts +54 -0
  131. package/src/panels/modals/modal-theme.ts +42 -0
  132. package/src/panels/modals/pairing-modal.ts +163 -0
  133. package/src/panels/modals/planning-modal.ts +304 -0
  134. package/src/panels/modals/plugins-modal.ts +174 -0
  135. package/src/panels/modals/policy-modal.ts +256 -0
  136. package/src/panels/modals/provider-health-modal.ts +136 -0
  137. package/src/panels/modals/remote-modal.ts +115 -0
  138. package/src/panels/modals/sandbox-modal.ts +150 -0
  139. package/src/panels/modals/security-modal.ts +217 -0
  140. package/src/panels/modals/services-modal.ts +179 -0
  141. package/src/panels/modals/settings-sync-modal.ts +142 -0
  142. package/src/panels/modals/skills-modal.ts +189 -0
  143. package/src/panels/modals/subscription-modal.ts +172 -0
  144. package/src/panels/modals/work-plan-modal.ts +177 -0
  145. package/src/panels/panel-confirm-overlay.ts +72 -0
  146. package/src/panels/panel-manager.ts +123 -9
  147. package/src/panels/polish-core.ts +38 -25
  148. package/src/panels/project-planning-answer-actions.ts +8 -11
  149. package/src/panels/skills-panel.ts +7 -51
  150. package/src/panels/types.ts +37 -0
  151. package/src/permissions/hunk-selection.ts +179 -0
  152. package/src/permissions/prompt.ts +216 -13
  153. package/src/renderer/autocomplete-overlay.ts +28 -2
  154. package/src/renderer/compaction-history-modal.ts +19 -3
  155. package/src/renderer/compaction-preview.ts +13 -2
  156. package/src/renderer/compaction-quality.ts +100 -0
  157. package/src/renderer/compositor.ts +2 -3
  158. package/src/renderer/config-modal.ts +95 -0
  159. package/src/renderer/conversation-overlays.ts +10 -17
  160. package/src/renderer/fleet-tab-strip.ts +56 -0
  161. package/src/renderer/footer-tips.ts +15 -3
  162. package/src/renderer/fullscreen-primitives.ts +32 -22
  163. package/src/renderer/git-status.ts +43 -1
  164. package/src/renderer/help-overlay.ts +2 -2
  165. package/src/renderer/layout.ts +0 -4
  166. package/src/renderer/markdown.ts +7 -3
  167. package/src/renderer/modal-factory.ts +25 -20
  168. package/src/renderer/model-workspace.ts +62 -4
  169. package/src/renderer/overlay-box.ts +21 -17
  170. package/src/renderer/panel-workspace-bar.ts +8 -2
  171. package/src/renderer/process-indicator.ts +14 -3
  172. package/src/renderer/selection-modal-overlay.ts +6 -1
  173. package/src/renderer/session-picker-modal.ts +196 -3
  174. package/src/renderer/settings-modal-helpers.ts +2 -0
  175. package/src/renderer/settings-modal.ts +7 -0
  176. package/src/renderer/shell-surface.ts +8 -1
  177. package/src/renderer/status-glyphs.ts +14 -15
  178. package/src/renderer/system-message.ts +15 -3
  179. package/src/renderer/terminal-bg-probe.ts +339 -0
  180. package/src/renderer/terminal-escapes.ts +20 -0
  181. package/src/renderer/theme-mode-config.ts +67 -0
  182. package/src/renderer/theme.ts +91 -1
  183. package/src/renderer/thinking.ts +11 -3
  184. package/src/renderer/tool-call.ts +15 -9
  185. package/src/renderer/tool-result-summary.ts +148 -0
  186. package/src/renderer/turn-injection.ts +133 -0
  187. package/src/renderer/ui-factory.ts +154 -85
  188. package/src/renderer/ui-primitives.ts +30 -129
  189. package/src/runtime/bootstrap-command-context.ts +27 -1
  190. package/src/runtime/bootstrap-command-parts.ts +41 -10
  191. package/src/runtime/bootstrap-core.ts +47 -15
  192. package/src/runtime/bootstrap-hook-bridge.ts +7 -0
  193. package/src/runtime/bootstrap-shell.ts +48 -17
  194. package/src/runtime/bootstrap.ts +129 -22
  195. package/src/runtime/code-index-services.ts +135 -0
  196. package/src/runtime/legacy-daemon-migration.ts +516 -0
  197. package/src/runtime/memory-fold.ts +26 -0
  198. package/src/runtime/onboarding/derivation.ts +7 -2
  199. package/src/runtime/onboarding/snapshot.ts +27 -1
  200. package/src/runtime/onboarding/types.ts +31 -1
  201. package/src/runtime/operator-token-cleanup.ts +82 -1
  202. package/src/runtime/orchestrator-core-services.ts +59 -0
  203. package/src/runtime/process-lifecycle.ts +3 -1
  204. package/src/runtime/resume-notice.ts +209 -0
  205. package/src/runtime/services.ts +98 -46
  206. package/src/runtime/session-inbound-inputs.ts +252 -0
  207. package/src/runtime/session-spine-transport.ts +64 -0
  208. package/src/runtime/terminal-output-guard.ts +15 -8
  209. package/src/runtime/ui-services.ts +27 -3
  210. package/src/runtime/workstream-services.ts +327 -0
  211. package/src/runtime/wrfc-persistence.ts +124 -17
  212. package/src/shell/blocking-input.ts +68 -4
  213. package/src/shell/recovery-input-helpers.ts +170 -1
  214. package/src/shell/ui-openers.ts +171 -26
  215. package/src/utils/format-duration.ts +8 -18
  216. package/src/utils/splash-lines.ts +1 -1
  217. package/src/utils/terminal-width.ts +52 -0
  218. package/src/version.ts +1 -1
  219. package/src/panels/agent-inspector-panel.ts +0 -786
  220. package/src/panels/approval-panel.ts +0 -252
  221. package/src/panels/automation-control-panel.ts +0 -479
  222. package/src/panels/cockpit-panel.ts +0 -481
  223. package/src/panels/cockpit-read-model.ts +0 -238
  224. package/src/panels/communication-panel.ts +0 -256
  225. package/src/panels/control-plane-panel.ts +0 -470
  226. package/src/panels/debug-panel.ts +0 -615
  227. package/src/panels/docs-panel.ts +0 -384
  228. package/src/panels/eval-panel.ts +0 -627
  229. package/src/panels/file-explorer-panel.ts +0 -673
  230. package/src/panels/file-preview-panel.ts +0 -517
  231. package/src/panels/hooks-panel.ts +0 -401
  232. package/src/panels/incident-review-panel.ts +0 -406
  233. package/src/panels/intelligence-panel.ts +0 -383
  234. package/src/panels/knowledge-graph-panel.ts +0 -515
  235. package/src/panels/marketplace-panel.ts +0 -399
  236. package/src/panels/memory-panel.ts +0 -558
  237. package/src/panels/ops-control-panel.ts +0 -329
  238. package/src/panels/ops-strategy-panel.ts +0 -321
  239. package/src/panels/orchestration-panel.ts +0 -465
  240. package/src/panels/panel-list-panel.ts +0 -566
  241. package/src/panels/plan-dashboard-panel.ts +0 -707
  242. package/src/panels/policy-panel.ts +0 -517
  243. package/src/panels/project-planning-panel.ts +0 -731
  244. package/src/panels/provider-health-panel.ts +0 -678
  245. package/src/panels/provider-health-tracker.ts +0 -310
  246. package/src/panels/provider-health-views.ts +0 -567
  247. package/src/panels/qr-panel.ts +0 -280
  248. package/src/panels/remote-panel.ts +0 -534
  249. package/src/panels/routes-panel.ts +0 -241
  250. package/src/panels/sandbox-panel.ts +0 -456
  251. package/src/panels/security-panel.ts +0 -447
  252. package/src/panels/services-panel.ts +0 -329
  253. package/src/panels/session-browser-panel.ts +0 -496
  254. package/src/panels/settings-sync-panel.ts +0 -398
  255. package/src/panels/subscription-panel.ts +0 -342
  256. package/src/panels/symbol-outline-panel.ts +0 -619
  257. package/src/panels/system-messages-panel.ts +0 -364
  258. package/src/panels/tasks-panel.ts +0 -608
  259. package/src/panels/thinking-panel.ts +0 -333
  260. package/src/panels/tool-inspector-panel.ts +0 -537
  261. package/src/panels/work-plan-panel.ts +0 -540
  262. package/src/panels/worktree-panel.ts +0 -360
  263. package/src/panels/wrfc-panel.ts +0 -790
  264. package/src/renderer/agent-detail-modal.ts +0 -466
  265. package/src/renderer/live-tail-modal.ts +0 -156
  266. package/src/renderer/process-modal.ts +0 -671
  267. 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
  }