@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,329 @@
1
+ /**
2
+ * ServiceRegistry — named service credential resolution.
3
+ *
4
+ * Reads service configs from .goodvibes/tui/services.json.
5
+ * Each service entry declares its authType and the SecretsManager key
6
+ * that holds the credential.
7
+ *
8
+ * Example services.json:
9
+ * {
10
+ * "openai": { "name": "openai", "baseUrl": "https://api.openai.com", "authType": "bearer", "tokenKey": "OPENAI_API_KEY" },
11
+ * "github": { "name": "github", "baseUrl": "https://api.github.com", "authType": "bearer", "tokenKey": "GITHUB_TOKEN" },
12
+ * "slack": { "name": "slack", "authType": "bearer", "tokenKey": "SLACK_BOT_TOKEN", "tokenRef": { "source": "vaultwarden", "item": "GoodVibes Slack", "field": "password", "server": "https://vault.example.test" } }
13
+ * }
14
+ */
15
+
16
+ import { readFileSync } from 'fs';
17
+ import { SecretsManager } from './secrets.ts';
18
+ import {
19
+ describeSecretRef,
20
+ isSecretRefInput,
21
+ resolveSecretRef,
22
+ type SecretRefInput,
23
+ } from '@pellux/goodvibes-sdk/platform/config/secret-refs';
24
+ import type { OAuthProviderConfig } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
25
+ import { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
26
+ import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
27
+ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Types
31
+ // ---------------------------------------------------------------------------
32
+
33
+ export interface ServiceConfig {
34
+ /** Human-readable / lookup name. */
35
+ name: string;
36
+ /** Base URL for the service (informational). */
37
+ baseUrl?: string;
38
+ /** Auth type used by this service. */
39
+ authType: 'bearer' | 'basic' | 'api-key' | 'oauth';
40
+ /** SecretsManager key that holds the primary credential (token or API key). */
41
+ tokenKey: string;
42
+ /** Optional external/local secret reference for the primary credential. */
43
+ tokenRef?: SecretRefInput;
44
+ /** For basic auth: SecretsManager key that holds the password. */
45
+ passwordKey?: string;
46
+ /** Optional external/local secret reference for the basic-auth password. */
47
+ passwordRef?: SecretRefInput;
48
+ /** For api-key auth: the header name. Defaults to X-API-Key. */
49
+ apiKeyHeader?: string;
50
+ /** Optional secret key holding a webhook or callback URL for this service. */
51
+ webhookUrlKey?: string;
52
+ /** Optional external/local secret reference for a webhook or callback URL. */
53
+ webhookUrlRef?: SecretRefInput;
54
+ /** Optional secret key for inbound request signing/verification. */
55
+ signingSecretKey?: string;
56
+ /** Optional external/local secret reference for inbound request signing/verification. */
57
+ signingSecretRef?: SecretRefInput;
58
+ /** Optional public-key secret used for inbound signature verification. */
59
+ publicKeyKey?: string;
60
+ /** Optional external/local secret reference for inbound public-key verification. */
61
+ publicKeyRef?: SecretRefInput;
62
+ /** Optional provider ID used for subscription token override lookup. */
63
+ providerId?: string;
64
+ /** OAuth metadata for subscription-backed services. */
65
+ oauth?: OAuthProviderConfig;
66
+ }
67
+
68
+ export type ServiceSecretField =
69
+ | 'primary'
70
+ | 'password'
71
+ | 'webhookUrl'
72
+ | 'signingSecret'
73
+ | 'publicKey';
74
+
75
+ export interface ServiceInspection {
76
+ readonly config: ServiceConfig;
77
+ readonly hasPrimaryCredential: boolean;
78
+ readonly hasPasswordCredential: boolean;
79
+ readonly hasWebhookUrl: boolean;
80
+ readonly hasSigningSecret: boolean;
81
+ readonly hasPublicKey: boolean;
82
+ }
83
+
84
+ export interface ServiceConnectionTestResult {
85
+ readonly ok: boolean;
86
+ readonly status: number | null;
87
+ readonly testedUrl: string | null;
88
+ readonly error?: string;
89
+ }
90
+
91
+ export interface ServiceRegistryOptions {
92
+ readonly secretsManager: SecretsManager;
93
+ readonly subscriptionManager: SubscriptionManager;
94
+ }
95
+
96
+ function readServicesFile(filePath: string): Record<string, ServiceConfig> {
97
+ try {
98
+ const raw = readFileSync(filePath, 'utf-8');
99
+ return JSON.parse(raw) as Record<string, ServiceConfig>;
100
+ } catch (err) {
101
+ const code = (err as NodeJS.ErrnoException).code;
102
+ if (code !== 'ENOENT') {
103
+ logger.error('ServiceRegistry: failed to read services file — treating as empty', {
104
+ path: filePath,
105
+ });
106
+ }
107
+ return {};
108
+ }
109
+ }
110
+
111
+ // ---------------------------------------------------------------------------
112
+ // ServiceRegistry
113
+ // ---------------------------------------------------------------------------
114
+
115
+ export class ServiceRegistry {
116
+ private readonly servicesFilePath: string;
117
+ private readonly secretsManager: SecretsManager;
118
+ private readonly subscriptionManager: SubscriptionManager;
119
+
120
+ constructor(servicesFilePath: string, options: ServiceRegistryOptions) {
121
+ this.servicesFilePath = servicesFilePath;
122
+ this.secretsManager = options.secretsManager;
123
+ this.subscriptionManager = options.subscriptionManager;
124
+ }
125
+
126
+ /**
127
+ * Return all registered service configs.
128
+ */
129
+ getAll(): Record<string, ServiceConfig> {
130
+ return readServicesFile(this.servicesFilePath);
131
+ }
132
+
133
+ /**
134
+ * Return the config for a named service, or null if not found.
135
+ */
136
+ get(serviceName: string): ServiceConfig | null {
137
+ const all = this.getAll();
138
+ return all[serviceName] ?? null;
139
+ }
140
+
141
+ private async resolveConfiguredSecret(
142
+ serviceName: string,
143
+ field: ServiceSecretField,
144
+ keyOrRef?: string,
145
+ ref?: SecretRefInput,
146
+ ): Promise<string | null> {
147
+ const candidate = ref ?? (keyOrRef && isSecretRefInput(keyOrRef) ? keyOrRef : undefined);
148
+ if (candidate) {
149
+ try {
150
+ const resolved = await resolveSecretRef(candidate, {
151
+ resolveLocalSecret: (key) => this.secretsManager.get(key),
152
+ homeDirectory: this.secretsManager.getGlobalHome?.() ?? undefined,
153
+ });
154
+ return resolved.value;
155
+ } catch (error) {
156
+ logger.warn('ServiceRegistry: failed to resolve secret reference', {
157
+ serviceName,
158
+ field,
159
+ ref: describeSecretRef(candidate),
160
+ error: summarizeError(error),
161
+ });
162
+ return null;
163
+ }
164
+ }
165
+
166
+ return keyOrRef ? this.secretsManager.get(keyOrRef) : null;
167
+ }
168
+
169
+ /**
170
+ * Resolve auth headers for a named service.
171
+ * Looks up the service config, fetches credential from SecretsManager,
172
+ * and returns the appropriate HTTP headers.
173
+ *
174
+ * Returns null if the service is not registered or credential is unavailable.
175
+ */
176
+ async resolveAuth(serviceName: string): Promise<Record<string, string> | null> {
177
+ const config = this.get(serviceName);
178
+ if (!config) {
179
+ logger.debug('ServiceRegistry: unknown service', { serviceName });
180
+ return null;
181
+ }
182
+
183
+ const providerOverride = this.subscriptionManager.getAccessToken(config.providerId ?? serviceName);
184
+ if (providerOverride) {
185
+ return { Authorization: `Bearer ${providerOverride}` };
186
+ }
187
+
188
+ switch (config.authType) {
189
+ case 'bearer': {
190
+ const token = await this.resolveConfiguredSecret(serviceName, 'primary', config.tokenKey, config.tokenRef);
191
+ if (!token) {
192
+ logger.debug('ServiceRegistry: bearer token not found', { serviceName, key: config.tokenKey });
193
+ return null;
194
+ }
195
+ return { Authorization: `Bearer ${token}` };
196
+ }
197
+
198
+ case 'basic': {
199
+ const username = await this.resolveConfiguredSecret(serviceName, 'primary', config.tokenKey, config.tokenRef);
200
+ const password = await this.resolveConfiguredSecret(serviceName, 'password', config.passwordKey, config.passwordRef);
201
+ if (!username) {
202
+ logger.debug('ServiceRegistry: basic username not found', { serviceName, key: config.tokenKey });
203
+ return null;
204
+ }
205
+ const encoded = Buffer.from(`${username}:${password ?? ''}`).toString('base64');
206
+ return { Authorization: `Basic ${encoded}` };
207
+ }
208
+
209
+ case 'api-key': {
210
+ const key = await this.resolveConfiguredSecret(serviceName, 'primary', config.tokenKey, config.tokenRef);
211
+ if (!key) {
212
+ logger.debug('ServiceRegistry: api key not found', { serviceName, key: config.tokenKey });
213
+ return null;
214
+ }
215
+ const headerName = config.apiKeyHeader ?? 'X-API-Key';
216
+ return { [headerName]: key };
217
+ }
218
+
219
+ case 'oauth': {
220
+ const token = await this.resolveConfiguredSecret(serviceName, 'primary', config.tokenKey, config.tokenRef);
221
+ if (!token) {
222
+ logger.debug('ServiceRegistry: oauth token not found', { serviceName, key: config.tokenKey });
223
+ return null;
224
+ }
225
+ return { Authorization: `Bearer ${token}` };
226
+ }
227
+
228
+ default:
229
+ return null;
230
+ }
231
+ }
232
+
233
+ async resolveSecret(
234
+ serviceName: string,
235
+ field: ServiceSecretField,
236
+ ): Promise<string | null> {
237
+ const config = this.get(serviceName);
238
+ if (!config) return null;
239
+
240
+ switch (field) {
241
+ case 'primary':
242
+ return this.resolveConfiguredSecret(serviceName, field, config.tokenKey, config.tokenRef);
243
+ case 'password':
244
+ return this.resolveConfiguredSecret(serviceName, field, config.passwordKey, config.passwordRef);
245
+ case 'webhookUrl':
246
+ return this.resolveConfiguredSecret(serviceName, field, config.webhookUrlKey, config.webhookUrlRef);
247
+ case 'signingSecret':
248
+ return this.resolveConfiguredSecret(serviceName, field, config.signingSecretKey, config.signingSecretRef);
249
+ case 'publicKey':
250
+ return this.resolveConfiguredSecret(serviceName, field, config.publicKeyKey, config.publicKeyRef);
251
+ }
252
+ }
253
+
254
+ async inspect(serviceName: string): Promise<ServiceInspection | null> {
255
+ const config = this.get(serviceName);
256
+ if (!config) return null;
257
+
258
+ const [
259
+ primary,
260
+ password,
261
+ webhookUrl,
262
+ signingSecret,
263
+ publicKey,
264
+ ] = await Promise.all([
265
+ this.resolveSecret(serviceName, 'primary'),
266
+ this.resolveSecret(serviceName, 'password'),
267
+ this.resolveSecret(serviceName, 'webhookUrl'),
268
+ this.resolveSecret(serviceName, 'signingSecret'),
269
+ this.resolveSecret(serviceName, 'publicKey'),
270
+ ]);
271
+
272
+ return {
273
+ config,
274
+ hasPrimaryCredential: primary !== null && primary.length > 0,
275
+ hasPasswordCredential: password !== null && password.length > 0,
276
+ hasWebhookUrl: webhookUrl !== null && webhookUrl.length > 0,
277
+ hasSigningSecret: signingSecret !== null && signingSecret.length > 0,
278
+ hasPublicKey: publicKey !== null && publicKey.length > 0,
279
+ };
280
+ }
281
+
282
+ async testConnection(serviceName: string): Promise<ServiceConnectionTestResult> {
283
+ const config = this.get(serviceName);
284
+ if (!config) {
285
+ return { ok: false, status: null, testedUrl: null, error: 'Unknown service' };
286
+ }
287
+
288
+ const baseUrl = config.baseUrl?.trim() ?? '';
289
+ if (!baseUrl) {
290
+ return { ok: false, status: null, testedUrl: null, error: 'No baseUrl configured' };
291
+ }
292
+
293
+ const headers = await this.resolveAuth(serviceName);
294
+ const reqHeaders: Record<string, string> = {
295
+ Accept: 'application/json',
296
+ ...(headers ?? {}),
297
+ };
298
+ const candidates = [
299
+ `${baseUrl.replace(/\/$/, '')}/health`,
300
+ baseUrl.replace(/\/$/, ''),
301
+ ];
302
+
303
+ for (const url of candidates) {
304
+ try {
305
+ const response = await fetch(url, {
306
+ method: 'GET',
307
+ headers: reqHeaders,
308
+ signal: AbortSignal.timeout(5000),
309
+ });
310
+ return {
311
+ ok: response.ok,
312
+ status: response.status,
313
+ testedUrl: url,
314
+ ...(response.ok ? {} : { error: `HTTP ${response.status}` }),
315
+ };
316
+ } catch (error) {
317
+ const message = summarizeError(error);
318
+ logger.debug('ServiceRegistry: service test failed', { serviceName, url, error: message });
319
+ }
320
+ }
321
+
322
+ return {
323
+ ok: false,
324
+ status: null,
325
+ testedUrl: candidates[candidates.length - 1] ?? null,
326
+ error: 'Connection failed',
327
+ };
328
+ }
329
+ }
@@ -0,0 +1,31 @@
1
+ import { getBuiltinSubscriptionProvider } from './subscription-providers.ts';
2
+ import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
3
+ import { refreshOpenAICodexToken } from '@pellux/goodvibes-sdk/platform/config/openai-codex-auth';
4
+
5
+ export async function resolveSubscriptionAccessToken(
6
+ provider: string,
7
+ manager: Pick<SubscriptionManager, 'get' | 'saveSubscription' | 'resolveAccessToken'>,
8
+ ): Promise<string | null> {
9
+ if (provider === 'openai') {
10
+ const existing = manager.get('openai');
11
+ if (!existing) return null;
12
+ if (typeof existing.expiresAt === 'number' && Date.now() + 60_000 >= existing.expiresAt) {
13
+ if (!existing.refreshToken) return existing.accessToken;
14
+ const refreshed = await refreshOpenAICodexToken(existing.refreshToken);
15
+ manager.saveSubscription({
16
+ ...existing,
17
+ accessToken: refreshed.accessToken,
18
+ refreshToken: refreshed.refreshToken,
19
+ tokenType: refreshed.tokenType,
20
+ expiresAt: refreshed.expiresAt,
21
+ ...(refreshed.scopes ? { scopes: refreshed.scopes } : existing.scopes ? { scopes: existing.scopes } : {}),
22
+ updatedAt: Date.now(),
23
+ });
24
+ return refreshed.accessToken;
25
+ }
26
+ return existing.accessToken;
27
+ }
28
+ const builtin = getBuiltinSubscriptionProvider(provider);
29
+ if (!builtin) return null;
30
+ return manager.resolveAccessToken(provider, builtin.oauth);
31
+ }
@@ -0,0 +1,127 @@
1
+ import type { OAuthProviderConfig } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
2
+ import type { ServiceConfig } from './service-registry.ts';
3
+
4
+ export interface BuiltinSubscriptionProvider {
5
+ readonly provider: string;
6
+ readonly displayName: string;
7
+ readonly authType: 'oauth';
8
+ readonly tokenKey: string;
9
+ readonly providerId: string;
10
+ readonly oauth: OAuthProviderConfig;
11
+ readonly notes: readonly string[];
12
+ }
13
+
14
+ export interface AvailableSubscriptionProvider {
15
+ readonly provider: string;
16
+ readonly displayName: string;
17
+ readonly source: 'builtin' | 'service';
18
+ readonly oauth: OAuthProviderConfig;
19
+ readonly tokenKey: string;
20
+ readonly providerId: string;
21
+ readonly notes: readonly string[];
22
+ }
23
+
24
+ const OPENAI_SUBSCRIPTION_PROVIDER: BuiltinSubscriptionProvider = {
25
+ provider: 'openai',
26
+ displayName: 'OpenAI Codex',
27
+ authType: 'oauth',
28
+ tokenKey: 'OPENAI_API_KEY',
29
+ providerId: 'openai',
30
+ oauth: {
31
+ authUrl: 'https://auth.openai.com/oauth/authorize',
32
+ tokenUrl: 'https://auth.openai.com/oauth/token',
33
+ clientId: 'app_EMoamEEZ73f0CkXaXp7hrann',
34
+ redirectUri: 'http://localhost:1455/auth/callback',
35
+ scopes: ['openid', 'profile', 'email', 'offline_access'],
36
+ usePkce: true,
37
+ tokenRequestEncoding: 'form',
38
+ refreshRequestEncoding: 'form',
39
+ overrideAmbientApiKeys: false,
40
+ authParams: {
41
+ id_token_add_organizations: 'true',
42
+ codex_cli_simplified_flow: 'true',
43
+ originator: 'pi',
44
+ },
45
+ localCallback: {
46
+ host: 'localhost',
47
+ port: 1455,
48
+ path: '/auth/callback',
49
+ autoComplete: true,
50
+ },
51
+ },
52
+ notes: [
53
+ 'Built-in OpenAI Codex / ChatGPT subscription login path.',
54
+ 'Uses the Codex/ChatGPT OAuth flow rather than the standard OpenAI API-key path.',
55
+ ],
56
+ };
57
+
58
+ const BUILTIN_SUBSCRIPTION_PROVIDERS: Record<string, BuiltinSubscriptionProvider> = {
59
+ openai: OPENAI_SUBSCRIPTION_PROVIDER,
60
+ };
61
+
62
+ export function listBuiltinSubscriptionProviders(): BuiltinSubscriptionProvider[] {
63
+ return Object.values(BUILTIN_SUBSCRIPTION_PROVIDERS)
64
+ .slice()
65
+ .sort((a, b) => a.provider.localeCompare(b.provider));
66
+ }
67
+
68
+ export function getBuiltinSubscriptionProvider(provider: string): BuiltinSubscriptionProvider | null {
69
+ return BUILTIN_SUBSCRIPTION_PROVIDERS[provider] ?? null;
70
+ }
71
+
72
+ export function getSubscriptionProviderConfig(
73
+ provider: string,
74
+ serviceConfig?: ServiceConfig | null,
75
+ ): { oauth: OAuthProviderConfig; source: 'service' | 'builtin'; tokenKey: string; providerId: string } | null {
76
+ if (serviceConfig?.authType === 'oauth' && serviceConfig.oauth) {
77
+ return {
78
+ oauth: serviceConfig.oauth,
79
+ source: 'service',
80
+ tokenKey: serviceConfig.tokenKey,
81
+ providerId: serviceConfig.providerId ?? serviceConfig.name,
82
+ };
83
+ }
84
+
85
+ const builtin = getBuiltinSubscriptionProvider(provider);
86
+ if (!builtin) return null;
87
+ return {
88
+ oauth: builtin.oauth,
89
+ source: 'builtin',
90
+ tokenKey: builtin.tokenKey,
91
+ providerId: builtin.providerId,
92
+ };
93
+ }
94
+
95
+ export function listAvailableSubscriptionProviders(
96
+ services: Record<string, ServiceConfig>,
97
+ ): AvailableSubscriptionProvider[] {
98
+ const providers = new Map<string, AvailableSubscriptionProvider>();
99
+
100
+ for (const builtin of listBuiltinSubscriptionProviders()) {
101
+ providers.set(builtin.provider, {
102
+ provider: builtin.provider,
103
+ displayName: builtin.displayName,
104
+ source: 'builtin',
105
+ oauth: builtin.oauth,
106
+ tokenKey: builtin.tokenKey,
107
+ providerId: builtin.providerId,
108
+ notes: builtin.notes,
109
+ });
110
+ }
111
+
112
+ for (const service of Object.values(services)) {
113
+ if (service.authType !== 'oauth' || !service.oauth) continue;
114
+ const provider = service.providerId ?? service.name;
115
+ providers.set(provider, {
116
+ provider,
117
+ displayName: service.name,
118
+ source: 'service',
119
+ oauth: service.oauth,
120
+ tokenKey: service.tokenKey,
121
+ providerId: provider,
122
+ notes: ['Configured through .goodvibes/tui/services.json'],
123
+ });
124
+ }
125
+
126
+ return [...providers.values()].sort((a, b) => a.provider.localeCompare(b.provider));
127
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Tool LLM — internal LLM access for tool operations.
3
+ *
4
+ * Provides a lightweight interface for tool-internal LLM calls:
5
+ * semantic diff, auto-heal, commit messages, prompt hooks, etc.
6
+ *
7
+ * Resolution order:
8
+ * 1. tools.llmProvider + tools.llmModel from config (if both set)
9
+ * 2. Currently selected provider/model from providerRegistry
10
+ *
11
+ * Design constraints:
12
+ * - Never throws from ToolLLM.chat() — returns empty string on any error
13
+ * - Logs failures via logger.debug (tool LLM failures are expected when no key)
14
+ * - Singleton pattern — import `toolLLM` for use
15
+ */
16
+
17
+ import type { ConfigManager } from './manager.ts';
18
+ import type { LLMProvider } from '../providers/interface.ts';
19
+ import type { ProviderRegistry } from '../providers/registry.ts';
20
+ import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
21
+ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
22
+
23
+ /** Resolved provider + model pair for tool-internal LLM calls. */
24
+ export interface ResolvedToolLLM {
25
+ provider: LLMProvider;
26
+ modelId: string;
27
+ }
28
+
29
+ export interface ToolLLMDeps {
30
+ readonly configManager: Pick<ConfigManager, 'get'>;
31
+ readonly providerRegistry: Pick<ProviderRegistry, 'get' | 'getCurrentModel' | 'getForModel'>;
32
+ }
33
+
34
+ /**
35
+ * Resolve the LLM provider and model to use for tool-internal operations.
36
+ *
37
+ * Resolution order:
38
+ * 1. If tools.llmProvider + tools.llmModel are both set in config, use those.
39
+ * 2. Otherwise fall back to the currently selected provider/model.
40
+ *
41
+ * Returns null if resolution fails (e.g. unknown provider name).
42
+ */
43
+ export function resolveToolLLM(deps: ToolLLMDeps): ResolvedToolLLM | null {
44
+ try {
45
+ const cfgProvider = deps.configManager.get('tools.llmProvider');
46
+ const cfgModel = deps.configManager.get('tools.llmModel');
47
+
48
+ if (cfgProvider && cfgModel) {
49
+ // Explicit config: resolve by provider name
50
+ const provider = deps.providerRegistry.get(cfgProvider);
51
+ return { provider, modelId: cfgModel };
52
+ }
53
+
54
+ // Fallback: use currently selected provider/model
55
+ const currentDef = deps.providerRegistry.getCurrentModel();
56
+ const provider = deps.providerRegistry.getForModel(currentDef.id, currentDef.provider);
57
+ return { provider, modelId: currentDef.id };
58
+ } catch (err) {
59
+ logger.debug('resolveToolLLM: failed to resolve provider/model', { error: summarizeError(err) });
60
+ return null;
61
+ }
62
+ }
63
+
64
+ /** Chat options for tool-internal LLM calls. */
65
+ export interface ToolLLMChatOptions {
66
+ maxTokens?: number;
67
+ systemPrompt?: string;
68
+ }
69
+
70
+ /**
71
+ * ToolLLM — lightweight LLM interface for internal tool operations.
72
+ *
73
+ * Usage:
74
+ * const result = await toolLLM.chat('Generate a commit message for: ...');
75
+ *
76
+ * Always returns a string — empty string on any failure.
77
+ */
78
+ export class ToolLLM {
79
+ constructor(private readonly deps: ToolLLMDeps) {}
80
+
81
+ /**
82
+ * Send a single-turn prompt to the tool LLM.
83
+ *
84
+ * @param prompt The user prompt to send.
85
+ * @param options Optional maxTokens and systemPrompt.
86
+ * @returns The assistant's text response, or empty string on failure.
87
+ */
88
+ async chat(prompt: string, options: ToolLLMChatOptions = {}): Promise<string> {
89
+ try {
90
+ const resolved = resolveToolLLM(this.deps);
91
+ if (!resolved) {
92
+ logger.debug('ToolLLM.chat: no provider resolved, returning empty string');
93
+ return '';
94
+ }
95
+
96
+ const { provider, modelId } = resolved;
97
+ const response = await provider.chat({
98
+ model: modelId,
99
+ messages: [{ role: 'user', content: prompt }],
100
+ maxTokens: options.maxTokens ?? 1024,
101
+ systemPrompt: options.systemPrompt,
102
+ });
103
+
104
+ return response.content ?? '';
105
+ } catch (err) {
106
+ logger.debug('ToolLLM.chat: request failed (non-fatal)', { error: summarizeError(err) });
107
+ return '';
108
+ }
109
+ }
110
+ }