@pellux/goodvibes-tui 0.18.4 → 0.18.9

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 (571) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/README.md +2 -2
  3. package/bin/goodvibes +1 -1
  4. package/bin/goodvibes-daemon +66 -0
  5. package/docs/foundation-artifacts/operator-contract.json +1 -1
  6. package/package.json +14 -7
  7. package/scripts/postinstall.js +220 -0
  8. package/src/acp/connection.ts +5 -5
  9. package/src/acp/index.ts +1 -1
  10. package/src/acp/manager.ts +1 -133
  11. package/src/adapters/bluebubbles/index.ts +1 -1
  12. package/src/adapters/discord/index.ts +2 -2
  13. package/src/adapters/github/index.ts +1 -1
  14. package/src/adapters/google-chat/index.ts +1 -1
  15. package/src/adapters/imessage/index.ts +1 -1
  16. package/src/adapters/index.ts +15 -15
  17. package/src/adapters/matrix/index.ts +1 -1
  18. package/src/adapters/mattermost/index.ts +1 -1
  19. package/src/adapters/msteams/index.ts +2 -2
  20. package/src/adapters/ntfy/index.ts +1 -1
  21. package/src/adapters/signal/index.ts +1 -1
  22. package/src/adapters/slack/index.ts +2 -2
  23. package/src/adapters/telegram/index.ts +1 -1
  24. package/src/adapters/types.ts +4 -4
  25. package/src/adapters/webhook/index.ts +1 -1
  26. package/src/adapters/whatsapp/index.ts +1 -1
  27. package/src/agents/message-bus-core.ts +2 -2
  28. package/src/agents/message-bus.ts +2 -2
  29. package/src/agents/orchestrator-prompts.ts +4 -4
  30. package/src/agents/orchestrator-runner.ts +11 -11
  31. package/src/agents/orchestrator.ts +15 -14
  32. package/src/agents/session.ts +1 -1
  33. package/src/agents/worktree.ts +1 -1
  34. package/src/agents/wrfc-config.ts +2 -2
  35. package/src/agents/wrfc-controller.ts +12 -12
  36. package/src/agents/wrfc-gate-runtime.ts +5 -5
  37. package/src/agents/wrfc-reporting.ts +1 -1
  38. package/src/agents/wrfc-runtime-events.ts +3 -3
  39. package/src/agents/wrfc-types.ts +1 -1
  40. package/src/automation/delivery-manager.ts +4 -4
  41. package/src/automation/index.ts +4 -4
  42. package/src/automation/manager-runtime-delivery.ts +1 -1
  43. package/src/automation/manager-runtime-events.ts +3 -3
  44. package/src/automation/manager-runtime-execution.ts +5 -5
  45. package/src/automation/manager-runtime-helpers.ts +2 -2
  46. package/src/automation/manager-runtime-job-mutations.ts +3 -3
  47. package/src/automation/manager-runtime-reconcile.ts +4 -4
  48. package/src/automation/manager-runtime-scheduling.ts +2 -2
  49. package/src/automation/manager-runtime.ts +18 -18
  50. package/src/automation/manager.ts +2 -2
  51. package/src/automation/service.ts +2 -2
  52. package/src/channels/builtin/account-actions.ts +5 -5
  53. package/src/channels/builtin/accounts.ts +2 -2
  54. package/src/channels/builtin/contracts.ts +3 -3
  55. package/src/channels/builtin/plugins.ts +5 -5
  56. package/src/channels/builtin/rendering.ts +4 -4
  57. package/src/channels/builtin/setup-schema.ts +1 -1
  58. package/src/channels/builtin/shared.ts +7 -7
  59. package/src/channels/builtin/surfaces.ts +2 -2
  60. package/src/channels/builtin/targets.ts +3 -3
  61. package/src/channels/builtin-runtime.ts +11 -11
  62. package/src/channels/delivery/shared.ts +2 -2
  63. package/src/channels/delivery/strategies-bridge.ts +3 -3
  64. package/src/channels/delivery/strategies-core.ts +5 -5
  65. package/src/channels/delivery/strategies-enterprise.ts +3 -3
  66. package/src/channels/delivery/types.ts +2 -2
  67. package/src/channels/delivery-router.ts +9 -9
  68. package/src/channels/index.ts +12 -12
  69. package/src/channels/plugin-registry.ts +1 -1
  70. package/src/channels/provider-runtime.ts +3 -3
  71. package/src/channels/reply-pipeline.ts +3 -3
  72. package/src/channels/route-manager.ts +2 -2
  73. package/src/channels/surface-registry.ts +2 -2
  74. package/src/config/helper-model.ts +1 -233
  75. package/src/config/index.ts +3 -3
  76. package/src/config/manager.ts +8 -404
  77. package/src/config/secrets.ts +21 -542
  78. package/src/config/service-registry.ts +1 -329
  79. package/src/config/tool-llm.ts +3 -3
  80. package/src/control-plane/approval-broker.ts +1 -1
  81. package/src/control-plane/gateway.ts +1 -713
  82. package/src/control-plane/index.ts +7 -7
  83. package/src/control-plane/media-contract-schemas.ts +1 -208
  84. package/src/control-plane/method-catalog-admin.ts +1 -136
  85. package/src/control-plane/method-catalog-channels.ts +1 -591
  86. package/src/control-plane/method-catalog-control-automation.ts +1 -475
  87. package/src/control-plane/method-catalog-control-core.ts +1 -594
  88. package/src/control-plane/method-catalog-control.ts +1 -8
  89. package/src/control-plane/method-catalog-events.ts +1 -74
  90. package/src/control-plane/method-catalog-knowledge.ts +1 -531
  91. package/src/control-plane/method-catalog-media.ts +1 -279
  92. package/src/control-plane/method-catalog-runtime.ts +1 -304
  93. package/src/control-plane/method-catalog-shared.ts +1 -223
  94. package/src/control-plane/method-catalog.ts +1 -242
  95. package/src/control-plane/operator-contract-schemas-admin.ts +1 -639
  96. package/src/control-plane/operator-contract-schemas-channels.ts +1 -375
  97. package/src/control-plane/operator-contract-schemas-control.ts +1 -226
  98. package/src/control-plane/operator-contract-schemas-domains.ts +1 -4
  99. package/src/control-plane/operator-contract-schemas-knowledge.ts +1 -582
  100. package/src/control-plane/operator-contract-schemas-media.ts +1 -297
  101. package/src/control-plane/operator-contract-schemas-permissions.ts +1 -100
  102. package/src/control-plane/operator-contract-schemas-remote.ts +1 -38
  103. package/src/control-plane/operator-contract-schemas-runtime.ts +1 -563
  104. package/src/control-plane/operator-contract-schemas-shared.ts +1 -85
  105. package/src/control-plane/operator-contract-schemas-telemetry.ts +1 -349
  106. package/src/control-plane/operator-contract-schemas.ts +1 -6
  107. package/src/control-plane/operator-contract.ts +5 -3
  108. package/src/control-plane/session-broker.ts +1 -1
  109. package/src/core/compaction-sections.ts +5 -5
  110. package/src/core/compaction-types.ts +3 -3
  111. package/src/core/composer-state.ts +1 -1
  112. package/src/core/context-compaction.ts +7 -7
  113. package/src/core/conversation-compaction.ts +4 -4
  114. package/src/core/conversation-diff.ts +1 -1
  115. package/src/core/conversation-rendering.ts +5 -5
  116. package/src/core/conversation-utils.ts +2 -2
  117. package/src/core/conversation.ts +10 -10
  118. package/src/core/event-replay.ts +1 -1
  119. package/src/core/orchestrator-context-runtime.ts +8 -8
  120. package/src/core/orchestrator-follow-up-runtime.ts +2 -2
  121. package/src/core/orchestrator-runtime.ts +4 -4
  122. package/src/core/orchestrator-tool-runtime.ts +7 -7
  123. package/src/core/orchestrator-turn-helpers.ts +7 -7
  124. package/src/core/orchestrator-turn-loop.ts +10 -10
  125. package/src/core/orchestrator.ts +17 -17
  126. package/src/core/plan-command-handler.ts +2 -2
  127. package/src/core/system-message-router.ts +2 -2
  128. package/src/core/transcript-events/classify.ts +1 -1
  129. package/src/core/transcript-events/index.ts +3 -3
  130. package/src/daemon/cli.ts +6 -6
  131. package/src/daemon/control-plane.ts +7 -7
  132. package/src/daemon/facade-composition.ts +16 -15
  133. package/src/daemon/facade.ts +17 -17
  134. package/src/daemon/helpers.ts +2 -2
  135. package/src/daemon/http/router-route-contexts.ts +11 -11
  136. package/src/daemon/http/router.ts +25 -25
  137. package/src/daemon/http-listener.ts +3 -3
  138. package/src/daemon/index.ts +1 -3
  139. package/src/daemon/service-manager.ts +1 -1
  140. package/src/daemon/surface-actions.ts +8 -8
  141. package/src/daemon/surface-delivery.ts +7 -7
  142. package/src/daemon/surface-policy.ts +1 -1
  143. package/src/daemon/transport-events.ts +4 -4
  144. package/src/daemon/types.ts +24 -24
  145. package/src/export/markdown.ts +1 -1
  146. package/src/export/session-export.ts +1 -633
  147. package/src/git/index.ts +1 -1
  148. package/src/git/service.ts +1 -1
  149. package/src/hooks/chain-engine.ts +1 -1
  150. package/src/hooks/dispatcher.ts +4 -4
  151. package/src/hooks/hook-api.ts +1 -1
  152. package/src/hooks/index.ts +8 -8
  153. package/src/hooks/runners/agent.ts +1 -1
  154. package/src/hooks/runners/prompt.ts +1 -1
  155. package/src/hooks/workbench.ts +2 -2
  156. package/src/input/command-registry.ts +24 -17
  157. package/src/input/commands/config.ts +1 -1
  158. package/src/input/commands/control-room-runtime.ts +2 -2
  159. package/src/input/commands/conversation-runtime.ts +1 -1
  160. package/src/input/commands/discovery-runtime.ts +7 -1
  161. package/src/input/commands/eval.ts +2 -2
  162. package/src/input/commands/git-runtime.ts +1 -1
  163. package/src/input/commands/guidance-runtime.ts +3 -3
  164. package/src/input/commands/health-runtime.ts +7 -7
  165. package/src/input/commands/incident-runtime.ts +1 -1
  166. package/src/input/commands/integration-runtime.ts +3 -3
  167. package/src/input/commands/local-provider-runtime.ts +1 -1
  168. package/src/input/commands/local-runtime.ts +1 -1
  169. package/src/input/commands/local-setup-review.ts +2 -2
  170. package/src/input/commands/local-setup.ts +2 -2
  171. package/src/input/commands/managed-runtime.ts +2 -2
  172. package/src/input/commands/marketplace-runtime.ts +1 -1
  173. package/src/input/commands/platform-access-runtime.ts +1 -1
  174. package/src/input/commands/platform-sandbox-qemu.ts +3 -3
  175. package/src/input/commands/platform-sandbox-runtime.ts +5 -5
  176. package/src/input/commands/platform-sandbox-session.ts +1 -1
  177. package/src/input/commands/policy-dispatch.ts +2 -2
  178. package/src/input/commands/product-runtime.ts +2 -2
  179. package/src/input/commands/profile-sync-runtime.ts +1 -1
  180. package/src/input/commands/provider-accounts-runtime.ts +1 -1
  181. package/src/input/commands/provider.ts +3 -3
  182. package/src/input/commands/quit-shared.ts +1 -1
  183. package/src/input/commands/recall-bundle.ts +1 -1
  184. package/src/input/commands/recall-capture.ts +2 -2
  185. package/src/input/commands/recall-query.ts +2 -2
  186. package/src/input/commands/recall-shared.ts +1 -1
  187. package/src/input/commands/remote-runtime-setup.ts +1 -1
  188. package/src/input/commands/remote-runtime.ts +1 -1
  189. package/src/input/commands/runtime-services.ts +13 -11
  190. package/src/input/commands/schedule-runtime.ts +2 -2
  191. package/src/input/commands/session-content.ts +1 -1
  192. package/src/input/commands/session-workflow.ts +4 -4
  193. package/src/input/commands/settings-sync-runtime.ts +1 -1
  194. package/src/input/commands/share-runtime.ts +9 -4
  195. package/src/input/commands/shell-core.ts +1 -1
  196. package/src/input/commands/skills-runtime.ts +1 -1
  197. package/src/input/commands/subscription-runtime.ts +1 -1
  198. package/src/input/commands/tasks-runtime.ts +1 -1
  199. package/src/input/commands/teamwork-runtime.ts +1 -1
  200. package/src/input/commands/worktree-runtime.ts +1 -1
  201. package/src/input/handler-command-route.ts +1 -1
  202. package/src/input/handler-content-actions.ts +3 -3
  203. package/src/input/handler-feed-routes.ts +2 -2
  204. package/src/input/handler-feed.ts +1 -1
  205. package/src/input/handler-shortcuts.ts +1 -1
  206. package/src/input/handler.ts +1 -1
  207. package/src/input/keybindings.ts +5 -0
  208. package/src/input/model-picker.ts +2 -2
  209. package/src/input/profile-picker-modal.ts +1 -1
  210. package/src/input/session-picker-modal.ts +1 -1
  211. package/src/input/settings-modal.ts +4 -4
  212. package/src/integrations/index.ts +1 -1
  213. package/src/integrations/notifier.ts +1 -1
  214. package/src/integrations/webhooks.ts +1 -177
  215. package/src/knowledge/consolidation.ts +2 -2
  216. package/src/knowledge/graphql.ts +1 -1
  217. package/src/knowledge/index.ts +5 -5
  218. package/src/knowledge/ingest-compile.ts +3 -3
  219. package/src/knowledge/ingest-context.ts +1 -1
  220. package/src/knowledge/ingest-inputs.ts +4 -4
  221. package/src/knowledge/ingest.ts +1 -20
  222. package/src/knowledge/internal.ts +1 -1
  223. package/src/knowledge/knowledge-api.ts +7 -7
  224. package/src/knowledge/lint.ts +3 -3
  225. package/src/knowledge/memory-sync.ts +2 -2
  226. package/src/knowledge/packet.ts +3 -3
  227. package/src/knowledge/scheduling.ts +2 -2
  228. package/src/knowledge/service.ts +10 -10
  229. package/src/main.ts +11 -10
  230. package/src/mcp/index.ts +4 -4
  231. package/src/mcp/mcp-api.ts +1 -1
  232. package/src/mcp/registry.ts +1 -508
  233. package/src/media/builtin-image-understanding.ts +2 -2
  234. package/src/media/builtin-providers.ts +2 -2
  235. package/src/media/index.ts +1 -1
  236. package/src/multimodal/index.ts +1 -1
  237. package/src/multimodal/service.ts +2 -2
  238. package/src/panels/agent-inspector-panel.ts +2 -2
  239. package/src/panels/agent-logs-panel.ts +3 -3
  240. package/src/panels/approval-panel.ts +2 -2
  241. package/src/panels/builtin/operations.ts +3 -1
  242. package/src/panels/builtin/shared.ts +14 -14
  243. package/src/panels/context-visualizer-panel.ts +2 -2
  244. package/src/panels/cost-tracker-panel.ts +2 -2
  245. package/src/panels/debug-panel.ts +3 -3
  246. package/src/panels/git-panel.ts +1 -1
  247. package/src/panels/hooks-panel.ts +4 -4
  248. package/src/panels/knowledge-panel.ts +1 -1
  249. package/src/panels/marketplace-panel.ts +1 -1
  250. package/src/panels/mcp-panel.ts +1 -1
  251. package/src/panels/memory-panel.ts +2 -2
  252. package/src/panels/ops-control-panel.ts +2 -2
  253. package/src/panels/ops-strategy-panel.ts +2 -2
  254. package/src/panels/plugins-panel.ts +1 -1
  255. package/src/panels/policy-panel.ts +1 -1
  256. package/src/panels/provider-health-panel.ts +3 -3
  257. package/src/panels/provider-stats-panel.ts +2 -2
  258. package/src/panels/sandbox-panel.ts +3 -3
  259. package/src/panels/schedule-panel.ts +1 -1
  260. package/src/panels/settings-sync-panel.ts +1 -1
  261. package/src/panels/skills-panel.ts +28 -1
  262. package/src/panels/system-messages-panel.ts +1 -1
  263. package/src/panels/tasks-panel.ts +1 -1
  264. package/src/panels/thinking-panel.ts +2 -2
  265. package/src/panels/token-budget-panel.ts +1 -1
  266. package/src/panels/tool-inspector-panel.ts +2 -2
  267. package/src/panels/worktree-panel.ts +1 -1
  268. package/src/panels/wrfc-panel.ts +4 -4
  269. package/src/permissions/briefs/build.ts +1 -1
  270. package/src/permissions/manager.ts +1 -356
  271. package/src/permissions/prompt.ts +1 -1
  272. package/src/plugins/api.ts +9 -9
  273. package/src/plugins/loader.ts +8 -8
  274. package/src/plugins/manager.ts +5 -5
  275. package/src/providers/amazon-bedrock-mantle.ts +1 -1
  276. package/src/providers/amazon-bedrock.ts +1 -1
  277. package/src/providers/anthropic-compat.ts +4 -4
  278. package/src/providers/anthropic-sdk-provider.ts +5 -5
  279. package/src/providers/anthropic-vertex.ts +1 -1
  280. package/src/providers/anthropic.ts +4 -4
  281. package/src/providers/auto-register.ts +6 -6
  282. package/src/providers/builtin-catalog.ts +2 -2
  283. package/src/providers/builtin-registry.ts +15 -15
  284. package/src/providers/cache-planner.ts +2 -2
  285. package/src/providers/capabilities.ts +1 -601
  286. package/src/providers/custom-loader.ts +6 -6
  287. package/src/providers/discovered-compat.ts +7 -18
  288. package/src/providers/discovered-factory.ts +7 -7
  289. package/src/providers/discovered-traits.ts +1 -1
  290. package/src/providers/gemini.ts +4 -4
  291. package/src/providers/github-copilot.ts +4 -4
  292. package/src/providers/index.ts +1 -47
  293. package/src/providers/interface.ts +1 -1
  294. package/src/providers/llama-cpp.ts +4 -4
  295. package/src/providers/lm-studio-helpers.ts +1 -1
  296. package/src/providers/lm-studio.ts +4 -4
  297. package/src/providers/model-catalog-cache.ts +1 -1
  298. package/src/providers/model-catalog-notifications.ts +1 -1
  299. package/src/providers/model-catalog-synthetic.ts +2 -2
  300. package/src/providers/model-catalog.ts +7 -7
  301. package/src/providers/model-limits.ts +1 -280
  302. package/src/providers/ollama.ts +4 -4
  303. package/src/providers/openai-codex.ts +2 -2
  304. package/src/providers/openai-compat.ts +4 -4
  305. package/src/providers/openai.ts +3 -3
  306. package/src/providers/optimizer.ts +1 -381
  307. package/src/providers/provider-api.ts +1 -553
  308. package/src/providers/registry-helpers.ts +1 -1
  309. package/src/providers/registry-models.ts +2 -2
  310. package/src/providers/registry-types.ts +5 -5
  311. package/src/providers/registry.ts +1 -729
  312. package/src/providers/runtime-metadata.ts +1 -1
  313. package/src/providers/runtime-snapshot.ts +3 -3
  314. package/src/providers/synthetic.ts +3 -3
  315. package/src/providers/tier-prompts.ts +1 -1
  316. package/src/providers/tool-formats.ts +1 -1
  317. package/src/renderer/agent-detail-modal.ts +2 -2
  318. package/src/renderer/block-actions.ts +1 -1
  319. package/src/renderer/context-inspector.ts +1 -1
  320. package/src/renderer/conversation-layout.ts +1 -1
  321. package/src/renderer/conversation-overlays.ts +1 -1
  322. package/src/renderer/git-status.ts +1 -1
  323. package/src/renderer/live-tail-modal.ts +1 -1
  324. package/src/renderer/process-modal.ts +2 -2
  325. package/src/runtime/bootstrap-background.ts +18 -8
  326. package/src/runtime/bootstrap-command-context.ts +24 -24
  327. package/src/runtime/bootstrap-command-parts.ts +24 -24
  328. package/src/runtime/bootstrap-core.ts +12 -10
  329. package/src/runtime/bootstrap-helpers.ts +2 -2
  330. package/src/runtime/bootstrap-hook-bridge.ts +9 -9
  331. package/src/runtime/bootstrap-runtime-events.ts +4 -4
  332. package/src/runtime/bootstrap-services.ts +4 -4
  333. package/src/runtime/bootstrap-shell.ts +11 -11
  334. package/src/runtime/bootstrap.ts +28 -10
  335. package/src/runtime/compaction/index.ts +1 -90
  336. package/src/runtime/compaction/lifecycle.ts +1 -167
  337. package/src/runtime/compaction/manager.ts +11 -11
  338. package/src/runtime/compaction/quality-score.ts +1 -279
  339. package/src/runtime/compaction/resume-repair.ts +1 -183
  340. package/src/runtime/compaction/strategies/autocompact.ts +1 -65
  341. package/src/runtime/compaction/strategies/boundary-commit.ts +1 -106
  342. package/src/runtime/compaction/strategies/collapse.ts +1 -90
  343. package/src/runtime/compaction/strategies/index.ts +1 -23
  344. package/src/runtime/compaction/strategies/microcompact.ts +1 -74
  345. package/src/runtime/compaction/strategies/reactive.ts +1 -89
  346. package/src/runtime/compaction/types.ts +1 -221
  347. package/src/runtime/context.ts +10 -10
  348. package/src/runtime/diagnostics/actions.ts +1 -1
  349. package/src/runtime/diagnostics/index.ts +5 -5
  350. package/src/runtime/diagnostics/panels/agents.ts +2 -2
  351. package/src/runtime/diagnostics/panels/events.ts +2 -2
  352. package/src/runtime/diagnostics/panels/health.ts +2 -2
  353. package/src/runtime/diagnostics/panels/ops.ts +2 -2
  354. package/src/runtime/diagnostics/panels/policy.ts +2 -2
  355. package/src/runtime/diagnostics/panels/tasks.ts +2 -2
  356. package/src/runtime/diagnostics/panels/tool-calls.ts +2 -2
  357. package/src/runtime/diagnostics/provider.ts +1 -1
  358. package/src/runtime/ecosystem/recommendations.ts +1 -1
  359. package/src/runtime/emitters/agents.ts +2 -2
  360. package/src/runtime/emitters/automation.ts +2 -2
  361. package/src/runtime/emitters/communication.ts +2 -2
  362. package/src/runtime/emitters/compaction.ts +2 -2
  363. package/src/runtime/emitters/control-plane.ts +2 -2
  364. package/src/runtime/emitters/deliveries.ts +2 -2
  365. package/src/runtime/emitters/forensics.ts +2 -2
  366. package/src/runtime/emitters/index.ts +27 -27
  367. package/src/runtime/emitters/knowledge.ts +2 -2
  368. package/src/runtime/emitters/mcp.ts +2 -2
  369. package/src/runtime/emitters/ops.ts +2 -2
  370. package/src/runtime/emitters/orchestration.ts +2 -2
  371. package/src/runtime/emitters/permissions.ts +2 -2
  372. package/src/runtime/emitters/planner.ts +2 -2
  373. package/src/runtime/emitters/plugins.ts +2 -2
  374. package/src/runtime/emitters/providers.ts +2 -2
  375. package/src/runtime/emitters/routes.ts +2 -2
  376. package/src/runtime/emitters/security.ts +2 -2
  377. package/src/runtime/emitters/session.ts +2 -2
  378. package/src/runtime/emitters/surfaces.ts +2 -2
  379. package/src/runtime/emitters/tasks.ts +2 -2
  380. package/src/runtime/emitters/tools.ts +2 -2
  381. package/src/runtime/emitters/transport.ts +2 -2
  382. package/src/runtime/emitters/turn.ts +3 -3
  383. package/src/runtime/emitters/ui.ts +2 -2
  384. package/src/runtime/emitters/watchers.ts +2 -2
  385. package/src/runtime/emitters/workflows.ts +3 -3
  386. package/src/runtime/eval/index.ts +3 -3
  387. package/src/runtime/eval/runner.ts +1 -1
  388. package/src/runtime/eval/suites.ts +1 -1
  389. package/src/runtime/events/domain-map.ts +2 -2
  390. package/src/runtime/events/index.ts +1 -194
  391. package/src/runtime/events/turn.ts +1 -60
  392. package/src/runtime/events/workflows.ts +1 -17
  393. package/src/runtime/forensics/collector.ts +4 -4
  394. package/src/runtime/forensics/index.ts +1 -1
  395. package/src/runtime/foundation-clients.ts +14 -14
  396. package/src/runtime/foundation-services.ts +8 -8
  397. package/src/runtime/guidance.ts +3 -3
  398. package/src/runtime/health/effect-handlers.ts +3 -3
  399. package/src/runtime/health/index.ts +4 -4
  400. package/src/runtime/health/wiring.ts +2 -2
  401. package/src/runtime/index.ts +29 -29
  402. package/src/runtime/integration/helpers.ts +12 -12
  403. package/src/runtime/lifecycle.ts +4 -4
  404. package/src/runtime/mcp/index.ts +3 -3
  405. package/src/runtime/mcp/manager.ts +1 -1
  406. package/src/runtime/network/inbound.ts +2 -2
  407. package/src/runtime/network/index.ts +5 -5
  408. package/src/runtime/network/outbound.ts +2 -2
  409. package/src/runtime/network/shared.ts +1 -1
  410. package/src/runtime/operator-client.ts +9 -9
  411. package/src/runtime/ops/control-plane.ts +2 -2
  412. package/src/runtime/ops/index.ts +3 -3
  413. package/src/runtime/ops/playbooks/index.ts +2 -2
  414. package/src/runtime/ops/playbooks/session-unrecoverable.ts +2 -2
  415. package/src/runtime/ops/playbooks/stuck-turn.ts +1 -1
  416. package/src/runtime/ops/runtime-context.ts +1 -1
  417. package/src/runtime/orchestration/spawn-policy.ts +1 -1
  418. package/src/runtime/peer-client.ts +3 -3
  419. package/src/runtime/perf/index.ts +1 -1
  420. package/src/runtime/perf/slo-collector.ts +1 -1
  421. package/src/runtime/permissions/index.ts +5 -5
  422. package/src/runtime/permissions/policy-runtime.ts +1 -175
  423. package/src/runtime/permissions/rule-suggestions.ts +1 -1
  424. package/src/runtime/plugins/hot-reload.ts +4 -4
  425. package/src/runtime/plugins/index.ts +13 -13
  426. package/src/runtime/plugins/lifecycle.ts +1 -1
  427. package/src/runtime/plugins/manager.ts +10 -10
  428. package/src/runtime/plugins/manifest.ts +2 -2
  429. package/src/runtime/plugins/quarantine.ts +2 -2
  430. package/src/runtime/plugins/trust.ts +2 -2
  431. package/src/runtime/plugins/types.ts +1 -1
  432. package/src/runtime/provider-accounts/registry.ts +2 -2
  433. package/src/runtime/remote/distributed-runtime-contract-schemas.ts +3 -3
  434. package/src/runtime/remote/index.ts +3 -3
  435. package/src/runtime/remote/runner-registry.ts +2 -2
  436. package/src/runtime/remote/supervisor.ts +1 -1
  437. package/src/runtime/runtime-hook-api.ts +1 -1
  438. package/src/runtime/runtime-knowledge-api.ts +1 -1
  439. package/src/runtime/runtime-mcp-api.ts +1 -1
  440. package/src/runtime/runtime-ops-api.ts +2 -2
  441. package/src/runtime/runtime-provider-api.ts +1 -1
  442. package/src/runtime/services.ts +42 -35
  443. package/src/runtime/session-maintenance.ts +1 -1
  444. package/src/runtime/session-persistence.ts +2 -2
  445. package/src/runtime/session-return-context.ts +3 -3
  446. package/src/runtime/settings/control-plane-store.ts +1 -1
  447. package/src/runtime/settings/control-plane.ts +2 -2
  448. package/src/runtime/shell-command-extensions.ts +7 -7
  449. package/src/runtime/shell-command-ops.ts +6 -6
  450. package/src/runtime/shell-command-platform.ts +1 -1
  451. package/src/runtime/shell-command-services.ts +18 -18
  452. package/src/runtime/shell-command-workspace.ts +2 -2
  453. package/src/runtime/store/domains/conversation.ts +1 -1
  454. package/src/runtime/store/domains/index.ts +4 -4
  455. package/src/runtime/store/domains/permissions.ts +1 -1
  456. package/src/runtime/store/helpers/reducers/conversation.ts +3 -3
  457. package/src/runtime/store/helpers/reducers/lifecycle.ts +3 -3
  458. package/src/runtime/store/helpers/reducers/shared.ts +2 -2
  459. package/src/runtime/store/helpers/reducers/sync.ts +1 -1
  460. package/src/runtime/store/helpers/reducers.ts +4 -4
  461. package/src/runtime/store/index.ts +4 -4
  462. package/src/runtime/store/selectors/index.ts +2 -2
  463. package/src/runtime/store/state.ts +4 -4
  464. package/src/runtime/tasks/adapters/acp-adapter.ts +1 -1
  465. package/src/runtime/tasks/adapters/index.ts +6 -6
  466. package/src/runtime/tasks/index.ts +3 -3
  467. package/src/runtime/tasks/manager.ts +3 -3
  468. package/src/runtime/telemetry/api-helpers.ts +2 -2
  469. package/src/runtime/telemetry/api.ts +2 -2
  470. package/src/runtime/telemetry/index.ts +5 -5
  471. package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +1 -1
  472. package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +1 -1
  473. package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +1 -1
  474. package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +1 -1
  475. package/src/runtime/telemetry/instrumentation/domain-bridge.ts +5 -5
  476. package/src/runtime/telemetry/instrumentation/index.ts +3 -3
  477. package/src/runtime/tools/context.ts +3 -3
  478. package/src/runtime/tools/index.ts +4 -4
  479. package/src/runtime/tools/phased-executor.ts +3 -3
  480. package/src/runtime/tools/phases/budget.ts +1 -1
  481. package/src/runtime/tools/phases/execute.ts +1 -1
  482. package/src/runtime/tools/phases/index.ts +7 -7
  483. package/src/runtime/tools/phases/map-output.ts +1 -1
  484. package/src/runtime/tools/phases/permission.ts +2 -2
  485. package/src/runtime/tools/phases/posthook.ts +1 -1
  486. package/src/runtime/tools/phases/prehook.ts +1 -1
  487. package/src/runtime/tools/phases/validate.ts +1 -1
  488. package/src/runtime/transports/direct.ts +4 -4
  489. package/src/runtime/transports/http-helpers.ts +3 -3
  490. package/src/runtime/transports/http-types.ts +6 -6
  491. package/src/runtime/transports/http.ts +8 -8
  492. package/src/runtime/transports/realtime.ts +4 -4
  493. package/src/runtime/transports/remote-events.ts +1 -1
  494. package/src/runtime/transports/shared.ts +2 -2
  495. package/src/runtime/transports/ui-runtime-events.ts +2 -2
  496. package/src/runtime/ui/index.ts +7 -7
  497. package/src/runtime/ui/model-picker/data-provider.ts +4 -4
  498. package/src/runtime/ui/model-picker/health-enrichment.ts +3 -3
  499. package/src/runtime/ui/model-picker/index.ts +8 -8
  500. package/src/runtime/ui/provider-health/data-provider.ts +2 -2
  501. package/src/runtime/ui/provider-health/fallback-visualizer.ts +1 -1
  502. package/src/runtime/ui/provider-health/index.ts +5 -5
  503. package/src/runtime/ui-events.ts +1 -1
  504. package/src/runtime/ui-read-models-core.ts +2 -2
  505. package/src/runtime/ui-read-models-observability-maintenance.ts +4 -4
  506. package/src/runtime/ui-read-models-observability-options.ts +1 -1
  507. package/src/runtime/ui-read-models-observability-remote.ts +2 -2
  508. package/src/runtime/ui-read-models-observability-security.ts +3 -3
  509. package/src/runtime/ui-read-models-observability-system.ts +6 -6
  510. package/src/runtime/ui-read-models-observability.ts +10 -10
  511. package/src/runtime/ui-read-models-operations.ts +2 -2
  512. package/src/runtime/ui-read-models.ts +7 -7
  513. package/src/runtime/ui-service-queries.ts +2 -2
  514. package/src/runtime/ui-services.ts +7 -7
  515. package/src/runtime/worktree/registry.ts +1 -1
  516. package/src/scripts/process-messages.ts +1 -1
  517. package/src/sessions/manager.ts +9 -383
  518. package/src/shell/blocking-input.ts +3 -3
  519. package/src/shell/ui-openers.ts +3 -3
  520. package/src/state/file-watcher.ts +1 -1
  521. package/src/state/index.ts +10 -10
  522. package/src/state/knowledge-injection.ts +2 -2
  523. package/src/state/memory-embedding-http.ts +2 -2
  524. package/src/state/memory-embeddings.ts +1 -1
  525. package/src/state/memory-ingest.ts +3 -3
  526. package/src/state/memory-registry.ts +3 -3
  527. package/src/state/memory-store-helpers.ts +1 -1
  528. package/src/state/memory-store.ts +4 -4
  529. package/src/state/memory-vector-store.ts +3 -3
  530. package/src/tools/agent/index.ts +7 -7
  531. package/src/tools/agent/manager.ts +8 -8
  532. package/src/tools/analyze/git-modes.ts +2 -2
  533. package/src/tools/analyze/index.ts +2 -2
  534. package/src/tools/channel/agent-tools.ts +1 -1
  535. package/src/tools/channel/index.ts +2 -2
  536. package/src/tools/control/index.ts +1 -1
  537. package/src/tools/edit/core.ts +3 -3
  538. package/src/tools/edit/index.ts +2 -2
  539. package/src/tools/edit/phased.ts +2 -2
  540. package/src/tools/fetch/index.ts +2 -2
  541. package/src/tools/fetch/phased.ts +1 -1
  542. package/src/tools/index.ts +28 -28
  543. package/src/tools/mcp/index.ts +1 -1
  544. package/src/tools/remote-trigger/index.ts +1 -1
  545. package/src/tools/shared/auto-heal.ts +2 -2
  546. package/src/tools/state/index.ts +1 -1
  547. package/src/tools/web-search/index.ts +1 -1
  548. package/src/tools/write/index.ts +3 -3
  549. package/src/tools/write/phased.ts +1 -1
  550. package/src/version.ts +1 -1
  551. package/src/watchers/index.ts +2 -2
  552. package/src/watchers/registry.ts +2 -2
  553. package/src/web-search/index.ts +10 -10
  554. package/src/web-search/provider-registry.ts +8 -8
  555. package/src/web-search/providers/brave.ts +1 -1
  556. package/src/web-search/providers/duckduckgo.ts +1 -1
  557. package/src/web-search/providers/exa.ts +1 -1
  558. package/src/web-search/providers/firecrawl.ts +1 -1
  559. package/src/web-search/providers/perplexity.ts +1 -1
  560. package/src/web-search/providers/searxng.ts +1 -1
  561. package/src/web-search/providers/shared.ts +1 -1
  562. package/src/web-search/providers/tavily.ts +1 -1
  563. package/src/web-search/service.ts +2 -2
  564. package/docs/README.md +0 -32
  565. package/scripts/postinstall.mjs +0 -203
  566. package/src/runtime/ecosystem/catalog.ts +0 -606
  567. package/src/runtime/sandbox/backend.ts +0 -291
  568. package/src/runtime/sandbox/manager.ts +0 -364
  569. package/src/runtime/sandbox/provisioning.ts +0 -422
  570. package/src/runtime/sandbox/session-registry.ts +0 -289
  571. package/src/tools/repl/index.ts +0 -318
@@ -1,422 +0,0 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { dirname, join, resolve } from 'node:path';
3
- import { spawnSync } from 'node:child_process';
4
- import type { ConfigManager } from '../../config/manager.ts';
5
- import { getSandboxConfigSnapshot } from './manager.ts';
6
- import { renderQemuWrapperTemplate } from '@pellux/goodvibes-sdk/platform/runtime/sandbox/qemu-wrapper-template';
7
-
8
- export interface SandboxDoctorCheck {
9
- readonly label: string;
10
- readonly ok: boolean;
11
- readonly detail: string;
12
- }
13
-
14
- export interface SandboxGuestBundle {
15
- readonly version: 1;
16
- readonly exportedAt: number;
17
- readonly guest: {
18
- readonly qemuBinary: string;
19
- readonly imagePath: string;
20
- readonly wrapperPath: string;
21
- readonly host: string;
22
- readonly port: number;
23
- readonly user: string;
24
- readonly workspacePath: string;
25
- readonly sessionMode: string;
26
- };
27
- readonly nextSteps: readonly string[];
28
- }
29
-
30
- export interface SandboxQemuInitBundle {
31
- readonly directory: string;
32
- readonly wrapperPath: string;
33
- readonly guestBundlePath: string;
34
- readonly readmePath: string;
35
- }
36
-
37
- export interface SandboxQemuSetupBundle extends SandboxQemuInitBundle {
38
- readonly imagePath: string;
39
- readonly imageCreateScriptPath: string;
40
- readonly guestBootstrapScriptPath: string;
41
- readonly projectionPolicyPath: string;
42
- readonly sshConfigPath: string;
43
- readonly manifestPath: string;
44
- }
45
-
46
- export interface SandboxQemuSetupManifest {
47
- readonly version: 1;
48
- readonly createdAt: number;
49
- readonly wrapperPath: string;
50
- readonly imagePath: string;
51
- readonly imageCreateScriptPath: string;
52
- readonly guestBootstrapScriptPath: string;
53
- readonly projectionPolicyPath: string;
54
- readonly sshConfigPath: string;
55
- readonly recommendedSettings: {
56
- readonly backend: 'qemu';
57
- readonly wrapperPath: string;
58
- readonly imagePath: string;
59
- readonly guestHost: string;
60
- readonly guestPort: number;
61
- readonly guestUser: string;
62
- readonly guestWorkspacePath: string;
63
- readonly sessionMode: string;
64
- };
65
- }
66
-
67
- function existsExecutable(pathArg: string): boolean {
68
- if (!pathArg) return false;
69
- try {
70
- const stat = Bun.file(pathArg);
71
- return stat.size >= 0;
72
- } catch {
73
- return false;
74
- }
75
- }
76
-
77
- export function buildSandboxDoctorChecks(manager: ConfigManager): SandboxDoctorCheck[] {
78
- const config = getSandboxConfigSnapshot(manager);
79
- return [
80
- {
81
- label: 'backend',
82
- ok: config.vmBackend === 'local' || config.vmBackend === 'qemu',
83
- detail: `selected=${config.vmBackend}`,
84
- },
85
- {
86
- label: 'qemu image',
87
- ok: config.vmBackend === 'local' || Boolean(config.qemuImagePath),
88
- detail: config.qemuImagePath || 'missing sandbox.qemuImagePath',
89
- },
90
- {
91
- label: 'qemu wrapper',
92
- ok: config.vmBackend === 'local' || Boolean(config.qemuExecWrapper),
93
- detail: config.qemuExecWrapper || 'missing sandbox.qemuExecWrapper',
94
- },
95
- {
96
- label: 'guest host',
97
- ok: config.vmBackend === 'local' || Boolean(config.qemuGuestHost),
98
- detail: config.qemuGuestHost || 'missing sandbox.qemuGuestHost',
99
- },
100
- {
101
- label: 'guest user',
102
- ok: config.vmBackend === 'local' || Boolean(config.qemuGuestUser),
103
- detail: config.qemuGuestUser || 'missing sandbox.qemuGuestUser',
104
- },
105
- {
106
- label: 'guest workspace',
107
- ok: config.vmBackend === 'local' || Boolean(config.qemuWorkspacePath),
108
- detail: config.qemuWorkspacePath || 'missing sandbox.qemuWorkspacePath',
109
- },
110
- {
111
- label: 'wrapper file',
112
- ok: config.vmBackend === 'local' || !config.qemuExecWrapper || existsExecutable(config.qemuExecWrapper),
113
- detail: config.qemuExecWrapper ? `present=${existsExecutable(config.qemuExecWrapper)}` : 'not configured',
114
- },
115
- ];
116
- }
117
-
118
- export function renderSandboxDoctor(manager: ConfigManager): string {
119
- const checks = buildSandboxDoctorChecks(manager);
120
- const failing = checks.filter((check) => !check.ok);
121
- return [
122
- 'Sandbox Doctor',
123
- ...checks.map((check) => ` ${check.ok ? 'ok ' : 'bad'} ${check.label.padEnd(16)} ${check.detail}`),
124
- '',
125
- failing.length === 0
126
- ? ' next: run /sandbox guest-test <profile> or /sandbox session start <profile>'
127
- : ' next: fix the failing items, then run /sandbox doctor again',
128
- ].join('\n');
129
- }
130
-
131
- export function exportSandboxGuestBundle(
132
- manager: ConfigManager,
133
- workspaceRoot: string,
134
- pathArg: string,
135
- ): { path: string; bundle: SandboxGuestBundle } {
136
- const config = getSandboxConfigSnapshot(manager);
137
- const targetPath = resolve(workspaceRoot, pathArg);
138
- const bundle: SandboxGuestBundle = {
139
- version: 1,
140
- exportedAt: Date.now(),
141
- guest: {
142
- qemuBinary: config.qemuBinary,
143
- imagePath: config.qemuImagePath,
144
- wrapperPath: config.qemuExecWrapper,
145
- host: config.qemuGuestHost,
146
- port: config.qemuGuestPort,
147
- user: config.qemuGuestUser,
148
- workspacePath: config.qemuWorkspacePath,
149
- sessionMode: config.qemuSessionMode,
150
- },
151
- nextSteps: [
152
- 'Ensure the image boots with SSH enabled and a user matching qemuGuestUser.',
153
- 'Forward guest port 22 to qemuGuestPort.',
154
- 'Install the wrapper and set /sandbox set-qemu-wrapper <path>.',
155
- 'Run /sandbox guest-test <profile> to validate transport and workspace projection.',
156
- ],
157
- };
158
- mkdirSync(dirname(targetPath), { recursive: true });
159
- writeFileSync(targetPath, `${JSON.stringify(bundle, null, 2)}\n`, 'utf-8');
160
- return { path: targetPath, bundle };
161
- }
162
-
163
- export function inspectSandboxGuestBundle(bundle: SandboxGuestBundle): string {
164
- return [
165
- 'Sandbox Guest Bundle',
166
- ` exportedAt: ${new Date(bundle.exportedAt).toISOString()}`,
167
- ` qemu binary: ${bundle.guest.qemuBinary}`,
168
- ` image: ${bundle.guest.imagePath || '(unset)'}`,
169
- ` wrapper: ${bundle.guest.wrapperPath || '(unset)'}`,
170
- ` guest: ${bundle.guest.user || '(unset)'}@${bundle.guest.host || '(unset)'}:${bundle.guest.port}`,
171
- ` workspace: ${bundle.guest.workspacePath || '(unset)'}`,
172
- ` session mode: ${bundle.guest.sessionMode}`,
173
- ...bundle.nextSteps.map((step) => ` next: ${step}`),
174
- ].join('\n');
175
- }
176
-
177
- export function scaffoldSandboxQemuInitBundle(
178
- manager: ConfigManager,
179
- workspaceRoot: string,
180
- pathArg: string,
181
- ): SandboxQemuInitBundle {
182
- const targetDir = resolve(workspaceRoot, pathArg);
183
- mkdirSync(targetDir, { recursive: true });
184
- const wrapperPath = join(targetDir, 'qemu-wrapper.sh');
185
- const guestBundlePath = join(targetDir, 'guest-bundle.json');
186
- const readmePath = join(targetDir, 'README.txt');
187
- writeFileSync(wrapperPath, renderQemuWrapperTemplate(), { encoding: 'utf-8', mode: 0o755 });
188
- exportSandboxGuestBundle(manager, workspaceRoot, guestBundlePath);
189
- const config = getSandboxConfigSnapshot(manager);
190
- const readme = [
191
- 'GoodVibes QEMU Sandbox Init Bundle',
192
- '',
193
- 'Files:',
194
- ` qemu-wrapper.sh host-side wrapper used by /sandbox session run`,
195
- ` guest-bundle.json current guest transport and workspace settings`,
196
- '',
197
- 'Suggested setup:',
198
- ` 1. Ensure ${config.qemuBinary || 'qemu-system-x86_64'} is installed and on PATH.`,
199
- ' 2. Prepare a guest image with SSH enabled.',
200
- ' 3. Forward guest port 22 to the configured host port.',
201
- ` 4. Point GoodVibes at ${wrapperPath}`,
202
- ` /sandbox set-qemu-wrapper ${wrapperPath}`,
203
- ` 5. Point GoodVibes at your image`,
204
- ' /sandbox set-qemu-image <path-to-image>',
205
- ` 6. Verify transport`,
206
- ' /sandbox doctor',
207
- ' /sandbox guest-test eval-js',
208
- ].join('\n');
209
- writeFileSync(readmePath, `${readme}\n`, 'utf-8');
210
- return { directory: targetDir, wrapperPath, guestBundlePath, readmePath };
211
- }
212
-
213
- export function scaffoldSandboxQemuSetupBundle(
214
- manager: ConfigManager,
215
- workspaceRoot: string,
216
- pathArg: string,
217
- ): SandboxQemuSetupBundle {
218
- const base = scaffoldSandboxQemuInitBundle(manager, workspaceRoot, pathArg);
219
- const targetDir = base.directory;
220
- const config = getSandboxConfigSnapshot(manager);
221
- const imageDir = join(targetDir, 'images');
222
- const bootstrapDir = join(targetDir, 'guest');
223
- const policyDir = join(targetDir, 'policy');
224
- mkdirSync(imageDir, { recursive: true });
225
- mkdirSync(bootstrapDir, { recursive: true });
226
- mkdirSync(policyDir, { recursive: true });
227
-
228
- const imagePath = join(imageDir, 'goodvibes-sandbox.qcow2');
229
- const imageCreateScriptPath = join(targetDir, 'create-image.sh');
230
- const guestBootstrapScriptPath = join(bootstrapDir, 'bootstrap-guest.sh');
231
- const projectionPolicyPath = join(policyDir, 'workspace-projection.json');
232
- const sshConfigPath = join(targetDir, 'ssh_config');
233
- const manifestPath = join(targetDir, 'setup-manifest.json');
234
-
235
- const imageCreateScript = [
236
- '#!/usr/bin/env bash',
237
- 'set -euo pipefail',
238
- '',
239
- 'IMAGE_PATH="${1:-' + imagePath.replace(/"/g, '\\"') + '}"',
240
- 'SIZE_GB="${2:-20}"',
241
- 'QEMU_IMG_BIN="${QEMU_IMG_BIN:-qemu-img}"',
242
- '',
243
- 'exec "$QEMU_IMG_BIN" create -f qcow2 "$IMAGE_PATH" "${SIZE_GB}G"',
244
- ].join('\n');
245
- writeFileSync(imageCreateScriptPath, `${imageCreateScript}\n`, { encoding: 'utf-8', mode: 0o755 });
246
-
247
- const guestBootstrap = [
248
- '#!/usr/bin/env bash',
249
- 'set -euo pipefail',
250
- '',
251
- '# GoodVibes guest bootstrap scaffold',
252
- '# Run this inside a Linux guest image after first boot.',
253
- '',
254
- 'if command -v apt-get >/dev/null 2>&1; then',
255
- ' sudo apt-get update',
256
- ' sudo apt-get install -y openssh-server python3 tar',
257
- 'fi',
258
- '',
259
- `sudo mkdir -p ${config.qemuWorkspacePath || '/workspace'}`,
260
- `id -u ${config.qemuGuestUser || 'goodvibes'} >/dev/null 2>&1 || sudo useradd -m -s /bin/bash ${config.qemuGuestUser || 'goodvibes'}`,
261
- `sudo chown -R ${config.qemuGuestUser || 'goodvibes'}:${config.qemuGuestUser || 'goodvibes'} ${config.qemuWorkspacePath || '/workspace'}`,
262
- 'sudo systemctl enable ssh || true',
263
- 'sudo systemctl restart ssh || true',
264
- ].join('\n');
265
- writeFileSync(guestBootstrapScriptPath, `${guestBootstrap}\n`, { encoding: 'utf-8', mode: 0o755 });
266
-
267
- const projectionPolicy = {
268
- version: 1,
269
- workspaceRoot,
270
- guestWorkspace: config.qemuWorkspacePath || '/workspace',
271
- excludes: ['.git', 'node_modules', '.venv', '.goodvibes/cache', '.env*', '*.pem', '*.key', '*credentials*', '*secret*'],
272
- notes: [
273
- 'Review and tighten this projection policy before enabling untrusted MCP workloads.',
274
- 'The wrapper syncs the filtered project root into the guest over tar+ssh.',
275
- ],
276
- };
277
- writeFileSync(projectionPolicyPath, `${JSON.stringify(projectionPolicy, null, 2)}\n`, 'utf-8');
278
-
279
- const sshConfig = [
280
- 'Host goodvibes-sandbox',
281
- ` HostName ${config.qemuGuestHost || '127.0.0.1'}`,
282
- ` Port ${config.qemuGuestPort}`,
283
- ` User ${config.qemuGuestUser || 'goodvibes'}`,
284
- ' StrictHostKeyChecking accept-new',
285
- ' UserKnownHostsFile ~/.goodvibes/tui/known_hosts',
286
- ' LogLevel ERROR',
287
- ].join('\n');
288
- writeFileSync(sshConfigPath, `${sshConfig}\n`, 'utf-8');
289
-
290
- const manifest: SandboxQemuSetupManifest = {
291
- version: 1,
292
- createdAt: Date.now(),
293
- wrapperPath: base.wrapperPath,
294
- imagePath,
295
- imageCreateScriptPath,
296
- guestBootstrapScriptPath,
297
- projectionPolicyPath,
298
- sshConfigPath,
299
- recommendedSettings: {
300
- backend: 'qemu',
301
- wrapperPath: base.wrapperPath,
302
- imagePath,
303
- guestHost: config.qemuGuestHost || '127.0.0.1',
304
- guestPort: config.qemuGuestPort,
305
- guestUser: config.qemuGuestUser || 'goodvibes',
306
- guestWorkspacePath: config.qemuWorkspacePath || '/workspace',
307
- sessionMode: config.qemuSessionMode,
308
- },
309
- };
310
- writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf-8');
311
-
312
- const readme = [
313
- 'GoodVibes QEMU Sandbox Setup Bundle',
314
- '',
315
- 'This bundle is the productized first-run QEMU setup path.',
316
- '',
317
- 'Files:',
318
- ` qemu-wrapper.sh host-side wrapper used by GoodVibes`,
319
- ` create-image.sh creates ${imagePath} with qemu-img`,
320
- ` guest/bootstrap-guest.sh bootstrap script to run inside the guest`,
321
- ` policy/workspace-projection.json default workspace projection policy`,
322
- ` ssh_config SSH host stanza for the guest`,
323
- ` guest-bundle.json current runtime transport settings`,
324
- ` setup-manifest.json paths and recommended GoodVibes settings`,
325
- '',
326
- 'Suggested flow:',
327
- ` 1. Create an image: ${imageCreateScriptPath} ${imagePath} 20`,
328
- ` 2. Boot a Linux guest using ${imagePath}`,
329
- ` 3. Run ${guestBootstrapScriptPath} inside the guest`,
330
- ` 4. Configure port-forwarding so guest SSH reaches ${config.qemuGuestHost || '127.0.0.1'}:${config.qemuGuestPort}`,
331
- ` 5. Point GoodVibes at the generated paths`,
332
- ` /sandbox set-backend qemu`,
333
- ` /sandbox set-qemu-wrapper ${base.wrapperPath}`,
334
- ` /sandbox set-qemu-image ${imagePath}`,
335
- ` /sandbox set-qemu-guest-host ${config.qemuGuestHost || '127.0.0.1'}`,
336
- ` /sandbox set-qemu-guest-port ${config.qemuGuestPort}`,
337
- ` /sandbox set-qemu-guest-user ${config.qemuGuestUser || 'goodvibes'}`,
338
- ` /sandbox set-qemu-workspace ${config.qemuWorkspacePath || '/workspace'}`,
339
- ' 6. Validate with /sandbox doctor and /sandbox guest-test eval-js',
340
- ].join('\n');
341
- writeFileSync(base.readmePath, `${readme}\n`, 'utf-8');
342
-
343
- return {
344
- ...base,
345
- imagePath,
346
- imageCreateScriptPath,
347
- guestBootstrapScriptPath,
348
- projectionPolicyPath,
349
- sshConfigPath,
350
- manifestPath,
351
- };
352
- }
353
-
354
- export function createSandboxQemuImage(
355
- workspaceRoot: string,
356
- imagePathArg: string,
357
- sizeGb: number,
358
- qemuImgBinary = process.env.QEMU_IMG_BIN || 'qemu-img',
359
- ): { path: string; sizeGb: number } {
360
- const targetPath = resolve(workspaceRoot, imagePathArg);
361
- mkdirSync(dirname(targetPath), { recursive: true });
362
- const result = spawnSync(qemuImgBinary, ['create', '-f', 'qcow2', targetPath, `${sizeGb}G`], {
363
- encoding: 'utf-8',
364
- windowsHide: true,
365
- });
366
- if (result.status !== 0) {
367
- const detail = (result.stderr || result.stdout || `Failed to run ${qemuImgBinary}`).trim();
368
- throw new Error(detail);
369
- }
370
- return { path: targetPath, sizeGb };
371
- }
372
-
373
- export function bootstrapSandboxQemuSetupBundle(
374
- manager: ConfigManager,
375
- workspaceRoot: string,
376
- pathArg: string,
377
- sizeGb: number,
378
- ): SandboxQemuSetupBundle {
379
- const bundle = scaffoldSandboxQemuSetupBundle(manager, workspaceRoot, pathArg);
380
- createSandboxQemuImage(workspaceRoot, bundle.imagePath, sizeGb);
381
- applySandboxQemuSetupManifest(manager, loadSandboxQemuSetupManifest(workspaceRoot, bundle.manifestPath));
382
- return bundle;
383
- }
384
-
385
- export function inspectSandboxQemuSetupManifest(manifest: SandboxQemuSetupManifest): string {
386
- return [
387
- 'Sandbox QEMU Setup Manifest',
388
- ` createdAt: ${new Date(manifest.createdAt).toISOString()}`,
389
- ` wrapper: ${manifest.wrapperPath}`,
390
- ` image: ${manifest.imagePath}`,
391
- ` create-image script: ${manifest.imageCreateScriptPath}`,
392
- ` guest bootstrap: ${manifest.guestBootstrapScriptPath}`,
393
- ` projection policy: ${manifest.projectionPolicyPath}`,
394
- ` ssh config: ${manifest.sshConfigPath}`,
395
- ' recommended settings:',
396
- ` backend: ${manifest.recommendedSettings.backend}`,
397
- ` host: ${manifest.recommendedSettings.guestHost}`,
398
- ` port: ${manifest.recommendedSettings.guestPort}`,
399
- ` user: ${manifest.recommendedSettings.guestUser}`,
400
- ` workspace: ${manifest.recommendedSettings.guestWorkspacePath}`,
401
- ` session mode: ${manifest.recommendedSettings.sessionMode}`,
402
- ].join('\n');
403
- }
404
-
405
- export function loadSandboxQemuSetupManifest(workspaceRoot: string, pathArg: string): SandboxQemuSetupManifest {
406
- const targetPath = resolve(workspaceRoot, pathArg);
407
- return JSON.parse(readFileSync(targetPath, 'utf-8')) as SandboxQemuSetupManifest;
408
- }
409
-
410
- export function applySandboxQemuSetupManifest(
411
- manager: ConfigManager,
412
- manifest: SandboxQemuSetupManifest,
413
- ): void {
414
- manager.setDynamic('sandbox.vmBackend', manifest.recommendedSettings.backend);
415
- manager.setDynamic('sandbox.qemuExecWrapper', manifest.recommendedSettings.wrapperPath);
416
- manager.setDynamic('sandbox.qemuImagePath', manifest.recommendedSettings.imagePath);
417
- manager.setDynamic('sandbox.qemuGuestHost', manifest.recommendedSettings.guestHost);
418
- manager.setDynamic('sandbox.qemuGuestPort', manifest.recommendedSettings.guestPort);
419
- manager.setDynamic('sandbox.qemuGuestUser', manifest.recommendedSettings.guestUser);
420
- manager.setDynamic('sandbox.qemuWorkspacePath', manifest.recommendedSettings.guestWorkspacePath);
421
- manager.setDynamic('sandbox.qemuSessionMode', manifest.recommendedSettings.sessionMode as 'attach' | 'launch-per-command');
422
- }