@pellux/goodvibes-agent 1.4.4 → 1.5.1

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 (230) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +52 -7
  3. package/dist/package/main.js +7491 -12253
  4. package/docs/README.md +2 -2
  5. package/docs/channels-remote-and-api.md +1 -1
  6. package/docs/getting-started.md +2 -2
  7. package/docs/release-and-publishing.md +1 -1
  8. package/docs/tools-and-commands.md +5 -5
  9. package/package.json +4 -2
  10. package/release/live-verification/live-verification.json +13 -13
  11. package/release/live-verification/live-verification.md +15 -15
  12. package/release/performance-snapshot.json +2 -2
  13. package/release/release-notes.md +5 -7
  14. package/release/release-readiness.json +6 -6
  15. package/src/agent/behavior-discovery-summary.ts +4 -18
  16. package/src/agent/calendar-registry.ts +322 -0
  17. package/src/agent/competitive-feature-inventory.ts +268 -130
  18. package/src/agent/document-registry.ts +5 -1
  19. package/src/agent/email/email-service.ts +350 -0
  20. package/src/agent/email/imap-client.ts +596 -0
  21. package/src/agent/email/smtp-client.ts +453 -0
  22. package/src/agent/ics-calendar.ts +662 -0
  23. package/src/agent/ics-timezone.ts +172 -0
  24. package/src/agent/markdown-frontmatter.ts +31 -0
  25. package/src/agent/memory-safety.ts +1 -1
  26. package/src/agent/note-registry.ts +3 -9
  27. package/src/agent/persona-discovery.ts +3 -15
  28. package/src/agent/persona-registry.ts +1 -10
  29. package/src/agent/research-source-registry.ts +5 -1
  30. package/src/agent/routine-discovery.ts +3 -15
  31. package/src/agent/runtime-profile.ts +3 -0
  32. package/src/agent/skill-discovery.ts +3 -15
  33. package/src/agent/skill-draft-proposer.ts +203 -0
  34. package/src/agent/skill-draft-runner.ts +201 -0
  35. package/src/agent/skill-registry.ts +36 -1
  36. package/src/agent/skill-standard.ts +99 -0
  37. package/src/agent/vibe-file.ts +7 -22
  38. package/src/cli/completion.ts +1 -1
  39. package/src/cli/config-overrides.ts +10 -1
  40. package/src/cli/redaction.ts +17 -5
  41. package/src/config/provider-model.ts +2 -1
  42. package/src/config/secret-config.ts +13 -6
  43. package/src/core/activity-feed.ts +97 -0
  44. package/src/core/away-digest.ts +161 -0
  45. package/src/core/conversation-rendering.ts +7 -3
  46. package/src/core/conversation.ts +22 -15
  47. package/src/core/hardware-profile.ts +362 -0
  48. package/src/core/last-seen-store.ts +78 -0
  49. package/src/core/plain-language.ts +52 -0
  50. package/src/core/setup-incomplete-hint.ts +90 -0
  51. package/src/core/system-message-router.ts +38 -87
  52. package/src/input/agent-workspace-basic-command-editor-submission.ts +60 -220
  53. package/src/input/agent-workspace-basic-command-editors.ts +39 -141
  54. package/src/input/agent-workspace-categories.ts +40 -125
  55. package/src/input/agent-workspace-command-editor.ts +4 -0
  56. package/src/input/agent-workspace-host-category.ts +0 -5
  57. package/src/input/agent-workspace-local-editor-submission.ts +3 -1
  58. package/src/input/agent-workspace-navigation.ts +10 -3
  59. package/src/input/agent-workspace-onboarding-actions.ts +132 -0
  60. package/src/input/agent-workspace-onboarding-categories.ts +29 -26
  61. package/src/input/agent-workspace-onboarding-finish.ts +11 -4
  62. package/src/input/agent-workspace-onboarding-state.ts +111 -0
  63. package/src/input/agent-workspace-profile-editor-submission.ts +260 -0
  64. package/src/input/agent-workspace-profile-editors.ts +155 -0
  65. package/src/input/agent-workspace-subscription-editor.ts +7 -0
  66. package/src/input/agent-workspace-types.ts +5 -1
  67. package/src/input/agent-workspace.ts +65 -39
  68. package/src/input/command-registry.ts +18 -5
  69. package/src/input/commands/agent-runtime-profile-runtime.ts +2 -1
  70. package/src/input/commands/agent-skills-runtime.ts +60 -3
  71. package/src/input/commands/calendar-runtime.ts +209 -0
  72. package/src/input/commands/channels-runtime.ts +1 -0
  73. package/src/input/commands/command-error.ts +9 -0
  74. package/src/input/commands/compat-runtime.ts +1 -0
  75. package/src/input/commands/config.ts +1 -0
  76. package/src/input/commands/conversation-runtime.ts +1 -1
  77. package/src/input/commands/delegation-runtime.ts +5 -6
  78. package/src/input/commands/email-runtime.ts +387 -0
  79. package/src/input/commands/experience-runtime.ts +17 -4
  80. package/src/input/commands/guidance-runtime.ts +1 -1
  81. package/src/input/commands/health-runtime.ts +6 -1
  82. package/src/input/commands/knowledge-format.ts +73 -0
  83. package/src/input/commands/knowledge.ts +9 -74
  84. package/src/input/commands/local-provider-runtime.ts +2 -1
  85. package/src/input/commands/local-runtime.ts +10 -4
  86. package/src/input/commands/mcp-runtime.ts +7 -0
  87. package/src/input/commands/notify-runtime.ts +17 -1
  88. package/src/input/commands/onboarding-runtime.ts +1 -0
  89. package/src/input/commands/operator-actions-runtime.ts +1 -0
  90. package/src/input/commands/operator-runtime.ts +3 -0
  91. package/src/input/commands/personas-runtime.ts +1 -0
  92. package/src/input/commands/platform-access-runtime.ts +40 -17
  93. package/src/input/commands/product-runtime.ts +6 -1
  94. package/src/input/commands/provider-accounts-runtime.ts +3 -2
  95. package/src/input/commands/qrcode-runtime.ts +1 -0
  96. package/src/input/commands/routines-runtime.ts +1 -0
  97. package/src/input/commands/runtime-services.ts +0 -13
  98. package/src/input/commands/security-runtime.ts +1 -0
  99. package/src/input/commands/session-content.ts +1 -0
  100. package/src/input/commands/shell-core.ts +5 -2
  101. package/src/input/commands/subscription-runtime.ts +33 -9
  102. package/src/input/commands/support-bundle-runtime.ts +8 -1
  103. package/src/input/commands/tasks-runtime.ts +1 -0
  104. package/src/input/commands/tts-runtime.ts +1 -0
  105. package/src/input/commands/vibe-runtime.ts +1 -0
  106. package/src/input/commands.ts +4 -0
  107. package/src/input/feed-context-factory.ts +3 -12
  108. package/src/input/handler-command-route.ts +7 -60
  109. package/src/input/handler-feed-routes.ts +0 -194
  110. package/src/input/handler-feed.ts +2 -54
  111. package/src/input/handler-interactions.ts +0 -2
  112. package/src/input/handler-modal-stack.ts +0 -9
  113. package/src/input/handler-picker-routes.ts +24 -1
  114. package/src/input/handler-shortcuts.ts +11 -40
  115. package/src/input/handler-ui-state.ts +13 -0
  116. package/src/input/handler.ts +8 -35
  117. package/src/input/keybindings.ts +40 -17
  118. package/src/input/model-picker-local-fit.ts +130 -0
  119. package/src/input/shell-passthrough.ts +58 -0
  120. package/src/input/submission-router.ts +0 -5
  121. package/src/main.ts +129 -90
  122. package/src/renderer/activity-sidebar.ts +186 -0
  123. package/src/renderer/agent-workspace-context-lines.ts +5 -48
  124. package/src/renderer/agent-workspace-style.ts +1 -1
  125. package/src/renderer/agent-workspace.ts +14 -2
  126. package/src/renderer/compositor.ts +37 -125
  127. package/src/renderer/conversation-overlays.ts +3 -3
  128. package/src/renderer/help-overlay.ts +7 -5
  129. package/src/renderer/model-workspace.ts +101 -86
  130. package/src/{panels → renderer}/polish.ts +3 -3
  131. package/src/renderer/shell-surface.ts +4 -5
  132. package/src/renderer/status-token.ts +31 -11
  133. package/src/renderer/tab-strip.ts +1 -1
  134. package/src/renderer/tool-call.ts +7 -8
  135. package/src/renderer/tool-labels.ts +92 -0
  136. package/src/renderer/ui-factory.ts +48 -96
  137. package/src/runtime/bootstrap-command-context.ts +0 -5
  138. package/src/runtime/bootstrap-command-parts.ts +6 -15
  139. package/src/runtime/bootstrap-core.ts +34 -13
  140. package/src/runtime/bootstrap-hook-bridge.ts +3 -1
  141. package/src/runtime/bootstrap-shell.ts +3 -50
  142. package/src/runtime/bootstrap.ts +3 -4
  143. package/src/runtime/context.ts +1 -1
  144. package/src/runtime/diagnostics/panels/index.ts +0 -1
  145. package/src/runtime/diagnostics/panels/policy.ts +1 -1
  146. package/src/runtime/execution-ledger.ts +16 -1
  147. package/src/runtime/index.ts +6 -1
  148. package/src/runtime/onboarding/index.ts +1 -0
  149. package/src/runtime/onboarding/onboarding-state.ts +200 -0
  150. package/src/{panels → runtime}/provider-account-snapshot.ts +5 -2
  151. package/src/runtime/services.ts +16 -4
  152. package/src/runtime/terminal-output-guard.ts +7 -0
  153. package/src/runtime/tool-permission-safety.ts +1 -1
  154. package/src/runtime/ui/model-picker/data-provider.ts +1 -1
  155. package/src/runtime/ui/model-picker/health-enrichment.ts +2 -2
  156. package/src/runtime/ui/model-picker/types.ts +2 -2
  157. package/src/runtime/ui/provider-health/data-provider.ts +3 -3
  158. package/src/runtime/ui/provider-health/types.ts +2 -2
  159. package/src/runtime/ui-services.ts +0 -2
  160. package/src/shell/agent-workspace-fullscreen.ts +0 -1
  161. package/src/shell/autonomy-surfacing.ts +272 -0
  162. package/src/shell/session-continuity-hints.ts +0 -6
  163. package/src/shell/startup-wiring.ts +221 -0
  164. package/src/shell/ui-openers.ts +18 -29
  165. package/src/tools/agent-context-policy.ts +1 -1
  166. package/src/tools/agent-harness-background-processes.ts +4 -4
  167. package/src/tools/agent-harness-browser-cockpit-route.ts +3 -3
  168. package/src/tools/agent-harness-command-runner.ts +6 -1
  169. package/src/tools/agent-harness-document-ops.ts +26 -53
  170. package/src/tools/agent-harness-execution-history.ts +1 -13
  171. package/src/tools/agent-harness-execution-posture.ts +0 -15
  172. package/src/tools/agent-harness-keybinding-metadata.ts +28 -29
  173. package/src/tools/agent-harness-local-model-cookbook.ts +24 -1
  174. package/src/tools/agent-harness-metadata.ts +16 -0
  175. package/src/tools/agent-harness-mode-catalog.ts +2 -9
  176. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  177. package/src/tools/agent-harness-setup-posture-utils.ts +1 -1
  178. package/src/tools/agent-harness-tool-schema.ts +13 -14
  179. package/src/tools/agent-harness-tool.ts +27 -23
  180. package/src/tools/agent-harness-ui-surface-metadata.ts +10 -20
  181. package/src/tools/agent-harness-workspace-action-runner.ts +3 -4
  182. package/src/tools/agent-workspace-tool.ts +2 -33
  183. package/src/utils/terminal-width.ts +9 -3
  184. package/src/version.ts +1 -1
  185. package/src/input/agent-workspace-panel-route.ts +0 -44
  186. package/src/input/panel-integration-actions.ts +0 -26
  187. package/src/panels/approval-panel.ts +0 -149
  188. package/src/panels/automation-control-panel.ts +0 -212
  189. package/src/panels/base-panel.ts +0 -254
  190. package/src/panels/builtin/agent.ts +0 -58
  191. package/src/panels/builtin/knowledge.ts +0 -26
  192. package/src/panels/builtin/operations.ts +0 -121
  193. package/src/panels/builtin/session.ts +0 -138
  194. package/src/panels/builtin/shared.ts +0 -275
  195. package/src/panels/builtin/usage.ts +0 -21
  196. package/src/panels/builtin-panels.ts +0 -23
  197. package/src/panels/confirm-state.ts +0 -61
  198. package/src/panels/context-visualizer-panel.ts +0 -204
  199. package/src/panels/cost-tracker-panel.ts +0 -444
  200. package/src/panels/docs-panel.ts +0 -285
  201. package/src/panels/index.ts +0 -25
  202. package/src/panels/knowledge-panel.ts +0 -417
  203. package/src/panels/memory-panel.ts +0 -226
  204. package/src/panels/panel-list-panel.ts +0 -464
  205. package/src/panels/panel-manager.ts +0 -570
  206. package/src/panels/provider-accounts-panel.ts +0 -233
  207. package/src/panels/provider-health-domains.ts +0 -208
  208. package/src/panels/provider-health-panel.ts +0 -720
  209. package/src/panels/provider-health-tracker.ts +0 -115
  210. package/src/panels/provider-stats-panel.ts +0 -366
  211. package/src/panels/qr-panel.ts +0 -207
  212. package/src/panels/schedule-panel.ts +0 -321
  213. package/src/panels/scrollable-list-panel.ts +0 -491
  214. package/src/panels/search-focus.ts +0 -32
  215. package/src/panels/security-panel.ts +0 -295
  216. package/src/panels/session-browser-panel.ts +0 -395
  217. package/src/panels/session-maintenance.ts +0 -125
  218. package/src/panels/subscription-panel.ts +0 -263
  219. package/src/panels/system-messages-panel.ts +0 -230
  220. package/src/panels/tasks-panel.ts +0 -344
  221. package/src/panels/thinking-panel.ts +0 -304
  222. package/src/panels/token-budget-panel.ts +0 -475
  223. package/src/panels/tool-inspector-panel.ts +0 -436
  224. package/src/panels/types.ts +0 -54
  225. package/src/renderer/panel-composite.ts +0 -158
  226. package/src/renderer/panel-tab-bar.ts +0 -69
  227. package/src/renderer/panel-workspace-bar.ts +0 -42
  228. package/src/runtime/diagnostics/panels/panel-resources.ts +0 -118
  229. package/src/tools/agent-harness-panel-metadata.ts +0 -211
  230. /package/src/runtime/perf/{panel-health-monitor.ts → component-health.ts} +0 -0
@@ -69,10 +69,10 @@ const GOODVIBES_AGENT_OPERATOR_POLICY = [
69
69
  '- Act as one user-facing autonomous assistant. Prefer the lowest-friction safe path that completes the user outcome; do not expose internal package or host ownership unless it is needed for diagnosis, setup, or safety.',
70
70
  '- Work serially in the main conversation by default for ordinary chat, research, planning, setup, local context, and short tool work. Use visible schedules, work plans, operator actions, or delegated/remote routes for durable or long-running autonomy.',
71
71
  '- Connected-host lifecycle is not ambient. If the host is unavailable, explain the shortest user action to make the assistant reachable; do not pretend a missing host route worked.',
72
- '- Read tools: `route action:"plan|status"`, `schedule action:"list"`, `setup action:"status|item|repair|checkpoint"`, `settings action:"list|get"`, `vibe action:"status|show"`, `context action:"status|files|file|prompt|receipts|receipt"`, `memory action:"status|provider|curator|candidate|list|search|get"`, `channels action:"status|channel|setup|triage|deliveries"`, `models action:"status|route|local|providers|provider"`, `personal_ops action:"briefing|status|queue|intake|lane"`, `autonomy action:"intake|queue|item|status"`, `delegation action:"status|routes|route"`, `execution action:"status|route|history|record|processes|process_capabilities|process|recovery"`, `security action:"status|finding|explain"`, `support action:"status|bundle"`, `sessions action:"list|get"`, `audit action:"readiness|item|evidence|artifact"`, `computer action:"status|plan|control|browser|setup|mcp"`, `research action:"plan|search|runner|runs|run|sources|source|bundle|reports|report_artifact"`, `device action:"status|capability|browser|control|voice|provider"`, `workspace action:"status|actions|action|surfaces|surface|panels|panel|shortcuts|keybindings|keybinding|commands|command|cli_commands|cli_command"`, `host action:"status|capabilities|capability|services|service|methods|method"`, `import_goodvibes_settings action:"preview"`, and `agent_operator_briefing` for connected work/approvals/automation/schedules, `agent_knowledge` for isolated Agent Knowledge, and `agent_harness` for harness catalogs/status/capability discovery. Use `agent_artifacts` for saved artifact list/preview/export/package/archive; write modes are confirmation-gated.',
73
- '- Harness access: use `settings action:"set|reset|import"` and `workspace action:"run|run_command|open|open_panel|run_keybinding|set_keybinding|reset_keybinding"` to use the same surfaces the user can use; lower-level `agent_harness` modes remain for detail inspection and compatibility.',
72
+ '- Read tools: `route action:"plan|status"`, `schedule action:"list"`, `setup action:"status|item|repair|checkpoint"`, `settings action:"list|get"`, `vibe action:"status|show"`, `context action:"status|files|file|prompt|receipts|receipt"`, `memory action:"status|provider|curator|candidate|list|search|get"`, `channels action:"status|channel|setup|triage|deliveries"`, `models action:"status|route|local|providers|provider"`, `personal_ops action:"briefing|status|queue|intake|lane"`, `autonomy action:"intake|queue|item|status"`, `delegation action:"status|routes|route"`, `execution action:"status|route|history|record|processes|process_capabilities|process|recovery"`, `security action:"status|finding|explain"`, `support action:"status|bundle"`, `sessions action:"list|get"`, `audit action:"readiness|item|evidence|artifact"`, `computer action:"status|plan|control|browser|setup|mcp"`, `research action:"plan|search|runner|runs|run|sources|source|bundle|reports|report_artifact"`, `device action:"status|capability|browser|control|voice|provider"`, `workspace action:"status|actions|action|surfaces|surface|shortcuts|keybindings|keybinding|commands|command|cli_commands|cli_command"`, `host action:"status|capabilities|capability|services|service|methods|method"`, `import_goodvibes_settings action:"preview"`, and `agent_operator_briefing` for connected work/approvals/automation/schedules, `agent_knowledge` for isolated Agent Knowledge, and `agent_harness` for harness catalogs/status/capability discovery. Use `agent_artifacts` for saved artifact list/preview/export/package/archive; write modes are confirmation-gated.',
73
+ '- Harness access: use `settings action:"set|reset|import"` and `workspace action:"run|run_command|open|run_keybinding|set_keybinding|reset_keybinding"` to use the same surfaces the user can use; lower-level `agent_harness` modes remain for detail inspection and compatibility.',
74
74
  '- State tools: `agent_work_plan` for visible local work items; `agent_local_registry` for Agent-local notes, memory, personas, skills, bundles, and routines; `agent_learning_consolidation` for confirmed duplicate cleanup phases; `agent_documents` for versioned Agent document drafts. Keep records non-secret, sourced, and reviewable.',
75
- '- Confirmed tools: use `schedule`, `setup action:"save_checkpoint|clear_checkpoint|token|smoke|finish|import_settings"`, `vibe action:"init|import_persona"`, `models action:"smoke"` for local model server checks, `personal_ops action:"read"` for one live read-only inbox/calendar connector operation, `research action:"create_run|start_run|checkpoint|pause|resume|cancel|complete|fail|delete_run|add_source|review_source|reject_source|use_source|delete_source|report"`, `computer action:"open_browser"`, `device action:"open_browser|open_tts_provider|open_tts_voice"`, `workspace action:"run|run_command|open|open_panel|run_keybinding|set_keybinding|reset_keybinding"`, `import_goodvibes_settings`, `agent_operator_action`, `agent_artifacts` export/package/archive, `agent_documents`, `agent_review_packet_presets` save/refresh, `agent_review_packet_share`, `agent_knowledge_ingest`, `agent_learning_consolidation`, `agent_media_generate`, `agent_model_compare`, `agent_research_runs`, `agent_research_sources`, `agent_research_report`, `agent_notify`, `agent_channel_send`, `agent_autonomy_schedule`, `agent_reminder_schedule`, and `agent_schedule_edit` only for explicit user requests with confirm:true and explicitUserRequest.',
75
+ '- Confirmed tools: use `schedule`, `setup action:"save_checkpoint|clear_checkpoint|token|smoke|finish|import_settings"`, `vibe action:"init|import_persona"`, `models action:"smoke"` for local model server checks, `personal_ops action:"read"` for one live read-only inbox/calendar connector operation, `research action:"create_run|start_run|checkpoint|pause|resume|cancel|complete|fail|delete_run|add_source|review_source|reject_source|use_source|delete_source|report"`, `computer action:"open_browser"`, `device action:"open_browser|open_tts_provider|open_tts_voice"`, `workspace action:"run|run_command|open|run_keybinding|set_keybinding|reset_keybinding"`, `import_goodvibes_settings`, `agent_operator_action`, `agent_artifacts` export/package/archive, `agent_documents`, `agent_review_packet_presets` save/refresh, `agent_review_packet_share`, `agent_knowledge_ingest`, `agent_learning_consolidation`, `agent_media_generate`, `agent_model_compare`, `agent_research_runs`, `agent_research_sources`, `agent_research_report`, `agent_notify`, `agent_channel_send`, `agent_autonomy_schedule`, `agent_reminder_schedule`, and `agent_schedule_edit` only for explicit user requests with confirm:true and explicitUserRequest.',
76
76
  '- Agent Knowledge must use only `/api/goodvibes-agent/knowledge/*` and fail closed. Do not use default knowledge or non-Agent knowledge spaces.',
77
77
  '- External delivery, media generation, reminders, settings writes, slash-command mirrors, workspace action mirrors, and destructive local changes require explicit user intent and the owning tool/command confirmation.',
78
78
  '- Autonomous work must be visible, reviewable, and cancellable. Never create silent hidden jobs; when work should continue later, create or use an explicit schedule, reminder, work-plan item, operator action, or delegated/remote task route.',
@@ -237,7 +237,6 @@ export async function bootstrapRuntime(
237
237
  const {
238
238
  automationManager,
239
239
  hookDispatcher,
240
- panelManager,
241
240
  pluginManager,
242
241
  } = services;
243
242
 
@@ -19,7 +19,7 @@ import type { FeatureFlagManager } from '@/runtime/index.ts';
19
19
  import type { MutableRuntimeState } from '@/runtime/index.ts';
20
20
  import type { SessionSnapshot } from '@/runtime/index.ts';
21
21
  import type { RuntimeServices } from './services.ts';
22
- import type { ComponentHealthMonitor } from './perf/panel-health-monitor.ts';
22
+ import type { ComponentHealthMonitor } from './perf/component-health.ts';
23
23
  import type { WorktreeRegistry } from '@/runtime/index.ts';
24
24
  import type { SandboxSessionRegistry } from '@/runtime/index.ts';
25
25
 
@@ -19,6 +19,5 @@ export { TransportPanel } from '@/runtime/index.ts';
19
19
  export type { TransportPanelSnapshot } from '@/runtime/index.ts';
20
20
  export { OpsPanel } from './ops.ts';
21
21
  export type { OpsAuditEntry } from './ops.ts';
22
- export { PanelResourcesPanel } from './panel-resources.ts';
23
22
  export { SecurityPanel } from '@/runtime/index.ts';
24
23
  export type { SecurityPanelSnapshot } from '@/runtime/index.ts';
@@ -155,7 +155,7 @@ export class PolicyDiagnosticsPanel {
155
155
  */
156
156
  public subscribe(callback: () => void): () => void {
157
157
  this._subscribers.add(callback);
158
- return () => this._subscribers.delete(callback);
158
+ return () => { this._subscribers.delete(callback); };
159
159
  }
160
160
 
161
161
  /**
@@ -98,6 +98,21 @@ function stringArg(args: Record<string, unknown>, keys: readonly string[]): stri
98
98
  return undefined;
99
99
  }
100
100
 
101
+ /**
102
+ * Classify a tool call into a route kind for display and filtering.
103
+ *
104
+ * Keyword precedence (first match wins):
105
+ * 1. browser — browser/desktop/screenshot keywords
106
+ * 2. delegation — delegate/agent keywords
107
+ * 3. shell — exec/shell/bash keywords OR args.command is a string
108
+ * 4. write — write/edit/patch/delete keywords
109
+ * 5. network — fetch/web/http/url keywords
110
+ * 6. read — read/find/inspect/grep/search keywords
111
+ * 7. other — fallback for unrecognized tool names
112
+ *
113
+ * N2: precedence is intentional — shell beats write/read so that bash-exec tools
114
+ * that also match 'exec' are not misclassified as filesystem writes.
115
+ */
101
116
  function routeKindForTool(tool: string, args: Record<string, unknown>): AgentExecutionRouteKind {
102
117
  const name = tool.toLowerCase();
103
118
  if (name.includes('browser') || name.includes('desktop') || name.includes('screenshot')) return 'browser';
@@ -162,7 +177,7 @@ export class AgentExecutionLedger {
162
177
 
163
178
  public subscribe(callback: () => void): () => void {
164
179
  this.subscribers.add(callback);
165
- return () => this.subscribers.delete(callback);
180
+ return () => { this.subscribers.delete(callback); };
166
181
  }
167
182
 
168
183
  public dispose(): void {
@@ -325,6 +325,11 @@ export const getDistributedNodeHostContract = operations.getDistributedNodeHostC
325
325
  export const CURRENT_PROTOCOL_VERSION = operations.CURRENT_PROTOCOL_VERSION;
326
326
  export const VersionMismatchError = operations.VersionMismatchError;
327
327
  export const negotiateProtocolVersion = operations.negotiateProtocolVersion;
328
+ // Protocol version types — re-exported for transport compatibility tests.
329
+ // ProtocolVersion, VersionNegotiationResult, NegotiatedProtocol are available
330
+ // via operations namespace (operations.ProtocolVersion etc.) but cannot be
331
+ // re-exported here without a registered subpath. Tests that need these types
332
+ // should import from the operations namespace types directly.
328
333
  export const createTaskManager = operations.createTaskManager;
329
334
  export const PhasedToolExecutor = operations.PhasedToolExecutor;
330
335
  export const budgetPhase = operations.budgetPhase;
@@ -614,7 +619,7 @@ export type BundleProvenance = Security.BundleProvenance;
614
619
  export type DecisionReason = Security.DecisionReason;
615
620
  export type DivergenceReport = Security.DivergenceReport;
616
621
  export type EnforceGateResult = Security.EnforceGateResult;
617
- export type SignedPolicyBundle = Security.SignedPolicyBundle;
622
+ export type SignedPolicyBundle<T = unknown> = Security.SignedPolicyBundle<T>;
618
623
 
619
624
  export interface InspectableDomain {
620
625
  readonly name: string;
@@ -5,3 +5,4 @@ export * from './apply.ts';
5
5
  export * from './verify.ts';
6
6
  export * from './markers.ts';
7
7
  export * from './state.ts';
8
+ export * from './onboarding-state.ts';
@@ -0,0 +1,200 @@
1
+ import type { SetupPlanItem, SetupPlanStatus } from '../../tools/agent-harness-setup-posture-types.ts';
2
+ import type { OnboardingCheckMarkerState } from './types.ts';
3
+
4
+ /**
5
+ * Maps each setup plan item id to the Agent Workspace category that resolves it.
6
+ * This is the single sequencing table — every onboarding surface reads from here.
7
+ */
8
+ const PLAN_ITEM_CATEGORY_MAP: Readonly<Record<string, string>> = {
9
+ 'connected-host-readiness': 'setup',
10
+ 'connected-host-auth': 'setup',
11
+ 'goodvibes-settings-import': 'setup',
12
+ 'provider-access': 'account-model',
13
+ 'install-smoke': 'setup',
14
+ 'local-model-readiness': 'account-model',
15
+ 'agent-knowledge': 'setup',
16
+ 'vibe-personality': 'assistant-behavior',
17
+ 'local-behavior': 'onboarding-context',
18
+ 'communication-channels': 'onboarding-channels',
19
+ 'automation-review': 'tools-permissions',
20
+ 'browser-desktop-control': 'tools-permissions',
21
+ 'sudo-execution-posture': 'tools-permissions',
22
+ 'build-delegation': 'tools-permissions',
23
+ 'finish-onboarding': 'setup',
24
+ };
25
+
26
+ const DEFAULT_CATEGORY_ID = 'setup';
27
+
28
+ function planItemCategoryId(planItemId: string): string {
29
+ return PLAN_ITEM_CATEGORY_MAP[planItemId] ?? DEFAULT_CATEGORY_ID;
30
+ }
31
+
32
+ export interface OnboardingStep {
33
+ readonly id: string;
34
+ readonly label: string;
35
+ readonly status: SetupPlanStatus;
36
+ readonly blocksAutonomy: boolean;
37
+ /** Human-readable hint shown in the UI for the next action. */
38
+ readonly nextLabel: string;
39
+ /** Agent Workspace category id that resolves this step. */
40
+ readonly categoryId: string;
41
+ }
42
+
43
+ export interface OnboardingRecap {
44
+ /** Single headline sentence describing overall readiness. */
45
+ readonly headline: string;
46
+ /** One line per ready capability plus optional trailing lines. */
47
+ readonly lines: readonly string[];
48
+ }
49
+
50
+ export type OnboardingPhase = 'fresh' | 'in-progress' | 'complete';
51
+
52
+ export interface OnboardingState {
53
+ /**
54
+ * Phase derived from markers:
55
+ * - 'complete' completion marker present
56
+ * - 'in-progress' check marker present but no completion marker
57
+ * - 'fresh' neither marker present
58
+ */
59
+ readonly phase: OnboardingPhase;
60
+ /** All setup plan items converted to lightweight steps. */
61
+ readonly steps: readonly OnboardingStep[];
62
+ /** First non-ready step that blocks autonomy, or first non-ready step if none, or null. */
63
+ readonly currentStepId: string | null;
64
+ /** Human-readable progress, e.g. "2 of 5 ready". */
65
+ readonly progressLabel: string;
66
+ /** Steps that are not ready and block autonomy. */
67
+ readonly blockers: readonly OnboardingStep[];
68
+ /**
69
+ * True when a usable model route exists:
70
+ * the provider-access plan item is 'ready', or local-model-readiness is 'ready'.
71
+ */
72
+ readonly readyToChat: boolean;
73
+ /** Summary shown at the end of onboarding or as a re-entry summary. */
74
+ readonly recap: OnboardingRecap;
75
+ }
76
+
77
+ export interface DeriveOnboardingStateContext {
78
+ /** Fully-built setup plan (from buildSetupPlan). */
79
+ readonly plan: readonly SetupPlanItem[];
80
+ /** User-scope check marker (from readOnboardingCheckMarker). */
81
+ readonly checkMarker: OnboardingCheckMarkerState;
82
+ /** User-scope completion marker (from readOnboardingCompletionMarker). */
83
+ readonly completionMarker: OnboardingCheckMarkerState;
84
+ }
85
+
86
+ function derivePhase(
87
+ checkMarker: OnboardingCheckMarkerState,
88
+ completionMarker: OnboardingCheckMarkerState,
89
+ ): OnboardingPhase {
90
+ if (completionMarker.exists && completionMarker.payload !== null) return 'complete';
91
+ if (checkMarker.exists) return 'in-progress';
92
+ return 'fresh';
93
+ }
94
+
95
+ function planItemToStep(item: SetupPlanItem): OnboardingStep {
96
+ return {
97
+ id: item.id,
98
+ label: item.label,
99
+ status: item.status,
100
+ blocksAutonomy: item.blocksAutonomy,
101
+ nextLabel: item.nextAction,
102
+ categoryId: planItemCategoryId(item.id),
103
+ };
104
+ }
105
+
106
+ function deriveCurrentStepId(steps: readonly OnboardingStep[]): string | null {
107
+ // Priority: first non-ready blocker, then first non-ready step overall.
108
+ const firstBlocker = steps.find((s) => s.status !== 'ready' && s.blocksAutonomy);
109
+ if (firstBlocker) return firstBlocker.id;
110
+ const firstNonReady = steps.find((s) => s.status !== 'ready');
111
+ return firstNonReady?.id ?? null;
112
+ }
113
+
114
+ function deriveProgressLabel(plan: readonly SetupPlanItem[]): string {
115
+ const ready = plan.filter((item) => item.status === 'ready').length;
116
+ const total = plan.length;
117
+ return `${ready} of ${total} ready`;
118
+ }
119
+
120
+ function deriveReadyToChat(plan: readonly SetupPlanItem[]): boolean {
121
+ const providerItem = plan.find((item) => item.id === 'provider-access');
122
+ if (providerItem?.status === 'ready') return true;
123
+ const localModelItem = plan.find((item) => item.id === 'local-model-readiness');
124
+ return localModelItem?.status === 'ready';
125
+ }
126
+
127
+ function deriveRecap(
128
+ phase: OnboardingPhase,
129
+ steps: readonly OnboardingStep[],
130
+ plan: readonly SetupPlanItem[],
131
+ ): OnboardingRecap {
132
+ const readySteps = steps.filter((s) => s.status === 'ready');
133
+ const optionalCount = plan.filter(
134
+ (item) => item.status !== 'ready' && !item.blocksAutonomy,
135
+ ).length;
136
+
137
+ const headline =
138
+ phase === 'complete'
139
+ ? "You're set up. Here's what you can do now."
140
+ : phase === 'in-progress'
141
+ ? "Setup is in progress. Here's what's ready so far."
142
+ : 'Getting started — a few things to set up before the full experience.';
143
+
144
+ const lines: string[] = readySteps.map((s) => s.label);
145
+
146
+ // Capability examples: show what the user can actually do right now.
147
+ // Always-safe examples (research/draft/summarize) are shown whenever a model route is ready.
148
+ // Channel-dependent examples (reminders/messaging) only appear when that lane is configured.
149
+ const modelReady = deriveReadyToChat(plan);
150
+ if (modelReady && phase !== 'fresh') {
151
+ const channelsReady = plan.some(
152
+ (item) => item.id === 'communication-channels' && item.status === 'ready',
153
+ );
154
+ const capabilityLines: string[] = [
155
+ 'Ask me to research a topic, draft an email, summarize a file, or compare models.',
156
+ ];
157
+ if (channelsReady) {
158
+ capabilityLines.push('You can also set reminders and send messages through your connected channels.');
159
+ }
160
+ lines.push(...capabilityLines);
161
+ }
162
+
163
+ if (optionalCount > 0 && phase !== 'fresh') {
164
+ lines.push(`Still optional: ${optionalCount} item${optionalCount === 1 ? '' : 's'} available`);
165
+ }
166
+
167
+ if (phase !== 'fresh') {
168
+ lines.push('Try: "What can you help me with today?"');
169
+ }
170
+
171
+ return { headline, lines };
172
+ }
173
+
174
+ /**
175
+ * Pure selector: derives the full OnboardingState from an already-built plan and
176
+ * the current marker files. No side effects, no Date.now() calls.
177
+ */
178
+ export function deriveOnboardingState(
179
+ context: DeriveOnboardingStateContext,
180
+ ): OnboardingState {
181
+ const { plan, checkMarker, completionMarker } = context;
182
+
183
+ const phase = derivePhase(checkMarker, completionMarker);
184
+ const steps = plan.map(planItemToStep);
185
+ const currentStepId = deriveCurrentStepId(steps);
186
+ const progressLabel = deriveProgressLabel(plan);
187
+ const blockers = steps.filter((s) => s.status !== 'ready' && s.blocksAutonomy);
188
+ const readyToChat = deriveReadyToChat(plan);
189
+ const recap = deriveRecap(phase, steps, plan);
190
+
191
+ return {
192
+ phase,
193
+ steps,
194
+ currentStepId,
195
+ progressLabel,
196
+ blockers,
197
+ readyToChat,
198
+ recap,
199
+ };
200
+ }
@@ -1,7 +1,7 @@
1
1
  import { listBuiltinSubscriptionProviders } from '@pellux/goodvibes-sdk/platform/config';
2
2
  import type {
3
3
  ProviderAccountInspectionQuery,
4
- } from '../runtime/ui-service-queries.ts';
4
+ } from './ui-service-queries.ts';
5
5
 
6
6
  export type ProviderAuthRoute = 'api-key' | 'subscription' | 'service-oauth' | 'unconfigured';
7
7
  export type ProviderAuthFreshness = 'healthy' | 'expiring' | 'expired' | 'pending' | 'unconfigured';
@@ -261,7 +261,10 @@ export async function buildProviderAccountSnapshot(
261
261
  : 'No usable auth route is configured for this provider.',
262
262
  authFreshness: freshness,
263
263
  fallbackRoute: activeRoute !== preferredRoute ? activeRoute : undefined,
264
- fallbackRisk: hasSubscription && hasApiKey
264
+ // D7 fix: fallbackRisk is only meaningful when a fallbackRoute exists (i.e. activeRoute
265
+ // differs from preferredRoute). Setting it on a healthy provider where activeRoute===
266
+ // preferredRoute would show a spurious risk advisory with no fallback target.
267
+ fallbackRisk: (activeRoute !== preferredRoute) && hasSubscription && hasApiKey
265
268
  ? (isExpired(subscription?.expiresAt)
266
269
  ? 'preferred subscription path is expired; active route falls back to API key.'
267
270
  : 'Both subscription and API key are present; check route priority.')
@@ -46,7 +46,6 @@ import { IntegrationHelperService } from '@/runtime/index.ts';
46
46
  import { VoiceProviderRegistry, VoiceService, ensureBuiltinVoiceProviders } from '@pellux/goodvibes-sdk/platform/voice';
47
47
  import { WebSearchProviderRegistry, WebSearchService } from '@pellux/goodvibes-sdk/platform/web-search';
48
48
  import { MemoryEmbeddingProviderRegistry } from '@pellux/goodvibes-sdk/platform/state';
49
- import { PanelManager } from '../panels/panel-manager.ts';
50
49
  import { HookActivityTracker } from '@pellux/goodvibes-sdk/platform/hooks';
51
50
  import { HookDispatcher, createHookWorkbench, type HookWorkbench } from '@pellux/goodvibes-sdk/platform/hooks';
52
51
  import { PluginManager } from '@pellux/goodvibes-sdk/platform/plugins';
@@ -388,7 +387,6 @@ export interface RuntimeServices extends SdkRuntimeServices {
388
387
  readonly runtimeBus: RuntimeEventBus;
389
388
  readonly runtimeStore: RuntimeStore;
390
389
  readonly runtimeDispatch: DomainDispatch;
391
- readonly panelManager: PanelManager;
392
390
  readonly keybindingsManager: KeybindingsManager;
393
391
  readonly routeBindings: RouteBindingManager;
394
392
  readonly surfaceRegistry: SurfaceRegistry;
@@ -488,7 +486,6 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
488
486
  const featureFlags = options.featureFlags ?? createFeatureFlagManager();
489
487
  const runtimeDispatch = createDomainDispatch(options.runtimeStore);
490
488
  const gatewayMethods = new GatewayMethodCatalog();
491
- const panelManager = new PanelManager();
492
489
  const keybindingsManager = new KeybindingsManager({
493
490
  configPath: shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'keybindings.json'),
494
491
  });
@@ -738,6 +735,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
738
735
  const tokenAuditor = new ApiTokenAuditor({ managed: false });
739
736
  const componentHealthMonitor = new ComponentHealthMonitor();
740
737
  const worktreeRegistry = createDisabledAgentWorktreeRegistry(workingDirectory);
738
+ // Configured and attached to the runtime bus during bootstrap when webhook URLs are present.
741
739
  const webhookNotifier = new WebhookNotifier();
742
740
  const replayEngine = new DeterministicReplayEngine(workingDirectory);
743
741
  const providerOptimizer = new ProviderOptimizer(providerRegistry, providerCapabilityRegistry, false);
@@ -761,9 +759,24 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
761
759
  const modeManager = new ModeManager();
762
760
  const fileUndoManager = new FileUndoManager();
763
761
  const executionLedger = new AgentExecutionLedger(options.runtimeBus);
762
+ // The SDK's foundation/integration contracts still expect a panel manager;
763
+ // the Agent shell has no panel UI (the Activity sidebar replaced it), so we
764
+ // satisfy those contracts with a no-op implementation.
765
+ const NOOP_PANEL_MANAGER = (() => {
766
+ const emptyPane = { panels: [], activeIndex: 0 } as const;
767
+ return {
768
+ getTopPane: () => emptyPane,
769
+ getBottomPane: () => emptyPane,
770
+ getRegisteredTypes: () => [],
771
+ open: () => undefined,
772
+ show: () => {},
773
+ };
774
+ })();
775
+ const panelManager = NOOP_PANEL_MANAGER;
764
776
  const integrationHelpers = new IntegrationHelperService({
765
777
  workingDirectory,
766
778
  homeDirectory,
779
+ panelManager,
767
780
  runtimeStore: options.runtimeStore,
768
781
  runtimeBus: options.runtimeBus,
769
782
  configManager,
@@ -774,7 +787,6 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
774
787
  distributedRuntime,
775
788
  remoteRunnerRegistry,
776
789
  remoteSupervisor,
777
- panelManager,
778
790
  localUserAuthManager,
779
791
  providerRegistry,
780
792
  serviceRegistry,
@@ -89,6 +89,13 @@ export function allowTerminalWrite<T>(fn: () => T): T {
89
89
  }
90
90
 
91
91
  export function installTerminalOutputGuard(options: TerminalOutputGuardOptions): TerminalOutputGuard {
92
+ // D6 fix: if a guard already exists and hasn't been disposed, dispose it first
93
+ // so the monkeypatch chain is cleanly unwound BEFORE we snapshot the originals.
94
+ // This ensures stdout.write is the real underlying write when we capture it below.
95
+ if (currentGuard !== null) {
96
+ currentGuard.dispose();
97
+ }
98
+
92
99
  const stdout = options.stdout;
93
100
  const stderr = options.stderr ?? process.stderr;
94
101
  const originalStdoutWriteMethod = stdout.write;
@@ -71,7 +71,7 @@ const READ_ONLY_MEMORY_ACTIONS = new Set(['', 'status', 'summary', 'posture', 'm
71
71
  const READ_ONLY_COMPUTER_ACTIONS = new Set(['', 'status', 'summary', 'overview', 'computer', 'computer_use', 'plan', 'route', 'control_plan', 'browser_plan', 'desktop_plan', 'control', 'browser_control', 'desktop', 'desktop_control', 'screenshot', 'screen', 'screen_recording', 'observe', 'browser', 'pwa', 'cockpit', 'browser_cockpit', 'web', 'setup', 'configure', 'browser_desktop_control', 'mcp', 'tools', 'servers', 'mcp_servers']);
72
72
  const READ_ONLY_DEVICE_ACTIONS = new Set(['', 'status', 'map', 'capabilities', 'device', 'devices', 'mobile', 'phone', 'pairing', 'capability', 'route', 'pairing_route', 'show', 'inspect', 'browser', 'pwa', 'cockpit', 'browser_cockpit', 'web', 'control', 'browser_control', 'desktop', 'desktop_control', 'computer_use', 'voice', 'media', 'voice_media', 'workflows', 'provider', 'media_provider', 'voice_provider']);
73
73
  const READ_ONLY_MODELS_ACTIONS = new Set(['', 'status', 'routing', 'routes', 'models', 'model', 'readiness', 'route_readiness', 'route', 'model_route', 'inspect', 'show', 'candidate', 'endpoint', 'local', 'cookbook', 'local_cookbook', 'recipes', 'recipe', 'ollama', 'llama_cpp', 'llamacpp', 'vllm', 'local_servers', 'providers', 'provider_accounts', 'accounts', 'subscriptions', 'auth', 'logins', 'provider', 'provider_account', 'account', 'subscription', 'auth_status']);
74
- const READ_ONLY_WORKSPACE_ACTIONS = new Set(['', 'status', 'summary', 'home', 'workspace', 'categories', 'workspace_categories', 'actions', 'list_actions', 'workspace_actions', 'tasks', 'action', 'show', 'inspect', 'workspace_action', 'surfaces', 'ui_surfaces', 'screens', 'views', 'surface', 'ui_surface', 'screen', 'view', 'panels', 'panes', 'panel', 'pane', 'shortcuts', 'shortcut_help', 'help', 'keybindings', 'bindings', 'keys', 'keybinding', 'binding', 'key', 'commands', 'slash_commands', 'command_catalog', 'command', 'slash_command', 'inspect_command', 'cli_commands', 'cli_catalog', 'cli_command', 'inspect_cli_command']);
74
+ const READ_ONLY_WORKSPACE_ACTIONS = new Set(['', 'status', 'summary', 'home', 'workspace', 'categories', 'workspace_categories', 'actions', 'list_actions', 'workspace_actions', 'tasks', 'action', 'show', 'inspect', 'workspace_action', 'surfaces', 'ui_surfaces', 'screens', 'views', 'surface', 'ui_surface', 'screen', 'view', 'shortcuts', 'shortcut_help', 'help', 'keybindings', 'bindings', 'keys', 'keybinding', 'binding', 'key', 'commands', 'slash_commands', 'command_catalog', 'command', 'slash_command', 'inspect_command', 'cli_commands', 'cli_catalog', 'cli_command', 'inspect_cli_command']);
75
75
  const READ_ONLY_AUTONOMY_ACTIONS = new Set(['', 'intake', 'request', 'route', 'plan', 'triage', 'autonomy_intake', 'queue', 'list', 'work', 'ongoing', 'autonomy_queue', 'item', 'card', 'show', 'inspect', 'autonomy_queue_item', 'status', 'summary', 'overview']);
76
76
  const READ_ONLY_DELEGATION_ACTIONS = new Set(['', 'status', 'summary', 'overview', 'policy', 'decision', 'decisions', 'delegation_posture', 'routes', 'list', 'catalog', 'posture', 'route', 'item', 'card', 'show', 'inspect', 'delegation_route']);
77
77
  const READ_ONLY_EXECUTION_ACTIONS = new Set(['', 'status', 'summary', 'overview', 'routes', 'posture', 'execution_posture', 'route', 'show_route', 'inspect_route', 'execution_route', 'history', 'activity', 'records', 'execution_history', 'record', 'item', 'show', 'inspect', 'execution_history_item', 'processes', 'background', 'backgrounds', 'background_processes', 'capabilities', 'process_capabilities', 'process', 'background_process', 'recovery', 'file_recovery', 'undo_redo']);
@@ -84,7 +84,7 @@ export class ModelPickerDataProvider {
84
84
  */
85
85
  public subscribe(callback: () => void): () => void {
86
86
  this._subscribers.add(callback);
87
- return () => this._subscribers.delete(callback);
87
+ return () => { this._subscribers.delete(callback); };
88
88
  }
89
89
 
90
90
  /**
@@ -18,7 +18,7 @@ import type {
18
18
  ProviderHealthContext,
19
19
  CapabilityFlags,
20
20
  ProviderLatencyStats,
21
- } from '@/runtime/index.ts';
21
+ } from './types.ts';
22
22
 
23
23
  /** Status sort priority (lower = shown first). */
24
24
  const STATUS_ORDER: Record<string, number> = {
@@ -46,7 +46,7 @@ function buildHealthContext(record: ProviderHealthRecord | undefined): ProviderH
46
46
  if (record.stats.totalCalls > 0) {
47
47
  latency = {
48
48
  avgMs: record.stats.avgLatencyMs,
49
- p95Ms: record.stats.maxLatencyMs,
49
+ maxMs: record.stats.maxLatencyMs,
50
50
  minMs: record.stats.minLatencyMs,
51
51
  };
52
52
  }
@@ -32,8 +32,8 @@ export interface CapabilityFlags {
32
32
  export interface ProviderLatencyStats {
33
33
  /** Moving average latency in ms (last N calls). */
34
34
  readonly avgMs: number;
35
- /** Approximate 95th-percentile latency in ms (max of recent observations). */
36
- readonly p95Ms: number;
35
+ /** Maximum observed latency in ms (max of recent observations). */
36
+ readonly maxMs: number;
37
37
  /** Minimum observed latency in ms. */
38
38
  readonly minMs: number;
39
39
  }
@@ -15,7 +15,7 @@ import type {
15
15
  ProviderHealthEntry,
16
16
  HealthTimeline,
17
17
  HealthTimelinePoint,
18
- } from '@/runtime/index.ts';
18
+ } from './types.ts';
19
19
 
20
20
  /**
21
21
  * Number of timeline points retained per provider.
@@ -87,7 +87,7 @@ export class ProviderHealthDataProvider {
87
87
  */
88
88
  public subscribe(callback: () => void): () => void {
89
89
  this._subscribers.add(callback);
90
- return () => this._subscribers.delete(callback);
90
+ return () => { this._subscribers.delete(callback); };
91
91
  }
92
92
 
93
93
  /**
@@ -196,7 +196,7 @@ export class ProviderHealthDataProvider {
196
196
  isConfigured: record.isConfigured,
197
197
  successRate,
198
198
  errorRate,
199
- p95LatencyMs: record.stats.maxLatencyMs,
199
+ maxLatencyMs: record.stats.maxLatencyMs,
200
200
  avgLatencyMs: record.stats.avgLatencyMs,
201
201
  totalCalls: total,
202
202
  // cacheHitRate is populated only when cache-capability is wired to the provider record.
@@ -59,8 +59,8 @@ export interface ProviderHealthEntry {
59
59
  readonly successRate: number;
60
60
  /** Error rate (0–1), derived from totalCalls and errorCalls. */
61
61
  readonly errorRate: number;
62
- /** Approximate p95 latency in ms (max of recent observations). */
63
- readonly p95LatencyMs: number;
62
+ /** Maximum observed latency in ms (max of recent observations). */
63
+ readonly maxLatencyMs: number;
64
64
  /** Moving average latency in ms. */
65
65
  readonly avgLatencyMs: number;
66
66
  /** Total API calls recorded. */
@@ -19,7 +19,6 @@ export interface UiEnvironmentServices {
19
19
 
20
20
  export interface UiShellServices {
21
21
  readonly keybindingsManager: RuntimeServices['keybindingsManager'];
22
- readonly panelManager: RuntimeServices['panelManager'];
23
22
  readonly processManager: RuntimeServices['processManager'];
24
23
  readonly profileManager: RuntimeServices['profileManager'];
25
24
  readonly bookmarkManager: RuntimeServices['bookmarkManager'];
@@ -135,7 +134,6 @@ export function createUiRuntimeServices(
135
134
  },
136
135
  shell: {
137
136
  keybindingsManager: runtimeServices.keybindingsManager,
138
- panelManager: runtimeServices.panelManager,
139
137
  processManager: runtimeServices.processManager,
140
138
  profileManager: runtimeServices.profileManager,
141
139
  bookmarkManager: runtimeServices.bookmarkManager,
@@ -28,7 +28,6 @@ export function createFullscreenCompositeFromLines(
28
28
  viewport: normalizeFullscreenViewport(lines, width, height),
29
29
  footer: [],
30
30
  forceFullRedraw: true,
31
- panelWidth: 0,
32
31
  };
33
32
  }
34
33