@pellux/goodvibes-tui 1.16.1 → 1.18.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 (257) hide show
  1. package/CHANGELOG.md +138 -9
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/operator-contract.json +5490 -1806
  4. package/package.json +7 -7
  5. package/src/cli/completions/generate.ts +5 -4
  6. package/src/cli/config-overrides.ts +51 -11
  7. package/src/cli/doctor.ts +4 -5
  8. package/src/cli/entrypoint.ts +13 -8
  9. package/src/cli/help.ts +7 -6
  10. package/src/cli/launch-auto-update.ts +214 -0
  11. package/src/cli/management-commands.ts +82 -15
  12. package/src/cli/management.ts +0 -2
  13. package/src/cli/parser.ts +5 -0
  14. package/src/cli/status.ts +13 -0
  15. package/src/cli/surface-command.ts +5 -5
  16. package/src/cli/tui-startup.ts +60 -97
  17. package/src/cli/types.ts +2 -0
  18. package/src/config/index.ts +1 -1
  19. package/src/config/tui-extension-settings.ts +33 -0
  20. package/src/core/composer-state.ts +1 -1
  21. package/src/core/consolidation-receipt.ts +41 -0
  22. package/src/core/conversation-line-cache.ts +3 -3
  23. package/src/core/conversation-rendering.ts +18 -9
  24. package/src/core/conversation.ts +2 -2
  25. package/src/core/long-task-notifier.ts +7 -7
  26. package/src/core/memory-provenance.ts +67 -0
  27. package/src/core/pairing-devices.ts +49 -0
  28. package/src/core/pairing-handoff.ts +101 -0
  29. package/src/core/pairing-offers.ts +83 -0
  30. package/src/core/pairing-origin.ts +78 -0
  31. package/src/core/pairing-tailscale-gateway.ts +56 -0
  32. package/src/core/power-chip-source.ts +91 -0
  33. package/src/core/power-status.ts +95 -0
  34. package/src/core/stable-host.ts +171 -0
  35. package/src/core/stream-event-wiring.ts +29 -6
  36. package/src/core/system-message-noise.ts +1 -1
  37. package/src/core/system-message-router.ts +6 -6
  38. package/src/core/turn-budget-outcome.ts +60 -0
  39. package/src/core/turn-cancellation.ts +40 -1
  40. package/src/core/turn-event-wiring.ts +14 -8
  41. package/src/daemon/cli.ts +64 -58
  42. package/src/daemon/lifecycle.ts +41 -0
  43. package/src/daemon/service-commands.ts +5 -5
  44. package/src/export/cost-utils.ts +128 -6
  45. package/src/input/autocomplete.ts +2 -2
  46. package/src/input/command-registry.ts +55 -9
  47. package/src/input/commands/acp-runtime.ts +72 -0
  48. package/src/input/commands/ci-runtime.ts +5 -1
  49. package/src/input/commands/codebase-runtime.ts +6 -6
  50. package/src/input/commands/cost-runtime.ts +1 -1
  51. package/src/input/commands/devices-runtime.ts +109 -0
  52. package/src/input/commands/git-runtime.ts +28 -4
  53. package/src/input/commands/graph-runtime.ts +45 -0
  54. package/src/input/commands/health-runtime.ts +2 -2
  55. package/src/input/commands/intelligence-runtime.ts +1 -1
  56. package/src/input/commands/local-auth-runtime.ts +1 -1
  57. package/src/input/commands/local-provider-runtime.ts +49 -10
  58. package/src/input/commands/local-runtime.ts +53 -5
  59. package/src/input/commands/memory.ts +2 -2
  60. package/src/input/commands/operator-panel-runtime.ts +5 -5
  61. package/src/input/commands/operator-rpc.ts +32 -11
  62. package/src/input/commands/permissions-provenance.ts +1 -1
  63. package/src/input/commands/permissions-runtime.ts +99 -8
  64. package/src/input/commands/planning-runtime.ts +3 -3
  65. package/src/input/commands/platform-sandbox-runtime.ts +1 -1
  66. package/src/input/commands/power-runtime.ts +56 -0
  67. package/src/input/commands/provider-accounts-runtime.ts +71 -6
  68. package/src/input/commands/provider.ts +7 -5
  69. package/src/input/commands/qrcode-runtime.ts +14 -19
  70. package/src/input/commands/queue-runtime.ts +70 -0
  71. package/src/input/commands/recall-files-git.ts +13 -51
  72. package/src/input/commands/recall-files.ts +8 -11
  73. package/src/input/commands/recall-review.ts +2 -2
  74. package/src/input/commands/relay-runtime.ts +1 -1
  75. package/src/input/commands/remote-runtime.ts +1 -1
  76. package/src/input/commands/runtime-services.ts +4 -4
  77. package/src/input/commands/schedule-runtime.ts +14 -7
  78. package/src/input/commands/services-runtime.ts +1 -1
  79. package/src/input/commands/session-workflow.ts +2 -2
  80. package/src/input/commands/settings-sync-runtime.ts +2 -2
  81. package/src/input/commands/share-runtime.ts +1 -1
  82. package/src/input/commands/shell-core.ts +46 -68
  83. package/src/input/commands/subscription-runtime.ts +1 -1
  84. package/src/input/commands/update-runtime.ts +153 -96
  85. package/src/input/commands/work-plan-runtime.ts +1 -1
  86. package/src/input/commands/workstream-attempts.ts +6 -1
  87. package/src/input/commands/workstream-runtime.ts +46 -27
  88. package/src/input/commands/worktree-runtime.ts +35 -8
  89. package/src/input/commands.ts +10 -2
  90. package/src/input/config-modal-types.ts +14 -3
  91. package/src/input/config-modal.ts +75 -13
  92. package/src/input/feature-unit-layout.ts +93 -82
  93. package/src/input/feed-context-factory.ts +2 -2
  94. package/src/input/handler-command-route.ts +2 -2
  95. package/src/input/handler-content-actions.ts +1 -1
  96. package/src/input/handler-feed-routes.ts +7 -7
  97. package/src/input/handler-feed.ts +4 -4
  98. package/src/input/handler-interactions.ts +3 -2
  99. package/src/input/handler-modal-routes.ts +12 -4
  100. package/src/input/handler-modal-token-routes.ts +1 -1
  101. package/src/input/handler-onboarding-daemon-adopt.ts +2 -2
  102. package/src/input/handler-onboarding.ts +3 -2
  103. package/src/input/handler-picker-routes.ts +26 -13
  104. package/src/input/handler-shortcuts.ts +29 -6
  105. package/src/input/handler.ts +2 -2
  106. package/src/input/keybindings.ts +21 -3
  107. package/src/input/onboarding/onboarding-feature-units.ts +34 -27
  108. package/src/input/onboarding/onboarding-provider-key-fields.ts +112 -0
  109. package/src/input/onboarding/onboarding-wizard-apply.ts +22 -21
  110. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +17 -0
  111. package/src/input/onboarding/onboarding-wizard-network-adopt.ts +2 -2
  112. package/src/input/onboarding/onboarding-wizard-steps.ts +30 -42
  113. package/src/input/panel-integration-actions.ts +2 -2
  114. package/src/input/panel-mouse-geometry.ts +1 -1
  115. package/src/input/panel-paste-flood-guard.ts +1 -1
  116. package/src/input/provider-key-intake.ts +167 -0
  117. package/src/input/sandbox-exec-config.ts +2 -2
  118. package/src/input/selection-modal.ts +1 -1
  119. package/src/input/settings-modal-activation.ts +5 -0
  120. package/src/input/settings-modal-adjustment.ts +4 -31
  121. package/src/input/settings-modal-data.ts +52 -57
  122. package/src/input/settings-modal-mutations.ts +12 -68
  123. package/src/input/settings-modal-types.ts +27 -17
  124. package/src/input/settings-modal.ts +74 -55
  125. package/src/main.ts +90 -90
  126. package/src/panels/agent-inspector-shared.ts +4 -4
  127. package/src/panels/base-panel.ts +2 -2
  128. package/src/panels/builtin/agent.ts +4 -4
  129. package/src/panels/builtin/development.ts +4 -4
  130. package/src/panels/builtin/knowledge.ts +1 -1
  131. package/src/panels/builtin/operations.ts +83 -11
  132. package/src/panels/builtin/session.ts +5 -5
  133. package/src/panels/builtin/shared.ts +16 -4
  134. package/src/panels/builtin-modals.ts +59 -42
  135. package/src/panels/builtin-panels.ts +1 -1
  136. package/src/panels/cost-tracker-panel.ts +124 -7
  137. package/src/panels/diff-panel.ts +39 -6
  138. package/src/panels/eval-registry.ts +2 -2
  139. package/src/panels/fleet-acts.ts +446 -0
  140. package/src/panels/fleet-deep-link.ts +1 -1
  141. package/src/panels/fleet-gateway.ts +117 -0
  142. package/src/panels/fleet-observed-render.ts +128 -0
  143. package/src/panels/fleet-panel-format.ts +163 -11
  144. package/src/panels/fleet-panel-worktree-detail.ts +14 -0
  145. package/src/panels/fleet-panel.ts +73 -57
  146. package/src/panels/fleet-read-model.ts +84 -14
  147. package/src/panels/fleet-spawn.ts +266 -0
  148. package/src/panels/fleet-steer.ts +2 -2
  149. package/src/panels/fleet-stop.ts +41 -5
  150. package/src/panels/fleet-tabs.ts +15 -16
  151. package/src/panels/fleet-transcript.ts +5 -5
  152. package/src/panels/git-panel.ts +2 -2
  153. package/src/panels/index.ts +4 -1
  154. package/src/panels/local-auth-panel.ts +1 -1
  155. package/src/panels/memory-consolidation-gateway.ts +94 -0
  156. package/src/panels/modals/devices-modal.ts +161 -0
  157. package/src/panels/modals/hooks-modal.ts +1 -1
  158. package/src/panels/modals/keybindings-modal.ts +2 -2
  159. package/src/panels/modals/knowledge-modal.ts +1 -1
  160. package/src/panels/modals/marketplace-modal.ts +4 -4
  161. package/src/panels/modals/memory-modal.ts +153 -9
  162. package/src/panels/modals/modal-surface-helpers.ts +1 -1
  163. package/src/panels/modals/modal-theme.ts +1 -1
  164. package/src/panels/modals/pairing-modal.ts +198 -68
  165. package/src/panels/modals/planning-modal.ts +2 -2
  166. package/src/panels/modals/plugins-modal.ts +1 -1
  167. package/src/panels/modals/policy-modal.ts +1 -1
  168. package/src/panels/modals/security-modal.ts +7 -1
  169. package/src/panels/modals/skills-modal.ts +1 -1
  170. package/src/panels/modals/work-plan-modal.ts +3 -3
  171. package/src/panels/notifications-feed.ts +127 -0
  172. package/src/panels/notifications-panel.ts +160 -0
  173. package/src/panels/panel-manager.ts +9 -9
  174. package/src/panels/plugins-panel.ts +4 -4
  175. package/src/panels/project-planning-answer-actions.ts +1 -1
  176. package/src/panels/provider-health-routes.ts +2 -2
  177. package/src/panels/skills-panel.ts +4 -5
  178. package/src/panels/token-budget-panel.ts +11 -3
  179. package/src/panels/types.ts +5 -5
  180. package/src/panels/workstream-graph-render.ts +123 -0
  181. package/src/permissions/broker-approval-card.ts +201 -0
  182. package/src/permissions/hunk-selection.ts +28 -4
  183. package/src/permissions/prompt.ts +244 -29
  184. package/src/renderer/autocomplete-overlay.ts +107 -54
  185. package/src/renderer/code-block.ts +2 -2
  186. package/src/renderer/compaction-history-modal.ts +1 -1
  187. package/src/renderer/compaction-preview.ts +1 -1
  188. package/src/renderer/compaction-quality.ts +1 -1
  189. package/src/renderer/composer-fragments.ts +69 -0
  190. package/src/renderer/compositor.ts +2 -2
  191. package/src/renderer/config-modal.ts +1 -1
  192. package/src/renderer/conversation-overlays.ts +1 -1
  193. package/src/renderer/footer-tips.ts +3 -3
  194. package/src/renderer/hint-grammar.ts +1 -1
  195. package/src/renderer/modal-factory.ts +1 -1
  196. package/src/renderer/model-picker-overlay.ts +1 -1
  197. package/src/renderer/model-workspace.ts +7 -2
  198. package/src/renderer/panel-composite.ts +2 -2
  199. package/src/renderer/panel-workspace-bar.ts +1 -1
  200. package/src/renderer/process-indicator.ts +1 -1
  201. package/src/renderer/selection-modal-overlay.ts +1 -1
  202. package/src/renderer/session-picker-modal.ts +2 -2
  203. package/src/renderer/settings-modal-helpers.ts +23 -5
  204. package/src/renderer/settings-modal.ts +129 -39
  205. package/src/renderer/shell-surface.ts +6 -0
  206. package/src/renderer/terminal-bg-probe.ts +1 -1
  207. package/src/renderer/theme.ts +3 -3
  208. package/src/renderer/tool-call.ts +13 -7
  209. package/src/renderer/tool-result-summary.ts +1 -1
  210. package/src/renderer/turn-injection.ts +7 -6
  211. package/src/renderer/ui-factory.ts +38 -1
  212. package/src/runtime/bootstrap-command-context.ts +7 -2
  213. package/src/runtime/bootstrap-command-parts.ts +9 -5
  214. package/src/runtime/bootstrap-core.ts +41 -41
  215. package/src/runtime/bootstrap-hook-bridge.ts +1 -1
  216. package/src/runtime/bootstrap-shell.ts +13 -5
  217. package/src/runtime/bootstrap.ts +34 -32
  218. package/src/runtime/channel-composition.ts +46 -0
  219. package/src/runtime/code-index-services.ts +3 -4
  220. package/src/runtime/daemon-attach-notices.ts +120 -0
  221. package/src/runtime/durability-services.ts +90 -0
  222. package/src/runtime/embedded-service-factories.ts +40 -0
  223. package/src/runtime/feature-settings.ts +147 -0
  224. package/src/runtime/fleet-services.ts +41 -0
  225. package/src/runtime/idle-power-services.ts +85 -0
  226. package/src/runtime/index.ts +6 -21
  227. package/src/runtime/interaction-seams.ts +109 -0
  228. package/src/runtime/legacy-daemon-migration.ts +29 -19
  229. package/src/runtime/memory-fold.ts +1 -1
  230. package/src/runtime/notification-dispatch.ts +110 -0
  231. package/src/runtime/onboarding/apply.ts +3 -29
  232. package/src/runtime/onboarding/fast-path.ts +39 -6
  233. package/src/runtime/onboarding/provider-key-capture.ts +126 -0
  234. package/src/runtime/onboarding/snapshot.ts +0 -1
  235. package/src/runtime/onboarding/types.ts +9 -3
  236. package/src/runtime/power-keepawake-remote.ts +75 -0
  237. package/src/runtime/process-lifecycle.ts +3 -1
  238. package/src/runtime/provider-fallback.ts +55 -0
  239. package/src/runtime/provider-optimizer-wiring.ts +55 -0
  240. package/src/runtime/release-artifacts.ts +19 -103
  241. package/src/runtime/resume-notice.ts +1 -1
  242. package/src/runtime/services.ts +113 -113
  243. package/src/runtime/session-continuity-hints.ts +38 -0
  244. package/src/runtime/surface-feature-flags.ts +40 -9
  245. package/src/runtime/terminal-output-guard.ts +2 -2
  246. package/src/runtime/trust/workspace-registration.ts +10 -2
  247. package/src/runtime/trust/workspace-trust.ts +58 -31
  248. package/src/runtime/ui-services.ts +6 -1
  249. package/src/runtime/update-check.ts +15 -69
  250. package/src/runtime/workstream-services.ts +2 -2
  251. package/src/shell/blocking-input.ts +108 -132
  252. package/src/shell/recovery-input-helpers.ts +53 -166
  253. package/src/shell/ui-openers.ts +38 -6
  254. package/src/utils/format-duration.ts +1 -1
  255. package/src/verification/verification-ledger.ts +21 -4
  256. package/src/version.ts +1 -1
  257. package/src/input/commands/flags-runtime.ts +0 -328
package/src/main.ts CHANGED
@@ -13,6 +13,7 @@ import { FileUndoManager } from '@pellux/goodvibes-sdk/platform/state';
13
13
  import { PermissionManager } from '@pellux/goodvibes-sdk/platform/permissions';
14
14
  import { AcpManager } from '@pellux/goodvibes-sdk/platform/acp';
15
15
  import { PermissionPromptUI, buildPendingPermissionExtras } from './permissions/prompt.ts';
16
+ import { handleBrokerApprovalChange, buildFixSessionAffordance, buildFixSessionErrorNotice, handleFixSessionAttachKey, refreshFixSessionsFromApprovals } from './permissions/broker-approval-card.ts';
16
17
  import { CommandRegistry } from './input/command-registry.ts';
17
18
  import type { CommandContext } from './input/command-registry.ts';
18
19
  import { renderProcessIndicator } from './renderer/process-indicator.ts';
@@ -32,18 +33,20 @@ import { logger } from '@pellux/goodvibes-sdk/platform/utils';
32
33
  import { registerBuiltinPanels } from './panels/builtin-panels.ts';
33
34
  import { bootstrapRuntime } from './runtime/bootstrap.ts';
34
35
  import type { BootstrapContext } from './runtime/bootstrap.ts';
36
+ import { selfUpdateAtLaunch } from './cli/launch-auto-update.ts';
35
37
  import { buildSharedOrchestratorCoreServices, refreshMemoryRecallSnapshot } from './runtime/orchestrator-core-services.ts';
36
- import type { HITLMode } from '@pellux/goodvibes-sdk/platform/state';
38
+ import { createSessionContinuityHintsBuilder } from './runtime/session-continuity-hints.ts';
39
+ import { resolveWebSurfaceUrl } from '@pellux/goodvibes-sdk/platform/runtime/feature-announcements';
37
40
  import { readLastSessionPointer, writeRecoveryFile } from '@/runtime/index.ts';
38
41
  import { handleBlockingShellInput, type PendingPermissionState } from './shell/blocking-input.ts';
39
- import { createPersistRecoverySnapshot, createRecoveryFileOps, createReopenRecoveryPanels, handleErrorAffordanceKey, resolveStartupRecoveryInfo } from './shell/recovery-input-helpers.ts';
42
+ import { autoRestoreRecoverySession, createPersistRecoverySnapshot, createReopenRecoveryPanels, handleErrorAffordanceKey } from './shell/recovery-input-helpers.ts';
40
43
  import { wireShellUiOpeners } from './shell/ui-openers.ts';
41
44
  import { deriveComposerState } from './core/composer-state.ts';
42
- import { buildPersistedSessionContext, formatReturnContextForDisplay, getReturnContextMode, maybeAssistReturnContextSummary } from '@/runtime/index.ts';
45
+ import { buildPersistedSessionContext, getReturnContextMode, maybeAssistReturnContextSummary } from '@/runtime/index.ts';
43
46
  import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
44
47
  import { prepareShellCliRuntime } from './cli/entrypoint.ts';
45
48
  import { applyInitialTuiCliState } from './cli/tui-startup.ts';
46
- import { applyRuntimeConfigDefault, applyRuntimeConfigValue } from './cli/config-overrides.ts';
49
+ import { applyConfiguredHitlMode, applyRuntimeConfigValue, applyTuiRuntimeConfigDefaults } from './cli/config-overrides.ts';
47
50
  import { renderToolCallBlock } from './renderer/tool-call.ts';
48
51
  import { wireSpokenTurnRuntime } from './audio/spoken-turn-wiring.ts';
49
52
  import { attachSpokenTurnModelRouting, createSpokenTurnInputOptions } from './audio/spoken-turn-model-routing.ts';
@@ -54,7 +57,7 @@ import { buildCommandArgsHint } from './input/command-args-hint.ts';
54
57
  import { summarizeRunningAgents } from './renderer/process-summary.ts';
55
58
  import { footerFleetCost } from './panels/fleet-read-model.ts';
56
59
  import { formatUserFacingErrorLine } from './core/format-user-error.ts';
57
- import { wireStreamEventMetrics, type StreamMetrics, type WireStreamEventMetricsResult } from './core/stream-event-wiring.ts';
60
+ import { wireStreamEventMetrics, createStreamMetrics, type StreamMetrics, type WireStreamEventMetricsResult } from './core/stream-event-wiring.ts';
58
61
  import { wireTurnEventHandlers } from './core/turn-event-wiring.ts';
59
62
  import { buildContextStatusHint } from './renderer/context-status-hint.ts';
60
63
  import { isEffectiveDangerMode } from './config/index.ts';
@@ -64,6 +67,9 @@ import { createSessionAutoTitler } from './core/session-auto-titler.ts';
64
67
  import { makeComposerEditorOpener } from './input/composer-editor.ts';
65
68
  import { evaluateSessionMaintenance } from '@/runtime/index.ts';
66
69
  import { createCancelGeneration } from './core/turn-cancellation.ts';
70
+ import { wireInteractionSeams, createMemoryProvenanceUi } from './runtime/interaction-seams.ts';
71
+ import { createPowerChipSource } from './core/power-chip-source.ts';
72
+ import { fetchDaemonPowerState, installKeepAwakeRemoteForward } from './runtime/power-keepawake-remote.ts';
67
73
  import { wrapRequestPermissionWithAlert } from './core/approval-alert.ts';
68
74
  import { createTerminalNotifier } from './core/terminal-notifier.ts';
69
75
  import { setPanelFrameRequester } from './panels/base-panel.ts';
@@ -79,6 +85,10 @@ async function main() {
79
85
  homeDirectory: homedir(),
80
86
  }, 'goodvibes');
81
87
 
88
+ // Launch-time self-update, before any bootstrap or terminal mode change; on
89
+ // an installed update this restarts onto the swapped binary and never returns.
90
+ const launchUpdateLines = await selfUpdateAtLaunch({ configManager, stdout });
91
+
82
92
  const ctx: BootstrapContext = await bootstrapRuntime(stdout, {
83
93
  configManager,
84
94
  workingDir: bootstrapWorkingDir,
@@ -102,7 +112,7 @@ async function main() {
102
112
  agentStatusIntervalRef,
103
113
  orchestratorRefs,
104
114
  setRenderRequest,
105
- permissionPromptRef,
115
+ permissionPromptRef, trustPromptRef,
106
116
  _writeLastSessionPointer: writeLastSessionPointer,
107
117
  systemMessageRouter,
108
118
  } = ctx;
@@ -111,7 +121,7 @@ async function main() {
111
121
  const { approvalBroker, agentManager, modeManager, processManager, providerRegistry, secretsManager, subscriptionManager } = ctx.services;
112
122
  conversation.setSessionMemoryStore(ctx.services.sessionMemoryStore);
113
123
  conversation.setSessionLineageTracker(ctx.services.sessionLineageTracker);
114
- // Shared payload (single source of truth, includes wo805's memoryRegistry —
124
+ // Shared payload (single source of truth, includes the memoryRegistry —
115
125
  // see orchestrator-core-services.ts) plus this site's favoritesStore.
116
126
  orchestrator.setCoreServices({
117
127
  ...buildSharedOrchestratorCoreServices({ services: ctx.services, configManager, providerRegistry }),
@@ -120,62 +130,40 @@ async function main() {
120
130
  ctx.services.wrfcController.setPlanManager(ctx.services.planManager);
121
131
  let activeConversationWidth = stdout.columns || 80;
122
132
  conversation.setWidthProvider(() => activeConversationWidth);
123
- {
124
- const hitlMode = configManager.get('behavior.hitlMode') as HITLMode | undefined;
125
- if (hitlMode && (hitlMode === 'quiet' || hitlMode === 'balanced' || hitlMode === 'operator')) {
126
- modeManager.setHITLMode(hitlMode);
127
- }
128
- }
133
+ // Persisted HITL mode + TUI-side config defaults (doc'd at their definitions).
134
+ applyConfiguredHitlMode(configManager, modeManager);
135
+ applyTuiRuntimeConfigDefaults(configManager);
129
136
 
130
- // TUI default: show token speed ON (SDK schema default is false). applyRuntimeConfigDefault
131
- // reads the global + project settings files and only applies the default in-memory when the
132
- // key is absent from both (e.g. a new install); an explicit user value is respected. No disk write.
133
- applyRuntimeConfigDefault(configManager, 'display.showTokenSpeed', true);
137
+ // Re-surface pre-TUI launch-update lines in-session (the alt screen wipes stdout).
138
+ for (const line of launchUpdateLines) systemMessageRouter.high(`[Update] ${line}`);
134
139
 
135
140
  const panelManager = ctx.services.panelManager;
136
- const buildSessionContinuityHints = () => {
137
- const sessionSnapshot = uiServices.readModels.session.getSnapshot();
138
- const tasksSnapshot = uiServices.readModels.tasks.getSnapshot();
139
- const remoteSnapshot = uiServices.readModels.remote.getSnapshot();
140
- const worktreeSnapshot = uiServices.readModels.worktrees.getSnapshot();
141
- return {
142
- pendingApprovals: sessionSnapshot.pendingApproval ? 1 : 0,
143
- activeTasks: tasksSnapshot.tasks.filter((task) => task.status === 'running' || task.status === 'queued').length,
144
- blockedTasks: tasksSnapshot.tasks.filter((task) => task.status === 'blocked').length,
145
- remoteContracts: remoteSnapshot.contracts.length,
146
- remoteRunners: remoteSnapshot.contracts.slice(0, 4).map((contract) => contract.runnerId),
147
- worktreeCount: worktreeSnapshot.records.length,
148
- worktreePaths: worktreeSnapshot.records.slice(0, 3).map((record) => record.path),
149
- openPanels: panelManager.getAllOpen().map((panel) => panel.id),
150
- };
151
- };
141
+ const buildSessionContinuityHints = createSessionContinuityHintsBuilder({ readModels: uiServices.readModels, panelManager });
152
142
 
153
143
  let pendingPermission: PendingPermissionState | null = null;
154
- approvalBroker.subscribe((approval) => {
155
- if (!pendingPermission) return;
156
- if (pendingPermission.callId !== approval.callId) return;
157
- if (approval.status === 'pending' || approval.status === 'claimed') return;
158
- pendingPermission = null;
159
- render();
144
+ // One-key jump/attach to a spawned CI fix-session: the affordance ARMS the id; the next 'j' runs the resume so the user never retypes it.
145
+ let fixSessionAttachArmed: string | null = null;
146
+ const attachToFixSession = (fixSessionId: string) => { void commandContext.executeCommand?.('session', ['resume', fixSessionId]); };
147
+ const onFixSessionStarted = buildFixSessionAffordance({
148
+ notify: (message) => { systemMessageRouter.high(message); render(); },
149
+ arm: (fixSessionId) => { fixSessionAttachArmed = fixSessionId; },
160
150
  });
151
+ // A failed fix-session spawn stamps an error instead of a dead id: render it honestly, no jump armed.
152
+ const onFixSessionError = buildFixSessionErrorNotice((message) => { systemMessageRouter.high(message); render(); });
153
+ commandContext.armFixSessionAttach = onFixSessionStarted;
154
+ approvalBroker.subscribe((approval) => handleBrokerApprovalChange({
155
+ approval, broker: approvalBroker, render, onFixSessionStarted, onFixSessionError,
156
+ getPending: () => pendingPermission,
157
+ setPending: (next) => { pendingPermission = next; },
158
+ }));
159
+ refreshFixSessionsFromApprovals(() => approvalBroker.listApprovals(), onFixSessionStarted, onFixSessionError); // catch pre-subscription stamps
161
160
 
162
161
  let scrollTop = 0;
163
162
  let scrollLocked = true;
164
- // Cached from the overlay-aware clamp the renderer computes (conversation-layout) each
165
- // frame so scroll() clamps against exactly what is displayed, not a footer estimate.
163
+ // Cached from the overlay-aware clamp the renderer computes (conversation-layout) each frame so scroll() clamps against exactly what is displayed, not a footer estimate.
166
164
  let lastMaxScroll: number | null = null;
167
165
  // Stream and tool-timer state; mutated by wireStreamEventMetrics handlers, read during render.
168
- const streamMetrics: StreamMetrics = {
169
- startTime: 0,
170
- deltaCount: 0,
171
- tokenSpeed: 0,
172
- ttftMs: undefined,
173
- ttftRecorded: false,
174
- activeToolStartedAtMs: undefined,
175
- activeToolName: undefined,
176
- lastDeltaAtMs: undefined, stallEpisode: 0,
177
- reconnectAttempt: undefined, reconnectMaxAttempts: undefined,
178
- };
166
+ const streamMetrics: StreamMetrics = createStreamMetrics();
179
167
 
180
168
  const getPromptContentWidth = () => computePromptContentWidth(stdout.columns);
181
169
 
@@ -185,8 +173,7 @@ async function main() {
185
173
  const currentModel = providerRegistry.getCurrentModel();
186
174
  const contextWindow = providerRegistry.getContextWindowForModel(currentModel);
187
175
  const rows = stdout.rows || 24;
188
- // Compact threshold must match buildShellFooter's `compact: height < 30` posture below,
189
- // else estimateShellFooterHeight's cached-height fast path answers with the wrong mode.
176
+ // Compact threshold must match buildShellFooter's `compact: height < 30` posture below, else estimateShellFooterHeight's cached-height fast path answers with the wrong mode.
190
177
  return rows - 2 - estimateShellFooterHeight(promptLines, contextWindow, rows < 30);
191
178
  };
192
179
 
@@ -209,9 +196,13 @@ async function main() {
209
196
  const unsubs: Array<() => void> = [];
210
197
  let recoveryInterval: ReturnType<typeof setInterval> | null = null;
211
198
  let stopSpokenOutputForExit: (() => Promise<void>) | null = null;
212
- let recoveryPending = false;
213
- // Which file the current recovery prompt should load/delete from (see recovery-input-helpers.ts).
214
- let recoverySource: 'live' | 'preserved' = 'live';
199
+ // The optional "used N memories" provenance chip (default OFF) — see interaction-seams.ts.
200
+ const memoryProvenanceUi = createMemoryProvenanceUi({ render: () => render(), memorySpine: ctx.services.memorySpine });
201
+ // Topology-aware keep-awake: the chip renders the DAEMON's state in adopted-external mode (power-chip-source.ts) and every toggle is forwarded to that daemon (power-keepawake-remote.ts) so keep-awake survives the TUI closing in BOTH topologies.
202
+ const isExternalDaemon = () => uiServices.platform.externalServices?.inspect()?.daemonStatus?.mode === 'external';
203
+ const powerChipSource = createPowerChipSource({ powerManager: ctx.services.powerManager, render: () => render(), isExternalDaemon,
204
+ onPowerEvent: (cb) => uiServices.events.ops.on('OPS_POWER_STATE_CHANGED', cb as never), fetchDaemonPowerState: () => fetchDaemonPowerState({ configManager, homeDirectory, isExternalDaemon }) });
205
+ unsubs.push(powerChipSource.stop, installKeepAwakeRemoteForward({ configManager, homeDirectory, isExternalDaemon }));
215
206
 
216
207
  const lifecycle = installProcessLifecycle({
217
208
  stdin,
@@ -335,6 +326,10 @@ async function main() {
335
326
  // Late-patched: bootstrap.ts populates uiServices.platform.externalServices AFTER commandContext is built.
336
327
  commandContext.platform.externalServices = uiServices.platform.externalServices;
337
328
  commandContext.cancelGeneration = cancelGeneration;
329
+ wireInteractionSeams(commandContext, {
330
+ orchestrator, powerManager: ctx.services.powerManager, readPowerSurface: () => powerChipSource.get(), render: () => render(), notify: (m) => systemMessageRouter.high(m),
331
+ getActiveToolCallId: () => streamMetrics.activeToolCallId, toggleMemoryProvenance: () => memoryProvenanceUi.toggle(),
332
+ });
338
333
  commandContext.isGenerating = () => orchestrator.isThinking;
339
334
  commandContext.jumpToBookmark = jumpToBookmark; commandContext.scrollToLine = scrollToLine;
340
335
  commandContext.clearScreen = () => {
@@ -379,7 +374,7 @@ async function main() {
379
374
  surfaceRegistry: ctx.services.surfaceRegistry,
380
375
  subscriptionManager: ctx.services.subscriptionManager,
381
376
  secretsManager: ctx.services.secretsManager,
382
- tokenAuditor: ctx.services.tokenAuditor,
377
+ pairingTokens: ctx.services.pairingTokens, tokenAuditor: ctx.services.tokenAuditor,
383
378
  replayEngine: ctx.services.replayEngine,
384
379
  webhookNotifier: ctx.services.webhookNotifier,
385
380
  policyRuntimeState: ctx.services.policyRuntimeState,
@@ -414,7 +409,7 @@ async function main() {
414
409
  input.setConversationManager(conversation);
415
410
  input.setContentWidth(getPromptContentWidth());
416
411
  input.filePicker.setOnUpdate(() => render());
417
- // W6.1 retirement: agentDetailModal/processModal setOnRefresh wiring removed —
412
+ // retirement: agentDetailModal/processModal setOnRefresh wiring removed —
418
413
  // those modals were deleted (Fleet subsumes the live process tree via F2).
419
414
 
420
415
  // Model picker callback is handled in bootstrap.ts — do not duplicate here.
@@ -501,6 +496,9 @@ async function main() {
501
496
  hitlMode: modeManager.getHITLMode(),
502
497
  // Cross-surface spine posture segment (adopted-daemon mode only).
503
498
  sessionSpineStatus: (() => { const s = uiServices.platform.externalServices?.inspect(); return s?.sessionSpineActive && s.sessionSpineStatus && s.sessionSpineStatus !== 'unknown' ? s.sessionSpineStatus : undefined; })(), runningAgentCount, runningProcessCount,
499
+ webSurfaceUrl: configManager.get('web.enabled') ? resolveWebSurfaceUrl(configManager) : undefined,
500
+ // Always-visible "sleep disabled" chip — topology-aware: the DAEMON's state in adopted-external mode, the in-process manager otherwise (power-chip-source.ts).
501
+ powerKeepAwake: powerChipSource.get().keepAwake,
504
502
  // Composer must not read as focused while the panel/process indicator owns keyboard focus.
505
503
  promptFocused: !input.panelFocused && !input.indicatorFocused,
506
504
  indicatorFocused: input.indicatorFocused,
@@ -547,7 +545,7 @@ async function main() {
547
545
  // Calculate how many rows are consumed by overlays (thinking, permissions, queue, file picker)
548
546
  let overlayRows = 0;
549
547
  if (orchestrator.isThinking) overlayRows += 2; // spinner + blank
550
- if (pendingPermission) overlayRows += PermissionPromptUI.getPromptHeight(pendingPermission, pendingPermission.hunkState, pendingPermission.detailsExpanded, pendingPermission.requestedBy);
548
+ if (pendingPermission) overlayRows += PermissionPromptUI.getPromptHeight(pendingPermission, pendingPermission.hunkState, pendingPermission.detailsExpanded, pendingPermission.requestedBy, PermissionPromptUI.promptViewState(pendingPermission, conversationWidth, approvalBroker));
551
549
  overlayRows += orchestrator.messageQueue.length * 3; // queued messages
552
550
  // File picker and model picker overlay rows computed from actual rendered line count below
553
551
  // Selection modal overlay rows are computed from actual rendered line count below
@@ -591,18 +589,17 @@ async function main() {
591
589
  viewport.push(...thinking);
592
590
  // Live tool timer: render the currently executing tool row with ticking elapsed.
593
591
  if (streamMetrics.activeToolName !== undefined && streamMetrics.activeToolStartedAtMs !== undefined) {
594
- const liveToolCall = { id: 'live', name: streamMetrics.activeToolName, arguments: {} };
592
+ const liveToolCall = { id: streamMetrics.activeToolCallId ?? 'live', name: streamMetrics.activeToolName, arguments: {} };
595
593
  viewport.push(...renderToolCallBlock(liveToolCall, 'executing', undefined, conversationWidth, undefined, undefined, undefined, streamMetrics.activeToolStartedAtMs));
596
594
  }
597
595
  }
598
596
 
599
597
  if (pendingPermission) {
600
- viewport.push(...PermissionPromptUI.createPromptLines(conversationWidth, pendingPermission, pendingPermission.hunkState, pendingPermission.detailsExpanded, pendingPermission.requestedBy));
598
+ viewport.push(...PermissionPromptUI.createPromptLines(conversationWidth, pendingPermission, pendingPermission.hunkState, pendingPermission.detailsExpanded, pendingPermission.requestedBy, PermissionPromptUI.promptViewState(pendingPermission, conversationWidth, approvalBroker)));
601
599
  }
602
600
 
603
- orchestrator.messageQueue.forEach(msg => {
604
- viewport.push(...UIFactory.createQueuedMessageFragment(conversationWidth, msg.text));
605
- });
601
+ viewport.push(...UIFactory.createQueuedMessageList(conversationWidth, orchestrator.listQueuedMessages()));
602
+ viewport.push(...memoryProvenanceUi.renderChip(conversationWidth, configManager));
606
603
 
607
604
  viewport = applyConversationOverlays(viewport, {
608
605
  input,
@@ -643,8 +640,8 @@ async function main() {
643
640
  panelWidth: panelComposite.panelWidth,
644
641
  });
645
642
  };
646
- const renderScheduler = createRenderScheduler(renderNow, undefined, () => lifecycle.isTerminalRestored()); // WO-208 coalescer; no frames after terminal restore
647
- const render = (): void => renderScheduler.schedule(); // captured direct writes → activity log + quiet /debug counter, not repeated transcript lines (UX-B 1a)
643
+ const renderScheduler = createRenderScheduler(renderNow, undefined, () => lifecycle.isTerminalRestored()); // coalescer; no frames after terminal restore
644
+ const render = (): void => renderScheduler.schedule(); // captured direct writes → activity log + quiet /debug counter, not repeated transcript lines (1a)
648
645
  const terminalOutputGuard = installTuiTerminalOutputGuard({ stdout, stderr: process.stderr, onCapture: (total) => { commandContext.session.runtime.terminalWritesIntercepted = total; render(); } });
649
646
 
650
647
  setRenderRequest(() => renderScheduler.flushNow()); // bootstrap's 16ms coalescer composites via the (restore-gated) scheduler
@@ -669,7 +666,7 @@ async function main() {
669
666
  homeDirectory,
670
667
  getConfiguredProviderIds: ctx._getConfiguredProviderIds,
671
668
  getPinned: ctx._getPinned,
672
- render,
669
+ render, trustPromptRef,
673
670
  });
674
671
 
675
672
  const { refreshGit, unsubs: turnUnsubs } = wireTurnEventHandlers({
@@ -691,6 +688,8 @@ async function main() {
691
688
  });
692
689
  unsubs.push(...turnUnsubs);
693
690
 
691
+ unsubs.push(uiServices.events.turns.on('TURN_COMPLETED', (evt) => memoryProvenanceUi.onTurnCompleted(evt)));
692
+
694
693
  // Stable turn context for failover retry — set in submitInput, read by retryTurn.
695
694
  let retryCtx: { count: number; text: string; content?: ContentPart[]; opts?: Parameters<typeof orchestrator.handleUserInput>[2] } | null = null;
696
695
  // One-key retry affordance, active right after a user-visible TURN_ERROR: 'r' re-submits on the
@@ -731,7 +730,7 @@ async function main() {
731
730
  stdin.resume();
732
731
  stdin.setEncoding('utf8');
733
732
  allowTerminalWrite(() => stdout.write((cli.flags.noAltScreen ? '' : ALT_SCREEN_ENTER) + CLEAR_SCREEN + CURSOR_HIDE + MOUSE_ENABLE + KEYBOARD_EXT_ENABLE + PASTE_ENABLE + FOCUS_ENABLE));
734
- // DEBT-2: forced dark/light applies before first paint; auto (TTY only) fires the
733
+ // forced dark/light applies before first paint; auto (TTY only) fires the
735
734
  // OSC 11 probe and repaints once if light wins. filterInput strips the reply from stdin.
736
735
  const themeProbe = installBackgroundThemeProbe({ configManager, isTTY: Boolean(stdout.isTTY), env: process.env, writeQuery: (b) => allowTerminalWrite(() => stdout.write(b)), requestRepaint: () => { compositor.resetDiff(); render(); } });
737
736
 
@@ -740,24 +739,24 @@ async function main() {
740
739
  stdin.on('data', (raw: string) => {
741
740
  const data = themeProbe.filterInput(raw); if (data.length === 0) return;
742
741
  const blocking = handleBlockingShellInput({
743
- data, pendingPermission, recoveryPending, conversation, systemMessageRouter, render,
742
+ data, pendingPermission, render,
744
743
  abortTurn: () => orchestrator.abort(),
745
- ...createRecoveryFileOps(() => recoverySource, { homeDirectory }),
746
- homeDirectory, sessionId: runtime.sessionId,
747
- persistSnapshot: createPersistRecoverySnapshot({ sessionManager: ctx.services.sessionManager, runtime, conversation }),
748
- reopenPanels: createReopenRecoveryPanels({ panelManager, render }),
749
744
  });
750
745
  pendingPermission = blocking.pendingPermission;
751
- recoveryPending = blocking.recoveryPending;
752
746
  if (blocking.handled) {
753
747
  return;
754
748
  }
755
-
756
749
  // One-key retry affordance: armed after a user-visible TURN_ERROR; any key other than r/m dismisses it and routes normally.
757
750
  if (errorAffordanceActive) {
758
751
  errorAffordanceActive = false;
759
752
  if (handleErrorAffordanceKey(data, { retryArmed: retryCtx !== null, retry: retryTurn, openModelPicker: () => commandContext.openModelPicker?.(), render })) return;
760
753
  }
754
+ // One-key jump to a spawned CI fix-session: 'j' attaches, any other key dismisses and routes normally.
755
+ if (fixSessionAttachArmed !== null) {
756
+ const armedFixSessionId = fixSessionAttachArmed;
757
+ fixSessionAttachArmed = null;
758
+ if (handleFixSessionAttachKey(data, { armedFixSessionId, attach: attachToFixSession, render })) return;
759
+ }
761
760
 
762
761
  input.feed(data);
763
762
  });
@@ -765,26 +764,27 @@ async function main() {
765
764
  process.on('unhandledRejection', unhandledRejectionHandler);
766
765
  stdout.on('resize', resizeHandler);
767
766
 
767
+ // --- Silent crash-recovery restore (no prompt/banner) ---
768
+ // Restore the newest crash snapshot in place, replay any post-snapshot
769
+ // journal turns, reopen its panels, and emit a single one-line receipt. The
770
+ // SDK scopes both the load and the follow-up delete to that snapshot's own
771
+ // session id, so a concurrent session's snapshot is never touched. Runs
772
+ // before the initial render so the restored content shows immediately.
773
+ autoRestoreRecoverySession({
774
+ workingDirectory: workingDir,
775
+ homeDirectory,
776
+ conversation,
777
+ persistSnapshot: createPersistRecoverySnapshot({ sessionManager: ctx.services.sessionManager, runtime, conversation }),
778
+ reopenPanels: createReopenRecoveryPanels({ panelManager, render }),
779
+ systemMessageRouter,
780
+ });
781
+
768
782
  // Initial render
769
783
  conversation.rebuildHistory();
770
784
  render();
771
785
 
772
- // --- Crash recovery check (also checks the preserve-on-dismiss sibling; see recovery-input-helpers.ts) ---
773
- const recoveryInfo = resolveStartupRecoveryInfo({ workingDirectory: workingDir, homeDirectory });
774
- if (recoveryInfo) {
775
- recoverySource = recoveryInfo.source;
776
- systemMessageRouter.high(`[Recovery] Found unsaved session from ${new Date(recoveryInfo.timestamp).toLocaleString()}. Title: "${recoveryInfo.title}". Press Ctrl+R to restore, Esc to discard, or start typing to ignore it.`);
777
- for (const line of formatReturnContextForDisplay(recoveryInfo.returnContext)) {
778
- systemMessageRouter.low(`[Recovery] ${line}`);
779
- }
780
- render();
781
- recoveryPending = true;
782
- }
783
-
784
786
  // --- Auto-save to recovery file every 60s ---
785
787
  recoveryInterval = setInterval(() => {
786
- // Skip while an earlier recovery prompt is unresolved (avoids racing preserve-on-dismiss).
787
- if (recoveryPending) return;
788
788
  const snapshot = conversation.toJSON() as { messages: Array<import('./core/conversation.ts').ConversationMessageSnapshot> };
789
789
  const persisted = buildPersistedSessionContext(snapshot.messages, conversation.getTitleSource(), buildSessionContinuityHints());
790
790
  writeRecoveryFile(
@@ -8,7 +8,7 @@ export type AgentInspectorEntryKind = 'user' | 'assistant' | 'tool_call' | 'tool
8
8
  // ---------------------------------------------------------------------------
9
9
  // Shared agent status / stall constants
10
10
  // Used by the Fleet panel's agent views and read-model consumers (formerly also
11
- // AgentDetailModal, which was retired in W6.1).
11
+ // AgentDetailModal, which was retired in).
12
12
  // ---------------------------------------------------------------------------
13
13
 
14
14
  /** Terminal statuses — cancel not offered; stall check skipped. */
@@ -127,7 +127,7 @@ export function agentKindStyle(kind: AgentInspectorEntryKind, colors: Record<str
127
127
  }
128
128
 
129
129
  // ---------------------------------------------------------------------------
130
- // Inspector filter modes (ported from the merged agent-logs console — WO-110)
130
+ // Inspector filter modes (ported from the merged agent-logs console —)
131
131
  // ---------------------------------------------------------------------------
132
132
 
133
133
  export type AgentInspectorFilterType = 'all' | 'assistant' | 'tool' | 'error';
@@ -188,7 +188,7 @@ interface AgentUsageLike {
188
188
 
189
189
  /**
190
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
191
+ * being present-but-empty.: the SDK's AgentRecord.usage is initialised
192
192
  * to an all-zero object at agent spawn (platform/tools/agent/manager.ts) and
193
193
  * — in the currently pinned SDK version — is never updated past that, so a
194
194
  * plain truthiness check on `rec.usage` treats every agent, including ones
@@ -256,7 +256,7 @@ export function buildWrfcCostSegments(
256
256
  }
257
257
 
258
258
  // ---------------------------------------------------------------------------
259
- // Agent lifecycle event subscriptions (ported from agent-logs — WO-110)
259
+ // Agent lifecycle event subscriptions (ported from agent-logs —)
260
260
  // ---------------------------------------------------------------------------
261
261
 
262
262
  export interface AgentActivityHooks {
@@ -227,10 +227,10 @@ export abstract class BasePanel implements Panel {
227
227
  return consumed;
228
228
  }
229
229
 
230
- /** R2: Mark this panel dirty — it will be re-rendered on the next compositor frame. */
230
+ /** Mark this panel dirty — it will be re-rendered on the next compositor frame. */
231
231
  public invalidate(): void { this.needsRender = true; }
232
232
 
233
- /** R2: Called by the compositor after a successful render to clear the dirty flag. */
233
+ /** Called by the compositor after a successful render to clear the dirty flag. */
234
234
  public markRendered(): void { this.needsRender = false; }
235
235
 
236
236
  protected markDirty(): void {
@@ -1,25 +1,25 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
2
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
3
3
 
4
- // W6.1 (the purge): thinking, tools, inspector, and wrfc were registered here
4
+ // (the purge): thinking, tools, inspector, and wrfc were registered here
5
5
  // before the purge. thinking/tools were DELETE-disposition (no surviving
6
6
  // human surface — thinking already renders inline in the transcript, tool
7
7
  // results render inline plus per-node in Fleet); inspector/wrfc were
8
8
  // RETIRE-INTO-FLEET (their live console is subsumed by the Fleet panel,
9
9
  // operations.ts:84). See registerOperationsPanels for the fleet
10
- // registration and .goodvibes/audit/2026-07-04-wave6-briefs.json (W6.1) for
10
+ // registration and .goodvibes/audit/2026-07-04-wave6-briefs.json for
11
11
  // the full disposition map.
12
12
  export function registerAgentPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
13
13
  // Compat: '/panel open agent-logs' and 'inspector' (and any saved
14
14
  // layout/muscle memory) still resolve — redirected straight to fleet.
15
- // Repointed from agent-logs->inspector (WO-110) now that inspector itself
15
+ // Repointed from agent-logs->inspector now that inspector itself
16
16
  // is retired; alias resolution is a single hop (PanelManager._resolveId),
17
17
  // so this must point at the real surviving id, not at another alias.
18
18
  manager.registerAlias('agent-logs', 'fleet');
19
19
  manager.registerAlias('inspector', 'fleet');
20
20
  manager.registerAlias('wrfc', 'fleet');
21
21
 
22
- // W6.1 (the purge) — group B (WO-P): 'work-plan' and 'project-planning'
22
+ // (the purge) — group B: 'work-plan' and 'project-planning'
23
23
  // migrated to the 'work-plan-modal' / 'planning-modal' config-modal surfaces.
24
24
  // Their surfaces AND panel→modal redirects are registered centrally in
25
25
  // registerBuiltinModals (builtin-modals.ts). Panel registrations retired here.
@@ -6,14 +6,14 @@ import { CostTrackerPanel } from '../cost-tracker-panel.ts';
6
6
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
7
7
  import { requireUiServices, withUnconfiguredFallback } from './shared.ts';
8
8
 
9
- // W6.1 (the purge): plan, intelligence, explorer, preview, and symbols were
9
+ // (the purge): plan, intelligence, explorer, preview, and symbols were
10
10
  // registered here before the purge. plan was RETIRE-INTO-FLEET (its
11
11
  // execution-plan view is subsumed by Fleet — operations.ts:84); the other
12
12
  // four were DELETE-disposition (no surviving human surface — intelligence's
13
13
  // read-model still backs the surviving `/intelligence` CLI subcommands, see
14
14
  // intelligence-runtime.ts; explorer/preview/symbols had no dedicated
15
15
  // read-model to preserve). See .goodvibes/audit/2026-07-04-wave6-briefs.json
16
- // (W6.1) for the full disposition map.
16
+ // for the full disposition map.
17
17
  export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
18
18
  manager.registerType({
19
19
  id: 'git',
@@ -56,10 +56,10 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
56
56
  ),
57
57
  });
58
58
 
59
- // WO-110: 'inspector' registration moved to builtin/agent.ts (category
59
+ // 'inspector' registration moved to builtin/agent.ts (category
60
60
  // 'agent') — it now absorbs the merged agent-logs capabilities.
61
61
 
62
- // WO-152: always registered (was gated behind `if (deps.getOrchestratorUsage)`,
62
+ // always registered (was gated behind `if (deps.getOrchestratorUsage)`,
63
63
  // so `/panel open cost` reported "Unknown panel" on builds without usage
64
64
  // tracking wired). Falls back to a "dependency not configured" empty state.
65
65
  {
@@ -1,7 +1,7 @@
1
1
  import type { PanelManager } from '../panel-manager.ts';
2
2
  import type { ResolvedBuiltinPanelDeps } from './shared.ts';
3
3
 
4
- // W6.1 (the purge) — group B: 'knowledge' and 'memory' migrated to the
4
+ // (the purge) — group B: 'knowledge' and 'memory' migrated to the
5
5
  // 'knowledge-modal' / 'memory-modal' config-modal surfaces. Both surfaces and
6
6
  // their panel→modal redirects are registered centrally in registerBuiltinModals
7
7
  // (src/panels/builtin-modals.ts). This registrar is intentionally empty