@pellux/goodvibes-tui 1.0.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 (209) hide show
  1. package/CHANGELOG.md +130 -127
  2. package/README.md +32 -14
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +2 -2
  5. package/src/cli/ensure-goodvibes-gitignore.ts +32 -0
  6. package/src/cli/entrypoint.ts +2 -0
  7. package/src/core/alert-gating.ts +67 -0
  8. package/src/core/approval-alert.ts +72 -0
  9. package/src/core/budget-breach-notifier.ts +106 -0
  10. package/src/core/conversation-rendering.ts +19 -0
  11. package/src/core/conversation.ts +58 -0
  12. package/src/core/focus-tracker.ts +41 -0
  13. package/src/core/long-task-notifier.ts +33 -6
  14. package/src/core/stream-event-wiring.ts +104 -2
  15. package/src/core/stream-stall-watchdog.ts +41 -17
  16. package/src/core/system-message-router.ts +37 -51
  17. package/src/core/turn-cancellation.ts +20 -0
  18. package/src/core/turn-event-wiring.ts +64 -3
  19. package/src/export/cost-utils.ts +126 -8
  20. package/src/input/command-registry.ts +54 -1
  21. package/src/input/commands/checkpoint-runtime.ts +280 -0
  22. package/src/input/commands/codebase-runtime.ts +192 -0
  23. package/src/input/commands/diff-runtime.ts +61 -30
  24. package/src/input/commands/eval.ts +1 -1
  25. package/src/input/commands/health-runtime.ts +1 -1
  26. package/src/input/commands/image-runtime.ts +112 -0
  27. package/src/input/commands/intelligence-runtime.ts +11 -1
  28. package/src/input/commands/local-auth-runtime.ts +4 -1
  29. package/src/input/commands/local-runtime.ts +9 -3
  30. package/src/input/commands/marketplace-runtime.ts +2 -2
  31. package/src/input/commands/memory.ts +6 -1
  32. package/src/input/commands/operator-panel-runtime.ts +40 -24
  33. package/src/input/commands/planning-runtime.ts +26 -3
  34. package/src/input/commands/platform-sandbox-runtime.ts +1 -6
  35. package/src/input/commands/plugin-runtime.ts +2 -2
  36. package/src/input/commands/policy-dispatch.ts +21 -0
  37. package/src/input/commands/provider-accounts-runtime.ts +1 -1
  38. package/src/input/commands/qrcode-runtime.ts +3 -3
  39. package/src/input/commands/recall-review.ts +35 -0
  40. package/src/input/commands/remote-runtime.ts +3 -3
  41. package/src/input/commands/runtime-services.ts +54 -13
  42. package/src/input/commands/services-runtime.ts +1 -1
  43. package/src/input/commands/session-content.ts +12 -0
  44. package/src/input/commands/session-workflow.ts +19 -1
  45. package/src/input/commands/settings-sync-runtime.ts +1 -1
  46. package/src/input/commands/share-runtime.ts +9 -2
  47. package/src/input/commands/shell-core.ts +15 -7
  48. package/src/input/commands/skills-runtime.ts +2 -8
  49. package/src/input/commands/subscription-runtime.ts +2 -2
  50. package/src/input/commands/test-runtime.ts +277 -0
  51. package/src/input/commands/websearch-runtime.ts +101 -0
  52. package/src/input/commands/work-plan-runtime.ts +36 -10
  53. package/src/input/commands/workstream-runtime.ts +338 -0
  54. package/src/input/commands.ts +12 -0
  55. package/src/input/config-modal-types.ts +161 -0
  56. package/src/input/config-modal.ts +377 -0
  57. package/src/input/feed-context-factory.ts +7 -8
  58. package/src/input/handler-command-route.ts +27 -17
  59. package/src/input/handler-content-actions.ts +22 -8
  60. package/src/input/handler-feed-routes.ts +107 -7
  61. package/src/input/handler-feed.ts +49 -13
  62. package/src/input/handler-interactions.ts +3 -3
  63. package/src/input/handler-modal-routes.ts +65 -0
  64. package/src/input/handler-modal-stack.ts +3 -5
  65. package/src/input/handler-modal-token-routes.ts +16 -49
  66. package/src/input/handler-picker-routes.ts +11 -94
  67. package/src/input/handler-shortcuts.ts +24 -14
  68. package/src/input/handler-types.ts +3 -6
  69. package/src/input/handler-ui-state.ts +10 -22
  70. package/src/input/handler.ts +10 -28
  71. package/src/input/keybindings.ts +22 -8
  72. package/src/input/model-picker-types.ts +24 -6
  73. package/src/input/model-picker.ts +58 -0
  74. package/src/input/panel-integration-actions.ts +9 -170
  75. package/src/input/settings-modal-data.ts +95 -0
  76. package/src/input/settings-modal-mutations.ts +6 -4
  77. package/src/main.ts +41 -44
  78. package/src/panels/agent-inspector-shared.ts +35 -11
  79. package/src/panels/base-panel.ts +22 -1
  80. package/src/panels/builtin/agent.ts +21 -107
  81. package/src/panels/builtin/development.ts +16 -62
  82. package/src/panels/builtin/knowledge.ts +8 -32
  83. package/src/panels/builtin/operations.ts +84 -428
  84. package/src/panels/builtin/session.ts +21 -112
  85. package/src/panels/builtin/shared.ts +9 -43
  86. package/src/panels/builtin-modals.ts +218 -0
  87. package/src/panels/builtin-panels.ts +5 -0
  88. package/src/panels/cost-tracker-panel.ts +63 -14
  89. package/src/panels/diff-panel.ts +123 -60
  90. package/src/panels/eval-registry.ts +60 -0
  91. package/src/panels/fleet-panel.ts +800 -0
  92. package/src/panels/fleet-read-model.ts +477 -0
  93. package/src/panels/fleet-steer.ts +92 -0
  94. package/src/panels/fleet-stop.ts +125 -0
  95. package/src/panels/fleet-tabs.ts +230 -0
  96. package/src/panels/fleet-transcript.ts +356 -0
  97. package/src/panels/git-panel.ts +9 -9
  98. package/src/panels/index.ts +7 -31
  99. package/src/panels/local-auth-panel.ts +10 -0
  100. package/src/panels/modals/hooks-modal.ts +187 -0
  101. package/src/panels/modals/keybindings-modal.ts +151 -0
  102. package/src/panels/modals/knowledge-modal.ts +158 -0
  103. package/src/panels/modals/local-auth-modal.ts +132 -0
  104. package/src/panels/modals/marketplace-modal.ts +218 -0
  105. package/src/panels/modals/memory-modal.ts +180 -0
  106. package/src/panels/modals/modal-surface-helpers.ts +54 -0
  107. package/src/panels/modals/modal-theme.ts +36 -0
  108. package/src/panels/modals/pairing-modal.ts +144 -0
  109. package/src/panels/modals/planning-modal.ts +282 -0
  110. package/src/panels/modals/plugins-modal.ts +174 -0
  111. package/src/panels/modals/policy-modal.ts +256 -0
  112. package/src/panels/modals/provider-health-modal.ts +136 -0
  113. package/src/panels/modals/remote-modal.ts +115 -0
  114. package/src/panels/modals/sandbox-modal.ts +150 -0
  115. package/src/panels/modals/security-modal.ts +217 -0
  116. package/src/panels/modals/services-modal.ts +179 -0
  117. package/src/panels/modals/settings-sync-modal.ts +142 -0
  118. package/src/panels/modals/skills-modal.ts +189 -0
  119. package/src/panels/modals/subscription-modal.ts +172 -0
  120. package/src/panels/modals/work-plan-modal.ts +149 -0
  121. package/src/panels/panel-confirm-overlay.ts +72 -0
  122. package/src/panels/panel-manager.ts +108 -5
  123. package/src/panels/project-planning-answer-actions.ts +4 -2
  124. package/src/panels/scrollable-list-panel.ts +9 -0
  125. package/src/panels/skills-panel.ts +7 -51
  126. package/src/panels/token-budget-panel.ts +5 -3
  127. package/src/panels/types.ts +26 -0
  128. package/src/permissions/hunk-selection.ts +179 -0
  129. package/src/permissions/prompt.ts +60 -4
  130. package/src/renderer/compaction-history-modal.ts +19 -3
  131. package/src/renderer/compaction-preview.ts +13 -2
  132. package/src/renderer/compaction-quality.ts +100 -0
  133. package/src/renderer/config-modal.ts +81 -0
  134. package/src/renderer/conversation-overlays.ts +10 -17
  135. package/src/renderer/fleet-tab-strip.ts +56 -0
  136. package/src/renderer/footer-tips.ts +10 -2
  137. package/src/renderer/git-status.ts +40 -0
  138. package/src/renderer/help-overlay.ts +2 -2
  139. package/src/renderer/model-workspace.ts +44 -1
  140. package/src/renderer/panel-workspace-bar.ts +8 -2
  141. package/src/renderer/shell-surface.ts +8 -1
  142. package/src/renderer/turn-injection.ts +114 -0
  143. package/src/renderer/ui-factory.ts +91 -7
  144. package/src/runtime/bootstrap-command-context.ts +24 -1
  145. package/src/runtime/bootstrap-command-parts.ts +36 -7
  146. package/src/runtime/bootstrap-core.ts +19 -4
  147. package/src/runtime/bootstrap-hook-bridge.ts +5 -0
  148. package/src/runtime/bootstrap-shell.ts +41 -17
  149. package/src/runtime/bootstrap.ts +11 -17
  150. package/src/runtime/code-index-services.ts +112 -0
  151. package/src/runtime/orchestrator-core-services.ts +49 -0
  152. package/src/runtime/process-lifecycle.ts +3 -1
  153. package/src/runtime/services.ts +91 -43
  154. package/src/runtime/ui-services.ts +8 -0
  155. package/src/runtime/workstream-services.ts +195 -0
  156. package/src/shell/blocking-input.ts +22 -1
  157. package/src/shell/ui-openers.ts +129 -17
  158. package/src/utils/format-duration.ts +8 -18
  159. package/src/utils/splash-lines.ts +1 -1
  160. package/src/version.ts +1 -1
  161. package/src/panels/agent-inspector-panel.ts +0 -786
  162. package/src/panels/approval-panel.ts +0 -252
  163. package/src/panels/automation-control-panel.ts +0 -479
  164. package/src/panels/cockpit-panel.ts +0 -481
  165. package/src/panels/cockpit-read-model.ts +0 -233
  166. package/src/panels/communication-panel.ts +0 -256
  167. package/src/panels/control-plane-panel.ts +0 -470
  168. package/src/panels/debug-panel.ts +0 -609
  169. package/src/panels/docs-panel.ts +0 -375
  170. package/src/panels/eval-panel.ts +0 -627
  171. package/src/panels/file-explorer-panel.ts +0 -664
  172. package/src/panels/file-preview-panel.ts +0 -517
  173. package/src/panels/hooks-panel.ts +0 -401
  174. package/src/panels/incident-review-panel.ts +0 -406
  175. package/src/panels/intelligence-panel.ts +0 -383
  176. package/src/panels/knowledge-graph-panel.ts +0 -506
  177. package/src/panels/marketplace-panel.ts +0 -399
  178. package/src/panels/memory-panel.ts +0 -558
  179. package/src/panels/ops-control-panel.ts +0 -329
  180. package/src/panels/ops-strategy-panel.ts +0 -321
  181. package/src/panels/orchestration-panel.ts +0 -465
  182. package/src/panels/panel-list-panel.ts +0 -557
  183. package/src/panels/plan-dashboard-panel.ts +0 -707
  184. package/src/panels/policy-panel.ts +0 -517
  185. package/src/panels/project-planning-panel.ts +0 -721
  186. package/src/panels/provider-health-panel.ts +0 -678
  187. package/src/panels/provider-health-tracker.ts +0 -306
  188. package/src/panels/provider-health-views.ts +0 -560
  189. package/src/panels/qr-panel.ts +0 -280
  190. package/src/panels/remote-panel.ts +0 -534
  191. package/src/panels/routes-panel.ts +0 -241
  192. package/src/panels/sandbox-panel.ts +0 -456
  193. package/src/panels/security-panel.ts +0 -447
  194. package/src/panels/services-panel.ts +0 -329
  195. package/src/panels/session-browser-panel.ts +0 -487
  196. package/src/panels/settings-sync-panel.ts +0 -398
  197. package/src/panels/subscription-panel.ts +0 -342
  198. package/src/panels/symbol-outline-panel.ts +0 -619
  199. package/src/panels/system-messages-panel.ts +0 -364
  200. package/src/panels/tasks-panel.ts +0 -608
  201. package/src/panels/thinking-panel.ts +0 -333
  202. package/src/panels/tool-inspector-panel.ts +0 -537
  203. package/src/panels/work-plan-panel.ts +0 -530
  204. package/src/panels/worktree-panel.ts +0 -360
  205. package/src/panels/wrfc-panel.ts +0 -790
  206. package/src/renderer/agent-detail-modal.ts +0 -465
  207. package/src/renderer/live-tail-modal.ts +0 -156
  208. package/src/renderer/process-modal.ts +0 -656
  209. package/src/renderer/qr-renderer.ts +0 -120
@@ -1,5 +1,5 @@
1
1
  import { formatDuration } from '../utils/format-duration.ts';
2
- import { calcSessionCost } from '../export/cost-utils.ts';
2
+ import { calcSessionCost, isModelPriced } from '../export/cost-utils.ts';
3
3
  import type { AgentEvent } from '@/runtime/index.ts';
4
4
  import type { UiEventFeed } from '../runtime/ui-events.ts';
5
5
 
@@ -7,7 +7,8 @@ export type AgentInspectorEntryKind = 'user' | 'assistant' | 'tool_call' | 'tool
7
7
 
8
8
  // ---------------------------------------------------------------------------
9
9
  // Shared agent status / stall constants
10
- // Used by AgentInspectorPanel, AgentDetailModal, and cockpit read-model consumers.
10
+ // Used by the Fleet panel's agent views and read-model consumers (formerly also
11
+ // AgentDetailModal, which was retired in W6.1).
11
12
  // ---------------------------------------------------------------------------
12
13
 
13
14
  /** Terminal statuses — cancel not offered; stall check skipped. */
@@ -171,6 +172,8 @@ export function formatAgentCost(usd: number): string {
171
172
  export interface AgentUsageSummary {
172
173
  readonly tokens: number;
173
174
  readonly cost: number;
175
+ /** False when the model never resolved to a real price — `cost` is a zero placeholder, not a real reading. */
176
+ readonly priced: boolean;
174
177
  }
175
178
 
176
179
  interface AgentUsageLike {
@@ -183,22 +186,43 @@ interface AgentUsageLike {
183
186
  readonly model?: string | null;
184
187
  }
185
188
 
189
+ /**
190
+ * True when a usage object carries actual reported token data rather than
191
+ * being present-but-empty. W0.9: the SDK's AgentRecord.usage is initialised
192
+ * to an all-zero object at agent spawn (platform/tools/agent/manager.ts) and
193
+ * — in the currently pinned SDK version — is never updated past that, so a
194
+ * plain truthiness check on `rec.usage` treats every agent, including ones
195
+ * that did real work, as "has data" and renders a fabricated $0.00/0-token
196
+ * reading. Guarding on real (nonzero) counts instead keeps today's "n/a"
197
+ * honest and lights up automatically once a future SDK actually populates
198
+ * usage — no further TUI change needed.
199
+ */
200
+ export function hasReportedUsage(
201
+ usage: AgentUsageLike['usage'],
202
+ ): usage is NonNullable<AgentUsageLike['usage']> {
203
+ if (!usage) return false;
204
+ return usage.inputTokens > 0 || usage.outputTokens > 0
205
+ || (usage.cacheReadTokens ?? 0) > 0 || (usage.cacheWriteTokens ?? 0) > 0;
206
+ }
207
+
186
208
  /**
187
209
  * Total token count + cost for an agent record's usage, or null when no usage
188
210
  * data has landed yet (honest-UX: never fabricate a $0.00/0-token reading for
189
211
  * an agent that simply hasn't reported usage).
190
212
  */
191
213
  export function summarizeAgentUsage(rec: AgentUsageLike): AgentUsageSummary | null {
192
- if (!rec.usage) return null;
193
- const inputTokens = rec.usage.inputTokens + (rec.usage.cacheReadTokens ?? 0) + (rec.usage.cacheWriteTokens ?? 0);
214
+ if (!hasReportedUsage(rec.usage)) return null;
215
+ const usage = rec.usage;
216
+ const model = rec.model ?? 'unknown';
217
+ const inputTokens = usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
194
218
  const cost = calcSessionCost(
195
- rec.usage.inputTokens,
196
- rec.usage.outputTokens,
197
- rec.usage.cacheReadTokens ?? 0,
198
- rec.usage.cacheWriteTokens ?? 0,
199
- rec.model ?? 'unknown',
219
+ usage.inputTokens,
220
+ usage.outputTokens,
221
+ usage.cacheReadTokens ?? 0,
222
+ usage.cacheWriteTokens ?? 0,
223
+ model,
200
224
  );
201
- return { tokens: inputTokens + rec.usage.outputTokens, cost };
225
+ return { tokens: inputTokens + usage.outputTokens, cost, priced: isModelPriced(model) };
202
226
  }
203
227
 
204
228
  // ---------------------------------------------------------------------------
@@ -226,7 +250,7 @@ export function buildWrfcCostSegments(
226
250
  segments.push([segments.length > 0 ? ' Tokens ' : ' Tokens ', palette.label]);
227
251
  segments.push([formatTokens(usage.tokens), palette.info]);
228
252
  segments.push([' Cost ', palette.label]);
229
- segments.push([formatAgentCost(usage.cost), palette.info]);
253
+ segments.push([usage.priced ? formatAgentCost(usage.cost) : 'unpriced', palette.info]);
230
254
  }
231
255
  return segments.length > 0 ? segments : null;
232
256
  }
@@ -9,6 +9,20 @@ import { fitDisplay } from '../utils/terminal-width.ts';
9
9
  /** Canonical error-surface foreground (bad/red), kept out of the render body. */
10
10
  const ERROR_FG = '#ef4444';
11
11
 
12
+ /**
13
+ * Frame requester wired by main.ts to the render scheduler. Without it,
14
+ * markDirty() only sets a flag the compositor reads when a frame is ALREADY
15
+ * being composed for another reason (input, streaming) — so a live panel
16
+ * (fleet ticks, registry subscriptions) sat visibly stale while the app was
17
+ * idle until the next keypress (Wave-6 replay finding). The scheduler
18
+ * coalesces same-tick requests, so this stays cheap.
19
+ */
20
+ let panelFrameRequester: (() => void) | null = null;
21
+
22
+ export function setPanelFrameRequester(requester: (() => void) | null): void {
23
+ panelFrameRequester = requester;
24
+ }
25
+
12
26
  export abstract class BasePanel implements Panel {
13
27
  public needsRender = true;
14
28
  public isTransient = false;
@@ -219,7 +233,14 @@ export abstract class BasePanel implements Panel {
219
233
  /** R2: Called by the compositor after a successful render to clear the dirty flag. */
220
234
  public markRendered(): void { this.needsRender = false; }
221
235
 
222
- protected markDirty(): void { this.needsRender = true; }
236
+ protected markDirty(): void {
237
+ // Request only on the false→true transition: a pending frame already
238
+ // covers repeat marks, and a panel that dirties itself mid-render must
239
+ // not schedule frames forever.
240
+ const wasDirty = this.needsRender;
241
+ this.needsRender = true;
242
+ if (!wasDirty) panelFrameRequester?.();
243
+ }
223
244
 
224
245
  /**
225
246
  * Check whether the panel is currently permitted to render.
@@ -1,113 +1,27 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
- import { AgentInspectorPanel } from '../agent-inspector-panel.ts';
3
- import { ThinkingPanel } from '../thinking-panel.ts';
4
- import { ToolInspectorPanel } from '../tool-inspector-panel.ts';
5
- import { WrfcPanel } from '../wrfc-panel.ts';
6
- import { ProjectPlanningPanel } from '../project-planning-panel.ts';
7
- import { WorkPlanPanel } from '../work-plan-panel.ts';
8
2
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
9
- import { requireUiServices } from './shared.ts';
10
3
 
4
+ // W6.1 (the purge): thinking, tools, inspector, and wrfc were registered here
5
+ // before the purge. thinking/tools were DELETE-disposition (no surviving
6
+ // human surface — thinking already renders inline in the transcript, tool
7
+ // results render inline plus per-node in Fleet); inspector/wrfc were
8
+ // RETIRE-INTO-FLEET (their live console is subsumed by the Fleet panel,
9
+ // operations.ts:84). See registerOperationsPanels for the fleet
10
+ // registration and .goodvibes/audit/2026-07-04-wave6-briefs.json (W6.1) for
11
+ // the full disposition map.
11
12
  export function registerAgentPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
12
- manager.registerType({
13
- id: 'thinking',
14
- name: 'Thinking',
15
- icon: 'T',
16
- category: 'ai',
17
- description: 'Stream model reasoning tokens in real-time with collapsible blocks per turn',
18
- preload: true,
19
- retainOnClose: true,
20
- factory: () => new ThinkingPanel(requireUiServices(deps).events.turns),
21
- });
13
+ // Compat: '/panel open agent-logs' and 'inspector' (and any saved
14
+ // layout/muscle memory) still resolve — redirected straight to fleet.
15
+ // Repointed from agent-logs->inspector (WO-110) now that inspector itself
16
+ // is retired; alias resolution is a single hop (PanelManager._resolveId),
17
+ // so this must point at the real surviving id, not at another alias.
18
+ manager.registerAlias('agent-logs', 'fleet');
19
+ manager.registerAlias('inspector', 'fleet');
20
+ manager.registerAlias('wrfc', 'fleet');
22
21
 
23
- manager.registerType({
24
- id: 'tools',
25
- name: 'Tools',
26
- icon: 'X',
27
- category: 'ai',
28
- description: 'Chronological tool call inspector with expandable args/results and filtering',
29
- preload: true,
30
- retainOnClose: true,
31
- factory: () => {
32
- const ui = requireUiServices(deps);
33
- return new ToolInspectorPanel(ui.events.tools, ui.events.turns);
34
- },
35
- });
36
-
37
- // WO-110: agent-logs merged into inspector — one deep agent console with
38
- // the correct JSONL parser + cancel, plus agent-logs' follow/pause/filter
39
- // ergonomics. Registration moved here (category 'agent') from
40
- // builtin/development.ts. (WO-113 retired the 'context' registration that
41
- // previously lived here: ContextVisualizerPanel merged into TokenBudgetPanel,
42
- // aliased in builtin/session.ts.)
43
- manager.registerType({
44
- id: 'inspector',
45
- name: 'Inspector',
46
- icon: 'I',
47
- category: 'agent',
48
- description: 'Live per-agent console: timeline, tool calls, WRFC/cost badges, pause/filter/follow, and cancel',
49
- preload: true,
50
- retainOnClose: true,
51
- factory: () => {
52
- const ui = requireUiServices(deps);
53
- return new AgentInspectorPanel({
54
- agentManager: ui.agents.agentManager,
55
- agentMessageBus: ui.agents.agentMessageBus,
56
- agentEvents: ui.events.agents,
57
- workingDirectory: ui.environment.workingDirectory,
58
- cancelAgent: (agentId: string) => ui.agents.agentManager.cancel(agentId),
59
- requestRender: deps.requestRender,
60
- });
61
- },
62
- });
63
-
64
- // Compat: '/panel open agent-logs' (and any saved layout/muscle memory)
65
- // still resolves — redirected to the merged inspector console.
66
- manager.registerAlias('agent-logs', 'inspector');
67
-
68
- manager.registerType({
69
- id: 'wrfc',
70
- name: 'WRFC',
71
- icon: 'W',
72
- category: 'agent',
73
- description: 'WRFC chain view: write, review, fix, and confirm cycle status',
74
- preload: true,
75
- retainOnClose: true,
76
- factory: () => {
77
- const ui = requireUiServices(deps);
78
- return new WrfcPanel(ui.events.workflows, {
79
- controller: ui.agents.wrfcController,
80
- cancelChain: (agentId: string) => ui.agents.agentManager.cancel(agentId),
81
- });
82
- },
83
- });
84
-
85
- manager.registerType({
86
- id: 'work-plan',
87
- name: 'Work Plan',
88
- // WO-152: was 'L' (collided with panel-list).
89
- icon: '◧',
90
- category: 'agent',
91
- description: 'Persistent workspace checklist for multi-step work and cross-session task tracking',
92
- preload: true,
93
- retainOnClose: true,
94
- factory: () => new WorkPlanPanel(deps.workPlanStore),
95
- });
96
-
97
- manager.registerType({
98
- id: 'project-planning',
99
- name: 'Planning',
100
- icon: 'P',
101
- category: 'agent',
102
- description: 'Passive project planning artifacts: readiness, questions, decisions, language, task graph, and agent handoff metadata',
103
- preload: true,
104
- retainOnClose: true,
105
- factory: () => new ProjectPlanningPanel({
106
- service: deps.projectPlanningService,
107
- projectId: deps.projectPlanningProjectId,
108
- requestRender: deps.requestRender,
109
- submitAnswer: deps.submitPlanningAnswer,
110
- dismissPlanning: deps.dismissPlanning,
111
- }),
112
- });
22
+ // W6.1 (the purge) — group B (WO-P): 'work-plan' and 'project-planning'
23
+ // migrated to the 'work-plan-modal' / 'planning-modal' config-modal surfaces.
24
+ // Their surfaces AND panel→modal redirects are registered centrally in
25
+ // registerBuiltinModals (builtin-modals.ts). Panel registrations retired here.
26
+ void deps;
113
27
  }
@@ -1,15 +1,18 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
2
  import { GitPanel } from '../git-panel.ts';
3
3
  import { DiffPanel } from '../diff-panel.ts';
4
- import { PlanDashboardPanel } from '../plan-dashboard-panel.ts';
5
4
  import { CostTrackerPanel } from '../cost-tracker-panel.ts';
6
- import { IntelligencePanel } from '../intelligence-panel.ts';
7
- import { FileExplorerPanel } from '../file-explorer-panel.ts';
8
- import { FilePreviewPanel } from '../file-preview-panel.ts';
9
- import { SymbolOutlinePanel } from '../symbol-outline-panel.ts';
10
5
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
11
6
  import { requireUiServices, withUnconfiguredFallback } from './shared.ts';
12
7
 
8
+ // W6.1 (the purge): plan, intelligence, explorer, preview, and symbols were
9
+ // registered here before the purge. plan was RETIRE-INTO-FLEET (its
10
+ // execution-plan view is subsumed by Fleet — operations.ts:84); the other
11
+ // four were DELETE-disposition (no surviving human surface — intelligence's
12
+ // read-model still backs the surviving `/intelligence` CLI subcommands, see
13
+ // intelligence-runtime.ts; explorer/preview/symbols had no dedicated
14
+ // read-model to preserve). See .goodvibes/audit/2026-07-04-wave6-briefs.json
15
+ // (W6.1) for the full disposition map.
13
16
  export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
14
17
  manager.registerType({
15
18
  id: 'git',
@@ -26,19 +29,9 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
26
29
  ),
27
30
  });
28
31
 
29
- manager.registerType({
30
- id: 'plan',
31
- name: 'Plan',
32
- // Distinct from Planning's 'P' (builtin/agent.ts) — interim glyph per
33
- // WO-128; WO-152 owns the registry-wide icon-uniqueness assertion.
34
- icon: '▤',
35
- category: 'agent',
36
- description: 'Active execution plan with phase progress and item status',
37
- factory: () => {
38
- const ui = requireUiServices(deps);
39
- return new PlanDashboardPanel(ui.events.workflows, { planManager: deps.planManager });
40
- },
41
- });
32
+ // Compat: '/panel open plan' (and any saved layout/muscle memory) still
33
+ // resolves — redirected to fleet, which absorbs the execution-plan view.
34
+ manager.registerAlias('plan', 'fleet');
42
35
 
43
36
  manager.registerType({
44
37
  id: 'diff',
@@ -46,7 +39,7 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
46
39
  icon: 'D',
47
40
  category: 'development',
48
41
  description: 'Unified diff view of agent file changes',
49
- factory: () => new DiffPanel(requireUiServices(deps).environment.workingDirectory),
42
+ factory: () => new DiffPanel(requireUiServices(deps).environment.workingDirectory, deps.requestRender),
50
43
  });
51
44
 
52
45
  // WO-110: 'inspector' registration moved to builtin/agent.ts (category
@@ -73,52 +66,13 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
73
66
  return new CostTrackerPanel(ui.events.turns, ui.events.agents, getOrchestratorUsage!, {
74
67
  budgetThreshold,
75
68
  getAgentStatus: (id) => ui.agents.agentManager.getStatus(id),
69
+ configAccess: {
70
+ get: (key) => deps.configManager.get(key as Parameters<typeof deps.configManager.get>[0]),
71
+ set: (key, value) => deps.configManager.set(key as Parameters<typeof deps.configManager.set>[0], value as never),
72
+ },
76
73
  });
77
74
  },
78
75
  ),
79
76
  });
80
77
  }
81
-
82
- manager.registerType({
83
- id: 'intelligence',
84
- name: 'Intelligence',
85
- icon: 'J',
86
- category: 'development',
87
- description: 'Workspace diagnostics, symbol search, hover, and completion readiness with recovery guidance',
88
- factory: () => new IntelligencePanel(requireUiServices(deps).readModels.intelligence),
89
- });
90
-
91
- manager.registerType({
92
- id: 'explorer',
93
- name: 'Explorer',
94
- icon: 'E',
95
- category: 'development',
96
- description: 'File system browser with keyboard navigation',
97
- factory: () => {
98
- const ui = requireUiServices(deps);
99
- return new FileExplorerPanel(ui.environment.workingDirectory, ui.environment.workingDirectory);
100
- },
101
- });
102
-
103
- manager.registerType({
104
- id: 'preview',
105
- name: 'Preview',
106
- // WO-152: was 'V' in the registry vs the live panel's own 'P' (base-panel
107
- // super() call) — a pre-existing registry/instance icon mismatch as well
108
- // as a collision (project-planning and plugins both also used 'P').
109
- // Unified to a single unique glyph in both places.
110
- icon: '◑',
111
- category: 'development',
112
- description: 'Syntax-highlighted file preview',
113
- factory: () => new FilePreviewPanel(),
114
- });
115
-
116
- manager.registerType({
117
- id: 'symbols',
118
- name: 'Symbols',
119
- icon: 'S',
120
- category: 'development',
121
- description: 'Symbol outline for the active file: functions, classes, and exports',
122
- factory: () => new SymbolOutlinePanel(),
123
- });
124
78
  }
@@ -1,36 +1,12 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
- import { MemoryPanel } from '../memory-panel.ts';
3
- import { KnowledgeGraphPanel } from '../knowledge-graph-panel.ts';
4
- import { requireKnowledgeApi, withUnconfiguredFallback, type ResolvedBuiltinPanelDeps } from './shared.ts';
2
+ import type { ResolvedBuiltinPanelDeps } from './shared.ts';
5
3
 
4
+ // W6.1 (the purge) — group B: 'knowledge' and 'memory' migrated to the
5
+ // 'knowledge-modal' / 'memory-modal' config-modal surfaces. Both surfaces and
6
+ // their panel→modal redirects are registered centrally in registerBuiltinModals
7
+ // (src/panels/builtin-modals.ts). This registrar is intentionally empty
8
+ // post-migration, kept as a stable call site invoked from registerBuiltinPanels.
6
9
  export function registerKnowledgePanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
7
- manager.registerType({
8
- id: 'knowledge',
9
- name: 'Knowledge',
10
- icon: 'K',
11
- category: 'agent',
12
- description: 'Live SDK knowledge graph: nodes, sources, issue review queue, and search',
13
- factory: () => new KnowledgeGraphPanel(requireKnowledgeApi(deps), () => manager.open('memory')),
14
- });
15
- // WO-152: always registered (was gated behind `if (deps.memoryRegistry)`,
16
- // so `/panel open memory` reported "Unknown panel" on builds without a
17
- // memory registry wired). Falls back to a "dependency not configured"
18
- // empty state.
19
- {
20
- const { memoryRegistry } = deps;
21
- manager.registerType({
22
- id: 'memory',
23
- name: 'Memory',
24
- icon: 'M',
25
- category: 'agent',
26
- description: 'Project memory: decisions, constraints, incidents, and patterns with provenance links',
27
- factory: withUnconfiguredFallback(
28
- memoryRegistry !== undefined,
29
- 'memory', 'Memory', 'M', 'agent',
30
- ' Memory registry not configured for this session.',
31
- 'This runtime was not wired with a project memory registry at bootstrap, so no memory data is available.',
32
- () => new MemoryPanel(memoryRegistry!),
33
- ),
34
- });
35
- }
10
+ void manager;
11
+ void deps;
36
12
  }