@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,61 @@
1
+ // ---------------------------------------------------------------------------
2
+ // useConfirmState<T> — reusable inline y/n confirmation helper
3
+ //
4
+ // Pattern (chosen over ConfirmableListPanel base class):
5
+ // - Composable: any panel holds a ConfirmState field, not a new base class
6
+ // - Identical y/n UX everywhere: y confirms, n/Esc cancels, any other key
7
+ // is absorbed (does nothing) while confirm is active
8
+ // - Render: caller calls renderConfirmLines(width, state) to get the two
9
+ // lines that replace the normal content area when confirming
10
+ // ---------------------------------------------------------------------------
11
+
12
+ import type { Line } from '../types/grid.ts';
13
+ import { buildPanelLine } from './polish.ts';
14
+ import { DEFAULT_PANEL_PALETTE } from './polish.ts';
15
+
16
+ export interface ConfirmState<T = string> {
17
+ /** The subject of the confirmation (e.g. item name or id). */
18
+ readonly subject: T;
19
+ /** Human-readable label for the item being destroyed. */
20
+ readonly label: string;
21
+ }
22
+
23
+ /**
24
+ * Call this from a panel's handleInput() BEFORE any other key handling.
25
+ *
26
+ * Returns:
27
+ * - `'confirmed'` — user pressed y; caller must execute the action and
28
+ * clear state (set confirm to null)
29
+ * - `'cancelled'` — user pressed n or Esc; caller must clear state
30
+ * - `'absorbed'` — any other key while confirm is active; caller returns true
31
+ * - `'inactive'` — no confirm pending; caller continues normal dispatch
32
+ */
33
+ export function handleConfirmInput<T = string>(
34
+ confirm: ConfirmState<T> | null,
35
+ key: string,
36
+ ): 'confirmed' | 'cancelled' | 'absorbed' | 'inactive' {
37
+ if (!confirm) return 'inactive';
38
+ if (key === 'y') return 'confirmed';
39
+ if (key === 'n' || key === 'escape') return 'cancelled';
40
+ return 'absorbed';
41
+ }
42
+
43
+ /**
44
+ * Build the two confirmation lines to show in place of the normal list body.
45
+ * Callers embed these lines in a workspace section titled 'Confirmation'.
46
+ */
47
+ export function renderConfirmLines<T = string>(width: number, state: ConfirmState<T>): Line[] {
48
+ const palette = DEFAULT_PANEL_PALETTE;
49
+ return [
50
+ buildPanelLine(width, [[
51
+ ` Delete "${state.label}"?`,
52
+ palette.warn,
53
+ ]]),
54
+ buildPanelLine(width, [
55
+ [' y', palette.info],
56
+ [' confirm delete', palette.dim],
57
+ [' n / Esc', palette.info],
58
+ [' cancel', palette.dim],
59
+ ]),
60
+ ];
61
+ }
@@ -0,0 +1,204 @@
1
+ // ---------------------------------------------------------------------------
2
+ // ContextVisualizerPanel — stacked bar showing context window composition.
3
+ // ---------------------------------------------------------------------------
4
+
5
+ import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
6
+ import type { Line } from '../types/grid.ts';
7
+ import { BasePanel } from './base-panel.ts';
8
+ import { evaluateSessionMaintenance } from '@/runtime/index.ts';
9
+ import type { TurnEvent } from '@/runtime/index.ts';
10
+ import type { UiEventFeed } from '../runtime/ui-events.ts';
11
+ import type { UiReadModel, UiSessionSnapshot } from '../runtime/ui-read-models.ts';
12
+ import type { SessionMemoryQuery } from '../runtime/ui-service-queries.ts';
13
+ import {
14
+ buildEmptyState,
15
+ buildGuidanceLine,
16
+ buildMeterLine,
17
+ buildPanelLine,
18
+ buildStyledPanelLine,
19
+ buildPanelWorkspace,
20
+ DEFAULT_PANEL_PALETTE,
21
+ } from './polish.ts';
22
+
23
+ const C = {
24
+ convFg: '#cc99ff',
25
+ overFg: '#ff6666',
26
+ barEmpty: '#333344',
27
+ labelFg: '#8888bb',
28
+ } as const;
29
+
30
+
31
+
32
+ interface ContextSnapshot {
33
+ input: number;
34
+ limit: number;
35
+ }
36
+
37
+ function formatK(n: number): string {
38
+ if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;
39
+ return String(n);
40
+ }
41
+
42
+ export class ContextVisualizerPanel extends BasePanel {
43
+ private snapshot: ContextSnapshot = { input: 0, limit: 0 };
44
+ private unsubs: Array<() => void> = [];
45
+ private readonly sessionMemoryStore: SessionMemoryQuery;
46
+
47
+ constructor(
48
+ private readonly turnEvents: UiEventFeed<TurnEvent>,
49
+ sessionMemoryStore: SessionMemoryQuery,
50
+ private readonly configManager: Pick<ConfigManager, 'get'>,
51
+ private getUsage?: () => { input: number; output: number; cacheRead: number; cacheWrite: number; model?: string },
52
+ private contextLimit?: number,
53
+ private sessionReadModel?: UiReadModel<UiSessionSnapshot>,
54
+ ) {
55
+ super('context', 'Context', 'C', 'ai');
56
+ this.sessionMemoryStore = sessionMemoryStore;
57
+ this._attachBus();
58
+ this._refresh();
59
+ }
60
+
61
+ override onActivate(): void {
62
+ this.needsRender = true;
63
+ this._refresh();
64
+ }
65
+
66
+ override onDeactivate(): void {
67
+ super.onDeactivate();
68
+ }
69
+
70
+ override onDestroy(): void {
71
+ this._detachBus();
72
+ }
73
+
74
+ render(width: number, height: number): Line[] {
75
+ return this.trackedRender(() => {
76
+ if (height <= 0 || width <= 0) return [];
77
+
78
+ const input = this.snapshot.input;
79
+ const limit = this.snapshot.limit;
80
+ const pct = limit > 0 ? Math.min(100, Math.round((input / limit) * 100)) : 0;
81
+ const barWidth = Math.max(1, width - 2);
82
+ const overLimit = limit > 0 && input > limit;
83
+ const fg = overLimit ? C.overFg : C.convFg;
84
+ if (limit <= 0) {
85
+ return buildPanelWorkspace(width, height, {
86
+ title: ' Context Usage',
87
+ intro: 'Visualize current input-token pressure against the active model context window.',
88
+ sections: [
89
+ {
90
+ lines: buildEmptyState(
91
+ width,
92
+ ' Context limit unavailable',
93
+ 'Select a model with a known context window and submit or complete a turn to populate live context usage.',
94
+ [],
95
+ DEFAULT_PANEL_PALETTE,
96
+ ),
97
+ },
98
+ ],
99
+ palette: DEFAULT_PANEL_PALETTE,
100
+ });
101
+ }
102
+
103
+ return buildPanelWorkspace(width, height, {
104
+ title: ' Context Usage',
105
+ intro: 'Visualize current input-token pressure against the active model context window.',
106
+ sections: [
107
+ {
108
+ title: 'Summary',
109
+ lines: [
110
+ buildPanelLine(width, [
111
+ [' Input ', DEFAULT_PANEL_PALETTE.label],
112
+ [formatK(input), DEFAULT_PANEL_PALETTE.value],
113
+ [' Limit ', DEFAULT_PANEL_PALETTE.label],
114
+ [formatK(limit), DEFAULT_PANEL_PALETTE.info],
115
+ [' Fill ', DEFAULT_PANEL_PALETTE.label],
116
+ [`${pct}%`, overLimit ? DEFAULT_PANEL_PALETTE.bad : DEFAULT_PANEL_PALETTE.good],
117
+ ]),
118
+ ],
119
+ },
120
+ {
121
+ title: 'Usage',
122
+ lines: [
123
+ this._renderBar(width, barWidth, input, limit),
124
+ this._renderSegLine(width, 'Input tokens', input, pct, fg),
125
+ buildPanelLine(width, [[` ${formatK(input)} / ${formatK(limit)} tokens (${pct}%) Refreshes each LLM call`, DEFAULT_PANEL_PALETTE.dim]]),
126
+ ],
127
+ },
128
+ {
129
+ title: 'Maintenance',
130
+ lines: this._renderMaintenance(width),
131
+ },
132
+ ],
133
+ palette: DEFAULT_PANEL_PALETTE,
134
+ });
135
+ });
136
+ }
137
+
138
+ private _renderBar(width: number, barWidth: number, input: number, limit: number): Line {
139
+ const filled = limit > 0 ? Math.min(barWidth, Math.round((input / limit) * barWidth)) : 0;
140
+ const overLimit = limit > 0 && input > limit;
141
+ const barFg = overLimit ? C.overFg : C.convFg;
142
+ return buildMeterLine(width, filled, barWidth, {
143
+ filled: barFg,
144
+ empty: C.barEmpty,
145
+ label: DEFAULT_PANEL_PALETTE.dim,
146
+ });
147
+ }
148
+
149
+ private _renderSegLine(width: number, label: string, val: number, pct: number, fg: string): Line {
150
+ const labelPadded = ` ${label}`.padEnd(22);
151
+ const valStr = formatK(val).padStart(7);
152
+ const pctStr = `${pct}%`.padStart(5);
153
+ return buildStyledPanelLine(width, [
154
+ { text: labelPadded, fg: C.labelFg },
155
+ { text: valStr, fg },
156
+ { text: ' ', fg: DEFAULT_PANEL_PALETTE.dim },
157
+ { text: pctStr, fg },
158
+ ]);
159
+ }
160
+
161
+ private _refresh(): void {
162
+ const usage = this.getUsage?.();
163
+ if (usage) {
164
+ this.snapshot.input = usage.input;
165
+ this.snapshot.limit = this.contextLimit ?? 0;
166
+ }
167
+ this.markDirty();
168
+ }
169
+
170
+ private _renderMaintenance(width: number): Line[] {
171
+ const status = evaluateSessionMaintenance({
172
+ configManager: this.configManager,
173
+ currentTokens: this.snapshot.input,
174
+ contextWindow: this.snapshot.limit,
175
+ sessionMemoryCount: this.sessionMemoryStore.list().length,
176
+ session: this.sessionReadModel?.getSnapshot().session,
177
+ });
178
+ const lines: Line[] = [
179
+ buildPanelLine(width, [[` ${status.summary}`, DEFAULT_PANEL_PALETTE.label]]),
180
+ ];
181
+ if (status.reasons[0]) {
182
+ lines.push(buildPanelLine(width, [[` ${status.reasons[0]}`, DEFAULT_PANEL_PALETTE.dim]]));
183
+ }
184
+ if (status.guidanceMode !== 'off' && status.nextSteps[0]) {
185
+ lines.push(buildGuidanceLine(width, status.nextSteps[0], 'open the suggested maintenance action', DEFAULT_PANEL_PALETTE));
186
+ }
187
+ return lines;
188
+ }
189
+
190
+ private _attachBus(): void {
191
+ if (this.unsubs.length > 0) return;
192
+ this.unsubs.push(this.turnEvents.on('TURN_COMPLETED', () => {
193
+ this._refresh();
194
+ }));
195
+ this.unsubs.push(this.turnEvents.on('TURN_SUBMITTED', () => {
196
+ this._refresh();
197
+ }));
198
+ }
199
+
200
+ private _detachBus(): void {
201
+ for (const unsub of this.unsubs) unsub();
202
+ this.unsubs = [];
203
+ }
204
+ }
@@ -0,0 +1,211 @@
1
+ import type { Line } from '../types/grid.ts';
2
+ import { createEmptyLine } from '../types/grid.ts';
3
+ import { ScrollableListPanel } from './scrollable-list-panel.ts';
4
+ import type { UiControlPlaneSnapshot, UiReadModel } from '../runtime/ui-read-models.ts';
5
+ import { truncateDisplay } from '../utils/terminal-width.ts';
6
+ import {
7
+ buildEmptyState,
8
+ buildGuidanceLine,
9
+ buildKeyValueLine,
10
+ buildPanelLine,
11
+ buildPanelWorkspace,
12
+ DEFAULT_PANEL_PALETTE,
13
+ type PanelPalette,
14
+ } from './polish.ts';
15
+
16
+ const C = {
17
+ ...DEFAULT_PANEL_PALETTE,
18
+ header: '#94a3b8',
19
+ headerBg: '#1e293b',
20
+ ok: '#22c55e',
21
+ warn: '#eab308',
22
+ error: '#ef4444',
23
+ info: '#38bdf8',
24
+ selectBg: '#0f172a',
25
+ } as const;
26
+
27
+ function formatTime(value?: number): string {
28
+ if (!value) return 'n/a';
29
+ return new Date(value).toLocaleString();
30
+ }
31
+
32
+ function connectionColor(state: string): string {
33
+ if (state === 'connected' || state === 'healthy') return C.ok;
34
+ if (state === 'degraded' || state === 'connecting' || state === 'initializing') return C.warn;
35
+ if (state === 'terminal_failure') return C.error;
36
+ return C.dim;
37
+ }
38
+
39
+ type ControlPlaneClient = UiControlPlaneSnapshot['clients'][number];
40
+
41
+ export class ControlPlanePanel extends ScrollableListPanel<ControlPlaneClient> {
42
+ private readonly unsub: (() => void) | null;
43
+
44
+ public constructor(private readonly readModel?: UiReadModel<UiControlPlaneSnapshot>) {
45
+ super('control-plane', 'Control Plane', 'C', 'monitoring');
46
+ this.showSelectionGutter = true; // I5: non-color selection affordance
47
+ this.unsub = readModel ? readModel.subscribe(() => this.markDirty()) : null;
48
+ }
49
+
50
+ public override onDestroy(): void {
51
+ this.unsub?.();
52
+ }
53
+
54
+ protected override getPalette(): PanelPalette {
55
+ return C;
56
+ }
57
+
58
+ protected getItems(): readonly ControlPlaneClient[] {
59
+ if (!this.readModel) return [];
60
+ return this.readModel.getSnapshot().clients;
61
+ }
62
+
63
+ protected renderItem(client: ControlPlaneClient, _index: number, selected: boolean, width: number): Line {
64
+ const bg = selected ? C.selectBg : undefined;
65
+ return buildPanelLine(width, [
66
+ [' ', C.label, bg],
67
+ [client.kind.padEnd(10), C.info, bg],
68
+ [` ${truncateDisplay(client.label, 20).padEnd(20)}`, C.value, bg],
69
+ [` ${client.transport.padEnd(12)}`, C.dim, bg],
70
+ [` ${truncateDisplay(formatTime(client.lastSeenAt), Math.max(0, width - 46))}`, C.dim, bg],
71
+ ]);
72
+ }
73
+
74
+ protected override getEmptyStateMessage(): string {
75
+ return ' No control-plane activity recorded.';
76
+ }
77
+
78
+ protected override getEmptyStateActions(): Array<{ command: string; summary: string }> {
79
+ return [
80
+ { command: '/cockpit', summary: 'watch operator posture from the terminal' },
81
+ { command: '/schedule list', summary: 'inspect externally managed automation without starting jobs here' },
82
+ ];
83
+ }
84
+
85
+ public render(width: number, height: number): Line[] {
86
+ const intro = 'Shared daemon control plane state, live clients, approval pressure, and recent omnichannel session posture.';
87
+
88
+ if (!this.readModel) {
89
+ const workspace = buildPanelWorkspace(width, height, {
90
+ title: 'Control Plane',
91
+ intro,
92
+ sections: [{
93
+ lines: buildEmptyState(
94
+ width,
95
+ ' Runtime read model not wired.',
96
+ 'This panel needs the shared control-plane read model to inspect clients, requests, and approvals.',
97
+ [{ command: '/cockpit', summary: 'use the cockpit while control-plane wiring is unavailable' }],
98
+ C,
99
+ ),
100
+ }],
101
+ palette: C,
102
+ });
103
+ while (workspace.length < height) workspace.push(createEmptyLine(width));
104
+ return workspace;
105
+ }
106
+
107
+ const snapshot = this.readModel.getSnapshot();
108
+ const approvals = snapshot.approvals;
109
+ const sessions = snapshot.sessions;
110
+ const recentEvents = snapshot.recentEvents;
111
+ const clients = this.getItems();
112
+
113
+ const headerLines: Line[] = [
114
+ buildKeyValueLine(width, [
115
+ { label: 'state', value: snapshot.connectionState, valueColor: connectionColor(snapshot.connectionState) },
116
+ { label: 'clients', value: String(snapshot.activeClientIds.length), valueColor: snapshot.activeClientIds.length > 0 ? C.ok : C.dim },
117
+ { label: 'requests', value: String(snapshot.requestCount), valueColor: snapshot.requestCount > 0 ? C.info : C.dim },
118
+ { label: 'errors', value: String(snapshot.errorCount), valueColor: snapshot.errorCount > 0 ? C.error : C.dim },
119
+ ], C),
120
+ buildKeyValueLine(width, [
121
+ { label: 'host', value: `${snapshot.host}:${snapshot.port}`, valueColor: C.value },
122
+ { label: 'approvals', value: String(approvals.filter((entry) => entry.status === 'pending').length), valueColor: approvals.some((entry) => entry.status === 'pending') ? C.warn : C.dim },
123
+ { label: 'sessions', value: String(sessions.length), valueColor: sessions.length > 0 ? C.info : C.dim },
124
+ { label: 'events', value: String(recentEvents.length), valueColor: recentEvents.length > 0 ? C.info : C.dim },
125
+ ], C),
126
+ buildGuidanceLine(width, '/cockpit', 'use the web operator surface or daemon APIs for direct interventions while this panel tracks overall posture', C),
127
+ ];
128
+
129
+ if (clients.length === 0 && approvals.length === 0 && sessions.length === 0) {
130
+ return this.renderList(width, height, {
131
+ title: 'Control Plane',
132
+ header: headerLines,
133
+ emptyMessage: ' No control-plane activity recorded.',
134
+ });
135
+ }
136
+
137
+ this.clampSelection();
138
+ const selected = clients[this.selectedIndex];
139
+
140
+ const footerLines: Line[] = [];
141
+ if (selected) {
142
+ footerLines.push(
143
+ buildPanelLine(width, [
144
+ [' Client: ', C.label],
145
+ [selected.label, C.value],
146
+ [' Kind: ', C.label],
147
+ [selected.kind, C.info],
148
+ ]),
149
+ buildPanelLine(width, [
150
+ [' Transport: ', C.label],
151
+ [selected.transport, C.value],
152
+ [' Connected: ', C.label],
153
+ [selected.connected ? 'yes' : 'no', selected.connected ? C.ok : C.warn],
154
+ ]),
155
+ buildPanelLine(width, [
156
+ [' Route: ', C.label],
157
+ [selected.routeId ?? 'n/a', C.dim],
158
+ [' Session: ', C.label],
159
+ [selected.sessionId ?? 'n/a', C.dim],
160
+ ]),
161
+ buildPanelLine(width, [
162
+ [' Last seen: ', C.label],
163
+ [formatTime(selected.lastSeenAt), C.dim],
164
+ [' Remote: ', C.label],
165
+ [truncateDisplay(selected.remoteAddress ?? 'n/a', Math.max(0, width - 36)), C.dim],
166
+ ]),
167
+ );
168
+ } else {
169
+ footerLines.push(buildPanelLine(width, [[' No connected client selected.', C.dim]]));
170
+ }
171
+
172
+ if (approvals.length > 0) {
173
+ footerLines.push(
174
+ ...approvals.slice(0, 6).map((approval) => buildPanelLine(width, [
175
+ [' ', C.label],
176
+ [approval.status.padEnd(10), approval.status === 'pending' ? C.warn : approval.status === 'approved' ? C.ok : approval.status === 'denied' ? C.error : C.dim],
177
+ [` ${truncateDisplay(approval.request.tool, 16).padEnd(16)}`, C.value],
178
+ [` ${truncateDisplay(approval.sessionId ?? approval.id, Math.max(0, width - 30))}`, C.dim],
179
+ ])),
180
+ );
181
+ }
182
+
183
+ if (sessions.length > 0) {
184
+ footerLines.push(
185
+ ...sessions.slice(0, 6).map((session) => buildPanelLine(width, [
186
+ [' ', C.label],
187
+ [session.status.padEnd(10), session.status === 'active' ? C.ok : C.dim],
188
+ [` ${truncateDisplay(session.title, 20).padEnd(20)}`, C.value],
189
+ [` ${truncateDisplay(session.activeAgentId ?? session.id, Math.max(0, width - 34))}`, C.dim],
190
+ ])),
191
+ );
192
+ }
193
+
194
+ if (recentEvents.length > 0) {
195
+ footerLines.push(
196
+ ...recentEvents.slice(0, 6).map((event) => buildPanelLine(width, [
197
+ [' ', C.label],
198
+ [truncateDisplay(event.event, 16).padEnd(16), C.info],
199
+ [` ${truncateDisplay(typeof event.payload === 'string' ? event.payload : JSON.stringify(event.payload) ?? '', Math.max(0, width - 19))}`, C.dim],
200
+ ])),
201
+ );
202
+ }
203
+ footerLines.push(buildPanelLine(width, [[' Up/Down move through connected clients', C.dim]]));
204
+
205
+ return this.renderList(width, height, {
206
+ title: 'Control Plane',
207
+ header: headerLines,
208
+ footer: footerLines,
209
+ });
210
+ }
211
+ }