@pellux/goodvibes-tui 1.1.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +85 -21
- package/README.md +20 -11
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/core/alert-gating.ts +67 -0
- package/src/core/approval-alert.ts +72 -0
- package/src/core/budget-breach-notifier.ts +106 -0
- package/src/core/conversation-rendering.ts +19 -0
- package/src/core/conversation.ts +18 -0
- package/src/core/focus-tracker.ts +41 -0
- package/src/core/long-task-notifier.ts +33 -6
- package/src/core/system-message-router.ts +37 -51
- package/src/core/turn-cancellation.ts +20 -0
- package/src/core/turn-event-wiring.ts +64 -3
- package/src/export/cost-utils.ts +36 -0
- package/src/input/command-registry.ts +38 -1
- package/src/input/commands/checkpoint-runtime.ts +280 -0
- package/src/input/commands/codebase-runtime.ts +192 -0
- package/src/input/commands/eval.ts +1 -1
- package/src/input/commands/health-runtime.ts +1 -1
- package/src/input/commands/image-runtime.ts +112 -0
- package/src/input/commands/intelligence-runtime.ts +11 -1
- package/src/input/commands/local-auth-runtime.ts +4 -1
- package/src/input/commands/local-runtime.ts +9 -3
- package/src/input/commands/marketplace-runtime.ts +2 -2
- package/src/input/commands/memory.ts +6 -1
- package/src/input/commands/operator-panel-runtime.ts +40 -24
- package/src/input/commands/planning-runtime.ts +26 -3
- package/src/input/commands/platform-sandbox-runtime.ts +1 -6
- package/src/input/commands/plugin-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +21 -0
- package/src/input/commands/provider-accounts-runtime.ts +1 -1
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/recall-review.ts +35 -0
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/runtime-services.ts +54 -13
- package/src/input/commands/services-runtime.ts +1 -1
- package/src/input/commands/session-workflow.ts +16 -1
- package/src/input/commands/settings-sync-runtime.ts +1 -1
- package/src/input/commands/shell-core.ts +15 -7
- package/src/input/commands/skills-runtime.ts +2 -8
- package/src/input/commands/subscription-runtime.ts +2 -2
- package/src/input/commands/test-runtime.ts +277 -0
- package/src/input/commands/websearch-runtime.ts +101 -0
- package/src/input/commands/work-plan-runtime.ts +36 -10
- package/src/input/commands/workstream-runtime.ts +338 -0
- package/src/input/commands.ts +12 -0
- package/src/input/config-modal-types.ts +161 -0
- package/src/input/config-modal.ts +377 -0
- package/src/input/feed-context-factory.ts +7 -8
- package/src/input/handler-command-route.ts +27 -17
- package/src/input/handler-feed-routes.ts +61 -23
- package/src/input/handler-feed.ts +47 -23
- package/src/input/handler-interactions.ts +1 -3
- package/src/input/handler-modal-routes.ts +65 -0
- package/src/input/handler-modal-stack.ts +3 -5
- package/src/input/handler-modal-token-routes.ts +16 -49
- package/src/input/handler-picker-routes.ts +11 -94
- package/src/input/handler-shortcuts.ts +24 -14
- package/src/input/handler-types.ts +2 -6
- package/src/input/handler-ui-state.ts +10 -22
- package/src/input/handler.ts +6 -28
- package/src/input/keybindings.ts +22 -8
- package/src/input/model-picker-types.ts +24 -6
- package/src/input/model-picker.ts +58 -0
- package/src/input/panel-integration-actions.ts +9 -170
- package/src/input/settings-modal-data.ts +95 -0
- package/src/input/settings-modal-mutations.ts +6 -4
- package/src/main.ts +24 -27
- package/src/panels/agent-inspector-shared.ts +2 -1
- package/src/panels/base-panel.ts +22 -1
- package/src/panels/builtin/agent.ts +21 -107
- package/src/panels/builtin/development.ts +15 -61
- package/src/panels/builtin/knowledge.ts +8 -32
- package/src/panels/builtin/operations.ts +84 -428
- package/src/panels/builtin/session.ts +21 -112
- package/src/panels/builtin/shared.ts +9 -43
- package/src/panels/builtin-modals.ts +218 -0
- package/src/panels/builtin-panels.ts +5 -0
- package/src/panels/cost-tracker-panel.ts +36 -10
- package/src/panels/diff-panel.ts +12 -43
- package/src/panels/eval-registry.ts +60 -0
- package/src/panels/fleet-panel.ts +800 -0
- package/src/panels/fleet-read-model.ts +477 -0
- package/src/panels/fleet-steer.ts +92 -0
- package/src/panels/fleet-stop.ts +125 -0
- package/src/panels/fleet-tabs.ts +230 -0
- package/src/panels/fleet-transcript.ts +356 -0
- package/src/panels/index.ts +7 -31
- package/src/panels/modals/hooks-modal.ts +187 -0
- package/src/panels/modals/keybindings-modal.ts +151 -0
- package/src/panels/modals/knowledge-modal.ts +158 -0
- package/src/panels/modals/local-auth-modal.ts +132 -0
- package/src/panels/modals/marketplace-modal.ts +218 -0
- package/src/panels/modals/memory-modal.ts +180 -0
- package/src/panels/modals/modal-surface-helpers.ts +54 -0
- package/src/panels/modals/modal-theme.ts +36 -0
- package/src/panels/modals/pairing-modal.ts +144 -0
- package/src/panels/modals/planning-modal.ts +282 -0
- package/src/panels/modals/plugins-modal.ts +174 -0
- package/src/panels/modals/policy-modal.ts +256 -0
- package/src/panels/modals/provider-health-modal.ts +136 -0
- package/src/panels/modals/remote-modal.ts +115 -0
- package/src/panels/modals/sandbox-modal.ts +150 -0
- package/src/panels/modals/security-modal.ts +217 -0
- package/src/panels/modals/services-modal.ts +179 -0
- package/src/panels/modals/settings-sync-modal.ts +142 -0
- package/src/panels/modals/skills-modal.ts +189 -0
- package/src/panels/modals/subscription-modal.ts +172 -0
- package/src/panels/modals/work-plan-modal.ts +149 -0
- package/src/panels/panel-confirm-overlay.ts +72 -0
- package/src/panels/panel-manager.ts +108 -5
- package/src/panels/project-planning-answer-actions.ts +4 -2
- package/src/panels/skills-panel.ts +7 -51
- package/src/panels/types.ts +13 -0
- package/src/permissions/hunk-selection.ts +179 -0
- package/src/permissions/prompt.ts +60 -4
- package/src/renderer/compaction-history-modal.ts +19 -3
- package/src/renderer/compaction-preview.ts +13 -2
- package/src/renderer/compaction-quality.ts +100 -0
- package/src/renderer/config-modal.ts +81 -0
- package/src/renderer/conversation-overlays.ts +10 -17
- package/src/renderer/fleet-tab-strip.ts +56 -0
- package/src/renderer/footer-tips.ts +10 -2
- package/src/renderer/git-status.ts +40 -0
- package/src/renderer/help-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +44 -1
- package/src/renderer/panel-workspace-bar.ts +8 -2
- package/src/renderer/turn-injection.ts +114 -0
- package/src/runtime/bootstrap-command-context.ts +21 -1
- package/src/runtime/bootstrap-command-parts.ts +34 -7
- package/src/runtime/bootstrap-core.ts +14 -4
- package/src/runtime/bootstrap-shell.ts +29 -16
- package/src/runtime/bootstrap.ts +11 -17
- package/src/runtime/code-index-services.ts +112 -0
- package/src/runtime/orchestrator-core-services.ts +49 -0
- package/src/runtime/process-lifecycle.ts +3 -1
- package/src/runtime/services.ts +91 -43
- package/src/runtime/ui-services.ts +8 -0
- package/src/runtime/workstream-services.ts +195 -0
- package/src/shell/blocking-input.ts +22 -1
- package/src/shell/ui-openers.ts +129 -17
- package/src/utils/format-duration.ts +8 -18
- package/src/utils/splash-lines.ts +1 -1
- package/src/version.ts +1 -1
- package/src/panels/agent-inspector-panel.ts +0 -786
- package/src/panels/approval-panel.ts +0 -252
- package/src/panels/automation-control-panel.ts +0 -479
- package/src/panels/cockpit-panel.ts +0 -481
- package/src/panels/cockpit-read-model.ts +0 -238
- package/src/panels/communication-panel.ts +0 -256
- package/src/panels/control-plane-panel.ts +0 -470
- package/src/panels/debug-panel.ts +0 -615
- package/src/panels/docs-panel.ts +0 -384
- package/src/panels/eval-panel.ts +0 -627
- package/src/panels/file-explorer-panel.ts +0 -673
- package/src/panels/file-preview-panel.ts +0 -517
- package/src/panels/hooks-panel.ts +0 -401
- package/src/panels/incident-review-panel.ts +0 -406
- package/src/panels/intelligence-panel.ts +0 -383
- package/src/panels/knowledge-graph-panel.ts +0 -515
- package/src/panels/marketplace-panel.ts +0 -399
- package/src/panels/memory-panel.ts +0 -558
- package/src/panels/ops-control-panel.ts +0 -329
- package/src/panels/ops-strategy-panel.ts +0 -321
- package/src/panels/orchestration-panel.ts +0 -465
- package/src/panels/panel-list-panel.ts +0 -566
- package/src/panels/plan-dashboard-panel.ts +0 -707
- package/src/panels/policy-panel.ts +0 -517
- package/src/panels/project-planning-panel.ts +0 -731
- package/src/panels/provider-health-panel.ts +0 -678
- package/src/panels/provider-health-tracker.ts +0 -310
- package/src/panels/provider-health-views.ts +0 -567
- package/src/panels/qr-panel.ts +0 -280
- package/src/panels/remote-panel.ts +0 -534
- package/src/panels/routes-panel.ts +0 -241
- package/src/panels/sandbox-panel.ts +0 -456
- package/src/panels/security-panel.ts +0 -447
- package/src/panels/services-panel.ts +0 -329
- package/src/panels/session-browser-panel.ts +0 -496
- package/src/panels/settings-sync-panel.ts +0 -398
- package/src/panels/subscription-panel.ts +0 -342
- package/src/panels/symbol-outline-panel.ts +0 -619
- package/src/panels/system-messages-panel.ts +0 -364
- package/src/panels/tasks-panel.ts +0 -608
- package/src/panels/thinking-panel.ts +0 -333
- package/src/panels/tool-inspector-panel.ts +0 -537
- package/src/panels/work-plan-panel.ts +0 -540
- package/src/panels/worktree-panel.ts +0 -360
- package/src/panels/wrfc-panel.ts +0 -790
- package/src/renderer/agent-detail-modal.ts +0 -466
- package/src/renderer/live-tail-modal.ts +0 -156
- package/src/renderer/process-modal.ts +0 -671
- package/src/renderer/qr-renderer.ts +0 -120
|
@@ -1,450 +1,106 @@
|
|
|
1
1
|
import type { PanelManager } from '../panel-manager.ts';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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 {
|
|
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
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
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
|
-
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
|
|
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: '
|
|
75
|
-
name: '
|
|
76
|
-
|
|
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: '
|
|
79
|
-
factory: () => new
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
manager.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
}
|