@pellux/goodvibes-tui 0.18.4

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 (732) hide show
  1. package/.goodvibes/GOODVIBES.md +35 -0
  2. package/.goodvibes/agents/reviewer.md +89 -0
  3. package/.goodvibes/skills/add-provider/SKILL.md +199 -0
  4. package/CHANGELOG.md +1681 -0
  5. package/README.md +1607 -0
  6. package/bin/goodvibes +66 -0
  7. package/docs/README.md +32 -0
  8. package/docs/foundation-artifacts/README.md +16 -0
  9. package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
  10. package/docs/foundation-artifacts/knowledge-store.sql +183 -0
  11. package/docs/foundation-artifacts/operator-contract.json +55157 -0
  12. package/docs/foundation-artifacts/peer-contract.json +2384 -0
  13. package/package.json +114 -0
  14. package/scripts/postinstall.mjs +203 -0
  15. package/src/acp/connection.ts +447 -0
  16. package/src/acp/index.ts +7 -0
  17. package/src/acp/manager.ts +133 -0
  18. package/src/adapters/bluebubbles/index.ts +127 -0
  19. package/src/adapters/discord/index.ts +297 -0
  20. package/src/adapters/github/index.ts +73 -0
  21. package/src/adapters/google-chat/index.ts +119 -0
  22. package/src/adapters/imessage/index.ts +92 -0
  23. package/src/adapters/index.ts +15 -0
  24. package/src/adapters/matrix/index.ts +116 -0
  25. package/src/adapters/mattermost/index.ts +151 -0
  26. package/src/adapters/msteams/index.ts +180 -0
  27. package/src/adapters/ntfy/index.ts +118 -0
  28. package/src/adapters/signal/index.ts +92 -0
  29. package/src/adapters/slack/index.ts +323 -0
  30. package/src/adapters/telegram/index.ts +160 -0
  31. package/src/adapters/types.ts +97 -0
  32. package/src/adapters/webhook/index.ts +178 -0
  33. package/src/adapters/whatsapp/index.ts +135 -0
  34. package/src/agents/message-bus-core.ts +312 -0
  35. package/src/agents/message-bus.ts +2 -0
  36. package/src/agents/orchestrator-prompts.ts +351 -0
  37. package/src/agents/orchestrator-runner.ts +668 -0
  38. package/src/agents/orchestrator.ts +437 -0
  39. package/src/agents/session.ts +108 -0
  40. package/src/agents/worktree.ts +153 -0
  41. package/src/agents/wrfc-config.ts +47 -0
  42. package/src/agents/wrfc-controller.ts +747 -0
  43. package/src/agents/wrfc-gate-runtime.ts +75 -0
  44. package/src/agents/wrfc-reporting.ts +284 -0
  45. package/src/agents/wrfc-runtime-events.ts +150 -0
  46. package/src/agents/wrfc-types.ts +67 -0
  47. package/src/automation/delivery-manager.ts +368 -0
  48. package/src/automation/index.ts +72 -0
  49. package/src/automation/manager-runtime-delivery.ts +139 -0
  50. package/src/automation/manager-runtime-events.ts +131 -0
  51. package/src/automation/manager-runtime-execution.ts +511 -0
  52. package/src/automation/manager-runtime-helpers.ts +433 -0
  53. package/src/automation/manager-runtime-job-mutations.ts +175 -0
  54. package/src/automation/manager-runtime-reconcile.ts +148 -0
  55. package/src/automation/manager-runtime-scheduling.ts +189 -0
  56. package/src/automation/manager-runtime-sync.ts +54 -0
  57. package/src/automation/manager-runtime.ts +721 -0
  58. package/src/automation/manager.ts +10 -0
  59. package/src/automation/service.ts +242 -0
  60. package/src/channels/builtin/account-actions.ts +490 -0
  61. package/src/channels/builtin/accounts.ts +433 -0
  62. package/src/channels/builtin/contracts.ts +405 -0
  63. package/src/channels/builtin/plugins.ts +308 -0
  64. package/src/channels/builtin/rendering.ts +174 -0
  65. package/src/channels/builtin/setup-schema.ts +504 -0
  66. package/src/channels/builtin/shared.ts +96 -0
  67. package/src/channels/builtin/surfaces.ts +57 -0
  68. package/src/channels/builtin/targets.ts +693 -0
  69. package/src/channels/builtin-runtime.ts +443 -0
  70. package/src/channels/delivery/shared.ts +199 -0
  71. package/src/channels/delivery/strategies-bridge.ts +246 -0
  72. package/src/channels/delivery/strategies-core.ts +299 -0
  73. package/src/channels/delivery/strategies-enterprise.ts +178 -0
  74. package/src/channels/delivery/types.ts +59 -0
  75. package/src/channels/delivery-router.ts +127 -0
  76. package/src/channels/index.ts +77 -0
  77. package/src/channels/plugin-registry.ts +551 -0
  78. package/src/channels/provider-runtime.ts +330 -0
  79. package/src/channels/reply-pipeline.ts +522 -0
  80. package/src/channels/route-manager.ts +340 -0
  81. package/src/channels/surface-registry.ts +186 -0
  82. package/src/config/helper-model.ts +233 -0
  83. package/src/config/index.ts +193 -0
  84. package/src/config/manager.ts +404 -0
  85. package/src/config/secrets.ts +547 -0
  86. package/src/config/service-registry.ts +329 -0
  87. package/src/config/subscription-auth.ts +31 -0
  88. package/src/config/subscription-providers.ts +127 -0
  89. package/src/config/tool-llm.ts +110 -0
  90. package/src/control-plane/approval-broker.ts +351 -0
  91. package/src/control-plane/gateway.ts +713 -0
  92. package/src/control-plane/index.ts +54 -0
  93. package/src/control-plane/media-contract-schemas.ts +208 -0
  94. package/src/control-plane/method-catalog-admin.ts +136 -0
  95. package/src/control-plane/method-catalog-channels.ts +591 -0
  96. package/src/control-plane/method-catalog-control-automation.ts +475 -0
  97. package/src/control-plane/method-catalog-control-core.ts +594 -0
  98. package/src/control-plane/method-catalog-control.ts +8 -0
  99. package/src/control-plane/method-catalog-events.ts +74 -0
  100. package/src/control-plane/method-catalog-knowledge.ts +531 -0
  101. package/src/control-plane/method-catalog-media.ts +279 -0
  102. package/src/control-plane/method-catalog-runtime.ts +304 -0
  103. package/src/control-plane/method-catalog-shared.ts +223 -0
  104. package/src/control-plane/method-catalog.ts +242 -0
  105. package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
  106. package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
  107. package/src/control-plane/operator-contract-schemas-control.ts +226 -0
  108. package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
  109. package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
  110. package/src/control-plane/operator-contract-schemas-media.ts +297 -0
  111. package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
  112. package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
  113. package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
  114. package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
  115. package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
  116. package/src/control-plane/operator-contract-schemas.ts +6 -0
  117. package/src/control-plane/operator-contract.ts +163 -0
  118. package/src/control-plane/session-broker.ts +780 -0
  119. package/src/core/compaction-sections.ts +492 -0
  120. package/src/core/compaction-types.ts +147 -0
  121. package/src/core/composer-state.ts +59 -0
  122. package/src/core/context-compaction.ts +542 -0
  123. package/src/core/conversation-compaction.ts +68 -0
  124. package/src/core/conversation-diff.ts +55 -0
  125. package/src/core/conversation-rendering.ts +343 -0
  126. package/src/core/conversation-utils.ts +72 -0
  127. package/src/core/conversation.ts +775 -0
  128. package/src/core/event-replay.ts +287 -0
  129. package/src/core/orchestrator-context-runtime.ts +407 -0
  130. package/src/core/orchestrator-follow-up-runtime.ts +134 -0
  131. package/src/core/orchestrator-runtime.ts +132 -0
  132. package/src/core/orchestrator-tool-runtime.ts +468 -0
  133. package/src/core/orchestrator-turn-helpers.ts +355 -0
  134. package/src/core/orchestrator-turn-loop.ts +443 -0
  135. package/src/core/orchestrator.ts +733 -0
  136. package/src/core/plan-command-handler.ts +169 -0
  137. package/src/core/system-message-router.ts +210 -0
  138. package/src/core/transcript-events/classify.ts +95 -0
  139. package/src/core/transcript-events/index.ts +15 -0
  140. package/src/daemon/cli.ts +88 -0
  141. package/src/daemon/control-plane.ts +522 -0
  142. package/src/daemon/facade-composition.ts +397 -0
  143. package/src/daemon/facade.ts +638 -0
  144. package/src/daemon/helpers.ts +74 -0
  145. package/src/daemon/http/router-route-contexts.ts +370 -0
  146. package/src/daemon/http/router.ts +531 -0
  147. package/src/daemon/http-listener.ts +301 -0
  148. package/src/daemon/index.ts +3 -0
  149. package/src/daemon/server.ts +1 -0
  150. package/src/daemon/service-manager.ts +413 -0
  151. package/src/daemon/surface-actions.ts +183 -0
  152. package/src/daemon/surface-delivery.ts +530 -0
  153. package/src/daemon/surface-policy.ts +60 -0
  154. package/src/daemon/transport-events.ts +110 -0
  155. package/src/daemon/types.ts +191 -0
  156. package/src/export/markdown.ts +213 -0
  157. package/src/export/session-export.ts +633 -0
  158. package/src/git/index.ts +1 -0
  159. package/src/git/service.ts +414 -0
  160. package/src/hooks/chain-engine.ts +414 -0
  161. package/src/hooks/dispatcher.ts +414 -0
  162. package/src/hooks/hook-api.ts +170 -0
  163. package/src/hooks/index.ts +48 -0
  164. package/src/hooks/runners/agent.ts +93 -0
  165. package/src/hooks/runners/prompt.ts +69 -0
  166. package/src/hooks/workbench.ts +360 -0
  167. package/src/input/autocomplete.ts +96 -0
  168. package/src/input/bookmark-modal.ts +115 -0
  169. package/src/input/command-registry.ts +300 -0
  170. package/src/input/commands/branch-runtime.ts +72 -0
  171. package/src/input/commands/config.ts +515 -0
  172. package/src/input/commands/control-room-runtime.ts +255 -0
  173. package/src/input/commands/conversation-runtime.ts +207 -0
  174. package/src/input/commands/diff-runtime.ts +161 -0
  175. package/src/input/commands/discovery-runtime.ts +45 -0
  176. package/src/input/commands/eval.ts +204 -0
  177. package/src/input/commands/experience-runtime.ts +278 -0
  178. package/src/input/commands/git-runtime.ts +81 -0
  179. package/src/input/commands/guidance-runtime.ts +101 -0
  180. package/src/input/commands/health-runtime.ts +434 -0
  181. package/src/input/commands/hooks-runtime.ts +148 -0
  182. package/src/input/commands/incident-runtime.ts +95 -0
  183. package/src/input/commands/integration-runtime.ts +394 -0
  184. package/src/input/commands/intelligence-runtime.ts +223 -0
  185. package/src/input/commands/knowledge.ts +368 -0
  186. package/src/input/commands/local-auth-runtime.ts +105 -0
  187. package/src/input/commands/local-provider-runtime.ts +170 -0
  188. package/src/input/commands/local-runtime.ts +458 -0
  189. package/src/input/commands/local-setup-review.ts +192 -0
  190. package/src/input/commands/local-setup-transfer.ts +134 -0
  191. package/src/input/commands/local-setup.ts +292 -0
  192. package/src/input/commands/managed-runtime.ts +208 -0
  193. package/src/input/commands/marketplace-runtime.ts +290 -0
  194. package/src/input/commands/mcp-runtime.ts +202 -0
  195. package/src/input/commands/memory-product-runtime.ts +111 -0
  196. package/src/input/commands/memory.ts +151 -0
  197. package/src/input/commands/notify-runtime.ts +83 -0
  198. package/src/input/commands/operator-panel-runtime.ts +141 -0
  199. package/src/input/commands/operator-runtime.ts +392 -0
  200. package/src/input/commands/permissions-runtime.ts +104 -0
  201. package/src/input/commands/planning-runtime.ts +97 -0
  202. package/src/input/commands/platform-access-runtime.ts +422 -0
  203. package/src/input/commands/platform-runtime.ts +6 -0
  204. package/src/input/commands/platform-sandbox-qemu.ts +137 -0
  205. package/src/input/commands/platform-sandbox-runtime.ts +406 -0
  206. package/src/input/commands/platform-sandbox-session.ts +128 -0
  207. package/src/input/commands/platform-services-runtime.ts +246 -0
  208. package/src/input/commands/policy-dispatch.ts +339 -0
  209. package/src/input/commands/policy.ts +17 -0
  210. package/src/input/commands/product-runtime.ts +351 -0
  211. package/src/input/commands/profile-sync-runtime.ts +99 -0
  212. package/src/input/commands/provider-accounts-runtime.ts +113 -0
  213. package/src/input/commands/provider.ts +363 -0
  214. package/src/input/commands/quit-shared.ts +162 -0
  215. package/src/input/commands/recall-bundle.ts +132 -0
  216. package/src/input/commands/recall-capture.ts +152 -0
  217. package/src/input/commands/recall-query.ts +229 -0
  218. package/src/input/commands/recall-review.ts +98 -0
  219. package/src/input/commands/recall-shared.ts +22 -0
  220. package/src/input/commands/remote-runtime-pool.ts +106 -0
  221. package/src/input/commands/remote-runtime-setup.ts +199 -0
  222. package/src/input/commands/remote-runtime.ts +531 -0
  223. package/src/input/commands/replay-runtime.ts +18 -0
  224. package/src/input/commands/runtime-services.ts +279 -0
  225. package/src/input/commands/schedule-runtime.ts +332 -0
  226. package/src/input/commands/services-runtime.ts +207 -0
  227. package/src/input/commands/session-content.ts +408 -0
  228. package/src/input/commands/session-workflow.ts +464 -0
  229. package/src/input/commands/session.ts +376 -0
  230. package/src/input/commands/settings-sync-runtime.ts +173 -0
  231. package/src/input/commands/share-runtime.ts +114 -0
  232. package/src/input/commands/shell-core.ts +320 -0
  233. package/src/input/commands/skills-runtime.ts +221 -0
  234. package/src/input/commands/subscription-runtime.ts +434 -0
  235. package/src/input/commands/tasks-runtime.ts +230 -0
  236. package/src/input/commands/teamwork-runtime.ts +374 -0
  237. package/src/input/commands/teleport-runtime.ts +57 -0
  238. package/src/input/commands/worktree-runtime.ts +137 -0
  239. package/src/input/commands.ts +127 -0
  240. package/src/input/file-picker.ts +192 -0
  241. package/src/input/handler-command-route.ts +106 -0
  242. package/src/input/handler-content-actions.ts +465 -0
  243. package/src/input/handler-feed-routes.ts +541 -0
  244. package/src/input/handler-feed.ts +361 -0
  245. package/src/input/handler-modal-routes.ts +335 -0
  246. package/src/input/handler-modal-stack.ts +237 -0
  247. package/src/input/handler-modal-token-routes.ts +272 -0
  248. package/src/input/handler-picker-routes.ts +416 -0
  249. package/src/input/handler-prompt-buffer.ts +320 -0
  250. package/src/input/handler-shortcuts.ts +195 -0
  251. package/src/input/handler-ui-state.ts +294 -0
  252. package/src/input/handler.ts +798 -0
  253. package/src/input/input-history.ts +267 -0
  254. package/src/input/keybindings.ts +256 -0
  255. package/src/input/model-picker.ts +730 -0
  256. package/src/input/panel-integration-actions.ts +77 -0
  257. package/src/input/profile-picker-modal.ts +222 -0
  258. package/src/input/search.ts +100 -0
  259. package/src/input/selection-modal.ts +163 -0
  260. package/src/input/selection.ts +135 -0
  261. package/src/input/session-picker-modal.ts +136 -0
  262. package/src/input/settings-modal.ts +718 -0
  263. package/src/input/submission-intent.ts +18 -0
  264. package/src/input/submission-router.ts +64 -0
  265. package/src/integrations/index.ts +42 -0
  266. package/src/integrations/notifier.ts +206 -0
  267. package/src/integrations/webhooks.ts +177 -0
  268. package/src/knowledge/consolidation.ts +346 -0
  269. package/src/knowledge/graphql.ts +324 -0
  270. package/src/knowledge/index.ts +60 -0
  271. package/src/knowledge/ingest-compile.ts +386 -0
  272. package/src/knowledge/ingest-context.ts +18 -0
  273. package/src/knowledge/ingest-inputs.ts +387 -0
  274. package/src/knowledge/ingest.ts +20 -0
  275. package/src/knowledge/internal.ts +257 -0
  276. package/src/knowledge/knowledge-api.ts +432 -0
  277. package/src/knowledge/lint.ts +121 -0
  278. package/src/knowledge/memory-sync.ts +62 -0
  279. package/src/knowledge/packet.ts +370 -0
  280. package/src/knowledge/scheduling.ts +283 -0
  281. package/src/knowledge/service.ts +715 -0
  282. package/src/main.ts +798 -0
  283. package/src/mcp/client.ts +383 -0
  284. package/src/mcp/index.ts +12 -0
  285. package/src/mcp/mcp-api.ts +90 -0
  286. package/src/mcp/registry.ts +508 -0
  287. package/src/media/builtin-image-understanding.ts +303 -0
  288. package/src/media/builtin-providers.ts +26 -0
  289. package/src/media/index.ts +18 -0
  290. package/src/multimodal/index.ts +13 -0
  291. package/src/multimodal/service.ts +492 -0
  292. package/src/panels/agent-inspector-panel.ts +515 -0
  293. package/src/panels/agent-inspector-shared.ts +94 -0
  294. package/src/panels/agent-logs-panel.ts +539 -0
  295. package/src/panels/agent-logs-shared.ts +129 -0
  296. package/src/panels/approval-panel.ts +169 -0
  297. package/src/panels/automation-control-panel.ts +253 -0
  298. package/src/panels/base-panel.ts +72 -0
  299. package/src/panels/builtin/agent.ts +88 -0
  300. package/src/panels/builtin/development.ts +111 -0
  301. package/src/panels/builtin/knowledge.ts +26 -0
  302. package/src/panels/builtin/operations.ts +385 -0
  303. package/src/panels/builtin/session.ts +61 -0
  304. package/src/panels/builtin/shared.ts +240 -0
  305. package/src/panels/builtin-panels.ts +23 -0
  306. package/src/panels/cockpit-panel.ts +183 -0
  307. package/src/panels/communication-panel.ts +191 -0
  308. package/src/panels/context-visualizer-panel.ts +199 -0
  309. package/src/panels/control-plane-panel.ts +266 -0
  310. package/src/panels/cost-tracker-panel.ts +444 -0
  311. package/src/panels/debug-panel.ts +432 -0
  312. package/src/panels/diff-panel.ts +518 -0
  313. package/src/panels/docs-panel.ts +283 -0
  314. package/src/panels/eval-panel.ts +399 -0
  315. package/src/panels/file-explorer-panel.ts +556 -0
  316. package/src/panels/file-preview-panel.ts +412 -0
  317. package/src/panels/forensics-panel.ts +364 -0
  318. package/src/panels/git-panel.ts +630 -0
  319. package/src/panels/hooks-panel.ts +274 -0
  320. package/src/panels/incident-review-panel.ts +247 -0
  321. package/src/panels/index.ts +48 -0
  322. package/src/panels/intelligence-panel.ts +176 -0
  323. package/src/panels/knowledge-panel.ts +328 -0
  324. package/src/panels/local-auth-panel.ts +146 -0
  325. package/src/panels/marketplace-panel.ts +223 -0
  326. package/src/panels/mcp-panel.ts +260 -0
  327. package/src/panels/memory-panel.ts +293 -0
  328. package/src/panels/ops-control-panel.ts +184 -0
  329. package/src/panels/ops-strategy-panel.ts +235 -0
  330. package/src/panels/orchestration-panel.ts +254 -0
  331. package/src/panels/panel-list-panel.ts +508 -0
  332. package/src/panels/panel-manager.ts +538 -0
  333. package/src/panels/panel-picker.ts +106 -0
  334. package/src/panels/plan-dashboard-panel.ts +272 -0
  335. package/src/panels/plugins-panel.ts +201 -0
  336. package/src/panels/policy-panel.ts +308 -0
  337. package/src/panels/polish.ts +668 -0
  338. package/src/panels/provider-account-snapshot.ts +259 -0
  339. package/src/panels/provider-accounts-panel.ts +221 -0
  340. package/src/panels/provider-health-domains.ts +211 -0
  341. package/src/panels/provider-health-panel.ts +725 -0
  342. package/src/panels/provider-health-tracker.ts +115 -0
  343. package/src/panels/provider-stats-panel.ts +366 -0
  344. package/src/panels/remote-panel.ts +449 -0
  345. package/src/panels/routes-panel.ts +228 -0
  346. package/src/panels/sandbox-panel.ts +289 -0
  347. package/src/panels/schedule-panel.ts +344 -0
  348. package/src/panels/search-focus.ts +32 -0
  349. package/src/panels/security-panel.ts +329 -0
  350. package/src/panels/services-panel.ts +271 -0
  351. package/src/panels/session-browser-panel.ts +399 -0
  352. package/src/panels/session-maintenance.ts +125 -0
  353. package/src/panels/settings-sync-panel.ts +164 -0
  354. package/src/panels/skills-panel.ts +475 -0
  355. package/src/panels/subscription-panel.ts +273 -0
  356. package/src/panels/symbol-outline-panel.ts +486 -0
  357. package/src/panels/system-messages-panel.ts +224 -0
  358. package/src/panels/tasks-panel.ts +448 -0
  359. package/src/panels/thinking-panel.ts +304 -0
  360. package/src/panels/token-budget-panel.ts +469 -0
  361. package/src/panels/tool-inspector-panel.ts +434 -0
  362. package/src/panels/types.ts +44 -0
  363. package/src/panels/watchers-panel.ts +241 -0
  364. package/src/panels/welcome-panel.ts +64 -0
  365. package/src/panels/worktree-panel.ts +180 -0
  366. package/src/panels/wrfc-panel.ts +480 -0
  367. package/src/permissions/briefs/build.ts +88 -0
  368. package/src/permissions/manager.ts +356 -0
  369. package/src/permissions/prompt.ts +184 -0
  370. package/src/plugins/api.ts +383 -0
  371. package/src/plugins/loader.ts +304 -0
  372. package/src/plugins/manager.ts +481 -0
  373. package/src/profiles/shape.ts +58 -0
  374. package/src/providers/amazon-bedrock-mantle.ts +50 -0
  375. package/src/providers/amazon-bedrock.ts +61 -0
  376. package/src/providers/anthropic-compat.ts +373 -0
  377. package/src/providers/anthropic-sdk-provider.ts +230 -0
  378. package/src/providers/anthropic-vertex.ts +59 -0
  379. package/src/providers/anthropic.ts +469 -0
  380. package/src/providers/auto-register.ts +417 -0
  381. package/src/providers/builtin-catalog.ts +326 -0
  382. package/src/providers/builtin-registry.ts +575 -0
  383. package/src/providers/cache-planner.ts +258 -0
  384. package/src/providers/capabilities.ts +601 -0
  385. package/src/providers/custom-loader.ts +425 -0
  386. package/src/providers/discovered-compat.ts +18 -0
  387. package/src/providers/discovered-factory.ts +61 -0
  388. package/src/providers/discovered-traits.ts +138 -0
  389. package/src/providers/gemini.ts +462 -0
  390. package/src/providers/github-copilot.ts +254 -0
  391. package/src/providers/index.ts +47 -0
  392. package/src/providers/interface.ts +185 -0
  393. package/src/providers/llama-cpp.ts +402 -0
  394. package/src/providers/lm-studio-helpers.ts +367 -0
  395. package/src/providers/lm-studio.ts +484 -0
  396. package/src/providers/model-catalog-cache.ts +221 -0
  397. package/src/providers/model-catalog-notifications.ts +97 -0
  398. package/src/providers/model-catalog-synthetic.ts +202 -0
  399. package/src/providers/model-catalog.ts +211 -0
  400. package/src/providers/model-limits.ts +280 -0
  401. package/src/providers/ollama.ts +469 -0
  402. package/src/providers/openai-codex.ts +472 -0
  403. package/src/providers/openai-compat.ts +615 -0
  404. package/src/providers/openai.ts +231 -0
  405. package/src/providers/optimizer.ts +381 -0
  406. package/src/providers/provider-api.ts +553 -0
  407. package/src/providers/registry-helpers.ts +34 -0
  408. package/src/providers/registry-models.ts +77 -0
  409. package/src/providers/registry-types.ts +67 -0
  410. package/src/providers/registry.ts +729 -0
  411. package/src/providers/runtime-metadata.ts +149 -0
  412. package/src/providers/runtime-snapshot.ts +130 -0
  413. package/src/providers/synthetic.ts +561 -0
  414. package/src/providers/tier-prompts.ts +84 -0
  415. package/src/providers/tool-formats.ts +414 -0
  416. package/src/renderer/agent-detail-modal.ts +285 -0
  417. package/src/renderer/autocomplete-overlay.ts +154 -0
  418. package/src/renderer/block-actions.ts +76 -0
  419. package/src/renderer/bookmark-modal.ts +101 -0
  420. package/src/renderer/bottom-bar.ts +58 -0
  421. package/src/renderer/buffer.ts +34 -0
  422. package/src/renderer/code-block.ts +373 -0
  423. package/src/renderer/compositor.ts +261 -0
  424. package/src/renderer/context-inspector.ts +219 -0
  425. package/src/renderer/conversation-layout.ts +67 -0
  426. package/src/renderer/conversation-overlays.ts +123 -0
  427. package/src/renderer/conversation-surface.ts +260 -0
  428. package/src/renderer/diff-view.ts +132 -0
  429. package/src/renderer/diff.ts +122 -0
  430. package/src/renderer/file-picker-overlay.ts +101 -0
  431. package/src/renderer/file-tree.ts +153 -0
  432. package/src/renderer/git-status.ts +89 -0
  433. package/src/renderer/help-overlay.ts +247 -0
  434. package/src/renderer/history-search-overlay.ts +73 -0
  435. package/src/renderer/layout-engine.ts +97 -0
  436. package/src/renderer/layout.ts +32 -0
  437. package/src/renderer/live-tail-modal.ts +156 -0
  438. package/src/renderer/markdown.ts +777 -0
  439. package/src/renderer/modal-factory.ts +467 -0
  440. package/src/renderer/modal-utils.ts +24 -0
  441. package/src/renderer/model-picker-overlay.ts +396 -0
  442. package/src/renderer/overlay-box.ts +165 -0
  443. package/src/renderer/overlay-viewport.ts +104 -0
  444. package/src/renderer/panel-composite.ts +80 -0
  445. package/src/renderer/panel-picker-overlay.ts +202 -0
  446. package/src/renderer/panel-tab-bar.ts +69 -0
  447. package/src/renderer/panel-workspace-bar.ts +38 -0
  448. package/src/renderer/process-indicator.ts +96 -0
  449. package/src/renderer/process-modal.ts +295 -0
  450. package/src/renderer/profile-picker-modal.ts +129 -0
  451. package/src/renderer/progress.ts +98 -0
  452. package/src/renderer/search-overlay.ts +54 -0
  453. package/src/renderer/selection-modal-overlay.ts +214 -0
  454. package/src/renderer/semantic-diff.ts +369 -0
  455. package/src/renderer/session-picker-modal.ts +127 -0
  456. package/src/renderer/settings-modal.ts +701 -0
  457. package/src/renderer/shell-surface.ts +88 -0
  458. package/src/renderer/surface-layout.ts +101 -0
  459. package/src/renderer/syntax-highlighter.ts +542 -0
  460. package/src/renderer/system-message.ts +83 -0
  461. package/src/renderer/tab-strip.ts +108 -0
  462. package/src/renderer/text-layout.ts +31 -0
  463. package/src/renderer/thinking.ts +17 -0
  464. package/src/renderer/tool-call.ts +233 -0
  465. package/src/renderer/ui-factory.ts +524 -0
  466. package/src/renderer/ui-primitives.ts +96 -0
  467. package/src/runtime/auth/inspection.ts +125 -0
  468. package/src/runtime/bootstrap-background.ts +147 -0
  469. package/src/runtime/bootstrap-command-context.ts +265 -0
  470. package/src/runtime/bootstrap-command-parts.ts +357 -0
  471. package/src/runtime/bootstrap-core.ts +375 -0
  472. package/src/runtime/bootstrap-helpers.ts +88 -0
  473. package/src/runtime/bootstrap-hook-bridge.ts +271 -0
  474. package/src/runtime/bootstrap-runtime-events.ts +254 -0
  475. package/src/runtime/bootstrap-services.ts +197 -0
  476. package/src/runtime/bootstrap-shell.ts +262 -0
  477. package/src/runtime/bootstrap.ts +488 -0
  478. package/src/runtime/compaction/index.ts +90 -0
  479. package/src/runtime/compaction/lifecycle.ts +167 -0
  480. package/src/runtime/compaction/manager.ts +474 -0
  481. package/src/runtime/compaction/quality-score.ts +279 -0
  482. package/src/runtime/compaction/resume-repair.ts +183 -0
  483. package/src/runtime/compaction/strategies/autocompact.ts +65 -0
  484. package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
  485. package/src/runtime/compaction/strategies/collapse.ts +90 -0
  486. package/src/runtime/compaction/strategies/index.ts +23 -0
  487. package/src/runtime/compaction/strategies/microcompact.ts +74 -0
  488. package/src/runtime/compaction/strategies/reactive.ts +89 -0
  489. package/src/runtime/compaction/types.ts +221 -0
  490. package/src/runtime/context.ts +158 -0
  491. package/src/runtime/diagnostics/actions.ts +776 -0
  492. package/src/runtime/diagnostics/index.ts +99 -0
  493. package/src/runtime/diagnostics/panels/agents.ts +252 -0
  494. package/src/runtime/diagnostics/panels/events.ts +188 -0
  495. package/src/runtime/diagnostics/panels/health.ts +242 -0
  496. package/src/runtime/diagnostics/panels/index.ts +24 -0
  497. package/src/runtime/diagnostics/panels/ops.ts +156 -0
  498. package/src/runtime/diagnostics/panels/policy.ts +176 -0
  499. package/src/runtime/diagnostics/panels/tasks.ts +251 -0
  500. package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
  501. package/src/runtime/diagnostics/provider.ts +262 -0
  502. package/src/runtime/ecosystem/catalog.ts +606 -0
  503. package/src/runtime/ecosystem/recommendations.ts +117 -0
  504. package/src/runtime/emitters/agents.ts +96 -0
  505. package/src/runtime/emitters/automation.ts +112 -0
  506. package/src/runtime/emitters/communication.ts +53 -0
  507. package/src/runtime/emitters/compaction.ts +161 -0
  508. package/src/runtime/emitters/control-plane.ts +65 -0
  509. package/src/runtime/emitters/deliveries.ts +65 -0
  510. package/src/runtime/emitters/forensics.ts +17 -0
  511. package/src/runtime/emitters/index.ts +59 -0
  512. package/src/runtime/emitters/knowledge.ts +129 -0
  513. package/src/runtime/emitters/mcp.ts +95 -0
  514. package/src/runtime/emitters/ops.ts +163 -0
  515. package/src/runtime/emitters/orchestration.ts +87 -0
  516. package/src/runtime/emitters/permissions.ts +98 -0
  517. package/src/runtime/emitters/planner.ts +23 -0
  518. package/src/runtime/emitters/plugins.ts +78 -0
  519. package/src/runtime/emitters/providers.ts +30 -0
  520. package/src/runtime/emitters/routes.ts +57 -0
  521. package/src/runtime/emitters/security.ts +53 -0
  522. package/src/runtime/emitters/session.ts +93 -0
  523. package/src/runtime/emitters/surfaces.ts +57 -0
  524. package/src/runtime/emitters/tasks.ts +69 -0
  525. package/src/runtime/emitters/tools.ts +140 -0
  526. package/src/runtime/emitters/transport.ts +78 -0
  527. package/src/runtime/emitters/turn.ts +155 -0
  528. package/src/runtime/emitters/ui.ts +57 -0
  529. package/src/runtime/emitters/watchers.ts +57 -0
  530. package/src/runtime/emitters/workflows.ts +79 -0
  531. package/src/runtime/eval/index.ts +48 -0
  532. package/src/runtime/eval/runner.ts +163 -0
  533. package/src/runtime/eval/suites.ts +264 -0
  534. package/src/runtime/events/domain-map.ts +148 -0
  535. package/src/runtime/events/index.ts +194 -0
  536. package/src/runtime/events/turn.ts +60 -0
  537. package/src/runtime/events/workflows.ts +17 -0
  538. package/src/runtime/forensics/collector.ts +693 -0
  539. package/src/runtime/forensics/index.ts +23 -0
  540. package/src/runtime/foundation-clients.ts +78 -0
  541. package/src/runtime/foundation-services.ts +96 -0
  542. package/src/runtime/guidance.ts +183 -0
  543. package/src/runtime/health/effect-handlers.ts +189 -0
  544. package/src/runtime/health/index.ts +70 -0
  545. package/src/runtime/health/wiring.ts +115 -0
  546. package/src/runtime/index.ts +174 -0
  547. package/src/runtime/integration/helpers.ts +640 -0
  548. package/src/runtime/lifecycle.ts +107 -0
  549. package/src/runtime/mcp/index.ts +68 -0
  550. package/src/runtime/mcp/manager.ts +513 -0
  551. package/src/runtime/network/inbound.ts +131 -0
  552. package/src/runtime/network/index.ts +30 -0
  553. package/src/runtime/network/outbound.ts +292 -0
  554. package/src/runtime/network/shared.ts +82 -0
  555. package/src/runtime/operator-client.ts +235 -0
  556. package/src/runtime/ops/control-plane.ts +363 -0
  557. package/src/runtime/ops/index.ts +122 -0
  558. package/src/runtime/ops/playbooks/index.ts +10 -0
  559. package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
  560. package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
  561. package/src/runtime/ops/runtime-context.ts +100 -0
  562. package/src/runtime/ops-api.ts +27 -0
  563. package/src/runtime/orchestration/spawn-policy.ts +83 -0
  564. package/src/runtime/peer-client.ts +404 -0
  565. package/src/runtime/perf/index.ts +57 -0
  566. package/src/runtime/perf/slo-collector.ts +375 -0
  567. package/src/runtime/permissions/index.ts +190 -0
  568. package/src/runtime/permissions/policy-runtime.ts +175 -0
  569. package/src/runtime/permissions/preflight.ts +101 -0
  570. package/src/runtime/permissions/rule-suggestions.ts +36 -0
  571. package/src/runtime/plugins/hot-reload.ts +221 -0
  572. package/src/runtime/plugins/index.ts +84 -0
  573. package/src/runtime/plugins/lifecycle.ts +95 -0
  574. package/src/runtime/plugins/manager.ts +474 -0
  575. package/src/runtime/plugins/manifest.ts +167 -0
  576. package/src/runtime/plugins/quarantine.ts +202 -0
  577. package/src/runtime/plugins/trust.ts +291 -0
  578. package/src/runtime/plugins/types.ts +205 -0
  579. package/src/runtime/provider-accounts/registry.ts +326 -0
  580. package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
  581. package/src/runtime/remote/index.ts +488 -0
  582. package/src/runtime/remote/runner-registry.ts +438 -0
  583. package/src/runtime/remote/supervisor.ts +70 -0
  584. package/src/runtime/runtime-hook-api.ts +5 -0
  585. package/src/runtime/runtime-knowledge-api.ts +14 -0
  586. package/src/runtime/runtime-mcp-api.ts +5 -0
  587. package/src/runtime/runtime-ops-api.ts +86 -0
  588. package/src/runtime/runtime-provider-api.ts +18 -0
  589. package/src/runtime/sandbox/backend.ts +291 -0
  590. package/src/runtime/sandbox/manager.ts +364 -0
  591. package/src/runtime/sandbox/provisioning.ts +422 -0
  592. package/src/runtime/sandbox/session-registry.ts +289 -0
  593. package/src/runtime/services.ts +541 -0
  594. package/src/runtime/session-maintenance.ts +188 -0
  595. package/src/runtime/session-persistence.ts +288 -0
  596. package/src/runtime/session-return-context.ts +195 -0
  597. package/src/runtime/settings/control-plane-store.ts +258 -0
  598. package/src/runtime/settings/control-plane.ts +599 -0
  599. package/src/runtime/shell-command-extensions.ts +54 -0
  600. package/src/runtime/shell-command-ops.ts +207 -0
  601. package/src/runtime/shell-command-platform.ts +47 -0
  602. package/src/runtime/shell-command-services.ts +143 -0
  603. package/src/runtime/shell-command-workspace.ts +31 -0
  604. package/src/runtime/store/domains/conversation.ts +181 -0
  605. package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
  606. package/src/runtime/store/domains/index.ts +222 -0
  607. package/src/runtime/store/domains/panels.ts +117 -0
  608. package/src/runtime/store/domains/permissions.ts +143 -0
  609. package/src/runtime/store/domains/ui-perf.ts +103 -0
  610. package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
  611. package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
  612. package/src/runtime/store/helpers/reducers/shared.ts +60 -0
  613. package/src/runtime/store/helpers/reducers/sync.ts +555 -0
  614. package/src/runtime/store/helpers/reducers.ts +30 -0
  615. package/src/runtime/store/index.ts +304 -0
  616. package/src/runtime/store/selectors/index.ts +354 -0
  617. package/src/runtime/store/state.ts +137 -0
  618. package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
  619. package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
  620. package/src/runtime/tasks/adapters/index.ts +16 -0
  621. package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
  622. package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
  623. package/src/runtime/tasks/index.ts +68 -0
  624. package/src/runtime/tasks/manager.ts +415 -0
  625. package/src/runtime/telemetry/api-helpers.ts +517 -0
  626. package/src/runtime/telemetry/api.ts +768 -0
  627. package/src/runtime/telemetry/index.ts +178 -0
  628. package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
  629. package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
  630. package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
  631. package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
  632. package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
  633. package/src/runtime/telemetry/instrumentation/index.ts +67 -0
  634. package/src/runtime/tools/context.ts +114 -0
  635. package/src/runtime/tools/index.ts +46 -0
  636. package/src/runtime/tools/phased-executor.ts +448 -0
  637. package/src/runtime/tools/phases/budget.ts +130 -0
  638. package/src/runtime/tools/phases/execute.ts +69 -0
  639. package/src/runtime/tools/phases/index.ts +13 -0
  640. package/src/runtime/tools/phases/map-output.ts +98 -0
  641. package/src/runtime/tools/phases/permission.ts +133 -0
  642. package/src/runtime/tools/phases/posthook.ts +57 -0
  643. package/src/runtime/tools/phases/prehook.ts +68 -0
  644. package/src/runtime/tools/phases/validate.ts +53 -0
  645. package/src/runtime/transports/direct.ts +73 -0
  646. package/src/runtime/transports/http-helpers.ts +218 -0
  647. package/src/runtime/transports/http-types.ts +364 -0
  648. package/src/runtime/transports/http.ts +629 -0
  649. package/src/runtime/transports/realtime.ts +50 -0
  650. package/src/runtime/transports/remote-events.ts +16 -0
  651. package/src/runtime/transports/shared.ts +39 -0
  652. package/src/runtime/transports/ui-runtime-events.ts +35 -0
  653. package/src/runtime/ui/index.ts +39 -0
  654. package/src/runtime/ui/model-picker/data-provider.ts +182 -0
  655. package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
  656. package/src/runtime/ui/model-picker/index.ts +59 -0
  657. package/src/runtime/ui/model-picker/types.ts +149 -0
  658. package/src/runtime/ui/provider-health/data-provider.ts +244 -0
  659. package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
  660. package/src/runtime/ui/provider-health/index.ts +46 -0
  661. package/src/runtime/ui/provider-health/types.ts +146 -0
  662. package/src/runtime/ui-events.ts +46 -0
  663. package/src/runtime/ui-read-model-helpers.ts +32 -0
  664. package/src/runtime/ui-read-models-core.ts +95 -0
  665. package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
  666. package/src/runtime/ui-read-models-observability-options.ts +5 -0
  667. package/src/runtime/ui-read-models-observability-remote.ts +73 -0
  668. package/src/runtime/ui-read-models-observability-security.ts +172 -0
  669. package/src/runtime/ui-read-models-observability-system.ts +217 -0
  670. package/src/runtime/ui-read-models-observability.ts +59 -0
  671. package/src/runtime/ui-read-models-operations.ts +203 -0
  672. package/src/runtime/ui-read-models.ts +61 -0
  673. package/src/runtime/ui-service-queries.ts +114 -0
  674. package/src/runtime/ui-services.ts +163 -0
  675. package/src/runtime/worktree/registry.ts +252 -0
  676. package/src/scripts/process-messages.ts +42 -0
  677. package/src/sessions/manager.ts +388 -0
  678. package/src/shell/blocking-input.ts +89 -0
  679. package/src/shell/ui-openers.ts +163 -0
  680. package/src/state/file-watcher.ts +294 -0
  681. package/src/state/index.ts +56 -0
  682. package/src/state/knowledge-injection.ts +214 -0
  683. package/src/state/memory-embedding-http.ts +642 -0
  684. package/src/state/memory-embeddings.ts +312 -0
  685. package/src/state/memory-ingest.ts +132 -0
  686. package/src/state/memory-registry.ts +111 -0
  687. package/src/state/memory-store-helpers.ts +160 -0
  688. package/src/state/memory-store.ts +728 -0
  689. package/src/state/memory-vector-store.ts +418 -0
  690. package/src/templates/manager.ts +187 -0
  691. package/src/tools/agent/index.ts +610 -0
  692. package/src/tools/agent/manager.ts +476 -0
  693. package/src/tools/analyze/git-modes.ts +380 -0
  694. package/src/tools/analyze/index.ts +128 -0
  695. package/src/tools/channel/agent-tools.ts +16 -0
  696. package/src/tools/channel/index.ts +268 -0
  697. package/src/tools/control/index.ts +90 -0
  698. package/src/tools/edit/core.ts +619 -0
  699. package/src/tools/edit/index.ts +4 -0
  700. package/src/tools/edit/phased.ts +33 -0
  701. package/src/tools/fetch/index.ts +3 -0
  702. package/src/tools/fetch/phased.ts +34 -0
  703. package/src/tools/fetch/runtime.ts +499 -0
  704. package/src/tools/index.ts +186 -0
  705. package/src/tools/mcp/index.ts +190 -0
  706. package/src/tools/remote-trigger/index.ts +130 -0
  707. package/src/tools/repl/index.ts +318 -0
  708. package/src/tools/shared/auto-heal.ts +282 -0
  709. package/src/tools/state/index.ts +688 -0
  710. package/src/tools/web-search/index.ts +38 -0
  711. package/src/tools/write/index.ts +604 -0
  712. package/src/tools/write/phased.ts +41 -0
  713. package/src/types/generated/foundation-client-types.ts +22 -0
  714. package/src/types/sql-js.d.ts +15 -0
  715. package/src/utils/splash-lines.ts +46 -0
  716. package/src/version.ts +17 -0
  717. package/src/watchers/index.ts +11 -0
  718. package/src/watchers/registry.ts +517 -0
  719. package/src/web-search/index.ts +26 -0
  720. package/src/web-search/provider-registry.ts +64 -0
  721. package/src/web-search/providers/brave.ts +100 -0
  722. package/src/web-search/providers/duckduckgo.ts +270 -0
  723. package/src/web-search/providers/exa.ts +77 -0
  724. package/src/web-search/providers/firecrawl.ts +90 -0
  725. package/src/web-search/providers/perplexity.ts +86 -0
  726. package/src/web-search/providers/searxng.ts +88 -0
  727. package/src/web-search/providers/shared.ts +249 -0
  728. package/src/web-search/providers/tavily.ts +90 -0
  729. package/src/web-search/service.ts +142 -0
  730. package/src/widget/index.ts +2 -0
  731. package/src/widget/types.ts +9 -0
  732. package/src/widget/widget.ts +8 -0
@@ -0,0 +1,175 @@
1
+ import { PolicyRegistry } from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-registry';
2
+ import { DivergencePanel } from '@pellux/goodvibes-sdk/platform/runtime/diagnostics/panels/divergence';
3
+ import type { PolicyPanelSnapshot } from '../diagnostics/panels/policy.ts';
4
+ import { PolicyPanel as PolicyDiagnosticsPanel } from '../diagnostics/panels/policy.ts';
5
+ import type { DivergenceDashboard } from '@pellux/goodvibes-sdk/platform/runtime/permissions/divergence-dashboard';
6
+ import type { PermissionCheckResult } from '@pellux/goodvibes-sdk/platform/permissions/types';
7
+ import { lintPolicyConfig } from '@pellux/goodvibes-sdk/platform/runtime/permissions/lint';
8
+ import type { PolicySimulationSummary } from '@pellux/goodvibes-sdk/platform/runtime/permissions/simulation-scenarios';
9
+ import type { PolicyPreflightReview } from './preflight.ts';
10
+
11
+ const MAX_PERMISSION_AUDIT = 100;
12
+
13
+ export interface PermissionAuditEntry {
14
+ readonly callId: string;
15
+ readonly tool: string;
16
+ readonly category: string;
17
+ readonly approved?: boolean;
18
+ readonly sourceLayer?: string;
19
+ readonly reasonCode?: string;
20
+ readonly riskLevel: string;
21
+ readonly classification: string;
22
+ readonly summary: string;
23
+ readonly reasons: readonly string[];
24
+ readonly target?: string;
25
+ readonly host?: string;
26
+ readonly requestedAt: number;
27
+ readonly decidedAt?: number;
28
+ readonly persisted?: boolean;
29
+ }
30
+
31
+ export class PolicyRuntimeState {
32
+ private readonly _registry: PolicyRegistry;
33
+ private _dashboard: DivergenceDashboard | null = null;
34
+ private _divergencePanel: DivergencePanel | null = null;
35
+ private readonly _recentPermissionAudit: PermissionAuditEntry[] = [];
36
+ private _lastSimulationSummary: PolicySimulationSummary | null = null;
37
+ private _lastPreflightReview: PolicyPreflightReview | null = null;
38
+ private readonly _subscribers = new Set<() => void>();
39
+
40
+ public constructor(registry: PolicyRegistry = new PolicyRegistry()) {
41
+ this._registry = registry;
42
+ }
43
+
44
+ public getRegistry(): PolicyRegistry {
45
+ return this._registry;
46
+ }
47
+
48
+ public getDashboard(): DivergenceDashboard | null {
49
+ return this._dashboard;
50
+ }
51
+
52
+ public getDivergencePanel(): DivergencePanel | null {
53
+ return this._divergencePanel;
54
+ }
55
+
56
+ public setDashboard(dashboard: DivergenceDashboard | null): void {
57
+ this._divergencePanel?.dispose();
58
+ this._dashboard = dashboard;
59
+ this._divergencePanel = dashboard ? new DivergencePanel(dashboard) : null;
60
+ this.notify();
61
+ }
62
+
63
+ public recordTrendEntry(): void {
64
+ this._divergencePanel?.recordTrendEntry();
65
+ this.notify();
66
+ }
67
+
68
+ public getSnapshot(): PolicyPanelSnapshot {
69
+ const current = this._registry.getCurrent();
70
+ const candidate = this._registry.getCandidate();
71
+ const lintFindings = [
72
+ ...(current ? lintPolicyConfig({ mode: 'custom', rules: current.rules }) : []),
73
+ ...(candidate ? lintPolicyConfig({ mode: 'custom', rules: candidate.rules }) : []),
74
+ ];
75
+ const panel = new PolicyDiagnosticsPanel(
76
+ this._registry,
77
+ this._divergencePanel,
78
+ this._recentPermissionAudit,
79
+ lintFindings,
80
+ this._lastSimulationSummary,
81
+ this._lastPreflightReview,
82
+ );
83
+ return panel.getSnapshot();
84
+ }
85
+
86
+ public recordSimulationSummary(summary: PolicySimulationSummary): void {
87
+ this._lastSimulationSummary = summary;
88
+ this.notify();
89
+ }
90
+
91
+ public recordPreflightReview(review: PolicyPreflightReview): void {
92
+ this._lastPreflightReview = review;
93
+ this.notify();
94
+ }
95
+
96
+ public recordPermissionRequest(params: {
97
+ callId: string;
98
+ tool: string;
99
+ category: string;
100
+ analysis: PermissionCheckResult['analysis'];
101
+ }): void {
102
+ this._upsertPermissionAudit({
103
+ callId: params.callId,
104
+ tool: params.tool,
105
+ category: params.category,
106
+ riskLevel: params.analysis.riskLevel,
107
+ classification: params.analysis.classification,
108
+ summary: params.analysis.summary,
109
+ reasons: params.analysis.reasons,
110
+ target: params.analysis.target,
111
+ host: params.analysis.host,
112
+ requestedAt: Date.now(),
113
+ });
114
+ this.notify();
115
+ }
116
+
117
+ public recordPermissionDecision(params: {
118
+ callId: string;
119
+ tool: string;
120
+ category: string;
121
+ result: PermissionCheckResult;
122
+ }): void {
123
+ this._upsertPermissionAudit({
124
+ callId: params.callId,
125
+ tool: params.tool,
126
+ category: params.category,
127
+ approved: params.result.approved,
128
+ sourceLayer: params.result.sourceLayer,
129
+ reasonCode: params.result.reasonCode,
130
+ riskLevel: params.result.analysis.riskLevel,
131
+ classification: params.result.analysis.classification,
132
+ summary: params.result.analysis.summary,
133
+ reasons: params.result.analysis.reasons,
134
+ target: params.result.analysis.target,
135
+ host: params.result.analysis.host,
136
+ requestedAt: Date.now(),
137
+ decidedAt: Date.now(),
138
+ persisted: params.result.persisted,
139
+ });
140
+ this.notify();
141
+ }
142
+
143
+ public subscribe(callback: () => void): () => void {
144
+ this._subscribers.add(callback);
145
+ return () => {
146
+ this._subscribers.delete(callback);
147
+ };
148
+ }
149
+
150
+ public notify(): void {
151
+ for (const cb of this._subscribers) {
152
+ try {
153
+ cb();
154
+ } catch {
155
+ // Panel/runtime subscribers must not break policy state propagation.
156
+ }
157
+ }
158
+ }
159
+
160
+ private _upsertPermissionAudit(entry: PermissionAuditEntry): void {
161
+ const existingIndex = this._recentPermissionAudit.findIndex((candidate) => candidate.callId === entry.callId);
162
+ if (existingIndex >= 0) {
163
+ this._recentPermissionAudit[existingIndex] = {
164
+ ...this._recentPermissionAudit[existingIndex]!,
165
+ ...entry,
166
+ requestedAt: this._recentPermissionAudit[existingIndex]!.requestedAt,
167
+ };
168
+ } else {
169
+ this._recentPermissionAudit.unshift(entry);
170
+ if (this._recentPermissionAudit.length > MAX_PERMISSION_AUDIT) {
171
+ this._recentPermissionAudit.length = MAX_PERMISSION_AUDIT;
172
+ }
173
+ }
174
+ }
175
+ }
@@ -0,0 +1,101 @@
1
+ import type { GoodVibesConfig, DeepReadonly } from '../../config/index.ts';
2
+ import type { PolicyLintFinding } from '@pellux/goodvibes-sdk/platform/runtime/permissions/lint';
3
+ import type { McpServerRole, McpTrustMode } from '@pellux/goodvibes-sdk/platform/runtime/mcp/types';
4
+
5
+ export type PolicyPreflightStatus = 'pass' | 'warn' | 'block';
6
+
7
+ export interface PolicyPreflightServer {
8
+ readonly serverName: string;
9
+ readonly trustMode: McpTrustMode;
10
+ readonly role: McpServerRole;
11
+ readonly allowedPaths: readonly string[];
12
+ readonly allowedHosts: readonly string[];
13
+ }
14
+
15
+ export interface PolicyPreflightIssue {
16
+ readonly severity: 'info' | 'warn' | 'error';
17
+ readonly source: 'policy' | 'runtime' | 'mcp';
18
+ readonly message: string;
19
+ readonly detail?: string;
20
+ readonly serverName?: string;
21
+ }
22
+
23
+ export interface PolicyPreflightReview {
24
+ readonly generatedAt: string;
25
+ readonly status: PolicyPreflightStatus;
26
+ readonly summary: string;
27
+ readonly issueCount: number;
28
+ readonly issues: readonly PolicyPreflightIssue[];
29
+ }
30
+
31
+ function summarize(status: PolicyPreflightStatus, issues: readonly PolicyPreflightIssue[]): string {
32
+ if (issues.length === 0) {
33
+ return 'No blocking or warning conditions detected for the current policy state.';
34
+ }
35
+ const errors = issues.filter((issue) => issue.severity === 'error').length;
36
+ const warnings = issues.filter((issue) => issue.severity === 'warn').length;
37
+ if (status === 'block') {
38
+ return `${errors} blocking issue${errors === 1 ? '' : 's'} and ${warnings} warning${warnings === 1 ? '' : 's'} require attention before high-risk runs.`;
39
+ }
40
+ return `${warnings} warning${warnings === 1 ? '' : 's'} detected in the current policy posture.`;
41
+ }
42
+
43
+ export function buildPolicyPreflightReview(params: {
44
+ config: DeepReadonly<GoodVibesConfig>;
45
+ lintFindings: readonly PolicyLintFinding[];
46
+ mcpServers: readonly PolicyPreflightServer[];
47
+ }): PolicyPreflightReview {
48
+ const issues: PolicyPreflightIssue[] = [];
49
+
50
+ for (const finding of params.lintFindings) {
51
+ issues.push({
52
+ severity: finding.severity === 'error' ? 'error' : finding.severity === 'warn' ? 'warn' : 'info',
53
+ source: 'policy',
54
+ message: finding.message,
55
+ detail: finding.ruleId ? `rule=${finding.ruleId}` : undefined,
56
+ });
57
+ }
58
+
59
+ if (params.config.permissions.mode === 'allow-all') {
60
+ issues.push({
61
+ severity: 'error',
62
+ source: 'runtime',
63
+ message: 'Permission mode is allow-all.',
64
+ detail: 'All runtime permission checks are bypassed for local tools.',
65
+ });
66
+ }
67
+
68
+ for (const server of params.mcpServers) {
69
+ if (server.trustMode === 'allow-all') {
70
+ issues.push({
71
+ severity: 'error',
72
+ source: 'mcp',
73
+ serverName: server.serverName,
74
+ message: `MCP server "${server.serverName}" is in allow-all mode.`,
75
+ detail: `role=${server.role} paths=${server.allowedPaths.length} hosts=${server.allowedHosts.length}`,
76
+ });
77
+ } else if (server.trustMode === 'ask-on-risk') {
78
+ issues.push({
79
+ severity: 'warn',
80
+ source: 'mcp',
81
+ serverName: server.serverName,
82
+ message: `MCP server "${server.serverName}" requires approval for risky actions.`,
83
+ detail: `role=${server.role} paths=${server.allowedPaths.length} hosts=${server.allowedHosts.length}`,
84
+ });
85
+ }
86
+ }
87
+
88
+ const status: PolicyPreflightStatus = issues.some((issue) => issue.severity === 'error')
89
+ ? 'block'
90
+ : issues.some((issue) => issue.severity === 'warn')
91
+ ? 'warn'
92
+ : 'pass';
93
+
94
+ return {
95
+ generatedAt: new Date().toISOString(),
96
+ status,
97
+ summary: summarize(status, issues),
98
+ issueCount: issues.length,
99
+ issues,
100
+ };
101
+ }
@@ -0,0 +1,36 @@
1
+ import type { PermissionAuditEntry } from './policy-runtime.ts';
2
+
3
+ export interface PermissionRuleSuggestion {
4
+ readonly id: string;
5
+ readonly tool: string;
6
+ readonly command: string;
7
+ readonly summary: string;
8
+ readonly reason: string;
9
+ }
10
+
11
+ export function buildPermissionRuleSuggestions(
12
+ audit: readonly PermissionAuditEntry[],
13
+ ): PermissionRuleSuggestion[] {
14
+ const denied = audit.filter((entry) => entry.approved === false);
15
+ const grouped = new Map<string, PermissionAuditEntry[]>();
16
+ for (const entry of denied) {
17
+ const key = `${entry.tool}:${entry.target ?? entry.host ?? entry.summary}`;
18
+ const list = grouped.get(key) ?? [];
19
+ list.push(entry);
20
+ grouped.set(key, list);
21
+ }
22
+ return [...grouped.entries()]
23
+ .filter(([, entries]) => entries.length >= 2)
24
+ .map(([key, entries]) => {
25
+ const sample = entries[0]!;
26
+ const target = sample.target ?? sample.host ?? sample.summary;
27
+ return {
28
+ id: key,
29
+ tool: sample.tool,
30
+ command: `/policy simulate ${sample.tool}${target ? ` --target ${JSON.stringify(target)}` : ''}`,
31
+ summary: `Repeated denials for ${sample.tool}`,
32
+ reason: `${entries.length} denials suggest a durable scoped rule or policy review may be appropriate.`,
33
+ } satisfies PermissionRuleSuggestion;
34
+ })
35
+ .sort((a, b) => a.tool.localeCompare(b.tool));
36
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Safe hot-reload protocol for plugins.
3
+ *
4
+ * Implements the 6-phase hot-reload sequence:
5
+ * 1. Quiesce — stop accepting new work from the plugin
6
+ * 2. Unregister — remove plugin's registrations (commands, tools, hooks)
7
+ * 3. Unload — deactivate and clean up the old plugin instance
8
+ * 4. Reload — load the new version with a cache-bust timestamp
9
+ * 5. Re-register — new instance calls init/activate (registers naturally)
10
+ * 6. Health check → active (healthy) or degraded (unhealthy)
11
+ */
12
+
13
+ import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
14
+ import type { PluginLoaderDeps } from '../../plugins/loader.ts';
15
+ import type { LoadedPlugin } from '../../plugins/loader.ts';
16
+ import type { PluginHealthCheckResult, PluginManifestV2 } from './types.ts';
17
+ import type { PluginLifecycleManager } from './manager.ts';
18
+ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
19
+
20
+ /**
21
+ * Options for a single plugin hot-reload operation.
22
+ */
23
+ export interface HotReloadOptions {
24
+ /**
25
+ * Callback to retrieve the current loaded plugin instance by name.
26
+ * Used to call deactivate() and run cleanup before unloading.
27
+ */
28
+ getLoadedPlugin: (name: string) => LoadedPlugin | undefined;
29
+
30
+ /**
31
+ * Callback to remove a plugin's loaded instance from the host's registry.
32
+ * Called after unload to clean up the host-side reference.
33
+ */
34
+ removeLoadedPlugin: (name: string) => void;
35
+
36
+ /**
37
+ * Callback to store the newly loaded plugin instance in the host's registry.
38
+ * Called after a successful reload.
39
+ */
40
+ storeLoadedPlugin: (name: string, plugin: LoadedPlugin) => void;
41
+
42
+ /**
43
+ * Optional health check callback invoked after re-registration.
44
+ * Return a PluginHealthCheckResult to indicate whether the plugin is healthy.
45
+ * Defaults to a trivial healthy check.
46
+ */
47
+ healthCheck?: (name: string) => Promise<PluginHealthCheckResult>;
48
+
49
+ /**
50
+ * Maximum time (ms) to wait for the health check before timing out.
51
+ * Defaults to 5000ms.
52
+ */
53
+ healthCheckTimeoutMs?: number;
54
+ }
55
+
56
+ /**
57
+ * Result of a hot-reload operation.
58
+ */
59
+ export interface HotReloadResult {
60
+ /** Whether the reload completed successfully and the plugin is healthy. */
61
+ success: boolean;
62
+ /** Phase that failed (if success === false). */
63
+ failedPhase?: 'quiesce' | 'unregister' | 'unload' | 'reload' | 're-register' | 'health-check';
64
+ /** Error message (if success === false). */
65
+ error?: string;
66
+ /** Duration of the reload in milliseconds. */
67
+ durationMs: number;
68
+ /** Whether the plugin ended in degraded state (partial success). */
69
+ degraded: boolean;
70
+ }
71
+
72
+ /** Default trivial health check — always returns healthy. */
73
+ async function defaultHealthCheck(name: string): Promise<PluginHealthCheckResult> {
74
+ return {
75
+ healthy: true,
76
+ message: `${name}: health check passed (default)`,
77
+ durationMs: 0,
78
+ };
79
+ }
80
+
81
+ /**
82
+ * runHotReload — Execute the safe 6-phase hot-reload protocol for a single
83
+ * plugin.
84
+ *
85
+ * @param name - Plugin name.
86
+ * @param manifest - Current manifest for the plugin.
87
+ * @param pluginDir - Absolute path to the plugin directory.
88
+ * @param deps - Loader dependencies (runtime bus, registries, etc.).
89
+ * @param lcm - PluginLifecycleManager to track state transitions.
90
+ * @param options - Host-side callbacks and configuration.
91
+ * @returns HotReloadResult describing the outcome.
92
+ */
93
+ export async function runHotReload(
94
+ name: string,
95
+ manifest: PluginManifestV2,
96
+ pluginDir: string,
97
+ deps: PluginLoaderDeps,
98
+ lcm: PluginLifecycleManager,
99
+ options: HotReloadOptions,
100
+ ): Promise<HotReloadResult> {
101
+ const startTs = Date.now();
102
+ const healthCheck = options.healthCheck ?? defaultHealthCheck;
103
+ const timeoutMs = options.healthCheckTimeoutMs ?? 5000;
104
+
105
+ const record = lcm.getRecord(name);
106
+ if (!record) {
107
+ return {
108
+ success: false,
109
+ failedPhase: 'quiesce',
110
+ error: `Plugin '${name}' is not tracked by the lifecycle manager`,
111
+ durationMs: Date.now() - startTs,
112
+ degraded: false,
113
+ };
114
+ }
115
+
116
+ logger.info(`[plugin-hot-reload] ${name}: starting hot-reload`);
117
+
118
+ // ── Phase 1: Quiesce ────────────────────────────────────────────────────
119
+ // Mark the plugin as reloading to signal to callers to defer new work.
120
+ // (The PluginLifecycleRecord.reloading flag is set, but state is not changed.)
121
+ // In a future implementation this phase could drain in-flight requests.
122
+ try {
123
+ // Access via cast since reloading is a mutable field on the record.
124
+ const mutableRecord = record as { reloading: boolean };
125
+ mutableRecord.reloading = true;
126
+ logger.debug(`[plugin-hot-reload] ${name}: phase 1/6 quiesced`);
127
+ } catch (err) {
128
+ return failure('quiesce', summarizeError(err), startTs);
129
+ }
130
+
131
+ // ── Phase 2: Prepare unregister ──────────────────────────────────────────
132
+ // The existing plugin's cleanup callbacks handle un-registration during
133
+ // unload, so there is no separate hook dispatch here.
134
+ logger.debug(`[plugin-hot-reload] ${name}: phase 2/6 unregister scheduled with unload cleanup`);
135
+
136
+ // ── Phase 3: Unload ─────────────────────────────────────────────────────
137
+ try {
138
+ const loaded = options.getLoadedPlugin(name);
139
+ if (loaded) {
140
+ const { unloadPlugin } = await import('../../plugins/loader.ts');
141
+ await unloadPlugin(loaded);
142
+ }
143
+ options.removeLoadedPlugin(name);
144
+ logger.debug(`[plugin-hot-reload] ${name}: phase 3/6 unloaded`);
145
+ } catch (err) {
146
+ return failure('unload', summarizeError(err), startTs);
147
+ }
148
+
149
+ // ── Phase 4 + 5: Reload + Re-register ──────────────────────────────────
150
+ // loadPlugin calls init() and activate() which re-registers everything.
151
+ let reloadedPlugin: import('../../plugins/loader.ts').LoadedPlugin | null = null;
152
+ try {
153
+ const { loadPlugin } = await import('../../plugins/loader.ts');
154
+ const cacheBust = Date.now();
155
+ reloadedPlugin = await loadPlugin({ manifest, pluginDir }, deps, cacheBust);
156
+ if (!reloadedPlugin) {
157
+ return failure('reload', 'loadPlugin returned null', startTs);
158
+ }
159
+ options.storeLoadedPlugin(name, reloadedPlugin);
160
+ logger.debug(`[plugin-hot-reload] ${name}: phases 4+5/6 reloaded + re-registered`);
161
+ } catch (err) {
162
+ return failure('reload', summarizeError(err), startTs);
163
+ }
164
+
165
+ // ── Phase 6: Health check ────────────────────────────────────────────────
166
+ let healthResult: PluginHealthCheckResult;
167
+ try {
168
+ healthResult = await Promise.race([
169
+ healthCheck(name),
170
+ new Promise<PluginHealthCheckResult>((_, reject) =>
171
+ setTimeout(() => reject(new Error(`health check timed out after ${timeoutMs}ms`)), timeoutMs),
172
+ ),
173
+ ]);
174
+ } catch (err) {
175
+ healthResult = {
176
+ healthy: false,
177
+ message: summarizeError(err),
178
+ durationMs: Date.now() - startTs,
179
+ };
180
+ }
181
+
182
+ // Clear reloading flag.
183
+ try {
184
+ const mutableRecord = lcm.getRecord(name) as { reloading: boolean } | undefined;
185
+ if (mutableRecord) mutableRecord.reloading = false;
186
+ } catch { /* non-fatal */ }
187
+
188
+ if (healthResult.healthy) {
189
+ logger.info(`[plugin-hot-reload] ${name}: hot-reload complete — active (${Date.now() - startTs}ms)`);
190
+ return {
191
+ success: true,
192
+ durationMs: Date.now() - startTs,
193
+ degraded: false,
194
+ };
195
+ } else {
196
+ // Plugin loaded but health check failed → degraded.
197
+ lcm.degradePlugin(name, `Health check failed: ${healthResult.message}`);
198
+ logger.warn(`[plugin-hot-reload] ${name}: hot-reload complete — degraded (${healthResult.message})`);
199
+ return {
200
+ success: true, // reload succeeded; just in degraded state
201
+ durationMs: Date.now() - startTs,
202
+ degraded: true,
203
+ };
204
+ }
205
+ }
206
+
207
+ /** Build a failure result for a named phase. */
208
+ function failure(
209
+ phase: HotReloadResult['failedPhase'],
210
+ error: string,
211
+ startTs: number,
212
+ ): HotReloadResult {
213
+ logger.error(`[plugin-hot-reload] phase '${String(phase)}' failed: ${error}`);
214
+ return {
215
+ success: false,
216
+ failedPhase: phase,
217
+ error,
218
+ durationMs: Date.now() - startTs,
219
+ degraded: false,
220
+ };
221
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Plugin lifecycle system — barrel export and factory.
3
+ *
4
+ * Gated by the `plugin-lifecycle` feature flag. Import and call
5
+ * `createPluginLifecycleManager()` at startup after the feature flag
6
+ * manager has been initialised.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createPluginLifecycleManager } from './src/runtime/plugins/index.ts';
11
+ *
12
+ * const lcm = createPluginLifecycleManager({ sessionId: session.id, runtimeBus });
13
+ * lcm.scanAndRegister();
14
+ * ```
15
+ */
16
+
17
+ export type {
18
+ PluginCapability,
19
+ PluginCapabilityManifest,
20
+ PluginManifestV2,
21
+ PluginTransition,
22
+ TransitionResult,
23
+ PluginHealthCheckResult,
24
+ PluginLifecycleRecord,
25
+ PluginLifecycleManagerOptions,
26
+ PluginLifecycleState,
27
+ } from './types.ts';
28
+
29
+ export { ALL_CAPABILITIES, MAX_TRANSITION_HISTORY } from './types.ts';
30
+
31
+ export {
32
+ VALID_TRANSITIONS,
33
+ canTransition,
34
+ applyTransition,
35
+ isOperational,
36
+ isReloadable,
37
+ isTerminal,
38
+ } from './lifecycle.ts';
39
+
40
+ export {
41
+ resolveCapabilityManifest,
42
+ hasCapability,
43
+ validateManifestV2,
44
+ } from './manifest.ts';
45
+
46
+ export { PluginLifecycleManager } from './manager.ts';
47
+ import { PluginLifecycleManager } from './manager.ts';
48
+
49
+ // Trust framework.
50
+ export type {
51
+ PluginTrustTier,
52
+ PluginTrustRecord,
53
+ SignatureValidationResult,
54
+ } from './trust.ts';
55
+ export {
56
+ PluginTrustStore,
57
+ validatePluginSignature,
58
+ filterCapabilitiesByTrust,
59
+ SAFE_CAPABILITIES,
60
+ } from './trust.ts';
61
+
62
+ export type { QuarantineRecord } from './quarantine.ts';
63
+ export { PluginQuarantineEngine } from './quarantine.ts';
64
+
65
+ export { isHighRiskCapability } from './manifest.ts';
66
+
67
+ export type { HotReloadOptions, HotReloadResult } from './hot-reload.ts';
68
+ export { runHotReload } from './hot-reload.ts';
69
+
70
+ /**
71
+ * createPluginLifecycleManager — Factory function for the PluginLifecycleManager.
72
+ *
73
+ * Intended as the primary entry point for consumers. Respects the
74
+ * `plugin-lifecycle` feature flag — callers should check the flag before
75
+ * invoking if they want to gate the entire system.
76
+ *
77
+ * @param options - Optional manager configuration.
78
+ * @returns A new PluginLifecycleManager instance.
79
+ */
80
+ export function createPluginLifecycleManager(
81
+ options: import('./types.ts').PluginLifecycleManagerOptions = {},
82
+ ): PluginLifecycleManager {
83
+ return new PluginLifecycleManager(options);
84
+ }