@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,551 @@
1
+ import { InfiniteBuffer } from './history.ts';
2
+ import { createEmptyLine, type Line, type Cell } from '../types/grid.ts';
3
+ import type { SplashOptions } from '../utils/splash-lines.ts';
4
+ import type { ToolCall, ToolResult } from '@pellux/goodvibes-sdk/platform/types';
5
+ import type { ProviderMessage, ContentPart } from '@pellux/goodvibes-sdk/platform/providers';
6
+ import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
7
+ import type { TranscriptEventKind } from '@pellux/goodvibes-sdk/platform/core';
8
+ import {
9
+ ConversationManager as SdkConversationManager,
10
+ type BlockMeta as SdkBlockMeta,
11
+ } from '@pellux/goodvibes-sdk/platform/core';
12
+ import {
13
+ addConversationSplashScreen,
14
+ appendConversationMessages,
15
+ conversationTextToLines,
16
+ logConversationText,
17
+ renderConversationAssistantMessage,
18
+ renderConversationSystemMessage,
19
+ renderConversationToolMessage,
20
+ renderConversationUserMessage,
21
+ } from './conversation-rendering.ts';
22
+ import { renderMarkdown } from '../renderer/markdown.ts';
23
+
24
+ /**
25
+ * ConversationManager - TUI subclass of the SDK's ConversationManager.
26
+ * Adds InfiniteBuffer history, block registry, collapse state, width tracking,
27
+ * dirty flag, display methods, splash screen, error/event navigation, and
28
+ * Line[]-based rendering atop the SDK's message management.
29
+ */
30
+
31
+ // Re-export SDK types for backward compatibility
32
+ export type {
33
+ TokenUsage,
34
+ ConversationMessageSnapshot,
35
+ ConversationTitleSource,
36
+ } from '@pellux/goodvibes-sdk/platform/core';
37
+
38
+ export type { SdkBlockMeta };
39
+
40
+ /** TUI extends the SDK BlockMeta with rendering position fields. */
41
+ export interface BlockMeta extends SdkBlockMeta {
42
+ /** Index of this block (increments per renderable block). */
43
+ blockIndex: number;
44
+ /** First rendered line index in the history buffer. */
45
+ startLine: number;
46
+ /** Number of rendered lines (when not collapsed). */
47
+ lineCount: number;
48
+ /** Stable key for collapse state persistence across rebuilds (e.g. msg_N). */
49
+ collapseKey: string;
50
+ }
51
+
52
+ // Import internal types needed for rendering helpers
53
+ import type { ConversationMessageSnapshot } from '@pellux/goodvibes-sdk/platform/core';
54
+ type Message = ConversationMessageSnapshot;
55
+
56
+ export class ConversationManager extends SdkConversationManager {
57
+ public history = new InfiniteBuffer();
58
+ private _getWidth: () => number;
59
+ /** Tracks the rendered width; a change invalidates the full history. */
60
+ private lastRenderedWidth = 0;
61
+ /** When true the buffer needs to be rebuilt before the next display. */
62
+ private dirty = true;
63
+ /** Index of the first message not yet appended to the buffer. */
64
+ private appendedUpTo = 0;
65
+ /** Optional config manager for display settings. */
66
+ private _configManager: ConfigManager | null = null;
67
+ /** Collapse state: stable key (msg_N) -> collapsed (true = collapsed). */
68
+ private collapseState: Map<string, boolean> = new Map();
69
+ /** Block registry: track rendered blocks for copy/apply. */
70
+ protected blockRegistry: BlockMeta[] = [];
71
+ /** Message index -> first rendered line index in the history buffer. */
72
+ private messageLineRegistry: number[] = [];
73
+ /** Registry of rendered line indices for system messages matching /error/i. */
74
+ private errorLineRegistry: number[] = [];
75
+ /** Streaming block start line in history buffer (for incremental streaming update). */
76
+ private streamingStartLine = -1;
77
+ /**
78
+ * Message index at the time of the last clearDisplay() call.
79
+ * rebuildHistory() renders only messages at or after this index, so the
80
+ * display stays blank for messages added before the clear while LLM history
81
+ * is fully preserved. Reset to 0 on resetAll() or rebuildHistory() width change.
82
+ */
83
+ private _displayFromMessageIndex = 0;
84
+
85
+ public suppressSplash: boolean = false;
86
+ public splashOptions: SplashOptions = {};
87
+
88
+ constructor(
89
+ getWidth: () => number = () => process.stdout.columns || 80,
90
+ configManager?: ConfigManager,
91
+ ) {
92
+ super();
93
+ this._getWidth = getWidth;
94
+ this._configManager = configManager ?? null;
95
+ }
96
+
97
+ /** Wire in a config manager after construction (e.g. from main.ts). */
98
+ public setConfigManager(cm: ConfigManager): void {
99
+ this._configManager = cm;
100
+ }
101
+
102
+ /** Update the width provider so shell layout can own transcript width. */
103
+ public setWidthProvider(getWidth: () => number): void {
104
+ this._getWidth = getWidth;
105
+ this.markDirty();
106
+ }
107
+
108
+ // -------------------------------------------------------------------------
109
+ // Overrides: add markDirty() to message mutations
110
+ // -------------------------------------------------------------------------
111
+
112
+ public override addUserMessage(content: string | ContentPart[]): void {
113
+ super.addUserMessage(content);
114
+ this.markDirty();
115
+ }
116
+
117
+ public override addAssistantMessage(
118
+ content: string,
119
+ opts?: {
120
+ toolCalls?: ToolCall[];
121
+ reasoningContent?: string;
122
+ reasoningSummary?: string;
123
+ usage?: import('@pellux/goodvibes-sdk/platform/core').TokenUsage;
124
+ model?: string;
125
+ provider?: string;
126
+ },
127
+ ): void {
128
+ super.addAssistantMessage(content, opts);
129
+ this.markDirty();
130
+ }
131
+
132
+ public override addToolResults(results: ToolResult[]): void {
133
+ super.addToolResults(results);
134
+ this.markDirty();
135
+ }
136
+
137
+ public override addSystemMessage(content: string): void {
138
+ super.addSystemMessage(content);
139
+ this.markDirty();
140
+ }
141
+
142
+ public override undo(): boolean {
143
+ const result = super.undo();
144
+ if (result) this.markDirty();
145
+ return result;
146
+ }
147
+
148
+ public override redo(): boolean {
149
+ const result = super.redo();
150
+ if (result) this.markDirty();
151
+ return result;
152
+ }
153
+
154
+ public override removeMessagesAfter(count: number): void {
155
+ super.removeMessagesAfter(count);
156
+ this.markDirty();
157
+ }
158
+
159
+ public override markLastUserMessageCancelled(): void {
160
+ super.markLastUserMessageCancelled();
161
+ this.markDirty();
162
+ }
163
+
164
+ // -------------------------------------------------------------------------
165
+ // Streaming overrides: add rendering tracking
166
+ // -------------------------------------------------------------------------
167
+
168
+ /**
169
+ * startStreamingBlock - Add a placeholder assistant message for incremental display.
170
+ * Called when streaming begins.
171
+ */
172
+ public override startStreamingBlock(): void {
173
+ super.startStreamingBlock();
174
+ this.markDirty();
175
+ // Record the line where the streaming block starts so updates can be incremental
176
+ this.flushHistory();
177
+ this.streamingStartLine = this.history.getLineCount();
178
+ }
179
+
180
+ /**
181
+ * updateStreamingBlock - Update the in-progress streaming block with accumulated content.
182
+ * Called per-delta during streaming. Does NOT trigger a full rebuild — instead it
183
+ * directly updates the history buffer from streamingStartLine onward.
184
+ */
185
+ public override updateStreamingBlock(content: string): void {
186
+ super.updateStreamingBlock(content);
187
+ // Incrementally update the history buffer instead of full rebuild
188
+ if (this.streamingStartLine >= 0) {
189
+ const width = this._getWidth();
190
+ this.history.truncateToLine(this.streamingStartLine);
191
+ const rendered = renderMarkdown(content, width);
192
+ this.history.addLines(rendered);
193
+ }
194
+ }
195
+
196
+ /**
197
+ * finalizeStreamingBlock - Remove the streaming placeholder.
198
+ * The orchestrator calls addAssistantMessage immediately after with the final content.
199
+ */
200
+ public override finalizeStreamingBlock(): void {
201
+ super.finalizeStreamingBlock();
202
+ this.streamingStartLine = -1;
203
+ this.markDirty();
204
+ }
205
+
206
+ // -------------------------------------------------------------------------
207
+ // Overrides: reset / replace / branch operations that also affect display
208
+ // -------------------------------------------------------------------------
209
+
210
+ /**
211
+ * resetAll - Clear both the display buffer and all conversation messages.
212
+ * This is a full reset; the LLM context is wiped.
213
+ */
214
+ public override resetAll(): void {
215
+ super.resetAll();
216
+ this.history.clear();
217
+ this.appendedUpTo = 0;
218
+ this.lastRenderedWidth = 0;
219
+ this.dirty = true;
220
+ this.collapseState.clear();
221
+ this.blockRegistry = [];
222
+ this.messageLineRegistry = [];
223
+ this.errorLineRegistry = [];
224
+ this.streamingStartLine = -1;
225
+ this._displayFromMessageIndex = 0; // full reset — show everything on next render
226
+ }
227
+
228
+ /**
229
+ * replaceMessagesForLLM - Replace the conversation's LLM-visible messages with a new set.
230
+ * Used by small-window compaction to swap in truncated messages without an LLM call.
231
+ * System messages are always preserved at the front.
232
+ *
233
+ * @param newMessages - Replacement ProviderMessage array (user/assistant/tool roles only)
234
+ */
235
+ public override replaceMessagesForLLM(newMessages: ProviderMessage[]): void {
236
+ super.replaceMessagesForLLM(newMessages);
237
+ this.history.clear();
238
+ this.appendedUpTo = 0;
239
+ this.lastRenderedWidth = 0;
240
+ this.dirty = true;
241
+ }
242
+
243
+ /**
244
+ * switchBranch - Replace the active messages with the stored branch snapshot.
245
+ * Returns true on success, false if the branch does not exist.
246
+ */
247
+ public override switchBranch(name: string): boolean {
248
+ const result = super.switchBranch(name);
249
+ if (result) this.markDirty();
250
+ return result;
251
+ }
252
+
253
+ /**
254
+ * mergeBranch - Append all messages from the named branch that come after
255
+ * the fork point.
256
+ * Returns true on success, false if the branch does not exist.
257
+ */
258
+ public override mergeBranch(name: string): boolean {
259
+ const result = super.mergeBranch(name);
260
+ if (result) this.markDirty();
261
+ return result;
262
+ }
263
+
264
+ /**
265
+ * fromJSON - Restore conversation from persisted data.
266
+ */
267
+ public override fromJSON(data: {
268
+ messages: Message[];
269
+ branches?: Record<string, Message[]>;
270
+ currentBranch?: string;
271
+ title?: string;
272
+ titleSource?: import('@pellux/goodvibes-sdk/platform/core').ConversationTitleSource;
273
+ }): void {
274
+ super.fromJSON(data);
275
+ this.history.clear();
276
+ this.appendedUpTo = 0;
277
+ this.lastRenderedWidth = 0;
278
+ this.dirty = true;
279
+ }
280
+
281
+ // -------------------------------------------------------------------------
282
+ // TUI-only display methods
283
+ // -------------------------------------------------------------------------
284
+
285
+ public getDisplayBlocks(): Line[] {
286
+ this.flushHistory();
287
+ return this.history.getAllLines();
288
+ }
289
+
290
+ /**
291
+ * rebuildHistory - Full rebuild. Called when width changes or on first render.
292
+ * For incremental appends use flushHistory().
293
+ */
294
+ public rebuildHistory(): void {
295
+ this.history.clear();
296
+ this.appendedUpTo = 0;
297
+ this.blockRegistry = [];
298
+ this.messageLineRegistry = [];
299
+ this.errorLineRegistry = [];
300
+ const width = this._getWidth();
301
+ this.lastRenderedWidth = width;
302
+ this.dirty = false;
303
+
304
+ const snapshot = this.getMessageSnapshot();
305
+ // When _displayFromMessageIndex > 0, clearDisplay() was called. Only render
306
+ // messages added after the clear — the pre-clear history stays off-screen.
307
+ // On a full rebuild (e.g. width change), reset the display-start to 0 so the
308
+ // user can scroll back to the full history if needed.
309
+ const displayStart = this._displayFromMessageIndex;
310
+ const visibleSnapshot = displayStart > 0 ? snapshot.slice(displayStart) : snapshot;
311
+
312
+ // Tool messages ARE rendered (as collapsed blocks); this filter is only
313
+ // for determining whether to show the splash screen (tool-only messages
314
+ // don't count as visible conversation content for splash purposes).
315
+ const displayMessages = visibleSnapshot.filter(
316
+ (m) => m.role !== 'tool' && m.role !== 'system',
317
+ );
318
+
319
+ if (displayMessages.length === 0 && displayStart === 0 && !this.suppressSplash) {
320
+ this.addSplashScreen(width);
321
+ return;
322
+ }
323
+
324
+ this.appendMessages(visibleSnapshot, width);
325
+ this.appendedUpTo = snapshot.length;
326
+ }
327
+
328
+ /**
329
+ * flushHistory - Incremental update. Appends only newly added messages.
330
+ * Falls back to a full rebuild when the terminal width has changed.
331
+ */
332
+ public flushHistory(): void {
333
+ const currentWidth = this._getWidth();
334
+ if (!this.dirty && currentWidth === this.lastRenderedWidth) return;
335
+ this.rebuildHistory();
336
+ }
337
+
338
+ private markDirty(): void {
339
+ this.dirty = true;
340
+ }
341
+
342
+ private renderingContext() {
343
+ return {
344
+ history: this.history,
345
+ blockRegistry: this.blockRegistry,
346
+ collapseState: this.collapseState,
347
+ errorLineRegistry: this.errorLineRegistry,
348
+ configManager: this._configManager,
349
+ splashOptions: this.splashOptions,
350
+ };
351
+ }
352
+
353
+ private renderUserMessage(message: Extract<Message, { role: 'user' }>, width: number): void {
354
+ renderConversationUserMessage(this.renderingContext(), message, width);
355
+ }
356
+
357
+ private renderAssistantMessage(
358
+ message: Extract<Message, { role: 'assistant' }>,
359
+ width: number,
360
+ lineNumberMode: 'all' | 'code' | 'off',
361
+ collapseThreshold: number,
362
+ msgIdx: number,
363
+ ): void {
364
+ renderConversationAssistantMessage(this.renderingContext(), message, width, lineNumberMode, collapseThreshold, msgIdx);
365
+ }
366
+
367
+ private renderSystemMessage(message: Extract<Message, { role: 'system' }>, width: number): void {
368
+ renderConversationSystemMessage(this.renderingContext(), message, width);
369
+ }
370
+
371
+ private renderToolMessage(message: Extract<Message, { role: 'tool' }>, width: number, msgIdx: number): void {
372
+ renderConversationToolMessage(this.renderingContext(), message, width, msgIdx);
373
+ }
374
+
375
+ /** Render a slice of messages into the history buffer. */
376
+ private appendMessages(messages: Message[], width: number): void {
377
+ appendConversationMessages(this.renderingContext(), messages, width, this.messageLineRegistry);
378
+ }
379
+
380
+ /** Find the nearest block to a given line index, optionally filtered by type. */
381
+ public findNearestBlock(lineIndex: number, typeFilter?: string): BlockMeta | null {
382
+ let nearest: BlockMeta | null = null;
383
+ let nearestDist = Infinity;
384
+ for (const block of this.blockRegistry) {
385
+ if (typeFilter !== undefined && block.type !== typeFilter) continue;
386
+ if (lineIndex >= block.startLine && lineIndex < block.startLine + block.lineCount) {
387
+ return block;
388
+ }
389
+ const dist = Math.abs(block.startLine - lineIndex);
390
+ if (dist < nearestDist) {
391
+ nearestDist = dist;
392
+ nearest = block;
393
+ }
394
+ }
395
+ return nearest;
396
+ }
397
+
398
+ /**
399
+ * isCollapsed - Returns whether the block at blockIndex is collapsed.
400
+ */
401
+ public isCollapsed(blockIndex: number): boolean {
402
+ const block = this.blockRegistry[blockIndex];
403
+ if (!block) return false;
404
+ return this.collapseState.get(block.collapseKey) ?? false;
405
+ }
406
+
407
+ /**
408
+ * getBlockContentAtLine - Find the nearest block to the given line index.
409
+ * Returns the raw content of the block, or null if not found.
410
+ */
411
+ public getBlockContentAtLine(lineIndex: number): string | null {
412
+ return this.findNearestBlock(lineIndex)?.rawContent ?? null;
413
+ }
414
+
415
+ /**
416
+ * getDiffAtLine - Find the diff block nearest the given line index.
417
+ * Returns file path and original/updated content for applying.
418
+ */
419
+ public getDiffAtLine(lineIndex: number): { filePath: string; original: string; updated: string } | null {
420
+ const nearest = this.findNearestBlock(lineIndex, 'diff');
421
+ if (!nearest || !nearest.filePath) return null;
422
+ return {
423
+ filePath: nearest.filePath,
424
+ original: nearest.diffOriginal ?? '',
425
+ updated: nearest.diffUpdated ?? '',
426
+ };
427
+ }
428
+
429
+ /**
430
+ * toggleCollapseAtLine - Toggle the collapse state of the nearest block to the given line.
431
+ * Triggers a rebuild. Returns the blockIndex toggled, or -1 if none found.
432
+ */
433
+ public toggleCollapseAtLine(lineIndex: number): number {
434
+ const nearest = this.findNearestBlock(lineIndex);
435
+ if (!nearest) return -1;
436
+ const current = this.collapseState.get(nearest.collapseKey) ?? false;
437
+ this.collapseState.set(nearest.collapseKey, !current);
438
+ this.markDirty();
439
+ return nearest.blockIndex;
440
+ }
441
+
442
+ /** Returns a read-only view of the block registry for external consumers. */
443
+ public getBlockRegistry(): readonly BlockMeta[] {
444
+ return this.blockRegistry;
445
+ }
446
+
447
+ /**
448
+ * getErrorLines - Returns line indices in the rendered history buffer for
449
+ * system messages that contain 'error' (case-insensitive).
450
+ * Triggers a history flush if dirty.
451
+ */
452
+ public getErrorLines(): number[] {
453
+ this.flushHistory();
454
+ return [...this.errorLineRegistry];
455
+ }
456
+
457
+ /**
458
+ * nextErrorLine - Find the next error line after currentLine (wraps around).
459
+ * Returns -1 if there are no error lines.
460
+ */
461
+ public nextErrorLine(currentLine: number): number {
462
+ const errors = this.getErrorLines();
463
+ if (errors.length === 0) return -1;
464
+ const after = errors.find(l => l > currentLine);
465
+ return after ?? errors[0];
466
+ }
467
+
468
+ /**
469
+ * prevErrorLine - Find the previous error line before currentLine (wraps around).
470
+ * Returns -1 if there are no error lines.
471
+ */
472
+ public prevErrorLine(currentLine: number): number {
473
+ const errors = this.getErrorLines();
474
+ if (errors.length === 0) return -1;
475
+ const before = [...errors].reverse().find(l => l < currentLine);
476
+ return before ?? errors[errors.length - 1];
477
+ }
478
+
479
+ public nextTranscriptEventLine(currentLine: number, kind: TranscriptEventKind | 'all' = 'all'): number {
480
+ this.flushHistory();
481
+ const index = this.getTranscriptEventIndex();
482
+ const events = kind === 'all' ? index.events : index.events.filter((event) => event.kind === kind);
483
+ if (events.length === 0) return -1;
484
+ const lines = events
485
+ .map((event) => this.messageLineRegistry[event.messageIndex] ?? -1)
486
+ .filter((line) => line >= 0)
487
+ .sort((a, b) => a - b);
488
+ if (lines.length === 0) return -1;
489
+ const after = lines.find((line) => line > currentLine);
490
+ return after ?? lines[0]!;
491
+ }
492
+
493
+ public prevTranscriptEventLine(currentLine: number, kind: TranscriptEventKind | 'all' = 'all'): number {
494
+ this.flushHistory();
495
+ const index = this.getTranscriptEventIndex();
496
+ const events = kind === 'all' ? index.events : index.events.filter((event) => event.kind === kind);
497
+ if (events.length === 0) return -1;
498
+ const lines = events
499
+ .map((event) => this.messageLineRegistry[event.messageIndex] ?? -1)
500
+ .filter((line) => line >= 0)
501
+ .sort((a, b) => a - b);
502
+ if (lines.length === 0) return -1;
503
+ const before = [...lines].reverse().find((line) => line < currentLine);
504
+ return before ?? lines[lines.length - 1]!;
505
+ }
506
+
507
+ public setSplashSuppressed(suppressed: boolean): void {
508
+ if (this.suppressSplash === suppressed) return;
509
+ this.suppressSplash = suppressed;
510
+ this.markDirty();
511
+ }
512
+
513
+ private addSplashScreen(width: number): void {
514
+ addConversationSplashScreen(this.renderingContext(), width);
515
+ }
516
+
517
+ public textToLines(text: string, width: number, style: Partial<Cell> = {}): Line[] {
518
+ return conversationTextToLines(text, width, style);
519
+ }
520
+
521
+ public log(text: string, style: Partial<Cell> = {}, indent = ' '): void {
522
+ logConversationText(this.renderingContext(), this._getWidth(), text, style, indent);
523
+ }
524
+
525
+ /**
526
+ * clearDisplay - Clear the visual history buffer without touching the LLM context messages.
527
+ * The next render will show a blank conversation area. Subsequent message additions
528
+ * rebuild the display incrementally from that point forward.
529
+ *
530
+ * Contract:
531
+ * - getDisplayBlocks() returns an empty array immediately after this call.
532
+ * - getMessageSnapshot() is unaffected — full LLM history is preserved.
533
+ * - resetAll() (which clears both display and messages) continues to work.
534
+ * - rebuildHistory() can be called by callers that need a full display rebuild.
535
+ */
536
+ public clearDisplay(): void {
537
+ this.history.clear();
538
+ this.blockRegistry = [];
539
+ this.messageLineRegistry = [];
540
+ this.errorLineRegistry = [];
541
+ // Advance _displayFromMessageIndex to exclude all current messages from display.
542
+ // rebuildHistory() will only render messages added AFTER this point.
543
+ this._displayFromMessageIndex = this.getMessageSnapshot().length;
544
+ this.appendedUpTo = this._displayFromMessageIndex;
545
+ this.dirty = false;
546
+ // Do NOT re-render here — display stays blank until the next message is added.
547
+ // The lastRenderedWidth is kept so subsequent appends use the correct width.
548
+ }
549
+ }
550
+
551
+ export { parseDiffForApply, applyDiffContent } from '@pellux/goodvibes-sdk/platform/core';
@@ -0,0 +1,45 @@
1
+ import { type Line, createEmptyLine } from '../types/grid.ts';
2
+
3
+ /**
4
+ * InfiniteBuffer - Manages the complete conversation history as a list of lines.
5
+ */
6
+ export class InfiniteBuffer {
7
+ private lines: Line[] = [];
8
+
9
+ public addLine(line: Line): void {
10
+ this.lines.push(line);
11
+ }
12
+
13
+ public addLines(lines: Line[]): void {
14
+ this.lines.push(...lines);
15
+ }
16
+
17
+ public getLineCount(): number {
18
+ return this.lines.length;
19
+ }
20
+
21
+ public getAllLines(): Line[] {
22
+ return this.lines;
23
+ }
24
+
25
+ public getSnapshot(startLine: number, height: number, width: number): Line[] {
26
+ const end = Math.min(this.lines.length, startLine + height);
27
+ const slice = this.lines.slice(startLine, end);
28
+
29
+ while (slice.length < height) {
30
+ slice.unshift(createEmptyLine(width));
31
+ }
32
+
33
+ return slice;
34
+ }
35
+
36
+ public clear(): void {
37
+ this.lines = [];
38
+ }
39
+
40
+ public truncateToLine(lineIndex: number): void {
41
+ if (lineIndex >= 0 && lineIndex < this.lines.length) {
42
+ this.lines.length = lineIndex;
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,7 @@
1
+ // Thin TUI wrapper — re-exports the SDK Orchestrator unchanged.
2
+ // The SDK class already contains all behaviour including getSpinner().
3
+ export {
4
+ Orchestrator,
5
+ type OrchestratorOptions,
6
+ type OrchestratorUserInputOptions,
7
+ } from '@pellux/goodvibes-sdk/platform/core';