@pellux/goodvibes-tui 0.18.12 → 0.18.17

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 (196) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +3 -2
  5. package/src/config/index.ts +1 -138
  6. package/src/core/conversation-rendering.ts +3 -3
  7. package/src/core/conversation.ts +176 -423
  8. package/src/core/history.ts +45 -0
  9. package/src/core/orchestrator.ts +3 -735
  10. package/src/core/system-message-router.ts +19 -58
  11. package/src/daemon/cli.ts +82 -6
  12. package/src/input/command-registry.ts +2 -0
  13. package/src/input/commands/control-room-runtime.ts +1 -1
  14. package/src/input/commands/health-runtime.ts +1 -1
  15. package/src/input/commands/local-setup-review.ts +1 -1
  16. package/src/input/commands/platform-access-runtime.ts +1 -1
  17. package/src/input/commands/qrcode-runtime.ts +20 -0
  18. package/src/input/commands/subscription-runtime.ts +1 -1
  19. package/src/input/commands.ts +2 -0
  20. package/src/input/handler-content-actions.ts +2 -2
  21. package/src/input/handler-feed.ts +7 -1
  22. package/src/input/handler-modal-routes.ts +19 -2
  23. package/src/input/handler-modal-token-routes.ts +4 -1
  24. package/src/input/handler-picker-routes.ts +4 -2
  25. package/src/input/handler-ui-state.ts +1 -1
  26. package/src/input/handler.ts +1 -1
  27. package/src/input/model-picker.ts +11 -0
  28. package/src/input/search.ts +1 -1
  29. package/src/input/selection.ts +2 -2
  30. package/src/input/settings-modal.ts +31 -3
  31. package/src/main.ts +1 -1
  32. package/src/panels/agent-inspector-panel.ts +3 -3
  33. package/src/panels/agent-logs-panel.ts +26 -27
  34. package/src/panels/approval-panel.ts +2 -2
  35. package/src/panels/automation-control-panel.ts +3 -3
  36. package/src/panels/base-panel.ts +14 -14
  37. package/src/panels/builtin/operations.ts +1 -1
  38. package/src/panels/builtin/session.ts +67 -1
  39. package/src/panels/builtin/shared.ts +4 -4
  40. package/src/panels/cockpit-panel.ts +2 -2
  41. package/src/panels/communication-panel.ts +3 -3
  42. package/src/panels/context-visualizer-panel.ts +2 -2
  43. package/src/panels/control-plane-panel.ts +3 -3
  44. package/src/panels/cost-tracker-panel.ts +3 -3
  45. package/src/panels/debug-panel.ts +2 -2
  46. package/src/panels/diff-panel.ts +2 -2
  47. package/src/panels/docs-panel.ts +1 -1
  48. package/src/panels/eval-panel.ts +2 -2
  49. package/src/panels/file-explorer-panel.ts +3 -3
  50. package/src/panels/file-preview-panel.ts +3 -3
  51. package/src/panels/forensics-panel.ts +2 -2
  52. package/src/panels/git-panel.ts +1 -1
  53. package/src/panels/hooks-panel.ts +3 -3
  54. package/src/panels/incident-review-panel.ts +1 -1
  55. package/src/panels/intelligence-panel.ts +2 -2
  56. package/src/panels/knowledge-panel.ts +1 -1
  57. package/src/panels/local-auth-panel.ts +2 -2
  58. package/src/panels/marketplace-panel.ts +1 -1
  59. package/src/panels/mcp-panel.ts +3 -3
  60. package/src/panels/memory-panel.ts +1 -1
  61. package/src/panels/ops-control-panel.ts +3 -3
  62. package/src/panels/ops-strategy-panel.ts +2 -2
  63. package/src/panels/orchestration-panel.ts +2 -2
  64. package/src/panels/panel-list-panel.ts +6 -6
  65. package/src/panels/plan-dashboard-panel.ts +1 -1
  66. package/src/panels/plugins-panel.ts +2 -2
  67. package/src/panels/policy-panel.ts +2 -2
  68. package/src/panels/polish.ts +3 -3
  69. package/src/panels/provider-account-snapshot.ts +1 -1
  70. package/src/panels/provider-accounts-panel.ts +25 -29
  71. package/src/panels/provider-health-panel.ts +2 -2
  72. package/src/panels/provider-stats-panel.ts +3 -3
  73. package/src/panels/qr-panel.ts +182 -0
  74. package/src/panels/remote-panel.ts +3 -3
  75. package/src/panels/routes-panel.ts +3 -3
  76. package/src/panels/sandbox-panel.ts +2 -2
  77. package/src/panels/schedule-panel.ts +1 -1
  78. package/src/panels/scrollable-list-panel.ts +407 -0
  79. package/src/panels/security-panel.ts +2 -2
  80. package/src/panels/services-panel.ts +3 -3
  81. package/src/panels/session-browser-panel.ts +2 -2
  82. package/src/panels/settings-sync-panel.ts +2 -2
  83. package/src/panels/skills-panel.ts +6 -6
  84. package/src/panels/subscription-panel.ts +3 -3
  85. package/src/panels/symbol-outline-panel.ts +3 -3
  86. package/src/panels/system-messages-panel.ts +4 -4
  87. package/src/panels/tasks-panel.ts +2 -2
  88. package/src/panels/thinking-panel.ts +3 -3
  89. package/src/panels/token-budget-panel.ts +1 -1
  90. package/src/panels/tool-inspector-panel.ts +3 -3
  91. package/src/panels/types.ts +5 -5
  92. package/src/panels/watchers-panel.ts +3 -3
  93. package/src/panels/welcome-panel.ts +1 -1
  94. package/src/panels/worktree-panel.ts +22 -21
  95. package/src/panels/wrfc-panel.ts +3 -3
  96. package/src/permissions/prompt.ts +3 -22
  97. package/src/plugins/loader.ts +15 -304
  98. package/src/renderer/agent-detail-modal.ts +1 -1
  99. package/src/renderer/autocomplete-overlay.ts +2 -2
  100. package/src/renderer/bookmark-modal.ts +1 -1
  101. package/src/renderer/bottom-bar.ts +2 -2
  102. package/src/renderer/buffer.ts +1 -1
  103. package/src/renderer/code-block.ts +2 -2
  104. package/src/renderer/compositor.ts +2 -2
  105. package/src/renderer/context-inspector.ts +1 -1
  106. package/src/renderer/conversation-layout.ts +2 -2
  107. package/src/renderer/conversation-overlays.ts +1 -1
  108. package/src/renderer/conversation-surface.ts +2 -2
  109. package/src/renderer/diff-view.ts +2 -2
  110. package/src/renderer/diff.ts +1 -1
  111. package/src/renderer/file-picker-overlay.ts +2 -2
  112. package/src/renderer/file-tree.ts +2 -2
  113. package/src/renderer/help-overlay.ts +1 -1
  114. package/src/renderer/history-search-overlay.ts +2 -2
  115. package/src/renderer/live-tail-modal.ts +1 -1
  116. package/src/renderer/markdown.ts +2 -2
  117. package/src/renderer/modal-factory.ts +3 -3
  118. package/src/renderer/model-picker-overlay.ts +2 -2
  119. package/src/renderer/overlay-box.ts +2 -2
  120. package/src/renderer/panel-composite.ts +1 -1
  121. package/src/renderer/panel-picker-overlay.ts +2 -2
  122. package/src/renderer/panel-tab-bar.ts +1 -1
  123. package/src/renderer/panel-workspace-bar.ts +1 -1
  124. package/src/renderer/process-indicator.ts +2 -2
  125. package/src/renderer/process-modal.ts +1 -1
  126. package/src/renderer/profile-picker-modal.ts +2 -2
  127. package/src/renderer/progress.ts +2 -2
  128. package/src/renderer/qr-renderer.ts +117 -0
  129. package/src/renderer/search-overlay.ts +2 -2
  130. package/src/renderer/selection-modal-overlay.ts +2 -2
  131. package/src/renderer/session-picker-modal.ts +2 -2
  132. package/src/renderer/settings-modal-helpers.ts +122 -0
  133. package/src/renderer/settings-modal.ts +149 -113
  134. package/src/renderer/shell-surface.ts +1 -1
  135. package/src/renderer/system-message.ts +1 -1
  136. package/src/renderer/tab-strip.ts +2 -2
  137. package/src/renderer/text-layout.ts +1 -1
  138. package/src/renderer/thinking.ts +1 -1
  139. package/src/renderer/tool-call.ts +2 -2
  140. package/src/renderer/ui-factory.ts +2 -2
  141. package/src/runtime/bootstrap-command-context.ts +5 -6
  142. package/src/runtime/bootstrap-command-parts.ts +32 -18
  143. package/src/runtime/bootstrap-core.ts +3 -2
  144. package/src/runtime/bootstrap-hook-bridge.ts +15 -174
  145. package/src/runtime/bootstrap-shell.ts +4 -4
  146. package/src/runtime/bootstrap.ts +7 -2
  147. package/src/runtime/context.ts +4 -20
  148. package/src/runtime/diagnostics/panels/index.ts +6 -6
  149. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  150. package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
  151. package/src/runtime/perf/panel-contracts.ts +32 -0
  152. package/src/runtime/perf/panel-health-monitor.ts +18 -0
  153. package/src/runtime/services.ts +5 -5
  154. package/src/runtime/store/domains/domain-read-matrix.ts +0 -2
  155. package/src/runtime/store/selectors/index.ts +11 -6
  156. package/src/runtime/store/state.ts +12 -4
  157. package/src/runtime/ui-events.ts +1 -0
  158. package/src/runtime/ui-read-model-helpers.ts +1 -32
  159. package/src/runtime/ui-read-models-observability-maintenance.ts +1 -81
  160. package/src/runtime/ui-read-models-observability-options.ts +1 -5
  161. package/src/runtime/ui-read-models-observability-remote.ts +1 -73
  162. package/src/runtime/ui-read-models-observability-security.ts +1 -172
  163. package/src/runtime/ui-read-models-observability-system.ts +1 -217
  164. package/src/runtime/ui-read-models-observability.ts +1 -59
  165. package/src/runtime/ui-service-queries.ts +1 -114
  166. package/src/runtime/ui-services.ts +1 -1
  167. package/src/shell/ui-openers.ts +1 -1
  168. package/src/tools/index.ts +1 -186
  169. package/src/types/grid.ts +48 -0
  170. package/src/utils/clipboard.ts +21 -0
  171. package/src/utils/splash-lines.ts +1 -1
  172. package/src/utils/terminal-width.ts +185 -0
  173. package/src/version.ts +1 -1
  174. package/src/config/service-registry.ts +0 -1
  175. package/src/config/subscription-providers.ts +0 -127
  176. package/src/daemon/facade-composition.ts +0 -398
  177. package/src/daemon/facade.ts +0 -638
  178. package/src/daemon/surface-policy.ts +0 -60
  179. package/src/daemon/types.ts +0 -191
  180. package/src/runtime/diagnostics/actions.ts +0 -776
  181. package/src/runtime/diagnostics/index.ts +0 -99
  182. package/src/runtime/diagnostics/panels/agents.ts +0 -252
  183. package/src/runtime/diagnostics/panels/events.ts +0 -188
  184. package/src/runtime/diagnostics/panels/health.ts +0 -242
  185. package/src/runtime/diagnostics/panels/tasks.ts +0 -251
  186. package/src/runtime/diagnostics/panels/tool-calls.ts +0 -267
  187. package/src/runtime/diagnostics/provider.ts +0 -262
  188. package/src/runtime/store/domains/conversation.ts +0 -181
  189. package/src/runtime/store/domains/permissions.ts +0 -143
  190. package/src/runtime/store/helpers/reducers/conversation.ts +0 -228
  191. package/src/runtime/store/helpers/reducers/lifecycle.ts +0 -440
  192. package/src/runtime/store/helpers/reducers/shared.ts +0 -60
  193. package/src/runtime/store/helpers/reducers/sync.ts +0 -555
  194. package/src/runtime/store/helpers/reducers.ts +0 -30
  195. package/src/runtime/ui-read-models-core.ts +0 -95
  196. package/src/runtime/ui-read-models-operations.ts +0 -203
@@ -1,172 +1 @@
1
- import { buildMcpAttackPathReview } from '@pellux/goodvibes-sdk/platform/runtime/mcp/index';
2
- import type { McpDecisionRecord, McpSecuritySnapshot } from '@pellux/goodvibes-sdk/platform/runtime/mcp/types';
3
- import type { RuntimeServices } from './services.ts';
4
- import type { UiReadModel } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-base';
5
- import { combineSubscriptions } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-model-helpers';
6
- import type { SecurityPanelSnapshot } from '@pellux/goodvibes-sdk/platform/runtime/diagnostics/panels/security';
7
- import type { PluginStatus } from '@pellux/goodvibes-sdk/platform/plugins/manager';
8
-
9
- export interface UiMcpServerSnapshot {
10
- readonly name: string;
11
- readonly role: string;
12
- readonly trustMode: string;
13
- readonly status: string;
14
- readonly schemaFreshness: string;
15
- readonly toolCount: number;
16
- readonly lastError?: string;
17
- readonly quarantineReason?: string;
18
- readonly quarantineDetail?: string;
19
- }
20
-
21
- export interface UiSecuritySnapshot {
22
- readonly audit: SecurityPanelSnapshot;
23
- readonly policy: {
24
- readonly preflightStatus: string;
25
- readonly preflightIssueCount: number;
26
- readonly lintFindingCount: number;
27
- };
28
- readonly deniedPermissions: number;
29
- readonly incidents: ReturnType<import('@pellux/goodvibes-sdk/platform/runtime/forensics/index').ForensicsRegistry['getAll']>;
30
- readonly latestIncident: ReturnType<import('@pellux/goodvibes-sdk/platform/runtime/forensics/index').ForensicsRegistry['latest']>;
31
- readonly mcpServers: readonly McpSecuritySnapshot[];
32
- readonly recentMcpDecisions: readonly McpDecisionRecord[];
33
- readonly attackPathReview: ReturnType<typeof buildMcpAttackPathReview>;
34
- readonly plugins: readonly PluginStatus[];
35
- readonly quarantinedPlugins: readonly PluginStatus[];
36
- readonly untrustedPlugins: readonly PluginStatus[];
37
- }
38
-
39
- export interface UiMcpSnapshot {
40
- readonly servers: readonly UiMcpServerSnapshot[];
41
- readonly connectedServerNames: readonly string[];
42
- readonly availableToolCount: number;
43
- readonly totalCalls: number;
44
- readonly totalErrors: number;
45
- readonly recentDecisions: readonly McpDecisionRecord[];
46
- }
47
-
48
- export interface UiLocalAuthSnapshot {
49
- readonly bootstrapCredentialPresent: boolean;
50
- readonly userCount: number;
51
- readonly sessionCount: number;
52
- }
53
-
54
- export interface UiSecurityObservabilityReadModels {
55
- readonly security: UiReadModel<UiSecuritySnapshot>;
56
- readonly mcp: UiReadModel<UiMcpSnapshot>;
57
- readonly localAuth: UiReadModel<UiLocalAuthSnapshot>;
58
- }
59
-
60
- export function createSecurityObservabilityReadModels(
61
- runtimeServices: RuntimeServices,
62
- options: import('./ui-read-models-observability-options.ts').UiObservabilityReadModelOptions = {},
63
- ): UiSecurityObservabilityReadModels {
64
- const { runtimeStore } = runtimeServices;
65
-
66
- return {
67
- security: {
68
- getSnapshot() {
69
- const audit = runtimeServices.tokenAuditor.auditAll(Date.now());
70
- const mcpServers = [...runtimeStore.getState().mcp.servers.values()].map((server): McpSecuritySnapshot => ({
71
- name: server.name,
72
- role: server.role,
73
- trustMode: server.trustMode,
74
- allowedPaths: server.allowedPaths,
75
- allowedHosts: server.allowedHosts,
76
- schemaFreshness: server.schemaFreshness,
77
- quarantineReason: server.quarantineReason,
78
- quarantineDetail: server.quarantineDetail,
79
- connected: server.status === 'connected' || server.status === 'degraded',
80
- }));
81
- const recentMcpDecisions = runtimeServices.mcpRegistry.listRecentSecurityDecisions(8);
82
- const attackPathReview = buildMcpAttackPathReview({
83
- servers: mcpServers,
84
- recentDecisions: recentMcpDecisions,
85
- });
86
- const plugins = runtimeServices.pluginManager.list();
87
- const policySnapshot = runtimeServices.policyRuntimeState.getSnapshot();
88
- const snapshot: SecurityPanelSnapshot = {
89
- managed: runtimeServices.tokenAuditor.isManaged,
90
- totalTokens: runtimeServices.tokenAuditor.tokenCount,
91
- results: audit.results,
92
- blocked: audit.blocked,
93
- scopeViolations: audit.scopeViolations,
94
- rotationWarnings: audit.rotationWarnings,
95
- rotationOverdue: audit.rotationOverdue,
96
- lastAuditAt: audit.capturedAt,
97
- capturedAt: new Date().toISOString(),
98
- };
99
- return {
100
- audit: snapshot,
101
- policy: {
102
- preflightStatus: policySnapshot.lastPreflightReview?.status ?? 'n/a',
103
- preflightIssueCount: policySnapshot.lastPreflightReview?.issueCount ?? 0,
104
- lintFindingCount: policySnapshot.lintFindings.length,
105
- },
106
- deniedPermissions: runtimeStore.getState().permissions.denialCount,
107
- incidents: options.forensicsRegistry?.getAll() ?? [],
108
- latestIncident: options.forensicsRegistry?.latest(),
109
- mcpServers,
110
- recentMcpDecisions,
111
- attackPathReview,
112
- plugins,
113
- quarantinedPlugins: plugins.filter((plugin) => plugin.quarantined),
114
- untrustedPlugins: plugins.filter((plugin) => plugin.trustTier === 'untrusted'),
115
- };
116
- },
117
- subscribe(listener) {
118
- const unsubs: Array<() => void> = [
119
- runtimeStore.subscribe(listener),
120
- runtimeServices.pluginManager.subscribe(listener),
121
- runtimeServices.policyRuntimeState.subscribe(listener),
122
- ];
123
- if (options.forensicsRegistry) {
124
- unsubs.push(options.forensicsRegistry.subscribe(listener));
125
- }
126
- return combineSubscriptions(...unsubs);
127
- },
128
- },
129
- mcp: {
130
- getSnapshot() {
131
- const state = runtimeStore.getState().mcp;
132
- const servers = [...state.servers.values()]
133
- .map((server): UiMcpServerSnapshot => ({
134
- name: server.name,
135
- role: server.role,
136
- trustMode: server.trustMode,
137
- status: server.status,
138
- schemaFreshness: server.schemaFreshness,
139
- toolCount: server.toolCount,
140
- lastError: server.lastError,
141
- quarantineReason: server.quarantineReason,
142
- quarantineDetail: server.quarantineDetail,
143
- }))
144
- .sort((a, b) => a.name.localeCompare(b.name));
145
- return {
146
- servers,
147
- connectedServerNames: state.connectedServerNames,
148
- availableToolCount: state.availableToolCount,
149
- totalCalls: state.totalCalls,
150
- totalErrors: state.totalErrors,
151
- recentDecisions: runtimeServices.mcpRegistry.listRecentSecurityDecisions(8),
152
- };
153
- },
154
- subscribe(listener) {
155
- return runtimeStore.subscribe(listener);
156
- },
157
- },
158
- localAuth: {
159
- getSnapshot() {
160
- const snapshot = runtimeServices.localUserAuthManager.inspect();
161
- return {
162
- bootstrapCredentialPresent: snapshot.bootstrapCredentialPresent,
163
- userCount: snapshot.userCount,
164
- sessionCount: snapshot.sessionCount,
165
- };
166
- },
167
- subscribe() {
168
- return () => {};
169
- },
170
- },
171
- };
172
- }
1
+ export * from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-security';
@@ -1,217 +1 @@
1
- import { buildEcosystemRecommendations, type EcosystemRecommendation } from '@pellux/goodvibes-sdk/platform/runtime/ecosystem/recommendations';
2
- import type { RuntimeServices } from './services.ts';
3
- import type { UiReadModel } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-base';
4
- import { combineSubscriptions, createStoreBackedReadModel } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-model-helpers';
5
- import type {
6
- ContinuitySnapshot as IntegrationContinuitySnapshot,
7
- SettingsSnapshot as IntegrationSettingsSnapshot,
8
- WorktreeSnapshot as IntegrationWorktreeSnapshot,
9
- } from '@pellux/goodvibes-sdk/platform/runtime/integration/helpers';
10
- import type { SessionReturnContextSummary } from '@pellux/goodvibes-sdk/platform/runtime/session-return-context';
11
- import type { ManagedWorktreeMeta } from '@pellux/goodvibes-sdk/platform/runtime/worktree/registry';
12
- import type { PluginStatus } from '@pellux/goodvibes-sdk/platform/plugins/manager';
13
-
14
- export interface UiIntelligenceSnapshot {
15
- readonly diagnosticsStatus: string;
16
- readonly symbolSearchStatus: string;
17
- readonly completionsStatus: string;
18
- readonly hoverStatus: string;
19
- readonly errorCount: number;
20
- readonly warningCount: number;
21
- readonly totalRequests: number;
22
- readonly avgLatencyMs: number;
23
- readonly hover: {
24
- readonly active: boolean;
25
- readonly filePath?: string;
26
- };
27
- readonly diagnostics: ReadonlyMap<string, readonly import('@pellux/goodvibes-sdk/platform/runtime/store/domains/intelligence').LspDiagnostic[]>;
28
- }
29
-
30
- export interface UiMarketplaceSnapshot {
31
- readonly startupIssues: readonly string[];
32
- readonly recommendations: readonly EcosystemRecommendation[];
33
- }
34
-
35
- export interface UiCockpitSnapshot {
36
- readonly runningTasks: number;
37
- readonly blockedTasks: number;
38
- readonly failedTasks: number;
39
- readonly activeGraphs: number;
40
- readonly guardTrips: number;
41
- readonly blockedMessages: number;
42
- readonly pendingPermissions: number;
43
- readonly deniedPermissions: number;
44
- readonly preflightStatus: string;
45
- readonly preflightIssueCount: number;
46
- readonly lintFindingCount: number;
47
- readonly tokenBlockedCount: number;
48
- readonly tokenRotationOverdueCount: number;
49
- readonly tokenScopeViolationCount: number;
50
- readonly tokenRotationWarningCount: number;
51
- readonly incidentCount: number;
52
- readonly latestIncident: ReturnType<import('@pellux/goodvibes-sdk/platform/runtime/forensics/index').ForensicsRegistry['latest']>;
53
- readonly elevatedMcp: number;
54
- readonly unhealthyMcp: number;
55
- readonly erroredPlugins: number;
56
- readonly failingIntegrations: number;
57
- readonly taskCount: number;
58
- readonly agentCount: number;
59
- readonly totalGraphs: number;
60
- readonly communicationCount: number;
61
- readonly mcpServerCount: number;
62
- readonly pluginCount: number;
63
- }
64
-
65
- export interface UiHealthSnapshot {
66
- readonly degradedDomains: readonly string[];
67
- readonly providerProblems: readonly string[];
68
- readonly degradedMcpServers: readonly string[];
69
- readonly quarantinedMcpServers: readonly string[];
70
- readonly integrationProblems: readonly string[];
71
- readonly daemonTransportState: string;
72
- readonly acpTransportState: string;
73
- readonly recoveryState: string;
74
- }
75
-
76
- export interface UiSystemObservabilityReadModels {
77
- readonly intelligence: UiReadModel<UiIntelligenceSnapshot>;
78
- readonly marketplace: UiReadModel<UiMarketplaceSnapshot>;
79
- readonly cockpit: UiReadModel<UiCockpitSnapshot>;
80
- readonly health: UiReadModel<UiHealthSnapshot>;
81
- }
82
-
83
- export function createSystemObservabilityReadModels(
84
- runtimeServices: RuntimeServices,
85
- options: import('./ui-read-models-observability-options.ts').UiObservabilityReadModelOptions = {},
86
- ): UiSystemObservabilityReadModels {
87
- const { runtimeStore } = runtimeServices;
88
-
89
- return {
90
- intelligence: createStoreBackedReadModel(runtimeServices, () => {
91
- const state = runtimeStore.getState().intelligence;
92
- return {
93
- diagnosticsStatus: state.diagnosticsStatus,
94
- symbolSearchStatus: state.symbolSearchStatus,
95
- completionsStatus: state.completionsStatus,
96
- hoverStatus: state.hoverStatus,
97
- errorCount: state.errorCount,
98
- warningCount: state.warningCount,
99
- totalRequests: state.totalRequests,
100
- avgLatencyMs: state.avgLatencyMs,
101
- hover: {
102
- active: state.hover.active,
103
- filePath: state.hover.filePath,
104
- },
105
- diagnostics: state.diagnostics,
106
- };
107
- }),
108
- marketplace: createStoreBackedReadModel(runtimeServices, () => {
109
- const state = runtimeStore.getState();
110
- const startupIssues: string[] = [];
111
- if (state.permissions.denialCount >= 3) {
112
- startupIssues.push(`${state.permissions.denialCount} permission denials suggest a policy-pack or trust posture review.`);
113
- }
114
- const authRequiredServers = [...state.mcp.servers.values()].filter((server) => server.status === 'auth_required');
115
- if (authRequiredServers.length > 0) {
116
- startupIssues.push(`${authRequiredServers.length} MCP server${authRequiredServers.length === 1 ? '' : 's'} need auth or reconnect repair.`);
117
- }
118
- const staleSchemas = [...state.mcp.servers.values()].filter((server) => server.schemaFreshness !== 'fresh');
119
- if (staleSchemas.length > 0) {
120
- startupIssues.push(`${staleSchemas.length} MCP server schema${staleSchemas.length === 1 ? ' is' : 's are'} stale or quarantined.`);
121
- }
122
- return {
123
- startupIssues,
124
- recommendations: buildEcosystemRecommendations(runtimeStore, {
125
- cwd: runtimeServices.shellPaths.workingDirectory,
126
- homeDir: runtimeServices.shellPaths.homeDirectory,
127
- }),
128
- };
129
- }),
130
- cockpit: {
131
- getSnapshot() {
132
- const state = runtimeStore.getState();
133
- const runningTasks = [...state.tasks.tasks.values()].filter((task) => task.status === 'running').length;
134
- const blockedTasks = [...state.tasks.tasks.values()].filter((task) => task.status === 'blocked').length;
135
- const failedTasks = [...state.tasks.tasks.values()].filter((task) => task.status === 'failed').length;
136
- const audit = runtimeServices.tokenAuditor.auditAll();
137
- const incidents = options.forensicsRegistry?.getAll() ?? [];
138
- const plugins = runtimeServices.pluginManager.list();
139
- const failingIntegrations = [...state.integrations.integrations.values()].filter((record) => record.status === 'error').length;
140
- const elevatedMcp = [...state.mcp.servers.values()].filter((server) => server.trustMode === 'allow-all').length;
141
- const unhealthyMcp = [...state.mcp.servers.values()].filter((server) => (
142
- server.status === 'degraded'
143
- || server.status === 'auth_required'
144
- || server.status === 'reconnecting'
145
- || server.status === 'disconnected'
146
- )).length;
147
- const preflight = runtimeServices.policyRuntimeState.getSnapshot().lastPreflightReview;
148
- const lintFindingCount = runtimeServices.policyRuntimeState.getSnapshot().lintFindings.length;
149
- return {
150
- runningTasks,
151
- blockedTasks,
152
- failedTasks,
153
- activeGraphs: state.orchestration.activeGraphIds.length,
154
- guardTrips: state.orchestration.recursionGuardTrips,
155
- blockedMessages: state.communication.totalBlocked,
156
- pendingPermissions: state.permissions.awaitingDecision ? 1 : 0,
157
- deniedPermissions: state.permissions.denialCount,
158
- preflightStatus: preflight?.status ?? 'n/a',
159
- preflightIssueCount: preflight?.issueCount ?? 0,
160
- lintFindingCount,
161
- tokenBlockedCount: audit.blocked.length,
162
- tokenRotationOverdueCount: audit.rotationOverdue.length,
163
- tokenScopeViolationCount: audit.scopeViolations.length,
164
- tokenRotationWarningCount: audit.rotationWarnings.length,
165
- incidentCount: incidents.length,
166
- latestIncident: options.forensicsRegistry?.latest(),
167
- elevatedMcp,
168
- unhealthyMcp,
169
- erroredPlugins: plugins.filter((plugin) => plugin.quarantined || !plugin.active).length,
170
- failingIntegrations,
171
- taskCount: state.tasks.tasks.size,
172
- agentCount: state.agents.agents.size,
173
- totalGraphs: state.orchestration.totalGraphs,
174
- communicationCount: state.communication.records.size,
175
- mcpServerCount: state.mcp.servers.size,
176
- pluginCount: plugins.length,
177
- };
178
- },
179
- subscribe(listener) {
180
- const unsubs: Array<() => void> = [runtimeStore.subscribe(listener)];
181
- if (options.forensicsRegistry) {
182
- unsubs.push(options.forensicsRegistry.subscribe(listener));
183
- }
184
- return combineSubscriptions(...unsubs);
185
- },
186
- },
187
- health: createStoreBackedReadModel(runtimeServices, () => {
188
- const state = runtimeStore.getState();
189
- const providerProblems = [...state.providerHealth.providers.values()]
190
- .filter((provider) => provider.status !== 'healthy' && provider.status !== 'unknown')
191
- .map((provider) => provider.providerId);
192
- const degradedMcpServers = [...state.mcp.servers.values()]
193
- .filter((server) => server.status === 'degraded' || server.status === 'auth_required' || server.schemaFreshness === 'quarantined')
194
- .map((server) => server.name);
195
- const quarantinedMcpServers = [...state.mcp.servers.values()]
196
- .filter((server) => server.schemaFreshness === 'quarantined')
197
- .map((server) => server.name);
198
- const degradedDomains: string[] = [];
199
- if (providerProblems.length > 0) degradedDomains.push('providerHealth');
200
- if (degradedMcpServers.length > 0) degradedDomains.push('mcp');
201
- if (state.integrations.problemIds.length > 0) degradedDomains.push('integrations');
202
- if (state.daemon.transportState === 'degraded' || state.daemon.transportState === 'terminal_failure') degradedDomains.push('daemon');
203
- if (state.acp.managerTransportState === 'degraded' || state.acp.managerTransportState === 'terminal_failure') degradedDomains.push('acp');
204
- if (state.session.recoveryState === 'failed') degradedDomains.push('session');
205
- return {
206
- degradedDomains,
207
- providerProblems,
208
- degradedMcpServers,
209
- quarantinedMcpServers,
210
- integrationProblems: state.integrations.problemIds,
211
- daemonTransportState: state.daemon.transportState,
212
- acpTransportState: state.acp.managerTransportState,
213
- recoveryState: state.session.recoveryState,
214
- };
215
- }),
216
- };
217
- }
1
+ export * from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-system';
@@ -1,59 +1 @@
1
- export type { UiObservabilityReadModelOptions } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-options';
2
- export type {
3
- UiRemoteSnapshot,
4
- UiRemoteReadModels,
5
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-remote';
6
- export type {
7
- UiIntelligenceSnapshot,
8
- UiMarketplaceSnapshot,
9
- UiCockpitSnapshot,
10
- UiHealthSnapshot,
11
- UiSystemObservabilityReadModels,
12
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-system';
13
- export type {
14
- UiSecuritySnapshot,
15
- UiMcpServerSnapshot,
16
- UiMcpSnapshot,
17
- UiLocalAuthSnapshot,
18
- UiSecurityObservabilityReadModels,
19
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-security';
20
- export type {
21
- UiSettingsSnapshot,
22
- UiContinuitySnapshot,
23
- UiWorktreeSnapshot,
24
- UiMaintenanceObservabilityReadModels,
25
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-maintenance';
26
-
27
- import type { RuntimeServices } from './services.ts';
28
- import { createRemoteReadModels, type UiRemoteReadModels } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-remote';
29
- import {
30
- createSystemObservabilityReadModels,
31
- type UiSystemObservabilityReadModels,
32
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-system';
33
- import {
34
- createSecurityObservabilityReadModels,
35
- type UiSecurityObservabilityReadModels,
36
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-security';
37
- import {
38
- createMaintenanceObservabilityReadModels,
39
- type UiMaintenanceObservabilityReadModels,
40
- } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-maintenance';
41
- import type { UiObservabilityReadModelOptions } from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability-options';
42
-
43
- export interface UiObservabilityReadModels
44
- extends UiRemoteReadModels,
45
- UiSystemObservabilityReadModels,
46
- UiSecurityObservabilityReadModels,
47
- UiMaintenanceObservabilityReadModels {}
48
-
49
- export function createObservabilityReadModels(
50
- runtimeServices: RuntimeServices,
51
- options: UiObservabilityReadModelOptions = {},
52
- ): UiObservabilityReadModels {
53
- return {
54
- ...createRemoteReadModels(runtimeServices),
55
- ...createSystemObservabilityReadModels(runtimeServices, options),
56
- ...createSecurityObservabilityReadModels(runtimeServices, options),
57
- ...createMaintenanceObservabilityReadModels(runtimeServices),
58
- };
59
- }
1
+ export * from '@pellux/goodvibes-sdk/platform/runtime/ui-read-models-observability';
@@ -1,114 +1 @@
1
- import type {
2
- ServiceConfig,
3
- ServiceConnectionTestResult,
4
- ServiceInspection,
5
- } from '../config/service-registry.ts';
6
- import type {
7
- PendingSubscriptionLogin,
8
- ProviderSubscription,
9
- } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
10
- import type { LocalAuthSnapshot } from '@pellux/goodvibes-sdk/platform/security/user-auth';
11
- import type { SessionInfo } from '@pellux/goodvibes-sdk/platform/sessions/manager';
12
- import type { Tool } from '@pellux/goodvibes-sdk/platform/types/tools';
13
- import type { ModelDefinition } from '@pellux/goodvibes-sdk/platform/providers/registry';
14
- import type {
15
- ProviderApi,
16
- ProviderRuntimeSnapshot,
17
- } from '@pellux/goodvibes-sdk/platform/providers/provider-api';
18
- import type { ExecutionPlan } from '@pellux/goodvibes-sdk/platform/core/execution-plan';
19
- import type { PlannerDecision, ExecutionStrategy } from '@pellux/goodvibes-sdk/platform/core/adaptive-planner';
20
-
21
- export interface EnvironmentVariableQuery {
22
- hasEnvironmentVariable(name: string): boolean;
23
- }
24
-
25
- export interface ServiceInspectionQuery {
26
- getAll(): Record<string, ServiceConfig>;
27
- inspect(name: string): Promise<ServiceInspection | null>;
28
- testConnection(name: string): Promise<ServiceConnectionTestResult>;
29
- }
30
-
31
- export interface SubscriptionAccessQuery {
32
- list(): ProviderSubscription[];
33
- listPending(): PendingSubscriptionLogin[];
34
- get(provider: string): ProviderSubscription | null;
35
- getPending(provider: string): PendingSubscriptionLogin | null;
36
- getAccessToken(provider: string): string | null;
37
- logout(provider: string): void;
38
- }
39
-
40
- export interface LocalAuthInspectionQuery {
41
- inspect(): LocalAuthSnapshot;
42
- }
43
-
44
- export interface SessionBrowserQuery {
45
- list(): SessionInfo[];
46
- search(query: string): Array<{ session: SessionInfo; matchCount: number; snippets: string[] }>;
47
- delete(name: string): void;
48
- }
49
-
50
- export interface SessionMemoryQuery {
51
- list(): readonly unknown[];
52
- }
53
-
54
- export interface ToolCatalogQuery {
55
- list(): Tool[];
56
- }
57
-
58
- export interface ProviderModelCatalogQuery {
59
- listModels(): ModelDefinition[];
60
- }
61
-
62
- export interface ProviderAccountInspectionQuery {
63
- readonly providerModels: ProviderModelCatalogQuery;
64
- readonly services: Pick<ServiceInspectionQuery, 'getAll' | 'inspect'>;
65
- readonly subscriptions: Pick<SubscriptionAccessQuery, 'list' | 'listPending' | 'get' | 'getPending'>;
66
- readonly environment: EnvironmentVariableQuery;
67
- }
68
-
69
- export interface ProviderRuntimeInspectionQuery {
70
- listProviderIds(): readonly string[];
71
- inspectAll(): Promise<readonly ProviderRuntimeSnapshot[]>;
72
- inspect(providerId: string): Promise<ProviderRuntimeSnapshot | null>;
73
- }
74
-
75
- export interface PlanDashboardQuery {
76
- getActive(): ExecutionPlan | null;
77
- }
78
-
79
- export interface OpsStrategyQuery {
80
- getLatest(): PlannerDecision | null;
81
- getMode(): ExecutionStrategy;
82
- getOverride(): ExecutionStrategy | null;
83
- getHistory(limit?: number): PlannerDecision[];
84
- }
85
-
86
- export function createEnvironmentVariableQuery(
87
- environment: Readonly<Record<string, string | undefined>>,
88
- ): EnvironmentVariableQuery {
89
- return {
90
- hasEnvironmentVariable(name: string): boolean {
91
- return Boolean(environment[name]);
92
- },
93
- };
94
- }
95
-
96
- export function createProviderRuntimeInspectionQuery(
97
- providers: Pick<ProviderApi, 'listProviderIds' | 'queryRuntimeMetadata'>,
98
- ): ProviderRuntimeInspectionQuery {
99
- return {
100
- listProviderIds(): readonly string[] {
101
- return providers.listProviderIds();
102
- },
103
-
104
- async inspectAll(): Promise<readonly ProviderRuntimeSnapshot[]> {
105
- const result = await providers.queryRuntimeMetadata({ scope: 'all' });
106
- return result.scope === 'all' ? result.snapshots : [];
107
- },
108
-
109
- async inspect(providerId: string): Promise<ProviderRuntimeSnapshot | null> {
110
- const result = await providers.queryRuntimeMetadata({ scope: 'provider', providerId });
111
- return result.scope === 'provider' ? result.snapshot : null;
112
- },
113
- };
114
- }
1
+ export * from '@pellux/goodvibes-sdk/platform/runtime/ui-service-queries';
@@ -1,7 +1,7 @@
1
1
  import type { RuntimeServices } from './services.ts';
2
2
  import type { RemoteRunnerRegistry } from '@pellux/goodvibes-sdk/platform/runtime/remote/runner-registry';
3
3
  import type { RemoteSupervisor } from '@pellux/goodvibes-sdk/platform/runtime/remote/supervisor';
4
- import { createUiRuntimeEvents, type UiRuntimeEvents } from '@pellux/goodvibes-sdk/platform/runtime/ui-events';
4
+ import { createUiRuntimeEvents, type UiRuntimeEvents } from './ui-events.ts';
5
5
  import { createUiReadModels, type UiReadModels, type UiReadModelOptions } from './ui-read-models.ts';
6
6
  import type { ForensicsRegistry } from '@pellux/goodvibes-sdk/platform/runtime/forensics/index';
7
7
  import type { ControlPlaneRecentEvent } from '@pellux/goodvibes-sdk/platform/control-plane/index';
@@ -4,7 +4,7 @@ import type { CommandContext } from '../input/command-registry.ts';
4
4
  import type { InputHandler } from '../input/handler.ts';
5
5
  import type { PanelManager } from '../panels/panel-manager.ts';
6
6
  import type { ProviderRegistry } from '@pellux/goodvibes-sdk/platform/providers/registry';
7
- import type { MutableRuntimeState } from '../runtime/context.ts';
7
+ import type { MutableRuntimeState } from '@pellux/goodvibes-sdk/platform/runtime/mutable-runtime-state';
8
8
  import type { FeatureFlagManager } from '@pellux/goodvibes-sdk/platform/runtime/feature-flags/index';
9
9
  import type { McpRegistry } from '@pellux/goodvibes-sdk/platform/mcp/registry';
10
10
  import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config/subscriptions';