@pellux/goodvibes-agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/.goodvibes/GOODVIBES.md +35 -0
  2. package/.goodvibes/agents/reviewer.md +48 -0
  3. package/.goodvibes/skills/add-provider/SKILL.md +199 -0
  4. package/CHANGELOG.md +25 -0
  5. package/README.md +74 -0
  6. package/bin/goodvibes-agent.ts +2 -0
  7. package/docs/README.md +23 -0
  8. package/docs/deployment-and-services.md +57 -0
  9. package/docs/getting-started.md +53 -0
  10. package/docs/release-and-publishing.md +46 -0
  11. package/package.json +134 -0
  12. package/scripts/check-bun.sh +20 -0
  13. package/src/audio/player.ts +156 -0
  14. package/src/audio/spoken-turn-controller.ts +203 -0
  15. package/src/audio/spoken-turn-model-routing.ts +117 -0
  16. package/src/audio/spoken-turn-wiring.ts +44 -0
  17. package/src/audio/text-chunker.ts +110 -0
  18. package/src/cli/bundle-command.ts +227 -0
  19. package/src/cli/completion.ts +90 -0
  20. package/src/cli/config-overrides.ts +159 -0
  21. package/src/cli/endpoints.ts +63 -0
  22. package/src/cli/entrypoint.ts +172 -0
  23. package/src/cli/help.ts +299 -0
  24. package/src/cli/index.ts +11 -0
  25. package/src/cli/management-commands.ts +426 -0
  26. package/src/cli/management.ts +744 -0
  27. package/src/cli/network-posture.ts +46 -0
  28. package/src/cli/package-verification.ts +123 -0
  29. package/src/cli/parser.ts +369 -0
  30. package/src/cli/provider-auth-routes.ts +22 -0
  31. package/src/cli/provider-classification.ts +107 -0
  32. package/src/cli/redaction.ts +105 -0
  33. package/src/cli/service-command.ts +26 -0
  34. package/src/cli/service-posture.ts +482 -0
  35. package/src/cli/status.ts +383 -0
  36. package/src/cli/surface-command.ts +247 -0
  37. package/src/cli/tui-startup.ts +32 -0
  38. package/src/cli/types.ts +69 -0
  39. package/src/cli-flags.ts +21 -0
  40. package/src/config/goodvibes-home-audit.ts +465 -0
  41. package/src/config/index.ts +57 -0
  42. package/src/config/provider-model.ts +23 -0
  43. package/src/config/secret-config.ts +119 -0
  44. package/src/config/secrets.ts +71 -0
  45. package/src/config/surface.ts +1 -0
  46. package/src/core/composer-state.ts +61 -0
  47. package/src/core/conversation-rendering.ts +359 -0
  48. package/src/core/conversation.ts +551 -0
  49. package/src/core/history.ts +45 -0
  50. package/src/core/orchestrator.ts +7 -0
  51. package/src/core/system-message-router.ts +171 -0
  52. package/src/daemon/cli.ts +55 -0
  53. package/src/daemon/safe-serve.ts +61 -0
  54. package/src/input/agent-workspace.ts +428 -0
  55. package/src/input/autocomplete.ts +96 -0
  56. package/src/input/bookmark-modal.ts +115 -0
  57. package/src/input/command-args-hint.ts +36 -0
  58. package/src/input/command-registry.ts +329 -0
  59. package/src/input/commands/agent-externalized-tui.ts +73 -0
  60. package/src/input/commands/agent-workspace-runtime.ts +17 -0
  61. package/src/input/commands/branch-runtime.ts +72 -0
  62. package/src/input/commands/cloudflare-runtime.ts +370 -0
  63. package/src/input/commands/config.ts +18 -0
  64. package/src/input/commands/control-room-runtime.ts +255 -0
  65. package/src/input/commands/conversation-runtime.ts +207 -0
  66. package/src/input/commands/discovery-runtime.ts +52 -0
  67. package/src/input/commands/eval.ts +204 -0
  68. package/src/input/commands/experience-runtime.ts +278 -0
  69. package/src/input/commands/guidance-runtime.ts +106 -0
  70. package/src/input/commands/health-runtime.ts +434 -0
  71. package/src/input/commands/hooks-runtime.ts +148 -0
  72. package/src/input/commands/incident-runtime.ts +95 -0
  73. package/src/input/commands/integration-runtime.ts +394 -0
  74. package/src/input/commands/intelligence-runtime.ts +223 -0
  75. package/src/input/commands/knowledge.ts +531 -0
  76. package/src/input/commands/local-auth-runtime.ts +105 -0
  77. package/src/input/commands/local-provider-runtime.ts +170 -0
  78. package/src/input/commands/local-runtime.ts +392 -0
  79. package/src/input/commands/local-setup-review.ts +199 -0
  80. package/src/input/commands/local-setup-transfer.ts +135 -0
  81. package/src/input/commands/local-setup.ts +282 -0
  82. package/src/input/commands/managed-runtime.ts +209 -0
  83. package/src/input/commands/marketplace-runtime.ts +290 -0
  84. package/src/input/commands/mcp-runtime.ts +432 -0
  85. package/src/input/commands/memory-product-runtime.ts +111 -0
  86. package/src/input/commands/memory.ts +151 -0
  87. package/src/input/commands/notify-runtime.ts +83 -0
  88. package/src/input/commands/onboarding-runtime.ts +14 -0
  89. package/src/input/commands/operator-panel-runtime.ts +146 -0
  90. package/src/input/commands/operator-runtime.ts +392 -0
  91. package/src/input/commands/planning-runtime.ts +205 -0
  92. package/src/input/commands/platform-access-runtime.ts +422 -0
  93. package/src/input/commands/platform-services-runtime.ts +246 -0
  94. package/src/input/commands/policy-dispatch.ts +339 -0
  95. package/src/input/commands/policy.ts +17 -0
  96. package/src/input/commands/product-runtime.ts +351 -0
  97. package/src/input/commands/profile-sync-runtime.ts +99 -0
  98. package/src/input/commands/provider-accounts-runtime.ts +113 -0
  99. package/src/input/commands/provider.ts +363 -0
  100. package/src/input/commands/qrcode-runtime.ts +20 -0
  101. package/src/input/commands/quit-shared.ts +162 -0
  102. package/src/input/commands/recall-bundle.ts +132 -0
  103. package/src/input/commands/recall-capture.ts +152 -0
  104. package/src/input/commands/recall-query.ts +229 -0
  105. package/src/input/commands/recall-review.ts +98 -0
  106. package/src/input/commands/recall-shared.ts +22 -0
  107. package/src/input/commands/remote-runtime-pool.ts +106 -0
  108. package/src/input/commands/remote-runtime-setup.ts +199 -0
  109. package/src/input/commands/remote-runtime.ts +431 -0
  110. package/src/input/commands/replay-runtime.ts +18 -0
  111. package/src/input/commands/runtime-services.ts +291 -0
  112. package/src/input/commands/schedule-runtime.ts +91 -0
  113. package/src/input/commands/services-runtime.ts +209 -0
  114. package/src/input/commands/session-content.ts +408 -0
  115. package/src/input/commands/session-workflow.ts +464 -0
  116. package/src/input/commands/session.ts +375 -0
  117. package/src/input/commands/settings-sync-runtime.ts +174 -0
  118. package/src/input/commands/share-runtime.ts +119 -0
  119. package/src/input/commands/shell-core.ts +307 -0
  120. package/src/input/commands/skills-runtime.ts +221 -0
  121. package/src/input/commands/subscription-runtime.ts +434 -0
  122. package/src/input/commands/tasks-runtime.ts +230 -0
  123. package/src/input/commands/teamwork-runtime.ts +339 -0
  124. package/src/input/commands/teleport-runtime.ts +57 -0
  125. package/src/input/commands/tts-runtime.ts +29 -0
  126. package/src/input/commands/work-plan-runtime.ts +169 -0
  127. package/src/input/commands.ts +131 -0
  128. package/src/input/feed-context-factory.ts +254 -0
  129. package/src/input/file-picker.ts +192 -0
  130. package/src/input/handler-command-route.ts +180 -0
  131. package/src/input/handler-content-actions.ts +497 -0
  132. package/src/input/handler-feed-routes.ts +648 -0
  133. package/src/input/handler-feed.ts +452 -0
  134. package/src/input/handler-interactions.ts +281 -0
  135. package/src/input/handler-modal-routes.ts +418 -0
  136. package/src/input/handler-modal-stack.ts +263 -0
  137. package/src/input/handler-modal-token-routes.ts +329 -0
  138. package/src/input/handler-onboarding-cloudflare.ts +391 -0
  139. package/src/input/handler-onboarding.ts +620 -0
  140. package/src/input/handler-picker-routes.ts +472 -0
  141. package/src/input/handler-prompt-buffer.ts +320 -0
  142. package/src/input/handler-shortcuts.ts +213 -0
  143. package/src/input/handler-ui-state.ts +372 -0
  144. package/src/input/handler.ts +729 -0
  145. package/src/input/input-history.ts +297 -0
  146. package/src/input/keybindings.ts +292 -0
  147. package/src/input/mcp-workspace.ts +554 -0
  148. package/src/input/model-picker-provider-filter.ts +28 -0
  149. package/src/input/model-picker-types.ts +137 -0
  150. package/src/input/model-picker.ts +797 -0
  151. package/src/input/onboarding/handler-onboarding-routes.ts +125 -0
  152. package/src/input/onboarding/onboarding-runtime-status.ts +87 -0
  153. package/src/input/onboarding/onboarding-wizard-apply.ts +277 -0
  154. package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +494 -0
  155. package/src/input/onboarding/onboarding-wizard-cloudflare.ts +204 -0
  156. package/src/input/onboarding/onboarding-wizard-constants.ts +158 -0
  157. package/src/input/onboarding/onboarding-wizard-external-surface-extra-specs.ts +130 -0
  158. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +762 -0
  159. package/src/input/onboarding/onboarding-wizard-helpers.ts +167 -0
  160. package/src/input/onboarding/onboarding-wizard-rules.ts +256 -0
  161. package/src/input/onboarding/onboarding-wizard-state.ts +365 -0
  162. package/src/input/onboarding/onboarding-wizard-steps.ts +798 -0
  163. package/src/input/onboarding/onboarding-wizard-types.ts +195 -0
  164. package/src/input/onboarding/onboarding-wizard.ts +711 -0
  165. package/src/input/panel-integration-actions.ts +78 -0
  166. package/src/input/profile-picker-modal.ts +222 -0
  167. package/src/input/search.ts +100 -0
  168. package/src/input/selection-modal.ts +163 -0
  169. package/src/input/selection.ts +135 -0
  170. package/src/input/session-picker-modal.ts +136 -0
  171. package/src/input/settings-modal-behavior.ts +37 -0
  172. package/src/input/settings-modal-secrets.ts +41 -0
  173. package/src/input/settings-modal-subscriptions.ts +95 -0
  174. package/src/input/settings-modal-types.ts +91 -0
  175. package/src/input/settings-modal.ts +793 -0
  176. package/src/input/submission-intent.ts +17 -0
  177. package/src/input/submission-router.ts +59 -0
  178. package/src/input/tts-settings-actions.ts +100 -0
  179. package/src/main.ts +792 -0
  180. package/src/mcp/runtime-reload.ts +81 -0
  181. package/src/panels/agent-inspector-panel.ts +521 -0
  182. package/src/panels/agent-inspector-shared.ts +94 -0
  183. package/src/panels/agent-logs-panel.ts +559 -0
  184. package/src/panels/agent-logs-shared.ts +129 -0
  185. package/src/panels/approval-panel.ts +150 -0
  186. package/src/panels/automation-control-panel.ts +212 -0
  187. package/src/panels/base-panel.ts +254 -0
  188. package/src/panels/builtin/agent.ts +117 -0
  189. package/src/panels/builtin/development.ts +31 -0
  190. package/src/panels/builtin/knowledge.ts +26 -0
  191. package/src/panels/builtin/operations.ts +349 -0
  192. package/src/panels/builtin/session.ts +129 -0
  193. package/src/panels/builtin/shared.ts +274 -0
  194. package/src/panels/builtin-panels.ts +23 -0
  195. package/src/panels/cockpit-panel.ts +183 -0
  196. package/src/panels/communication-panel.ts +153 -0
  197. package/src/panels/confirm-state.ts +61 -0
  198. package/src/panels/context-visualizer-panel.ts +204 -0
  199. package/src/panels/control-plane-panel.ts +211 -0
  200. package/src/panels/cost-tracker-panel.ts +444 -0
  201. package/src/panels/debug-panel.ts +432 -0
  202. package/src/panels/diff-panel.ts +520 -0
  203. package/src/panels/docs-panel.ts +283 -0
  204. package/src/panels/eval-panel.ts +399 -0
  205. package/src/panels/file-explorer-panel.ts +584 -0
  206. package/src/panels/file-preview-panel.ts +434 -0
  207. package/src/panels/forensics-panel.ts +364 -0
  208. package/src/panels/git-panel.ts +638 -0
  209. package/src/panels/hooks-panel.ts +239 -0
  210. package/src/panels/incident-review-panel.ts +197 -0
  211. package/src/panels/index.ts +46 -0
  212. package/src/panels/intelligence-panel.ts +176 -0
  213. package/src/panels/knowledge-panel.ts +345 -0
  214. package/src/panels/local-auth-panel.ts +130 -0
  215. package/src/panels/marketplace-panel.ts +212 -0
  216. package/src/panels/memory-panel.ts +225 -0
  217. package/src/panels/ops-control-panel.ts +150 -0
  218. package/src/panels/ops-strategy-panel.ts +235 -0
  219. package/src/panels/orchestration-panel.ts +273 -0
  220. package/src/panels/panel-list-panel.ts +509 -0
  221. package/src/panels/panel-manager.ts +570 -0
  222. package/src/panels/panel-picker.ts +106 -0
  223. package/src/panels/plan-dashboard-panel.ts +274 -0
  224. package/src/panels/plugins-panel.ts +178 -0
  225. package/src/panels/policy-panel.ts +308 -0
  226. package/src/panels/polish.ts +717 -0
  227. package/src/panels/project-planning-panel.ts +711 -0
  228. package/src/panels/provider-account-snapshot.ts +259 -0
  229. package/src/panels/provider-accounts-panel.ts +218 -0
  230. package/src/panels/provider-health-domains.ts +215 -0
  231. package/src/panels/provider-health-panel.ts +727 -0
  232. package/src/panels/provider-health-tracker.ts +115 -0
  233. package/src/panels/provider-stats-panel.ts +366 -0
  234. package/src/panels/qr-panel.ts +182 -0
  235. package/src/panels/remote-panel.ts +449 -0
  236. package/src/panels/routes-panel.ts +178 -0
  237. package/src/panels/sandbox-panel.ts +283 -0
  238. package/src/panels/schedule-panel.ts +329 -0
  239. package/src/panels/scrollable-list-panel.ts +491 -0
  240. package/src/panels/search-focus.ts +32 -0
  241. package/src/panels/security-panel.ts +295 -0
  242. package/src/panels/services-panel.ts +231 -0
  243. package/src/panels/session-browser-panel.ts +400 -0
  244. package/src/panels/session-maintenance.ts +125 -0
  245. package/src/panels/settings-sync-panel.ts +120 -0
  246. package/src/panels/skills-panel.ts +431 -0
  247. package/src/panels/subscription-panel.ts +263 -0
  248. package/src/panels/symbol-outline-panel.ts +486 -0
  249. package/src/panels/system-messages-panel.ts +230 -0
  250. package/src/panels/tasks-panel.ts +399 -0
  251. package/src/panels/thinking-panel.ts +304 -0
  252. package/src/panels/token-budget-panel.ts +475 -0
  253. package/src/panels/tool-inspector-panel.ts +429 -0
  254. package/src/panels/types.ts +54 -0
  255. package/src/panels/watchers-panel.ts +193 -0
  256. package/src/panels/work-plan-panel.ts +175 -0
  257. package/src/panels/worktree-panel.ts +182 -0
  258. package/src/panels/wrfc-panel.ts +609 -0
  259. package/src/permissions/prompt.ts +165 -0
  260. package/src/planning/project-planning-coordinator.ts +543 -0
  261. package/src/plugins/loader.ts +15 -0
  262. package/src/renderer/agent-detail-modal.ts +331 -0
  263. package/src/renderer/agent-workspace.ts +238 -0
  264. package/src/renderer/ansi-sanitize.ts +76 -0
  265. package/src/renderer/autocomplete-overlay.ts +154 -0
  266. package/src/renderer/block-actions.ts +76 -0
  267. package/src/renderer/bookmark-modal.ts +101 -0
  268. package/src/renderer/bottom-bar.ts +58 -0
  269. package/src/renderer/buffer.ts +113 -0
  270. package/src/renderer/code-block.ts +373 -0
  271. package/src/renderer/compositor.ts +283 -0
  272. package/src/renderer/context-inspector.ts +219 -0
  273. package/src/renderer/conversation-layout.ts +67 -0
  274. package/src/renderer/conversation-overlays.ts +140 -0
  275. package/src/renderer/conversation-surface.ts +260 -0
  276. package/src/renderer/diff-view.ts +132 -0
  277. package/src/renderer/diff.ts +130 -0
  278. package/src/renderer/file-picker-overlay.ts +101 -0
  279. package/src/renderer/file-tree.ts +153 -0
  280. package/src/renderer/fullscreen-primitives.ts +130 -0
  281. package/src/renderer/fullscreen-workspace.ts +199 -0
  282. package/src/renderer/git-status.ts +89 -0
  283. package/src/renderer/help-overlay.ts +267 -0
  284. package/src/renderer/history-search-overlay.ts +73 -0
  285. package/src/renderer/layout-engine.ts +97 -0
  286. package/src/renderer/layout.ts +32 -0
  287. package/src/renderer/live-tail-modal.ts +156 -0
  288. package/src/renderer/markdown.ts +635 -0
  289. package/src/renderer/mcp-workspace.ts +237 -0
  290. package/src/renderer/modal-factory.ts +467 -0
  291. package/src/renderer/modal-utils.ts +24 -0
  292. package/src/renderer/model-picker-overlay.ts +473 -0
  293. package/src/renderer/model-workspace.ts +488 -0
  294. package/src/renderer/onboarding/onboarding-wizard.ts +615 -0
  295. package/src/renderer/overlay-box.ts +146 -0
  296. package/src/renderer/overlay-viewport.ts +104 -0
  297. package/src/renderer/panel-composite.ts +158 -0
  298. package/src/renderer/panel-picker-overlay.ts +202 -0
  299. package/src/renderer/panel-tab-bar.ts +69 -0
  300. package/src/renderer/panel-workspace-bar.ts +42 -0
  301. package/src/renderer/process-indicator.ts +96 -0
  302. package/src/renderer/process-modal.ts +656 -0
  303. package/src/renderer/process-summary.ts +67 -0
  304. package/src/renderer/profile-picker-modal.ts +129 -0
  305. package/src/renderer/progress.ts +98 -0
  306. package/src/renderer/qr-renderer.ts +120 -0
  307. package/src/renderer/search-overlay.ts +54 -0
  308. package/src/renderer/selection-modal-overlay.ts +214 -0
  309. package/src/renderer/semantic-diff.ts +369 -0
  310. package/src/renderer/session-picker-modal.ts +127 -0
  311. package/src/renderer/settings-modal-helpers.ts +193 -0
  312. package/src/renderer/settings-modal.ts +537 -0
  313. package/src/renderer/shell-surface.ts +88 -0
  314. package/src/renderer/status-glyphs.ts +21 -0
  315. package/src/renderer/status-token.ts +67 -0
  316. package/src/renderer/surface-layout.ts +101 -0
  317. package/src/renderer/syntax-highlighter.ts +542 -0
  318. package/src/renderer/system-message.ts +83 -0
  319. package/src/renderer/tab-strip.ts +108 -0
  320. package/src/renderer/text-layout.ts +31 -0
  321. package/src/renderer/thinking.ts +17 -0
  322. package/src/renderer/tool-call.ts +234 -0
  323. package/src/renderer/ui-factory.ts +524 -0
  324. package/src/renderer/ui-primitives.ts +96 -0
  325. package/src/runtime/bootstrap-command-context.ts +278 -0
  326. package/src/runtime/bootstrap-command-parts.ts +386 -0
  327. package/src/runtime/bootstrap-core.ts +540 -0
  328. package/src/runtime/bootstrap-hook-bridge.ts +112 -0
  329. package/src/runtime/bootstrap-shell.ts +283 -0
  330. package/src/runtime/bootstrap.ts +575 -0
  331. package/src/runtime/cloudflare-control-plane.ts +349 -0
  332. package/src/runtime/context.ts +142 -0
  333. package/src/runtime/diagnostics/panels/index.ts +24 -0
  334. package/src/runtime/diagnostics/panels/ops.ts +156 -0
  335. package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
  336. package/src/runtime/diagnostics/panels/policy.ts +177 -0
  337. package/src/runtime/index.ts +662 -0
  338. package/src/runtime/onboarding/apply.ts +642 -0
  339. package/src/runtime/onboarding/derivation.ts +534 -0
  340. package/src/runtime/onboarding/index.ts +7 -0
  341. package/src/runtime/onboarding/markers.ts +148 -0
  342. package/src/runtime/onboarding/snapshot.ts +406 -0
  343. package/src/runtime/onboarding/state.ts +141 -0
  344. package/src/runtime/onboarding/types.ts +404 -0
  345. package/src/runtime/onboarding/verify.ts +171 -0
  346. package/src/runtime/operator-token-cleanup.ts +27 -0
  347. package/src/runtime/perf/panel-contracts.ts +32 -0
  348. package/src/runtime/perf/panel-health-monitor.ts +18 -0
  349. package/src/runtime/sandbox-public-gaps.ts +358 -0
  350. package/src/runtime/services.ts +670 -0
  351. package/src/runtime/store/domains/domain-read-matrix.ts +15 -0
  352. package/src/runtime/store/domains/index.ts +222 -0
  353. package/src/runtime/store/domains/panels.ts +117 -0
  354. package/src/runtime/store/domains/ui-perf.ts +103 -0
  355. package/src/runtime/store/index.ts +305 -0
  356. package/src/runtime/store/selectors/index.ts +359 -0
  357. package/src/runtime/store/state.ts +145 -0
  358. package/src/runtime/surface-feature-flags.ts +65 -0
  359. package/src/runtime/terminal-output-guard.ts +228 -0
  360. package/src/runtime/ui/index.ts +39 -0
  361. package/src/runtime/ui/model-picker/data-provider.ts +182 -0
  362. package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
  363. package/src/runtime/ui/model-picker/index.ts +59 -0
  364. package/src/runtime/ui/model-picker/types.ts +149 -0
  365. package/src/runtime/ui/provider-health/data-provider.ts +244 -0
  366. package/src/runtime/ui/provider-health/fallback-visualizer.ts +71 -0
  367. package/src/runtime/ui/provider-health/index.ts +46 -0
  368. package/src/runtime/ui/provider-health/types.ts +146 -0
  369. package/src/runtime/ui-events.ts +1 -0
  370. package/src/runtime/ui-read-model-helpers.ts +1 -0
  371. package/src/runtime/ui-read-models-observability-maintenance.ts +1 -0
  372. package/src/runtime/ui-read-models-observability-options.ts +1 -0
  373. package/src/runtime/ui-read-models-observability-remote.ts +1 -0
  374. package/src/runtime/ui-read-models-observability-security.ts +1 -0
  375. package/src/runtime/ui-read-models-observability-system.ts +1 -0
  376. package/src/runtime/ui-read-models-observability.ts +1 -0
  377. package/src/runtime/ui-read-models.ts +61 -0
  378. package/src/runtime/ui-service-queries.ts +1 -0
  379. package/src/runtime/ui-services.ts +190 -0
  380. package/src/scripts/process-messages.ts +42 -0
  381. package/src/shell/blocking-input.ts +98 -0
  382. package/src/shell/service-settings-sync.ts +273 -0
  383. package/src/shell/ui-openers.ts +352 -0
  384. package/src/tools/index.ts +1 -0
  385. package/src/tools/wrfc-agent-guard.ts +49 -0
  386. package/src/types/grid.ts +48 -0
  387. package/src/types/sql-js.d.ts +15 -0
  388. package/src/utils/clipboard.ts +22 -0
  389. package/src/utils/splash-lines.ts +46 -0
  390. package/src/utils/terminal-width.ts +185 -0
  391. package/src/verification/live-verifier.ts +430 -0
  392. package/src/verification/verification-ledger.ts +242 -0
  393. package/src/version.ts +17 -0
  394. package/src/widget/index.ts +2 -0
  395. package/src/widget/types.ts +9 -0
  396. package/src/widget/widget.ts +8 -0
  397. package/src/work-plans/work-plan-store.ts +374 -0
  398. package/tsconfig.json +18 -0
@@ -0,0 +1,404 @@
1
+ import type { ConfigManager, ConfigKey, GoodVibesConfig } from '../../config/index.ts';
2
+ import type { SecretsManager, SecretRecord, SecretStorageReview } from '../../config/secrets.ts';
3
+ import type { FeatureFlagConfigKey } from '../surface-feature-flags.ts';
4
+ import type { LocalAuthSnapshot, UserAuthManager } from '@pellux/goodvibes-sdk/platform/security';
5
+ import type { ShellPathService } from '@/runtime/index.ts';
6
+ import type {
7
+ LocalAuthInspectionQuery,
8
+ ServiceInspectionQuery,
9
+ SubscriptionAccessQuery,
10
+ } from '../ui-service-queries.ts';
11
+
12
+ export type OnboardingMode = 'new' | 'edit' | 'reopen';
13
+
14
+ export type OnboardingNetworkMode = 'local-network-default' | 'custom';
15
+
16
+ export type OnboardingAcknowledgementTarget = 'providers' | 'subscriptions' | 'auth';
17
+
18
+ export type OnboardingAcknowledgementReason =
19
+ | 'not-needed'
20
+ | 'configured-routing'
21
+ | 'customized-config'
22
+ | 'subscription-state'
23
+ | 'pending-login'
24
+ | 'auth-state'
25
+ | 'bootstrap-credential'
26
+ | 'active-sessions';
27
+
28
+ export type OnboardingVerificationStatus = 'pass' | 'warn' | 'fail';
29
+
30
+ export type OnboardingStateScope = 'user' | 'project';
31
+
32
+ export type OnboardingCheckMarkerSource = 'wizard' | 'command' | 'import' | 'unknown';
33
+
34
+ export interface OnboardingConfigSnapshot {
35
+ readonly display: GoodVibesConfig['display'];
36
+ readonly provider: GoodVibesConfig['provider'];
37
+ readonly behavior: GoodVibesConfig['behavior'];
38
+ readonly storage: GoodVibesConfig['storage'];
39
+ readonly permissions: GoodVibesConfig['permissions'];
40
+ readonly helper: GoodVibesConfig['helper'];
41
+ readonly tools: Pick<GoodVibesConfig['tools'], 'llmEnabled' | 'llmProvider' | 'llmModel'>;
42
+ readonly danger: GoodVibesConfig['danger'];
43
+ readonly controlPlane: GoodVibesConfig['controlPlane'];
44
+ readonly httpListener: GoodVibesConfig['httpListener'];
45
+ readonly web: GoodVibesConfig['web'];
46
+ readonly network: GoodVibesConfig['network'];
47
+ readonly surfaces: GoodVibesConfig['surfaces'];
48
+ readonly service: GoodVibesConfig['service'];
49
+ readonly featureFlags: GoodVibesConfig['featureFlags'];
50
+ readonly batch: GoodVibesConfig['batch'];
51
+ readonly cloudflare: GoodVibesConfig['cloudflare'];
52
+ }
53
+
54
+ export interface OnboardingProviderRoutingSnapshot {
55
+ readonly primaryProviderId: string;
56
+ readonly primaryModelId: string;
57
+ readonly primaryReasoningEffort: GoodVibesConfig['provider']['reasoningEffort'];
58
+ readonly embeddingProviderId: string;
59
+ readonly systemPromptFile: string;
60
+ readonly helperEnabled: boolean;
61
+ readonly helperProviderId: string;
62
+ readonly helperModelId: string;
63
+ readonly toolLlmEnabled: boolean;
64
+ readonly toolProviderId: string;
65
+ readonly toolModelId: string;
66
+ }
67
+
68
+ export interface OnboardingServiceState {
69
+ readonly name: string;
70
+ readonly providerId: string;
71
+ readonly baseUrl: string | null;
72
+ readonly authType: 'bearer' | 'basic' | 'api-key' | 'oauth';
73
+ readonly tokenKey: string;
74
+ readonly oauthConfigured: boolean;
75
+ readonly hasPrimaryCredential: boolean;
76
+ readonly hasPasswordCredential: boolean;
77
+ readonly hasWebhookUrl: boolean;
78
+ readonly hasSigningSecret: boolean;
79
+ readonly hasPublicKey: boolean;
80
+ readonly hasAppToken: boolean;
81
+ }
82
+
83
+ export interface OnboardingServicesSnapshot {
84
+ readonly total: number;
85
+ readonly oauthProviderIds: readonly string[];
86
+ readonly services: readonly OnboardingServiceState[];
87
+ }
88
+
89
+ export interface OnboardingSubscriptionsSnapshot {
90
+ readonly active: ReturnType<SubscriptionAccessQuery['list']>;
91
+ readonly pending: ReturnType<SubscriptionAccessQuery['listPending']>;
92
+ readonly activeProviderIds: readonly string[];
93
+ readonly pendingProviderIds: readonly string[];
94
+ }
95
+
96
+ export interface OnboardingSecretsSnapshot {
97
+ readonly review: SecretStorageReview;
98
+ readonly records: readonly SecretRecord[];
99
+ }
100
+
101
+ export interface OnboardingAuthSnapshot {
102
+ readonly snapshot: LocalAuthSnapshot;
103
+ }
104
+
105
+ export interface OnboardingBindSettingsSnapshot {
106
+ readonly daemonEnabled: boolean;
107
+ readonly httpListenerEnabled: boolean;
108
+ readonly controlPlane: GoodVibesConfig['controlPlane'];
109
+ readonly httpListener: GoodVibesConfig['httpListener'];
110
+ readonly web: GoodVibesConfig['web'];
111
+ }
112
+
113
+ export interface OnboardingSurfaceRecord {
114
+ readonly id: string;
115
+ readonly kind: string;
116
+ readonly label: string;
117
+ readonly enabled: boolean;
118
+ readonly state: string;
119
+ readonly capabilities: readonly string[];
120
+ readonly metadata: Readonly<Record<string, unknown>>;
121
+ }
122
+
123
+ export interface OnboardingSurfacesSnapshot {
124
+ readonly configuredEnabledKinds: readonly string[];
125
+ readonly records: readonly OnboardingSurfaceRecord[];
126
+ }
127
+
128
+ export interface OnboardingProviderAccountRecord {
129
+ readonly providerId: string;
130
+ readonly configured: boolean;
131
+ readonly active: boolean;
132
+ readonly oauthReady: boolean;
133
+ readonly pendingLogin: boolean;
134
+ readonly availableRoutes: readonly string[];
135
+ readonly activeRoute: string;
136
+ readonly authFreshness: string;
137
+ }
138
+
139
+ export interface OnboardingProviderAccountsSnapshot {
140
+ readonly capturedAt: number;
141
+ readonly configuredCount: number;
142
+ readonly issueCount: number;
143
+ readonly providers: readonly OnboardingProviderAccountRecord[];
144
+ }
145
+
146
+ export interface OnboardingRuntimeDefaultsSnapshot {
147
+ readonly providerReasoningEffort: GoodVibesConfig['provider']['reasoningEffort'];
148
+ readonly permissionsMode: GoodVibesConfig['permissions']['mode'];
149
+ readonly behavior: GoodVibesConfig['behavior'];
150
+ readonly display: GoodVibesConfig['display'];
151
+ readonly secretStoragePolicy: GoodVibesConfig['storage']['secretPolicy'];
152
+ }
153
+
154
+ export interface OnboardingAcknowledgementSnapshot {
155
+ readonly scope: OnboardingStateScope;
156
+ readonly exists: boolean;
157
+ readonly updatedAt: number | null;
158
+ readonly source: string | null;
159
+ readonly mode?: OnboardingMode;
160
+ readonly workspaceRoot?: string;
161
+ readonly accepted: Partial<Record<OnboardingAcknowledgementTarget, boolean>>;
162
+ }
163
+
164
+ export type OnboardingSnapshotCollectionIssueArea =
165
+ | 'services'
166
+ | 'subscriptions-active'
167
+ | 'subscriptions-pending'
168
+ | 'auth'
169
+ | 'secrets-review'
170
+ | 'secrets-records'
171
+ | 'surfaces'
172
+ | 'provider-accounts'
173
+ | 'acknowledgements';
174
+
175
+ export interface OnboardingSnapshotCollectionIssue {
176
+ readonly area: OnboardingSnapshotCollectionIssueArea;
177
+ readonly message: string;
178
+ }
179
+
180
+ export interface OnboardingSnapshotState {
181
+ readonly capturedAt: number;
182
+ readonly config: OnboardingConfigSnapshot;
183
+ readonly providerRouting: OnboardingProviderRoutingSnapshot;
184
+ readonly runtimeDefaults: OnboardingRuntimeDefaultsSnapshot;
185
+ readonly acknowledgements: OnboardingAcknowledgementSnapshot;
186
+ readonly services: OnboardingServicesSnapshot;
187
+ readonly subscriptions: OnboardingSubscriptionsSnapshot;
188
+ readonly secrets: OnboardingSecretsSnapshot;
189
+ readonly auth: OnboardingAuthSnapshot;
190
+ readonly bindSettings: OnboardingBindSettingsSnapshot;
191
+ readonly surfaces: OnboardingSurfacesSnapshot;
192
+ readonly providerAccounts: OnboardingProviderAccountsSnapshot | null;
193
+ readonly collectionIssues: readonly OnboardingSnapshotCollectionIssue[];
194
+ }
195
+
196
+ export type OnboardingStep1CapabilityId =
197
+ | 'local-tui-only'
198
+ | 'browser-access'
199
+ | 'network-access'
200
+ | 'webhook-events'
201
+ | 'external-integrations'
202
+ | 'cloudflare-batch';
203
+
204
+ export interface OnboardingStep1CapabilityItem {
205
+ readonly id: OnboardingStep1CapabilityId;
206
+ readonly label: string;
207
+ readonly selected: boolean;
208
+ readonly detail: string;
209
+ }
210
+
211
+ export interface OnboardingStep1CapabilityFlags {
212
+ readonly providers: boolean;
213
+ readonly services: boolean;
214
+ readonly subscriptions: boolean;
215
+ readonly auth: boolean;
216
+ readonly controlPlane: boolean;
217
+ readonly httpListener: boolean;
218
+ readonly web: boolean;
219
+ readonly surfaces: boolean;
220
+ readonly cloudflare: boolean;
221
+ }
222
+
223
+ export interface OnboardingAcknowledgementState {
224
+ readonly required: boolean;
225
+ readonly accepted: boolean;
226
+ readonly reason: OnboardingAcknowledgementReason;
227
+ readonly detail: string;
228
+ }
229
+
230
+ export interface OnboardingReopenEditAcknowledgementState {
231
+ readonly providers: OnboardingAcknowledgementState;
232
+ readonly subscriptions: OnboardingAcknowledgementState;
233
+ readonly auth: OnboardingAcknowledgementState;
234
+ }
235
+
236
+ export interface OnboardingStepDerivationState {
237
+ readonly step1Capabilities: readonly OnboardingStep1CapabilityItem[];
238
+ readonly step1_5NetworkMode: OnboardingNetworkMode;
239
+ readonly reopenEditAcknowledgements: OnboardingReopenEditAcknowledgementState;
240
+ }
241
+
242
+ export type OnboardingApplyOperation =
243
+ | {
244
+ readonly kind: 'set-config';
245
+ readonly key: ConfigKey | FeatureFlagConfigKey;
246
+ readonly value: unknown;
247
+ readonly scope?: 'global' | 'project';
248
+ }
249
+ | {
250
+ readonly kind: 'set-secret';
251
+ readonly key: string;
252
+ readonly value: string;
253
+ readonly scope?: 'project' | 'user';
254
+ readonly medium: 'secure' | 'plaintext';
255
+ }
256
+ | {
257
+ readonly kind: 'ensure-auth-user';
258
+ readonly username: string;
259
+ readonly password: string;
260
+ readonly roles?: readonly string[];
261
+ readonly createSession?: boolean;
262
+ readonly retireBootstrapCredential?: boolean;
263
+ }
264
+ | {
265
+ readonly kind: 'acknowledge';
266
+ readonly target: OnboardingAcknowledgementTarget;
267
+ readonly acknowledged: boolean;
268
+ };
269
+
270
+ export interface OnboardingApplyRequest {
271
+ readonly mode: OnboardingMode;
272
+ readonly source: string;
273
+ readonly operations: readonly OnboardingApplyOperation[];
274
+ }
275
+
276
+ export interface OnboardingAppliedOperation {
277
+ readonly kind: OnboardingApplyOperation['kind'];
278
+ readonly summary: string;
279
+ }
280
+
281
+ export interface OnboardingSkippedOperation {
282
+ readonly kind: OnboardingApplyOperation['kind'];
283
+ readonly reason: string;
284
+ }
285
+
286
+ export interface OnboardingApplyError {
287
+ readonly kind: OnboardingApplyOperation['kind'];
288
+ readonly message: string;
289
+ }
290
+
291
+ export interface OnboardingApplyResult {
292
+ readonly ok: boolean;
293
+ readonly applied: readonly OnboardingAppliedOperation[];
294
+ readonly skipped: readonly OnboardingSkippedOperation[];
295
+ readonly errors: readonly OnboardingApplyError[];
296
+ }
297
+
298
+ export interface OnboardingVerificationItem {
299
+ readonly id: string;
300
+ readonly status: OnboardingVerificationStatus;
301
+ readonly message: string;
302
+ readonly target?: string;
303
+ }
304
+
305
+ export interface OnboardingVerificationResult {
306
+ readonly verifiedAt: number;
307
+ readonly ok: boolean;
308
+ readonly items: readonly OnboardingVerificationItem[];
309
+ }
310
+
311
+ export interface OnboardingAcknowledgementRuntimeState {
312
+ readonly version: 1;
313
+ readonly updatedAt: number;
314
+ readonly source: string;
315
+ readonly mode?: OnboardingMode;
316
+ readonly workspaceRoot?: string;
317
+ readonly acknowledgements: Partial<Record<OnboardingAcknowledgementTarget, boolean>>;
318
+ }
319
+
320
+ export interface OnboardingCheckMarkerPayload {
321
+ readonly version: 1;
322
+ readonly checkedAt: number;
323
+ readonly updatedAt: number;
324
+ readonly source: OnboardingCheckMarkerSource;
325
+ readonly mode?: OnboardingMode;
326
+ readonly workspaceRoot?: string;
327
+ }
328
+
329
+ export interface OnboardingCheckMarkerState {
330
+ readonly scope: OnboardingStateScope;
331
+ readonly path: string;
332
+ readonly exists: boolean;
333
+ readonly payload: OnboardingCheckMarkerPayload | null;
334
+ readonly parseError?: string;
335
+ }
336
+
337
+ export interface OnboardingCheckMarkersState {
338
+ readonly user: OnboardingCheckMarkerState;
339
+ readonly project: OnboardingCheckMarkerState;
340
+ readonly effective: OnboardingCheckMarkerState | null;
341
+ }
342
+
343
+ export interface WriteOnboardingCheckMarkerOptions {
344
+ readonly scope?: OnboardingStateScope;
345
+ readonly checkedAt?: number;
346
+ readonly updatedAt?: number;
347
+ readonly source?: OnboardingCheckMarkerSource;
348
+ readonly mode?: OnboardingMode;
349
+ readonly workspaceRoot?: string;
350
+ }
351
+
352
+ export interface OnboardingSurfaceReadHelper {
353
+ list(): readonly OnboardingSurfaceRecord[] | Promise<readonly OnboardingSurfaceRecord[]>;
354
+ }
355
+
356
+ export interface OnboardingProviderAccountReadHelper {
357
+ loadSnapshot(): Promise<OnboardingProviderAccountsSnapshot>;
358
+ }
359
+
360
+ export type OnboardingShellPaths = Pick<
361
+ ShellPathService,
362
+ 'workingDirectory' | 'resolveProjectPath' | 'resolveUserPath'
363
+ >;
364
+
365
+ export interface OnboardingSnapshotDependencies {
366
+ readonly clock?: () => number;
367
+ readonly config: Pick<ConfigManager, 'get' | 'getCategory'>;
368
+ readonly subscriptions: Pick<SubscriptionAccessQuery, 'list' | 'listPending' | 'get' | 'getPending'>;
369
+ readonly secrets: Pick<SecretsManager, 'inspect' | 'listDetailed'>;
370
+ readonly auth: Pick<LocalAuthInspectionQuery, 'inspect'>;
371
+ readonly services: Pick<ServiceInspectionQuery, 'getAll' | 'inspect'>;
372
+ readonly surfaces?: OnboardingSurfaceReadHelper;
373
+ readonly providerAccounts?: OnboardingProviderAccountReadHelper;
374
+ readonly shellPaths?: OnboardingShellPaths;
375
+ readonly acknowledgementScope?: OnboardingStateScope;
376
+ }
377
+
378
+ export interface OnboardingApplyDependencies {
379
+ readonly clock?: () => number;
380
+ readonly config: Pick<ConfigManager, 'get' | 'getRaw' | 'load' | 'setDynamic'>;
381
+ readonly secrets?: Pick<SecretsManager, 'delete' | 'get' | 'inspect' | 'set'>;
382
+ readonly auth?: Pick<
383
+ UserAuthManager,
384
+ 'addUser'
385
+ | 'clearBootstrapCredentialFile'
386
+ | 'createSession'
387
+ | 'deleteUser'
388
+ | 'getUser'
389
+ | 'inspect'
390
+ | 'revokeSession'
391
+ | 'rotatePassword'
392
+ >;
393
+ readonly shellPaths: OnboardingShellPaths;
394
+ readonly acknowledgementScope?: OnboardingStateScope;
395
+ }
396
+
397
+ export interface OnboardingVerificationDependencies {
398
+ readonly clock?: () => number;
399
+ readonly config: Pick<ConfigManager, 'get'>;
400
+ readonly secrets?: Pick<SecretsManager, 'get'>;
401
+ readonly auth?: Pick<UserAuthManager, 'inspect'>;
402
+ readonly shellPaths: OnboardingShellPaths;
403
+ readonly acknowledgementScope?: OnboardingStateScope;
404
+ }
@@ -0,0 +1,171 @@
1
+ import { isSecretRefInput } from '@pellux/goodvibes-sdk/platform/config';
2
+ import { readOnboardingRuntimeState } from './state.ts';
3
+ import type {
4
+ OnboardingApplyOperation,
5
+ OnboardingApplyRequest,
6
+ OnboardingVerificationDependencies,
7
+ OnboardingVerificationItem,
8
+ OnboardingVerificationResult,
9
+ } from './types.ts';
10
+
11
+ function getNow(deps: Pick<OnboardingVerificationDependencies, 'clock'>): number {
12
+ return deps.clock?.() ?? Date.now();
13
+ }
14
+
15
+ function isDeepEqual(left: unknown, right: unknown): boolean {
16
+ if (Object.is(left, right)) return true;
17
+ if (Array.isArray(left) && Array.isArray(right)) {
18
+ return left.length === right.length && left.every((value, index) => isDeepEqual(value, right[index]));
19
+ }
20
+
21
+ if (
22
+ typeof left === 'object' && left !== null
23
+ && typeof right === 'object' && right !== null
24
+ && !Array.isArray(left)
25
+ && !Array.isArray(right)
26
+ ) {
27
+ const leftEntries = Object.entries(left);
28
+ const rightEntries = Object.entries(right);
29
+ if (leftEntries.length !== rightEntries.length) return false;
30
+
31
+ return leftEntries.every(([key, value]) => isDeepEqual(value, (right as Record<string, unknown>)[key]));
32
+ }
33
+
34
+ return false;
35
+ }
36
+
37
+ function isGoodVibesSecretRefInput(value: string): boolean {
38
+ const normalized = value.trim();
39
+ return normalized.startsWith('goodvibes://secrets/') && isSecretRefInput(normalized);
40
+ }
41
+
42
+ function verifyConfigOperation(
43
+ deps: OnboardingVerificationDependencies,
44
+ operation: Extract<OnboardingApplyOperation, { kind: 'set-config' }>,
45
+ ): OnboardingVerificationItem {
46
+ const actual = deps.config.get(operation.key as never);
47
+ const ok = isDeepEqual(actual, operation.value);
48
+
49
+ return {
50
+ id: `config:${operation.key}`,
51
+ status: ok ? 'pass' : 'fail',
52
+ message: ok
53
+ ? `${operation.key} matches the requested onboarding value.`
54
+ : `${operation.key} does not match the requested onboarding value.`,
55
+ target: operation.key,
56
+ };
57
+ }
58
+
59
+ function verifyAcknowledgementOperation(
60
+ deps: OnboardingVerificationDependencies,
61
+ operation: Extract<OnboardingApplyOperation, { kind: 'acknowledge' }>,
62
+ ): OnboardingVerificationItem {
63
+ const state = readOnboardingRuntimeState(deps.shellPaths, deps.acknowledgementScope ?? 'project');
64
+ if (state.parseError) {
65
+ return {
66
+ id: `acknowledge:${operation.target}`,
67
+ status: 'fail',
68
+ message: `Onboarding acknowledgement state could not be parsed: ${state.parseError}`,
69
+ target: operation.target,
70
+ };
71
+ }
72
+
73
+ const actual = state.payload?.acknowledgements[operation.target] ?? false;
74
+ const ok = actual === operation.acknowledged;
75
+
76
+ return {
77
+ id: `acknowledge:${operation.target}`,
78
+ status: ok ? 'pass' : 'fail',
79
+ message: ok
80
+ ? `${operation.target} acknowledgement matches the requested onboarding state.`
81
+ : `${operation.target} acknowledgement does not match the requested onboarding state.`,
82
+ target: operation.target,
83
+ };
84
+ }
85
+
86
+ async function verifySecretOperation(
87
+ deps: OnboardingVerificationDependencies,
88
+ operation: Extract<OnboardingApplyOperation, { kind: 'set-secret' }>,
89
+ ): Promise<OnboardingVerificationItem> {
90
+ if (!deps.secrets) {
91
+ return {
92
+ id: `secret:${operation.key}`,
93
+ status: 'fail',
94
+ message: 'Secret manager is unavailable.',
95
+ target: operation.key,
96
+ };
97
+ }
98
+
99
+ const actual = await deps.secrets.get(operation.key);
100
+ const ok = isGoodVibesSecretRefInput(operation.value)
101
+ ? actual !== null
102
+ : actual === operation.value;
103
+ return {
104
+ id: `secret:${operation.key}`,
105
+ status: ok ? 'pass' : 'fail',
106
+ message: ok
107
+ ? isGoodVibesSecretRefInput(operation.value)
108
+ ? `${operation.key} resolves through the stored GoodVibes secret reference.`
109
+ : `${operation.key} was stored through the secret manager.`
110
+ : `${operation.key} did not match the requested secret value.`,
111
+ target: operation.key,
112
+ };
113
+ }
114
+
115
+ function verifyAuthOperation(
116
+ deps: OnboardingVerificationDependencies,
117
+ operation: Extract<OnboardingApplyOperation, { kind: 'ensure-auth-user' }>,
118
+ ): OnboardingVerificationItem {
119
+ if (!deps.auth) {
120
+ return {
121
+ id: `auth:${operation.username}`,
122
+ status: 'fail',
123
+ message: 'Local auth manager is unavailable.',
124
+ target: operation.username,
125
+ };
126
+ }
127
+
128
+ const snapshot = deps.auth.inspect();
129
+ const username = operation.username.trim();
130
+ const user = snapshot.users.find((entry) => entry.username === username);
131
+ const requiredRoles = operation.roles ?? ['admin'];
132
+ const userExists = Boolean(user) && requiredRoles.every((role) => user!.roles.includes(role));
133
+ const sessionExists = operation.createSession === false
134
+ ? true
135
+ : snapshot.sessions.some((session) => session.username === username);
136
+ const bootstrapRetired = operation.retireBootstrapCredential
137
+ ? snapshot.bootstrapCredentialPresent === false
138
+ : true;
139
+ const ok = userExists && sessionExists && bootstrapRetired;
140
+ return {
141
+ id: `auth:${username}`,
142
+ status: ok ? 'pass' : 'fail',
143
+ message: ok
144
+ ? `${username} local auth user has required role(s) and session state.`
145
+ : `${username} local auth user/session/role/bootstrap state was not created.`,
146
+ target: username,
147
+ };
148
+ }
149
+
150
+ async function verifyOperation(
151
+ deps: OnboardingVerificationDependencies,
152
+ operation: OnboardingApplyOperation,
153
+ ): Promise<OnboardingVerificationItem> {
154
+ if (operation.kind === 'set-config') return verifyConfigOperation(deps, operation);
155
+ if (operation.kind === 'set-secret') return verifySecretOperation(deps, operation);
156
+ if (operation.kind === 'ensure-auth-user') return verifyAuthOperation(deps, operation);
157
+ return verifyAcknowledgementOperation(deps, operation);
158
+ }
159
+
160
+ export async function verifyOnboardingRequest(
161
+ deps: OnboardingVerificationDependencies,
162
+ request: OnboardingApplyRequest,
163
+ ): Promise<OnboardingVerificationResult> {
164
+ const items = await Promise.all(request.operations.map((operation) => verifyOperation(deps, operation)));
165
+
166
+ return {
167
+ verifiedAt: getNow(deps),
168
+ ok: items.every((item) => item.status === 'pass'),
169
+ items,
170
+ };
171
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * operator-token-cleanup.ts
3
+ *
4
+ * Shared helper that enumerates the legacy workspace-scoped `operator-tokens.json`
5
+ * locations earlier GoodVibes builds may have written. Used by the in-process
6
+ * bootstrap path so stale-token pruning has a single source of truth for where
7
+ * to look. GoodVibes Agent itself does not own daemon startup.
8
+ *
9
+ * Adding a new legacy location: append to `workspaceOperatorTokenCandidates` and
10
+ * the new path will be inspected on the next daemon boot.
11
+ */
12
+
13
+ import { join } from 'node:path';
14
+
15
+ /**
16
+ * Return the list of absolute operator-tokens.json paths the TUI may have written
17
+ * at legacy (pre-0.21.28) workspace-scoped locations under `workingDirectory`.
18
+ *
19
+ * The canonical, current-SDK location is `<daemonHomeDir>/operator-tokens.json`;
20
+ * this helper is strictly for legacy-cleanup candidates.
21
+ */
22
+ export function workspaceOperatorTokenCandidates(workingDirectory: string): readonly string[] {
23
+ return [
24
+ join(workingDirectory, '.goodvibes', 'operator-tokens.json'),
25
+ join(workingDirectory, '.goodvibes', 'tui', 'operator-tokens.json'),
26
+ ];
27
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Panel resource contracts — backward-compat shim.
3
+ *
4
+ * Re-exports the SDK's component contract types and helpers. TUI code that
5
+ * previously used local `ComponentResourceContract` / `ComponentHealthState`
6
+ * types (with `panelId`) now uses the SDK types (with `componentId`).
7
+ *
8
+ * Backward-compat aliases are re-exported:
9
+ * - `PanelResourceContract` = `Omit<ComponentResourceContract,'componentId'> & { panelId }`
10
+ * - `PanelHealthState` = `Omit<ComponentHealthState,'componentId'> & { panelId }`
11
+ *
12
+ * These keep TUI-internal code that still uses `.panelId` compiling while
13
+ * the broader migration to `.componentId` proceeds.
14
+ */
15
+
16
+ export type {
17
+ ComponentThrottleStatus,
18
+ ComponentHealthStatus,
19
+ ComponentResourceContract,
20
+ ComponentHealthState,
21
+ PanelThrottleStatus,
22
+ PanelHealthStatus,
23
+ PanelResourceContract,
24
+ PanelHealthState,
25
+ } from '@/runtime/index.ts';
26
+
27
+ export {
28
+ CATEGORY_CONTRACTS,
29
+ buildContract,
30
+ createInitialComponentHealthState,
31
+ createInitialPanelHealthState,
32
+ } from '@/runtime/index.ts';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Panel health monitor — backward-compat shim.
3
+ *
4
+ * Re-exports the SDK's ComponentHealthMonitor so that the TUI and the SDK
5
+ * share a single class declaration. This eliminates the TypeScript nominal
6
+ * incompatibility that arises from two classes having separate `private`
7
+ * field declarations with the same name.
8
+ *
9
+ * All call-sites that previously imported the TUI-local ComponentHealthMonitor
10
+ * now receive the SDK's canonical class without any behavioral change —
11
+ * the public API is identical (register/deregister/canRender/recordRender/
12
+ * getHealth/getAllHealth/getContract/resetHealth).
13
+ */
14
+
15
+ export {
16
+ ComponentHealthMonitor,
17
+ ComponentHealthMonitor as PanelHealthMonitor,
18
+ } from '@/runtime/index.ts';