@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,543 @@
1
+ import type {
2
+ ProjectPlanningAgentAssignment,
3
+ ProjectPlanningDependency,
4
+ ProjectPlanningEvaluation,
5
+ ProjectPlanningQuestion,
6
+ ProjectPlanningService,
7
+ ProjectPlanningState,
8
+ ProjectPlanningTask,
9
+ ProjectPlanningVerificationGate,
10
+ } from '@pellux/goodvibes-sdk/platform/knowledge';
11
+
12
+ export interface ProjectPlanningCoordinatorOptions {
13
+ readonly service: ProjectPlanningService;
14
+ readonly projectId: string;
15
+ readonly workingDirectory: string;
16
+ readonly openPanel?: () => void;
17
+ readonly notify?: (message: string) => void;
18
+ readonly now?: () => number;
19
+ }
20
+
21
+ export interface ProjectPlanningTurnPreparation {
22
+ readonly systemMessage: string;
23
+ readonly state: ProjectPlanningState;
24
+ readonly evaluation: ProjectPlanningEvaluation;
25
+ readonly handledLocally: boolean;
26
+ readonly statusMessage: string;
27
+ }
28
+
29
+ const PLANNING_INTENT_PATTERNS: readonly RegExp[] = [
30
+ /\b(plan|planning)\b/i,
31
+ /\bimplementation (plan|strategy)\b/i,
32
+ /\bexecution (plan|strategy)\b/i,
33
+ /\bdependency graph\b/i,
34
+ /\bbreak (this|it|that|the work) down\b/i,
35
+ /\bbefore (coding|implementing|we start|execution)\b/i,
36
+ /\bagent (handoff|assignment|assignments)\b/i,
37
+ /\bverification gates?\b/i,
38
+ /\binterview (me|loop)\b/i,
39
+ ];
40
+
41
+ const CANCEL_PATTERNS: readonly RegExp[] = [
42
+ /\b(stop|cancel|pause|exit) (the )?planning\b/i,
43
+ /\bplanning (is )?(done|cancelled|canceled|paused)\b/i,
44
+ /\b(skip|dismiss) (the )?planning\b/i,
45
+ /\bcontinue without (the )?planning\b/i,
46
+ ];
47
+
48
+ const APPROVAL_PATTERNS: readonly RegExp[] = [
49
+ /\b(approve|approved|approval granted)\b/i,
50
+ /\b(go ahead|execute this plan|start execution|ready to execute)\b/i,
51
+ ];
52
+
53
+ const ACCEPT_DEFAULT_PATTERNS: readonly RegExp[] = [
54
+ /^(ok|okay|yes|y|yep|yeah|sure|fine|default|continue|go|go ahead|let'?s go|looks good|sounds good)\.?$/i,
55
+ /\bok\b.*\blet'?s go\b/i,
56
+ /\blet'?s go\b/i,
57
+ /\b(use|accept|take) (the )?(default|recommended|recommendation)\b/i,
58
+ /\b(create|use) (the )?default task breakdown\b/i,
59
+ /\bfocused first-pass scope\b/i,
60
+ /\bstandard verification gates?\b/i,
61
+ ];
62
+
63
+ const GENERIC_RECOMMENDATION_PATTERNS: readonly RegExp[] = [
64
+ /\bdefine the first-pass scope\b/i,
65
+ /\bseparate out-of-scope work\b/i,
66
+ /\bcreate task records\b/i,
67
+ /\brecord concrete tests\b/i,
68
+ /\bverification gates?\b/i,
69
+ ];
70
+
71
+ export function hasProjectPlanningIntent(text: string): boolean {
72
+ const trimmed = text.trim();
73
+ if (!trimmed || trimmed.startsWith('/')) return false;
74
+ return PLANNING_INTENT_PATTERNS.some((pattern) => pattern.test(trimmed));
75
+ }
76
+
77
+ export class ProjectPlanningCoordinator {
78
+ private readonly service: ProjectPlanningService;
79
+ private readonly projectId: string;
80
+ private readonly workingDirectory: string;
81
+ private readonly openPanel: () => void;
82
+ private readonly notify: (message: string) => void;
83
+ private readonly now: () => number;
84
+
85
+ public constructor(options: ProjectPlanningCoordinatorOptions) {
86
+ this.service = options.service;
87
+ this.projectId = options.projectId;
88
+ this.workingDirectory = options.workingDirectory;
89
+ this.openPanel = options.openPanel ?? (() => {});
90
+ this.notify = options.notify ?? (() => {});
91
+ this.now = options.now ?? (() => Date.now());
92
+ }
93
+
94
+ public async prepareTurn(text: string): Promise<ProjectPlanningTurnPreparation | null> {
95
+ const prompt = text.trim();
96
+ if (!prompt || prompt.startsWith('!') || prompt.startsWith('/')) return null;
97
+
98
+ const stateResult = await this.service.getState({ projectId: this.projectId });
99
+ const existing = stateResult.state;
100
+ const active = this.isActive(existing);
101
+ const startsPlanning = hasProjectPlanningIntent(prompt);
102
+
103
+ if (this.isCancel(prompt)) {
104
+ if (existing) {
105
+ await this.service.upsertState({
106
+ projectId: this.projectId,
107
+ state: {
108
+ ...existing,
109
+ metadata: {
110
+ ...(existing.metadata ?? {}),
111
+ active: false,
112
+ pausedAt: this.now(),
113
+ },
114
+ },
115
+ });
116
+ this.notify('[Planning] Paused project planning for this workspace.');
117
+ }
118
+ return null;
119
+ }
120
+
121
+ if (!active && !startsPlanning) return null;
122
+
123
+ const answeredQuestion = active ? this.firstOpenQuestion(existing) : null;
124
+ const stateDraft = this.buildStateDraft(existing, prompt, {
125
+ startsPlanning,
126
+ answeredQuestion,
127
+ approved: this.isApproval(prompt),
128
+ });
129
+
130
+ const firstEvaluation = await this.service.evaluate({
131
+ projectId: this.projectId,
132
+ state: stateDraft,
133
+ });
134
+ const withNextQuestion = this.recordNextQuestion(stateDraft, firstEvaluation.nextQuestion);
135
+ const normalized = await this.service.evaluate({
136
+ projectId: this.projectId,
137
+ state: withNextQuestion,
138
+ });
139
+ const saved = await this.service.upsertState({
140
+ projectId: this.projectId,
141
+ state: normalized.state,
142
+ });
143
+ const state = saved.state ?? normalized.state;
144
+ const evaluation = await this.service.evaluate({
145
+ projectId: this.projectId,
146
+ state,
147
+ });
148
+
149
+ this.openPanel();
150
+ return {
151
+ systemMessage: this.buildSystemMessage(state, evaluation),
152
+ state,
153
+ evaluation,
154
+ handledLocally: true,
155
+ statusMessage: this.buildStatusMessage(state, evaluation),
156
+ };
157
+ }
158
+
159
+ private buildStateDraft(
160
+ existing: ProjectPlanningState | null,
161
+ prompt: string,
162
+ options: {
163
+ readonly startsPlanning: boolean;
164
+ readonly answeredQuestion: ProjectPlanningQuestion | null;
165
+ readonly approved: boolean;
166
+ },
167
+ ): Partial<ProjectPlanningState> {
168
+ const now = this.now();
169
+ const openQuestions = [...(existing?.openQuestions ?? [])];
170
+ const answeredQuestions = [...(existing?.answeredQuestions ?? [])];
171
+ if (options.answeredQuestion) {
172
+ const idx = openQuestions.findIndex((question) => question.id === options.answeredQuestion?.id);
173
+ if (idx >= 0) openQuestions.splice(idx, 1);
174
+ if (!answeredQuestions.some((question) => question.id === options.answeredQuestion?.id && question.answer === prompt)) {
175
+ answeredQuestions.push({
176
+ ...options.answeredQuestion,
177
+ status: 'answered',
178
+ answer: prompt,
179
+ answeredAt: now,
180
+ });
181
+ }
182
+ }
183
+
184
+ const knownContext = new Set(existing?.knownContext ?? []);
185
+ knownContext.add(`Workspace: ${this.workingDirectory}`);
186
+ if (options.startsPlanning && existing?.goal && prompt !== existing.goal) {
187
+ knownContext.add(`Latest planning request: ${prompt}`);
188
+ }
189
+
190
+ const draft: Partial<ProjectPlanningState> = {
191
+ ...(existing ?? {}),
192
+ projectId: this.projectId,
193
+ goal: existing?.goal?.trim() ? existing.goal : prompt,
194
+ knownContext: [...knownContext],
195
+ openQuestions,
196
+ answeredQuestions,
197
+ executionApproved: existing?.executionApproved === true || options.approved,
198
+ metadata: {
199
+ ...(existing?.metadata ?? {}),
200
+ active: true,
201
+ owner: 'tui',
202
+ source: 'conversation',
203
+ lastPromptAt: now,
204
+ },
205
+ };
206
+ return this.applyPlanningAnswer(draft, prompt, options.answeredQuestion, {
207
+ startsPlanning: options.startsPlanning,
208
+ approved: options.approved,
209
+ });
210
+ }
211
+
212
+ private applyPlanningAnswer(
213
+ state: Partial<ProjectPlanningState>,
214
+ prompt: string,
215
+ question: ProjectPlanningQuestion | null,
216
+ options: {
217
+ readonly startsPlanning: boolean;
218
+ readonly approved: boolean;
219
+ },
220
+ ): Partial<ProjectPlanningState> {
221
+ if (!question) return state;
222
+
223
+ const acceptDefault = this.acceptsDefault(prompt);
224
+ const questionId = question.id.toLowerCase();
225
+ const questionText = question.prompt.toLowerCase();
226
+ const existingGoal = (state.goal ?? prompt).trim();
227
+ const generic = acceptDefault || this.isGenericPlanningRecommendation(prompt);
228
+ let next: Partial<ProjectPlanningState> = { ...state };
229
+
230
+ if (questionId.includes('scope') || questionText.includes('scope') || questionText.includes('in or out')) {
231
+ next = {
232
+ ...next,
233
+ scope: generic ? this.defaultScope(existingGoal) : this.normalizeScopeAnswer(existingGoal, prompt),
234
+ };
235
+ }
236
+
237
+ if (
238
+ questionId.includes('task') ||
239
+ questionText.includes('task') ||
240
+ questionId.includes('dependency') ||
241
+ questionText.includes('dependency') ||
242
+ questionId.includes('verification') ||
243
+ questionText.includes('verification') ||
244
+ (acceptDefault && this.hasStructuralPlanningGaps(next))
245
+ ) {
246
+ next = this.withDefaultExecutionPlan(next, existingGoal);
247
+ if (!generic && !questionId.includes('scope')) {
248
+ next = this.addKnownContext(next, `Planning answer: ${prompt}`);
249
+ }
250
+ }
251
+
252
+ if (questionId.includes('approve') || questionText.includes('approve') || questionText.includes('execution')) {
253
+ next = {
254
+ ...next,
255
+ executionApproved: true,
256
+ metadata: {
257
+ ...(next.metadata ?? {}),
258
+ approvedAt: this.now(),
259
+ approvedFrom: 'planning-answer',
260
+ },
261
+ };
262
+ }
263
+
264
+ if (acceptDefault && this.isGoAhead(prompt)) {
265
+ next = this.withDefaultExecutionPlan({
266
+ ...next,
267
+ scope: next.scope ?? this.defaultScope(existingGoal),
268
+ executionApproved: true,
269
+ metadata: {
270
+ ...(next.metadata ?? {}),
271
+ approvedAt: this.now(),
272
+ approvedFrom: 'planning-go-ahead',
273
+ },
274
+ }, existingGoal);
275
+ }
276
+
277
+ return next;
278
+ }
279
+
280
+ private normalizeScopeAnswer(goal: string, answer: string): string {
281
+ const trimmed = answer.trim();
282
+ if (!trimmed) return this.defaultScope(goal);
283
+ if (/^scope\s+is\b/i.test(trimmed)) return trimmed;
284
+ return `Scope for "${goal}": ${trimmed}`;
285
+ }
286
+
287
+ private defaultScope(goal: string): string {
288
+ const cleanGoal = goal.trim() || 'the requested change';
289
+ return [
290
+ `First pass: make "${cleanGoal}" work end-to-end for the primary local TUI workflow.`,
291
+ 'Include the minimum TUI, daemon wiring, configuration persistence, documentation, and verification required for the feature to actually work.',
292
+ 'Exclude unrelated cleanup, broad refactors, polish-only changes, third-party integrations, and advanced distributed behavior unless they directly block the primary workflow.',
293
+ ].join(' ');
294
+ }
295
+
296
+ private withDefaultExecutionPlan(
297
+ state: Partial<ProjectPlanningState>,
298
+ goal: string,
299
+ ): Partial<ProjectPlanningState> {
300
+ const tasks = state.tasks && state.tasks.length > 0 ? [...state.tasks] : this.defaultTasks(goal);
301
+ const verificationGates = state.verificationGates && state.verificationGates.length > 0
302
+ ? [...state.verificationGates]
303
+ : this.defaultVerificationGates(goal);
304
+ const dependencies = state.dependencies && state.dependencies.length > 0
305
+ ? [...state.dependencies]
306
+ : this.defaultDependencies();
307
+ const agentAssignments = state.agentAssignments && state.agentAssignments.length > 0
308
+ ? [...state.agentAssignments]
309
+ : this.defaultAgentAssignments();
310
+ return {
311
+ ...state,
312
+ scope: state.scope ?? this.defaultScope(goal),
313
+ tasks,
314
+ verificationGates,
315
+ dependencies,
316
+ agentAssignments,
317
+ };
318
+ }
319
+
320
+ private defaultTasks(goal: string): ProjectPlanningTask[] {
321
+ const cleanGoal = goal.trim() || 'requested change';
322
+ return [
323
+ {
324
+ id: 'inspect-current-flow',
325
+ title: `Inspect the current paths for ${cleanGoal}`,
326
+ why: 'Planning must start from the actual code and runtime behavior, not assumptions.',
327
+ status: 'pending',
328
+ verification: ['Identify the relevant files, commands, config keys, and runtime path before editing.'],
329
+ canRunConcurrently: false,
330
+ needsReview: false,
331
+ recommendedAgent: 'explorer',
332
+ },
333
+ {
334
+ id: 'implement-core-behavior',
335
+ title: `Implement the core ${cleanGoal} behavior`,
336
+ why: 'This is the minimum product behavior required for the requested outcome to work.',
337
+ status: 'pending',
338
+ dependencies: ['inspect-current-flow'],
339
+ verification: ['Focused tests cover the changed behavior and fail without the implementation.'],
340
+ canRunConcurrently: false,
341
+ needsReview: true,
342
+ recommendedAgent: 'worker',
343
+ },
344
+ {
345
+ id: 'wire-user-surface',
346
+ title: `Wire the user-facing path for ${cleanGoal}`,
347
+ why: 'The feature must be reachable through the intended TUI/daemon/config surface, not just internal code.',
348
+ status: 'pending',
349
+ dependencies: ['implement-core-behavior'],
350
+ verification: ['A command, panel, route, or setting path exercises the behavior from the user-facing entry point.'],
351
+ canRunConcurrently: false,
352
+ needsReview: true,
353
+ recommendedAgent: 'worker',
354
+ },
355
+ {
356
+ id: 'verify-release-readiness',
357
+ title: `Verify ${cleanGoal} end-to-end`,
358
+ why: 'The plan is not complete until the user-facing path and regression tests prove it works.',
359
+ status: 'pending',
360
+ dependencies: ['implement-core-behavior', 'wire-user-surface'],
361
+ verification: ['Run focused tests plus the relevant type/build/smoke checks for the touched area.'],
362
+ canRunConcurrently: false,
363
+ needsReview: false,
364
+ recommendedAgent: 'none',
365
+ },
366
+ ];
367
+ }
368
+
369
+ private defaultDependencies(): ProjectPlanningDependency[] {
370
+ return [
371
+ { fromTaskId: 'inspect-current-flow', toTaskId: 'implement-core-behavior', reason: 'Implementation depends on knowing the current code path.' },
372
+ { fromTaskId: 'implement-core-behavior', toTaskId: 'wire-user-surface', reason: 'The user-facing surface should call the implemented behavior.' },
373
+ { fromTaskId: 'implement-core-behavior', toTaskId: 'verify-release-readiness', reason: 'Verification needs the implementation in place.' },
374
+ { fromTaskId: 'wire-user-surface', toTaskId: 'verify-release-readiness', reason: 'Verification must include the reachable user path.' },
375
+ ];
376
+ }
377
+
378
+ private defaultVerificationGates(goal: string): ProjectPlanningVerificationGate[] {
379
+ const cleanGoal = goal.trim() || 'requested change';
380
+ return [
381
+ {
382
+ id: 'focused-regression',
383
+ description: `Focused regression coverage proves "${cleanGoal}" works and prevents the observed failure from returning.`,
384
+ status: 'pending',
385
+ required: true,
386
+ },
387
+ {
388
+ id: 'typecheck',
389
+ description: 'TypeScript/build validation passes for the touched code.',
390
+ command: 'bunx tsc --noEmit',
391
+ status: 'pending',
392
+ required: true,
393
+ },
394
+ {
395
+ id: 'runtime-smoke',
396
+ description: 'A user-facing runtime smoke exercises the changed path when feasible.',
397
+ status: 'pending',
398
+ required: true,
399
+ },
400
+ ];
401
+ }
402
+
403
+ private defaultAgentAssignments(): ProjectPlanningAgentAssignment[] {
404
+ return [
405
+ {
406
+ taskId: 'inspect-current-flow',
407
+ agentType: 'explorer',
408
+ expectedOutput: 'Concrete files, state transitions, and failure path that must change.',
409
+ canRunConcurrently: false,
410
+ },
411
+ {
412
+ taskId: 'implement-core-behavior',
413
+ agentType: 'worker',
414
+ expectedOutput: 'Patch implementing the core behavior with focused tests.',
415
+ verification: 'Review the patch against the original request and regression test.',
416
+ canRunConcurrently: false,
417
+ },
418
+ {
419
+ taskId: 'wire-user-surface',
420
+ agentType: 'worker',
421
+ expectedOutput: 'Patch wiring the behavior through the intended user-facing surface.',
422
+ verification: 'Verify the UI/command/route actually exercises the new behavior.',
423
+ canRunConcurrently: false,
424
+ },
425
+ ];
426
+ }
427
+
428
+ private addKnownContext(state: Partial<ProjectPlanningState>, entry: string): Partial<ProjectPlanningState> {
429
+ const knownContext = new Set(state.knownContext ?? []);
430
+ knownContext.add(entry);
431
+ return { ...state, knownContext: [...knownContext] };
432
+ }
433
+
434
+ private hasStructuralPlanningGaps(state: Partial<ProjectPlanningState>): boolean {
435
+ return !state.scope || (state.tasks?.length ?? 0) === 0 || (state.verificationGates?.length ?? 0) === 0;
436
+ }
437
+
438
+ private recordNextQuestion(
439
+ state: Partial<ProjectPlanningState>,
440
+ question: ProjectPlanningQuestion | undefined,
441
+ ): Partial<ProjectPlanningState> {
442
+ if (!question) return state;
443
+ const answered = new Set((state.answeredQuestions ?? []).map((entry) => entry.id));
444
+ if (answered.has(question.id)) return state;
445
+ const openQuestions = [...(state.openQuestions ?? [])];
446
+ const existingIndex = openQuestions.findIndex((entry) => entry.id === question.id);
447
+ const normalized = { ...question, status: question.status ?? 'open' } satisfies ProjectPlanningQuestion;
448
+ if (existingIndex >= 0) openQuestions[existingIndex] = normalized;
449
+ else openQuestions.unshift(normalized);
450
+ return {
451
+ ...state,
452
+ openQuestions,
453
+ };
454
+ }
455
+
456
+ private buildSystemMessage(
457
+ state: ProjectPlanningState,
458
+ evaluation: ProjectPlanningEvaluation,
459
+ ): string {
460
+ const nextQuestion = evaluation.nextQuestion;
461
+ const gaps = evaluation.gaps
462
+ .slice(0, 8)
463
+ .map((gap) => `- ${gap.severity}: ${gap.kind} - ${gap.message}`)
464
+ .join('\n') || '- none';
465
+ const tasks = state.tasks
466
+ .map((task) => `- ${task.id}: ${task.title}`)
467
+ .join('\n') || '- none recorded yet';
468
+ const recentAnswers = state.answeredQuestions
469
+ .slice(-3)
470
+ .map((question) => `- ${question.prompt}\n Answer: ${question.answer ?? '(no answer recorded)'}`)
471
+ .join('\n') || '- none recorded yet';
472
+
473
+ return [
474
+ 'TUI-owned project planning loop is active for this turn.',
475
+ 'Do not execute code changes, spawn agents, or claim implementation is complete unless the user explicitly approves execution after the plan is structurally ready.',
476
+ 'Be relentless and thorough: challenge vague wording, inspect relevant context before proposing execution, and ask exactly one focused question when information is missing.',
477
+ 'Do not ask broad questions like "what is in scope?" without examples. Break broad planning gaps into concrete choices, explain tradeoffs, and recommend a default the user can accept or correct.',
478
+ '',
479
+ `Project id: ${this.projectId}`,
480
+ `Knowledge space: ${state.knowledgeSpaceId}`,
481
+ `Readiness: ${evaluation.readiness}`,
482
+ `Execution approved: ${state.executionApproved ? 'yes' : 'no'}`,
483
+ `Goal: ${state.goal || '(missing)'}`,
484
+ state.scope ? `Scope: ${state.scope}` : 'Scope: (missing)',
485
+ '',
486
+ 'Readiness gaps:',
487
+ gaps,
488
+ '',
489
+ 'Recent answered planning questions:',
490
+ recentAnswers,
491
+ '',
492
+ 'Recorded tasks:',
493
+ tasks,
494
+ '',
495
+ nextQuestion
496
+ ? `Resolve this next planning gap. If this wording is broad, turn it into a smaller concrete multiple-choice question before asking: ${nextQuestion.prompt}`
497
+ : 'If the plan is structurally ready, summarize the plan and ask for explicit execution approval. Do not start execution yourself.',
498
+ ].join('\n');
499
+ }
500
+
501
+ private buildStatusMessage(
502
+ state: ProjectPlanningState,
503
+ evaluation: ProjectPlanningEvaluation,
504
+ ): string {
505
+ const nextQuestion = evaluation.nextQuestion?.prompt;
506
+ const taskCount = state.tasks.length;
507
+ const gateCount = state.verificationGates.length;
508
+ const approved = state.executionApproved ? 'approved' : 'not approved';
509
+ if (evaluation.readiness === 'executable') {
510
+ return `[Planning] Updated plan: ${taskCount} task(s), ${gateCount} verification gate(s), execution ${approved}.`;
511
+ }
512
+ return `[Planning] Updated plan: ${taskCount} task(s), ${gateCount} verification gate(s). Next: ${nextQuestion ?? 'review the plan.'}`;
513
+ }
514
+
515
+ private isActive(state: ProjectPlanningState | null): boolean {
516
+ return state?.metadata?.['active'] === true && state.executionApproved !== true;
517
+ }
518
+
519
+ private firstOpenQuestion(state: ProjectPlanningState | null): ProjectPlanningQuestion | null {
520
+ return state?.openQuestions.find((question) => (question.status ?? 'open') === 'open') ?? null;
521
+ }
522
+
523
+ private isCancel(text: string): boolean {
524
+ return CANCEL_PATTERNS.some((pattern) => pattern.test(text));
525
+ }
526
+
527
+ private isApproval(text: string): boolean {
528
+ return APPROVAL_PATTERNS.some((pattern) => pattern.test(text));
529
+ }
530
+
531
+ private acceptsDefault(text: string): boolean {
532
+ const trimmed = text.trim();
533
+ return ACCEPT_DEFAULT_PATTERNS.some((pattern) => pattern.test(trimmed));
534
+ }
535
+
536
+ private isGoAhead(text: string): boolean {
537
+ return /\b(go|go ahead|let'?s go|execute|start|approved?|approval granted)\b/i.test(text.trim());
538
+ }
539
+
540
+ private isGenericPlanningRecommendation(text: string): boolean {
541
+ return GENERIC_RECOMMENDATION_PATTERNS.some((pattern) => pattern.test(text));
542
+ }
543
+ }
@@ -0,0 +1,15 @@
1
+ export {
2
+ getUserPluginDirectory,
3
+ getPluginDirectories,
4
+ discoverPlugins,
5
+ loadPlugin,
6
+ unloadPlugin,
7
+ } from '@pellux/goodvibes-sdk/platform/plugins';
8
+ export type {
9
+ PluginPathOptions,
10
+ PluginManifest,
11
+ PluginEntryPoint,
12
+ LoadedPlugin,
13
+ DiscoveredPlugin,
14
+ PluginLoaderDeps,
15
+ } from '@pellux/goodvibes-sdk/platform/plugins';