@pellux/goodvibes-tui 0.18.11 → 0.18.13

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 (570) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/operator-contract.json +1 -1
  4. package/package.json +2 -2
  5. package/src/config/index.ts +1 -138
  6. package/src/config/subscription-providers.ts +1 -127
  7. package/src/core/conversation-rendering.ts +5 -5
  8. package/src/core/conversation.ts +177 -424
  9. package/src/core/history.ts +45 -0
  10. package/src/core/orchestrator.ts +3 -733
  11. package/src/core/system-message-router.ts +19 -58
  12. package/src/input/command-registry.ts +3 -3
  13. package/src/input/commands/session-content.ts +2 -2
  14. package/src/input/commands/session-workflow.ts +1 -1
  15. package/src/input/handler-content-actions.ts +2 -2
  16. package/src/input/handler-feed.ts +2 -2
  17. package/src/input/handler-modal-token-routes.ts +1 -1
  18. package/src/input/handler-ui-state.ts +1 -1
  19. package/src/input/handler.ts +1 -1
  20. package/src/input/search.ts +1 -1
  21. package/src/input/selection.ts +2 -2
  22. package/src/input/session-picker-modal.ts +1 -1
  23. package/src/main.ts +1 -1
  24. package/src/panels/agent-inspector-panel.ts +3 -3
  25. package/src/panels/agent-logs-panel.ts +3 -3
  26. package/src/panels/approval-panel.ts +2 -2
  27. package/src/panels/automation-control-panel.ts +3 -3
  28. package/src/panels/base-panel.ts +14 -14
  29. package/src/panels/builtin/agent.ts +1 -0
  30. package/src/panels/builtin/operations.ts +2 -1
  31. package/src/panels/builtin/session.ts +2 -2
  32. package/src/panels/builtin/shared.ts +5 -5
  33. package/src/panels/cockpit-panel.ts +2 -2
  34. package/src/panels/communication-panel.ts +3 -3
  35. package/src/panels/context-visualizer-panel.ts +6 -3
  36. package/src/panels/control-plane-panel.ts +3 -3
  37. package/src/panels/cost-tracker-panel.ts +3 -3
  38. package/src/panels/debug-panel.ts +2 -2
  39. package/src/panels/diff-panel.ts +2 -2
  40. package/src/panels/docs-panel.ts +1 -1
  41. package/src/panels/eval-panel.ts +2 -2
  42. package/src/panels/file-explorer-panel.ts +3 -3
  43. package/src/panels/file-preview-panel.ts +3 -3
  44. package/src/panels/forensics-panel.ts +2 -2
  45. package/src/panels/git-panel.ts +1 -1
  46. package/src/panels/hooks-panel.ts +3 -3
  47. package/src/panels/incident-review-panel.ts +1 -1
  48. package/src/panels/intelligence-panel.ts +2 -2
  49. package/src/panels/knowledge-panel.ts +1 -1
  50. package/src/panels/local-auth-panel.ts +2 -2
  51. package/src/panels/marketplace-panel.ts +1 -1
  52. package/src/panels/mcp-panel.ts +3 -3
  53. package/src/panels/memory-panel.ts +1 -1
  54. package/src/panels/ops-control-panel.ts +3 -3
  55. package/src/panels/ops-strategy-panel.ts +2 -2
  56. package/src/panels/orchestration-panel.ts +2 -2
  57. package/src/panels/panel-list-panel.ts +6 -6
  58. package/src/panels/plan-dashboard-panel.ts +1 -1
  59. package/src/panels/plugins-panel.ts +2 -2
  60. package/src/panels/policy-panel.ts +2 -2
  61. package/src/panels/polish.ts +3 -3
  62. package/src/panels/provider-accounts-panel.ts +2 -2
  63. package/src/panels/provider-health-domains.ts +5 -1
  64. package/src/panels/provider-health-panel.ts +7 -3
  65. package/src/panels/provider-stats-panel.ts +3 -3
  66. package/src/panels/remote-panel.ts +3 -3
  67. package/src/panels/routes-panel.ts +3 -3
  68. package/src/panels/sandbox-panel.ts +2 -2
  69. package/src/panels/schedule-panel.ts +1 -1
  70. package/src/panels/security-panel.ts +2 -2
  71. package/src/panels/services-panel.ts +2 -2
  72. package/src/panels/session-browser-panel.ts +3 -3
  73. package/src/panels/settings-sync-panel.ts +2 -2
  74. package/src/panels/skills-panel.ts +6 -6
  75. package/src/panels/subscription-panel.ts +2 -2
  76. package/src/panels/symbol-outline-panel.ts +3 -3
  77. package/src/panels/system-messages-panel.ts +4 -4
  78. package/src/panels/tasks-panel.ts +2 -2
  79. package/src/panels/thinking-panel.ts +3 -3
  80. package/src/panels/token-budget-panel.ts +7 -3
  81. package/src/panels/tool-inspector-panel.ts +3 -3
  82. package/src/panels/types.ts +5 -5
  83. package/src/panels/watchers-panel.ts +3 -3
  84. package/src/panels/welcome-panel.ts +1 -1
  85. package/src/panels/worktree-panel.ts +2 -2
  86. package/src/panels/wrfc-panel.ts +3 -3
  87. package/src/permissions/prompt.ts +3 -22
  88. package/src/plugins/loader.ts +15 -304
  89. package/src/renderer/agent-detail-modal.ts +1 -1
  90. package/src/renderer/autocomplete-overlay.ts +2 -2
  91. package/src/renderer/bookmark-modal.ts +1 -1
  92. package/src/renderer/bottom-bar.ts +2 -2
  93. package/src/renderer/buffer.ts +1 -1
  94. package/src/renderer/code-block.ts +2 -2
  95. package/src/renderer/compositor.ts +2 -2
  96. package/src/renderer/context-inspector.ts +1 -1
  97. package/src/renderer/conversation-layout.ts +2 -2
  98. package/src/renderer/conversation-overlays.ts +1 -1
  99. package/src/renderer/conversation-surface.ts +2 -2
  100. package/src/renderer/diff-view.ts +2 -2
  101. package/src/renderer/diff.ts +1 -1
  102. package/src/renderer/file-picker-overlay.ts +2 -2
  103. package/src/renderer/file-tree.ts +2 -2
  104. package/src/renderer/help-overlay.ts +1 -1
  105. package/src/renderer/history-search-overlay.ts +2 -2
  106. package/src/renderer/live-tail-modal.ts +1 -1
  107. package/src/renderer/markdown.ts +2 -2
  108. package/src/renderer/modal-factory.ts +3 -3
  109. package/src/renderer/model-picker-overlay.ts +2 -2
  110. package/src/renderer/overlay-box.ts +2 -2
  111. package/src/renderer/panel-composite.ts +1 -1
  112. package/src/renderer/panel-picker-overlay.ts +2 -2
  113. package/src/renderer/panel-tab-bar.ts +1 -1
  114. package/src/renderer/panel-workspace-bar.ts +1 -1
  115. package/src/renderer/process-indicator.ts +2 -2
  116. package/src/renderer/process-modal.ts +1 -1
  117. package/src/renderer/profile-picker-modal.ts +2 -2
  118. package/src/renderer/progress.ts +2 -2
  119. package/src/renderer/search-overlay.ts +2 -2
  120. package/src/renderer/selection-modal-overlay.ts +2 -2
  121. package/src/renderer/session-picker-modal.ts +2 -2
  122. package/src/renderer/settings-modal.ts +2 -2
  123. package/src/renderer/shell-surface.ts +1 -1
  124. package/src/renderer/system-message.ts +1 -1
  125. package/src/renderer/tab-strip.ts +2 -2
  126. package/src/renderer/text-layout.ts +1 -1
  127. package/src/renderer/thinking.ts +1 -1
  128. package/src/renderer/tool-call.ts +2 -2
  129. package/src/renderer/ui-factory.ts +2 -2
  130. package/src/runtime/bootstrap-command-context.ts +7 -8
  131. package/src/runtime/bootstrap-command-parts.ts +4 -6
  132. package/src/runtime/bootstrap-core.ts +5 -4
  133. package/src/runtime/bootstrap-hook-bridge.ts +16 -175
  134. package/src/runtime/bootstrap-shell.ts +5 -5
  135. package/src/runtime/bootstrap.ts +6 -5
  136. package/src/runtime/context.ts +4 -20
  137. package/src/runtime/diagnostics/panels/index.ts +1 -1
  138. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  139. package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
  140. package/src/runtime/perf/panel-contracts.ts +32 -0
  141. package/src/runtime/perf/panel-health-monitor.ts +18 -0
  142. package/src/runtime/services.ts +6 -6
  143. package/src/runtime/store/domains/conversation.ts +1 -181
  144. package/src/runtime/store/domains/permissions.ts +1 -143
  145. package/src/runtime/store/helpers/reducers/conversation.ts +1 -228
  146. package/src/runtime/store/helpers/reducers/lifecycle.ts +1 -440
  147. package/src/runtime/store/selectors/index.ts +11 -6
  148. package/src/runtime/store/state.ts +12 -4
  149. package/src/runtime/ui-read-models-observability-security.ts +2 -2
  150. package/src/runtime/ui-read-models-observability-system.ts +1 -1
  151. package/src/runtime/ui-service-queries.ts +1 -1
  152. package/src/runtime/ui-services.ts +1 -1
  153. package/src/shell/ui-openers.ts +1 -1
  154. package/src/tools/index.ts +1 -186
  155. package/src/types/grid.ts +48 -0
  156. package/src/utils/clipboard.ts +21 -0
  157. package/src/utils/splash-lines.ts +1 -1
  158. package/src/utils/terminal-width.ts +185 -0
  159. package/src/version.ts +1 -1
  160. package/src/acp/connection.ts +0 -447
  161. package/src/acp/index.ts +0 -7
  162. package/src/acp/manager.ts +0 -1
  163. package/src/adapters/bluebubbles/index.ts +0 -127
  164. package/src/adapters/discord/index.ts +0 -297
  165. package/src/adapters/github/index.ts +0 -73
  166. package/src/adapters/google-chat/index.ts +0 -119
  167. package/src/adapters/imessage/index.ts +0 -92
  168. package/src/adapters/index.ts +0 -15
  169. package/src/adapters/matrix/index.ts +0 -116
  170. package/src/adapters/mattermost/index.ts +0 -151
  171. package/src/adapters/msteams/index.ts +0 -180
  172. package/src/adapters/ntfy/index.ts +0 -118
  173. package/src/adapters/signal/index.ts +0 -92
  174. package/src/adapters/slack/index.ts +0 -323
  175. package/src/adapters/telegram/index.ts +0 -160
  176. package/src/adapters/types.ts +0 -97
  177. package/src/adapters/webhook/index.ts +0 -178
  178. package/src/adapters/whatsapp/index.ts +0 -135
  179. package/src/agents/message-bus-core.ts +0 -312
  180. package/src/agents/message-bus.ts +0 -2
  181. package/src/agents/orchestrator-prompts.ts +0 -351
  182. package/src/agents/orchestrator-runner.ts +0 -668
  183. package/src/agents/orchestrator.ts +0 -438
  184. package/src/agents/session.ts +0 -108
  185. package/src/agents/worktree.ts +0 -153
  186. package/src/agents/wrfc-config.ts +0 -47
  187. package/src/agents/wrfc-controller.ts +0 -747
  188. package/src/agents/wrfc-gate-runtime.ts +0 -75
  189. package/src/agents/wrfc-reporting.ts +0 -284
  190. package/src/agents/wrfc-runtime-events.ts +0 -150
  191. package/src/agents/wrfc-types.ts +0 -67
  192. package/src/automation/delivery-manager.ts +0 -368
  193. package/src/automation/index.ts +0 -72
  194. package/src/automation/manager-runtime-delivery.ts +0 -139
  195. package/src/automation/manager-runtime-events.ts +0 -131
  196. package/src/automation/manager-runtime-execution.ts +0 -511
  197. package/src/automation/manager-runtime-helpers.ts +0 -433
  198. package/src/automation/manager-runtime-job-mutations.ts +0 -175
  199. package/src/automation/manager-runtime-reconcile.ts +0 -148
  200. package/src/automation/manager-runtime-scheduling.ts +0 -189
  201. package/src/automation/manager-runtime-sync.ts +0 -54
  202. package/src/automation/manager-runtime.ts +0 -721
  203. package/src/automation/manager.ts +0 -10
  204. package/src/automation/service.ts +0 -242
  205. package/src/channels/builtin/account-actions.ts +0 -490
  206. package/src/channels/builtin/accounts.ts +0 -433
  207. package/src/channels/builtin/contracts.ts +0 -405
  208. package/src/channels/builtin/plugins.ts +0 -308
  209. package/src/channels/builtin/rendering.ts +0 -174
  210. package/src/channels/builtin/setup-schema.ts +0 -504
  211. package/src/channels/builtin/shared.ts +0 -96
  212. package/src/channels/builtin/surfaces.ts +0 -57
  213. package/src/channels/builtin/targets.ts +0 -693
  214. package/src/channels/builtin-runtime.ts +0 -443
  215. package/src/channels/delivery/shared.ts +0 -199
  216. package/src/channels/delivery/strategies-bridge.ts +0 -246
  217. package/src/channels/delivery/strategies-core.ts +0 -299
  218. package/src/channels/delivery/strategies-enterprise.ts +0 -178
  219. package/src/channels/delivery/types.ts +0 -59
  220. package/src/channels/delivery-router.ts +0 -127
  221. package/src/channels/index.ts +0 -77
  222. package/src/channels/plugin-registry.ts +0 -551
  223. package/src/channels/provider-runtime.ts +0 -330
  224. package/src/channels/reply-pipeline.ts +0 -522
  225. package/src/channels/route-manager.ts +0 -340
  226. package/src/channels/surface-registry.ts +0 -186
  227. package/src/config/helper-model.ts +0 -1
  228. package/src/config/manager.ts +0 -8
  229. package/src/config/subscription-auth.ts +0 -31
  230. package/src/config/tool-llm.ts +0 -110
  231. package/src/control-plane/approval-broker.ts +0 -351
  232. package/src/control-plane/gateway.ts +0 -1
  233. package/src/control-plane/index.ts +0 -54
  234. package/src/control-plane/media-contract-schemas.ts +0 -1
  235. package/src/control-plane/method-catalog-admin.ts +0 -1
  236. package/src/control-plane/method-catalog-channels.ts +0 -1
  237. package/src/control-plane/method-catalog-control-automation.ts +0 -1
  238. package/src/control-plane/method-catalog-control-core.ts +0 -1
  239. package/src/control-plane/method-catalog-control.ts +0 -1
  240. package/src/control-plane/method-catalog-events.ts +0 -1
  241. package/src/control-plane/method-catalog-knowledge.ts +0 -1
  242. package/src/control-plane/method-catalog-media.ts +0 -1
  243. package/src/control-plane/method-catalog-runtime.ts +0 -1
  244. package/src/control-plane/method-catalog-shared.ts +0 -1
  245. package/src/control-plane/method-catalog.ts +0 -1
  246. package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
  247. package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
  248. package/src/control-plane/operator-contract-schemas-control.ts +0 -1
  249. package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
  250. package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
  251. package/src/control-plane/operator-contract-schemas-media.ts +0 -1
  252. package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
  253. package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
  254. package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
  255. package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
  256. package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
  257. package/src/control-plane/operator-contract-schemas.ts +0 -1
  258. package/src/control-plane/operator-contract.ts +0 -165
  259. package/src/control-plane/session-broker.ts +0 -780
  260. package/src/core/compaction-sections.ts +0 -492
  261. package/src/core/compaction-types.ts +0 -147
  262. package/src/core/context-compaction.ts +0 -542
  263. package/src/core/conversation-compaction.ts +0 -68
  264. package/src/core/conversation-diff.ts +0 -55
  265. package/src/core/conversation-utils.ts +0 -72
  266. package/src/core/event-replay.ts +0 -287
  267. package/src/core/orchestrator-context-runtime.ts +0 -407
  268. package/src/core/orchestrator-follow-up-runtime.ts +0 -134
  269. package/src/core/orchestrator-runtime.ts +0 -132
  270. package/src/core/orchestrator-tool-runtime.ts +0 -468
  271. package/src/core/orchestrator-turn-helpers.ts +0 -355
  272. package/src/core/orchestrator-turn-loop.ts +0 -443
  273. package/src/core/plan-command-handler.ts +0 -169
  274. package/src/core/transcript-events/classify.ts +0 -95
  275. package/src/core/transcript-events/index.ts +0 -15
  276. package/src/daemon/control-plane.ts +0 -522
  277. package/src/daemon/facade-composition.ts +0 -398
  278. package/src/daemon/facade.ts +0 -638
  279. package/src/daemon/helpers.ts +0 -74
  280. package/src/daemon/http/router-route-contexts.ts +0 -370
  281. package/src/daemon/http/router.ts +0 -531
  282. package/src/daemon/http-listener.ts +0 -301
  283. package/src/daemon/index.ts +0 -1
  284. package/src/daemon/server.ts +0 -1
  285. package/src/daemon/service-manager.ts +0 -413
  286. package/src/daemon/surface-actions.ts +0 -183
  287. package/src/daemon/surface-delivery.ts +0 -530
  288. package/src/daemon/surface-policy.ts +0 -60
  289. package/src/daemon/transport-events.ts +0 -110
  290. package/src/daemon/types.ts +0 -191
  291. package/src/export/markdown.ts +0 -213
  292. package/src/export/session-export.ts +0 -1
  293. package/src/git/index.ts +0 -1
  294. package/src/git/service.ts +0 -414
  295. package/src/hooks/chain-engine.ts +0 -414
  296. package/src/hooks/dispatcher.ts +0 -414
  297. package/src/hooks/hook-api.ts +0 -170
  298. package/src/hooks/index.ts +0 -48
  299. package/src/hooks/runners/agent.ts +0 -93
  300. package/src/hooks/runners/prompt.ts +0 -69
  301. package/src/hooks/workbench.ts +0 -360
  302. package/src/integrations/index.ts +0 -42
  303. package/src/integrations/notifier.ts +0 -206
  304. package/src/integrations/webhooks.ts +0 -1
  305. package/src/knowledge/consolidation.ts +0 -346
  306. package/src/knowledge/graphql.ts +0 -324
  307. package/src/knowledge/index.ts +0 -60
  308. package/src/knowledge/ingest-compile.ts +0 -386
  309. package/src/knowledge/ingest-context.ts +0 -18
  310. package/src/knowledge/ingest-inputs.ts +0 -387
  311. package/src/knowledge/ingest.ts +0 -1
  312. package/src/knowledge/internal.ts +0 -257
  313. package/src/knowledge/knowledge-api.ts +0 -432
  314. package/src/knowledge/lint.ts +0 -121
  315. package/src/knowledge/memory-sync.ts +0 -62
  316. package/src/knowledge/packet.ts +0 -370
  317. package/src/knowledge/scheduling.ts +0 -283
  318. package/src/knowledge/service.ts +0 -715
  319. package/src/mcp/client.ts +0 -383
  320. package/src/mcp/index.ts +0 -12
  321. package/src/mcp/mcp-api.ts +0 -90
  322. package/src/mcp/registry.ts +0 -1
  323. package/src/media/builtin-image-understanding.ts +0 -303
  324. package/src/media/builtin-providers.ts +0 -26
  325. package/src/media/index.ts +0 -18
  326. package/src/multimodal/index.ts +0 -13
  327. package/src/multimodal/service.ts +0 -492
  328. package/src/permissions/briefs/build.ts +0 -88
  329. package/src/permissions/manager.ts +0 -1
  330. package/src/plugins/api.ts +0 -383
  331. package/src/plugins/manager.ts +0 -481
  332. package/src/profiles/shape.ts +0 -58
  333. package/src/providers/amazon-bedrock-mantle.ts +0 -50
  334. package/src/providers/amazon-bedrock.ts +0 -61
  335. package/src/providers/anthropic-compat.ts +0 -373
  336. package/src/providers/anthropic-sdk-provider.ts +0 -230
  337. package/src/providers/anthropic-vertex.ts +0 -59
  338. package/src/providers/anthropic.ts +0 -469
  339. package/src/providers/auto-register.ts +0 -417
  340. package/src/providers/builtin-catalog.ts +0 -326
  341. package/src/providers/builtin-registry.ts +0 -575
  342. package/src/providers/cache-planner.ts +0 -258
  343. package/src/providers/capabilities.ts +0 -1
  344. package/src/providers/custom-loader.ts +0 -425
  345. package/src/providers/discovered-compat.ts +0 -7
  346. package/src/providers/discovered-factory.ts +0 -61
  347. package/src/providers/discovered-traits.ts +0 -138
  348. package/src/providers/gemini.ts +0 -462
  349. package/src/providers/github-copilot.ts +0 -254
  350. package/src/providers/index.ts +0 -1
  351. package/src/providers/interface.ts +0 -185
  352. package/src/providers/llama-cpp.ts +0 -402
  353. package/src/providers/lm-studio-helpers.ts +0 -367
  354. package/src/providers/lm-studio.ts +0 -484
  355. package/src/providers/model-catalog-cache.ts +0 -221
  356. package/src/providers/model-catalog-notifications.ts +0 -97
  357. package/src/providers/model-catalog-synthetic.ts +0 -202
  358. package/src/providers/model-catalog.ts +0 -211
  359. package/src/providers/model-limits.ts +0 -1
  360. package/src/providers/ollama.ts +0 -469
  361. package/src/providers/openai-codex.ts +0 -472
  362. package/src/providers/openai-compat.ts +0 -615
  363. package/src/providers/openai.ts +0 -231
  364. package/src/providers/optimizer.ts +0 -1
  365. package/src/providers/provider-api.ts +0 -1
  366. package/src/providers/registry-helpers.ts +0 -34
  367. package/src/providers/registry-models.ts +0 -77
  368. package/src/providers/registry-types.ts +0 -67
  369. package/src/providers/registry.ts +0 -1
  370. package/src/providers/runtime-metadata.ts +0 -149
  371. package/src/providers/runtime-snapshot.ts +0 -130
  372. package/src/providers/synthetic.ts +0 -561
  373. package/src/providers/tier-prompts.ts +0 -84
  374. package/src/providers/tool-formats.ts +0 -414
  375. package/src/runtime/auth/inspection.ts +0 -125
  376. package/src/runtime/bootstrap-background.ts +0 -157
  377. package/src/runtime/bootstrap-helpers.ts +0 -88
  378. package/src/runtime/bootstrap-runtime-events.ts +0 -254
  379. package/src/runtime/bootstrap-services.ts +0 -197
  380. package/src/runtime/compaction/index.ts +0 -1
  381. package/src/runtime/compaction/lifecycle.ts +0 -1
  382. package/src/runtime/compaction/manager.ts +0 -474
  383. package/src/runtime/compaction/quality-score.ts +0 -1
  384. package/src/runtime/compaction/resume-repair.ts +0 -1
  385. package/src/runtime/compaction/strategies/autocompact.ts +0 -1
  386. package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
  387. package/src/runtime/compaction/strategies/collapse.ts +0 -1
  388. package/src/runtime/compaction/strategies/index.ts +0 -1
  389. package/src/runtime/compaction/strategies/microcompact.ts +0 -1
  390. package/src/runtime/compaction/strategies/reactive.ts +0 -1
  391. package/src/runtime/compaction/types.ts +0 -1
  392. package/src/runtime/ecosystem/recommendations.ts +0 -117
  393. package/src/runtime/emitters/agents.ts +0 -96
  394. package/src/runtime/emitters/automation.ts +0 -112
  395. package/src/runtime/emitters/communication.ts +0 -53
  396. package/src/runtime/emitters/compaction.ts +0 -161
  397. package/src/runtime/emitters/control-plane.ts +0 -65
  398. package/src/runtime/emitters/deliveries.ts +0 -65
  399. package/src/runtime/emitters/forensics.ts +0 -17
  400. package/src/runtime/emitters/index.ts +0 -59
  401. package/src/runtime/emitters/knowledge.ts +0 -129
  402. package/src/runtime/emitters/mcp.ts +0 -95
  403. package/src/runtime/emitters/ops.ts +0 -163
  404. package/src/runtime/emitters/orchestration.ts +0 -87
  405. package/src/runtime/emitters/permissions.ts +0 -98
  406. package/src/runtime/emitters/planner.ts +0 -23
  407. package/src/runtime/emitters/plugins.ts +0 -78
  408. package/src/runtime/emitters/providers.ts +0 -30
  409. package/src/runtime/emitters/routes.ts +0 -57
  410. package/src/runtime/emitters/security.ts +0 -53
  411. package/src/runtime/emitters/session.ts +0 -93
  412. package/src/runtime/emitters/surfaces.ts +0 -57
  413. package/src/runtime/emitters/tasks.ts +0 -69
  414. package/src/runtime/emitters/tools.ts +0 -140
  415. package/src/runtime/emitters/transport.ts +0 -78
  416. package/src/runtime/emitters/turn.ts +0 -155
  417. package/src/runtime/emitters/ui.ts +0 -57
  418. package/src/runtime/emitters/watchers.ts +0 -57
  419. package/src/runtime/emitters/workflows.ts +0 -79
  420. package/src/runtime/eval/index.ts +0 -48
  421. package/src/runtime/eval/runner.ts +0 -163
  422. package/src/runtime/eval/suites.ts +0 -264
  423. package/src/runtime/events/domain-map.ts +0 -148
  424. package/src/runtime/events/index.ts +0 -1
  425. package/src/runtime/events/turn.ts +0 -1
  426. package/src/runtime/events/workflows.ts +0 -1
  427. package/src/runtime/forensics/collector.ts +0 -693
  428. package/src/runtime/forensics/index.ts +0 -23
  429. package/src/runtime/foundation-clients.ts +0 -78
  430. package/src/runtime/foundation-services.ts +0 -96
  431. package/src/runtime/guidance.ts +0 -183
  432. package/src/runtime/health/effect-handlers.ts +0 -189
  433. package/src/runtime/health/index.ts +0 -70
  434. package/src/runtime/health/wiring.ts +0 -115
  435. package/src/runtime/integration/helpers.ts +0 -640
  436. package/src/runtime/lifecycle.ts +0 -107
  437. package/src/runtime/mcp/index.ts +0 -68
  438. package/src/runtime/mcp/manager.ts +0 -513
  439. package/src/runtime/network/inbound.ts +0 -131
  440. package/src/runtime/network/index.ts +0 -30
  441. package/src/runtime/network/outbound.ts +0 -292
  442. package/src/runtime/network/shared.ts +0 -82
  443. package/src/runtime/operator-client.ts +0 -235
  444. package/src/runtime/ops/control-plane.ts +0 -363
  445. package/src/runtime/ops/index.ts +0 -122
  446. package/src/runtime/ops/playbooks/index.ts +0 -10
  447. package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
  448. package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
  449. package/src/runtime/ops/runtime-context.ts +0 -100
  450. package/src/runtime/ops-api.ts +0 -27
  451. package/src/runtime/orchestration/spawn-policy.ts +0 -83
  452. package/src/runtime/peer-client.ts +0 -404
  453. package/src/runtime/perf/index.ts +0 -57
  454. package/src/runtime/perf/slo-collector.ts +0 -375
  455. package/src/runtime/permissions/index.ts +0 -190
  456. package/src/runtime/permissions/policy-runtime.ts +0 -1
  457. package/src/runtime/permissions/preflight.ts +0 -101
  458. package/src/runtime/permissions/rule-suggestions.ts +0 -36
  459. package/src/runtime/plugins/hot-reload.ts +0 -221
  460. package/src/runtime/plugins/index.ts +0 -84
  461. package/src/runtime/plugins/lifecycle.ts +0 -95
  462. package/src/runtime/plugins/manager.ts +0 -474
  463. package/src/runtime/plugins/manifest.ts +0 -167
  464. package/src/runtime/plugins/quarantine.ts +0 -202
  465. package/src/runtime/plugins/trust.ts +0 -291
  466. package/src/runtime/plugins/types.ts +0 -205
  467. package/src/runtime/provider-accounts/registry.ts +0 -326
  468. package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
  469. package/src/runtime/remote/index.ts +0 -488
  470. package/src/runtime/remote/runner-registry.ts +0 -438
  471. package/src/runtime/remote/supervisor.ts +0 -70
  472. package/src/runtime/runtime-hook-api.ts +0 -5
  473. package/src/runtime/runtime-knowledge-api.ts +0 -14
  474. package/src/runtime/runtime-mcp-api.ts +0 -5
  475. package/src/runtime/runtime-ops-api.ts +0 -86
  476. package/src/runtime/runtime-provider-api.ts +0 -18
  477. package/src/runtime/session-maintenance.ts +0 -188
  478. package/src/runtime/session-persistence.ts +0 -288
  479. package/src/runtime/session-return-context.ts +0 -195
  480. package/src/runtime/settings/control-plane-store.ts +0 -258
  481. package/src/runtime/settings/control-plane.ts +0 -599
  482. package/src/runtime/shell-command-extensions.ts +0 -54
  483. package/src/runtime/shell-command-ops.ts +0 -207
  484. package/src/runtime/shell-command-platform.ts +0 -47
  485. package/src/runtime/shell-command-services.ts +0 -143
  486. package/src/runtime/shell-command-workspace.ts +0 -31
  487. package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
  488. package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
  489. package/src/runtime/tasks/adapters/index.ts +0 -16
  490. package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
  491. package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
  492. package/src/runtime/tasks/index.ts +0 -68
  493. package/src/runtime/tasks/manager.ts +0 -415
  494. package/src/runtime/telemetry/api-helpers.ts +0 -517
  495. package/src/runtime/telemetry/api.ts +0 -768
  496. package/src/runtime/telemetry/index.ts +0 -178
  497. package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
  498. package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
  499. package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
  500. package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
  501. package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
  502. package/src/runtime/telemetry/instrumentation/index.ts +0 -67
  503. package/src/runtime/tools/context.ts +0 -114
  504. package/src/runtime/tools/index.ts +0 -46
  505. package/src/runtime/tools/phased-executor.ts +0 -448
  506. package/src/runtime/tools/phases/budget.ts +0 -130
  507. package/src/runtime/tools/phases/execute.ts +0 -69
  508. package/src/runtime/tools/phases/index.ts +0 -13
  509. package/src/runtime/tools/phases/map-output.ts +0 -98
  510. package/src/runtime/tools/phases/permission.ts +0 -133
  511. package/src/runtime/tools/phases/posthook.ts +0 -57
  512. package/src/runtime/tools/phases/prehook.ts +0 -68
  513. package/src/runtime/tools/phases/validate.ts +0 -53
  514. package/src/runtime/transports/direct.ts +0 -73
  515. package/src/runtime/transports/http-helpers.ts +0 -218
  516. package/src/runtime/transports/http-types.ts +0 -364
  517. package/src/runtime/transports/http.ts +0 -629
  518. package/src/runtime/transports/realtime.ts +0 -50
  519. package/src/runtime/transports/remote-events.ts +0 -16
  520. package/src/runtime/transports/shared.ts +0 -39
  521. package/src/runtime/transports/ui-runtime-events.ts +0 -35
  522. package/src/runtime/ui-read-models-core.ts +0 -95
  523. package/src/runtime/ui-read-models-operations.ts +0 -203
  524. package/src/runtime/worktree/registry.ts +0 -252
  525. package/src/sessions/manager.ts +0 -14
  526. package/src/state/file-watcher.ts +0 -294
  527. package/src/state/index.ts +0 -56
  528. package/src/state/knowledge-injection.ts +0 -214
  529. package/src/state/memory-embedding-http.ts +0 -642
  530. package/src/state/memory-embeddings.ts +0 -312
  531. package/src/state/memory-ingest.ts +0 -132
  532. package/src/state/memory-registry.ts +0 -111
  533. package/src/state/memory-store-helpers.ts +0 -160
  534. package/src/state/memory-store.ts +0 -728
  535. package/src/state/memory-vector-store.ts +0 -418
  536. package/src/templates/manager.ts +0 -187
  537. package/src/tools/agent/index.ts +0 -610
  538. package/src/tools/agent/manager.ts +0 -476
  539. package/src/tools/analyze/git-modes.ts +0 -380
  540. package/src/tools/analyze/index.ts +0 -128
  541. package/src/tools/channel/agent-tools.ts +0 -16
  542. package/src/tools/channel/index.ts +0 -268
  543. package/src/tools/control/index.ts +0 -90
  544. package/src/tools/edit/core.ts +0 -619
  545. package/src/tools/edit/index.ts +0 -4
  546. package/src/tools/edit/phased.ts +0 -33
  547. package/src/tools/fetch/index.ts +0 -3
  548. package/src/tools/fetch/phased.ts +0 -34
  549. package/src/tools/fetch/runtime.ts +0 -499
  550. package/src/tools/mcp/index.ts +0 -190
  551. package/src/tools/remote-trigger/index.ts +0 -130
  552. package/src/tools/shared/auto-heal.ts +0 -282
  553. package/src/tools/state/index.ts +0 -688
  554. package/src/tools/web-search/index.ts +0 -38
  555. package/src/tools/write/index.ts +0 -604
  556. package/src/tools/write/phased.ts +0 -41
  557. package/src/types/generated/foundation-client-types.ts +0 -22
  558. package/src/watchers/index.ts +0 -11
  559. package/src/watchers/registry.ts +0 -517
  560. package/src/web-search/index.ts +0 -26
  561. package/src/web-search/provider-registry.ts +0 -64
  562. package/src/web-search/providers/brave.ts +0 -100
  563. package/src/web-search/providers/duckduckgo.ts +0 -270
  564. package/src/web-search/providers/exa.ts +0 -77
  565. package/src/web-search/providers/firecrawl.ts +0 -90
  566. package/src/web-search/providers/perplexity.ts +0 -86
  567. package/src/web-search/providers/searxng.ts +0 -88
  568. package/src/web-search/providers/shared.ts +0 -249
  569. package/src/web-search/providers/tavily.ts +0 -90
  570. package/src/web-search/service.ts +0 -142
@@ -1,258 +0,0 @@
1
- /**
2
- * Cache Strategy Planner — uses the helper model (or main model) to optimize
3
- * cache breakpoint placement for explicit-caching providers.
4
- *
5
- * Two modes:
6
- * 1. Heuristic (default): Uses getDefaultStrategy() from cache-strategy.ts
7
- * 2. LLM-assisted: Sends context to the helper model for optimized strategy
8
- *
9
- * The planner runs:
10
- * - Once at session start (first turn)
11
- * - Every N turns (configurable, default 10)
12
- * - When cache hit rate drops below threshold
13
- */
14
-
15
- import type {
16
- CacheStrategy,
17
- CacheContext,
18
- CacheBreakpoint,
19
- CacheHitTracker,
20
- } from '@pellux/goodvibes-sdk/platform/providers/cache-strategy';
21
- import { getDefaultStrategy } from '@pellux/goodvibes-sdk/platform/providers/cache-strategy';
22
- import { getCacheCapability } from '@pellux/goodvibes-sdk/platform/providers/cache-capability';
23
- import type { ProviderCacheCapability } from '@pellux/goodvibes-sdk/platform/providers/cache-capability';
24
- import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
25
- import type { HelperModel } from '@pellux/goodvibes-sdk/platform/config/helper-model';
26
- import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
27
- import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
28
-
29
- /** Result of a strategy planning run. */
30
- export interface PlanResult {
31
- strategy: CacheStrategy;
32
- source: 'heuristic' | 'helper' | 'cached';
33
- planTimeMs: number;
34
- }
35
-
36
- /**
37
- * CachePlanner — manages cache strategy lifecycle.
38
- *
39
- * Caches the current strategy and refreshes it based on
40
- * turn count and hit rate thresholds.
41
- */
42
- export class CachePlanner {
43
- private currentStrategy: CacheStrategy | null = null;
44
- private lastPlanTurn = 0;
45
- private turnsSinceLastPlan = 0;
46
- private readonly cacheHitTracker: Pick<CacheHitTracker, 'getMetrics'>;
47
-
48
- constructor(
49
- private readonly configManager: Pick<ConfigManager, 'get'>,
50
- private readonly helperModel: Pick<HelperModel, 'chat'>,
51
- cacheHitTracker: Pick<CacheHitTracker, 'getMetrics'>,
52
- ) {
53
- this.cacheHitTracker = cacheHitTracker;
54
- }
55
-
56
- /**
57
- * Get the current cache strategy, planning a new one if needed.
58
- *
59
- * Triggers re-planning when:
60
- * - No strategy exists yet (first call)
61
- * - refreshAfterTurns threshold reached
62
- * - Cache hit rate dropped below warning threshold
63
- */
64
- async getStrategy(context: CacheContext): Promise<PlanResult> {
65
- const startMs = Date.now();
66
- this.turnsSinceLastPlan++;
67
-
68
- // Check if we need to refresh
69
- const needsRefresh = this.shouldRefresh(context);
70
-
71
- if (this.currentStrategy && !needsRefresh) {
72
- return {
73
- strategy: this.currentStrategy,
74
- source: 'cached',
75
- planTimeMs: Date.now() - startMs,
76
- };
77
- }
78
-
79
- // Try LLM-assisted planning first (if helper enabled)
80
- const helperEnabled = this.configManager.get('helper.enabled') as boolean;
81
- const cap = getCacheCapability(context.providerName);
82
-
83
- if (helperEnabled && cap.type === 'explicit') {
84
- try {
85
- const helperStrategy = await this.planWithHelper(context, cap);
86
- if (helperStrategy) {
87
- this.currentStrategy = helperStrategy;
88
- this.lastPlanTurn = this.turnsSinceLastPlan;
89
- this.turnsSinceLastPlan = 0;
90
- return {
91
- strategy: helperStrategy,
92
- source: 'helper',
93
- planTimeMs: Date.now() - startMs,
94
- };
95
- }
96
- } catch (err) {
97
- logger.debug('[CachePlanner] Helper planning failed, falling back to heuristic', {
98
- error: summarizeError(err),
99
- });
100
- }
101
- }
102
-
103
- // Fallback: heuristic strategy
104
- const heuristicStrategy = getDefaultStrategy(context);
105
- this.currentStrategy = heuristicStrategy;
106
- this.lastPlanTurn = this.turnsSinceLastPlan;
107
- this.turnsSinceLastPlan = 0;
108
-
109
- return {
110
- strategy: heuristicStrategy,
111
- source: 'heuristic',
112
- planTimeMs: Date.now() - startMs,
113
- };
114
- }
115
-
116
- /** Check if strategy needs refresh. */
117
- private shouldRefresh(context: CacheContext): boolean {
118
- // No strategy yet
119
- if (!this.currentStrategy) return true;
120
-
121
- // Refresh interval reached
122
- if (
123
- this.currentStrategy.refreshAfterTurns > 0 &&
124
- this.turnsSinceLastPlan >= this.currentStrategy.refreshAfterTurns
125
- ) {
126
- return true;
127
- }
128
-
129
- // Hit rate dropped below threshold
130
- const hitRateThreshold = this.configManager.get('cache.hitRateWarningThreshold') as number;
131
- if (
132
- context.recentCacheHitRate !== undefined &&
133
- context.recentCacheHitRate < hitRateThreshold &&
134
- this.cacheHitTracker.getMetrics().turns >= 3 // Need enough data
135
- ) {
136
- return true;
137
- }
138
-
139
- return false;
140
- }
141
-
142
- /**
143
- * Use the helper model to plan an optimized cache strategy.
144
- * Returns null if the helper can't produce a valid strategy.
145
- */
146
- private async planWithHelper(
147
- context: CacheContext,
148
- cap: ProviderCacheCapability,
149
- ): Promise<CacheStrategy | null> {
150
- const prompt = this.buildHelperPrompt(context, cap);
151
-
152
- const response = await this.helperModel.chat('cache_strategy', prompt, {
153
- maxTokens: 1024,
154
- systemPrompt: 'You are a cache optimization assistant. Respond ONLY with valid JSON matching the requested schema. No markdown, no explanation.',
155
- });
156
-
157
- if (!response) return null;
158
-
159
- try {
160
- // Extract JSON from response (handle potential markdown wrapping)
161
- let jsonStr = response.trim();
162
- if (jsonStr.startsWith('```')) {
163
- jsonStr = jsonStr.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
164
- }
165
-
166
- const parsed = JSON.parse(jsonStr) as {
167
- breakpoints?: Array<{
168
- position?: string;
169
- ttl?: string;
170
- ttlSeconds?: number;
171
- reason?: string;
172
- }>;
173
- refreshAfterTurns?: number;
174
- };
175
-
176
- if (!parsed.breakpoints || !Array.isArray(parsed.breakpoints)) {
177
- logger.debug('[CachePlanner] Helper returned invalid structure');
178
- return null;
179
- }
180
-
181
- // Validate and sanitize breakpoints
182
- const validPositions = new Set(['system_and_tools', 'conversation_prefix', 'last_tool_result', 'dynamic']);
183
- const validTtls = new Set(['5m', '1h']);
184
-
185
- const breakpoints: CacheBreakpoint[] = parsed.breakpoints
186
- .filter(bp => bp.position && validPositions.has(bp.position) && bp.ttl && validTtls.has(bp.ttl))
187
- .map(bp => ({
188
- position: bp.position as CacheBreakpoint['position'],
189
- ttl: bp.ttl!,
190
- ttlSeconds: bp.ttl === '1h' ? 3600 : 300,
191
- reason: bp.reason ?? 'Helper-planned breakpoint',
192
- }));
193
-
194
- // Enforce TTL ordering constraint: longer TTLs must come first
195
- breakpoints.sort((a, b) => b.ttlSeconds - a.ttlSeconds);
196
-
197
- // Enforce max breakpoints
198
- if (cap.type === 'explicit') {
199
- breakpoints.splice(cap.maxBreakpoints);
200
- }
201
-
202
- if (breakpoints.length === 0) {
203
- logger.debug('[CachePlanner] Helper produced no valid breakpoints');
204
- return null;
205
- }
206
-
207
- return {
208
- breakpoints,
209
- prefixStable: true,
210
- refreshAfterTurns: parsed.refreshAfterTurns ?? 10,
211
- };
212
- } catch (err) {
213
- logger.debug('[CachePlanner] Failed to parse helper response', {
214
- error: summarizeError(err),
215
- response: response.slice(0, 200),
216
- });
217
- return null;
218
- }
219
- }
220
-
221
- /** Build the prompt for the helper model. */
222
- private buildHelperPrompt(context: CacheContext, cap: ProviderCacheCapability): string {
223
- return `Optimize cache breakpoint placement for an LLM API request.
224
-
225
- Provider: ${context.providerName}
226
- Cache type: ${cap.type}
227
- Max breakpoints: ${cap.type === 'explicit' ? cap.maxBreakpoints : 'N/A'}
228
- Available TTLs: ${cap.type === 'explicit' ? cap.ttlOptions.map(t => `${t.label} (${t.writeCostMultiplier}x write)`).join(', ') : 'N/A'}
229
- Read discount: ${cap.type === 'explicit' || cap.type === 'automatic' ? `${((1 - cap.readDiscount) * 100).toFixed(0)}% off` : 'N/A'}
230
- Min cacheable tokens: ${cap.type === 'explicit' ? cap.minCacheableTokens : 'N/A'}
231
-
232
- Current request context:
233
- - System prompt: ~${context.systemPromptTokens} tokens
234
- - Tools: ${context.toolCount} tools, ~${context.toolTokens} tokens
235
- - Conversation: ${context.conversationTurns} turns, ~${context.conversationTokens} tokens
236
- - Recent cache hit rate: ${context.recentCacheHitRate !== undefined ? `${(context.recentCacheHitRate * 100).toFixed(0)}%` : 'unknown'}
237
-
238
- Rules:
239
- - system_and_tools content NEVER changes during a session \u2192 prefer longest TTL
240
- - conversation_prefix grows each turn but old turns are stable \u2192 5m TTL (refreshes on read)
241
- - Longer TTL breakpoints MUST come before shorter TTL in content order
242
- - Only place breakpoints if content exceeds ${cap.type === 'explicit' ? cap.minCacheableTokens : 1024} token minimum
243
-
244
- Respond with JSON only:
245
- {
246
- "breakpoints": [
247
- { "position": "system_and_tools|conversation_prefix|last_tool_result|dynamic", "ttl": "5m|1h", "reason": "brief explanation" }
248
- ],
249
- "refreshAfterTurns": 10
250
- }`;
251
- }
252
-
253
- /** Force a strategy refresh on the next getStrategy() call. */
254
- invalidate(): void {
255
- this.currentStrategy = null;
256
- }
257
-
258
- }
@@ -1 +0,0 @@
1
- export * from '@pellux/goodvibes-sdk/platform/providers/capabilities';
@@ -1,425 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as fsPromises from 'fs/promises';
3
- import * as path from 'path';
4
- import type { RuntimeEventBus } from '@pellux/goodvibes-sdk/platform/runtime/events/index';
5
- import { emitProviderWarning } from '@pellux/goodvibes-sdk/platform/runtime/emitters/index';
6
- import { OpenAICompatProvider } from '@pellux/goodvibes-sdk/platform/providers/openai-compat';
7
- import { AnthropicCompatProvider } from '@pellux/goodvibes-sdk/platform/providers/anthropic-compat';
8
- import type { LLMProvider } from '@pellux/goodvibes-sdk/platform/providers/interface';
9
- import type { ModelDefinition } from '@pellux/goodvibes-sdk/platform/providers/registry';
10
- import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
11
- import {
12
- LocalContextIngestionService,
13
- resolveContextWindow,
14
- } from '@pellux/goodvibes-sdk/platform/providers/local-context-ingestion';
15
-
16
- /** Debounce delay for file watcher (ms). */
17
- const WATCH_DEBOUNCE_MS = 300;
18
-
19
- /**
20
- * JSON schema for a custom provider configuration file.
21
- * Place a *.json file in ~/.goodvibes/tui/providers/ to define a custom provider.
22
- */
23
- export interface CustomProviderConfig {
24
- /** Unique provider identifier, e.g. 'ollama' */
25
- name: string;
26
- /** Human-friendly display name, e.g. 'Ollama' */
27
- displayName: string;
28
- /**
29
- * API compatibility type.
30
- * - 'openai-compat': provider speaks the OpenAI Chat Completions API
31
- * - 'anthropic-compat': provider speaks the Anthropic Messages API (SSE streaming)
32
- */
33
- type: 'openai-compat' | 'anthropic-compat';
34
- /** Base URL for the API, e.g. 'http://localhost:11434/v1' */
35
- baseURL: string;
36
- /** Optional env var name whose value is used as the API key */
37
- apiKeyEnv?: string;
38
- /** Optional explicit API key (takes precedence over apiKeyEnv) */
39
- apiKey?: string;
40
- /** Optional extra HTTP headers sent with every request */
41
- defaultHeaders?: Record<string, string>;
42
- /** How to send reasoning params. Default: 'none' (don't send). */
43
- reasoningFormat?: 'mercury' | 'openrouter' | 'llamacpp' | 'none';
44
- /** List of models exposed by this provider */
45
- models: Array<{
46
- id: string;
47
- displayName: string;
48
- description?: string;
49
- contextWindow: number;
50
- selectable?: boolean;
51
- capabilities: {
52
- toolCalling: boolean;
53
- codeEditing: boolean;
54
- reasoning: boolean;
55
- multimodal: boolean;
56
- };
57
- reasoningEffort?: string[];
58
- /** Model capability tier — controls system prompt verbosity. */
59
- tier?: 'free' | 'standard' | 'premium';
60
- }>;
61
- }
62
-
63
- /** Result of loading all custom providers from disk. */
64
- export interface LoadCustomProvidersResult {
65
- providers: Array<{ config: CustomProviderConfig; provider: LLMProvider }>;
66
- models: ModelDefinition[];
67
- warnings: string[];
68
- }
69
-
70
- /** Options for loadCustomProviders. */
71
- export interface LoadCustomProvidersOptions {
72
- /** Directory that owns custom provider JSON files. */
73
- providersDir: string;
74
- /**
75
- * When true, attempts to fetch max_context_length from each provider's
76
- * /v1/models endpoint and uses the reported value with 'provider_api'
77
- * provenance. Falls back to the configured contextWindow or DEFAULT_CONTEXT_WINDOW.
78
- * Defaults to false.
79
- */
80
- ingestContextWindows?: boolean;
81
- contextIngestion?: Pick<LocalContextIngestionService, 'ingestProviderContextWindows'>;
82
- }
83
-
84
- /**
85
- * Resolve API key from config.
86
- * Priority: explicit apiKey > env var (apiKeyEnv) > empty string.
87
- */
88
- function resolveApiKey(config: CustomProviderConfig): string {
89
- if (config.apiKey) return config.apiKey;
90
- if (config.apiKeyEnv) {
91
- const val = process.env[config.apiKeyEnv];
92
- if (val) return val;
93
- }
94
- return '';
95
- }
96
-
97
- /**
98
- * Validate a single parsed JSON object against the CustomProviderConfig schema.
99
- * Returns { valid, errors } — errors is empty when valid.
100
- */
101
- function validateCustomProvider(data: unknown): { valid: boolean; errors: string[] } {
102
- const errors: string[] = [];
103
-
104
- if (typeof data !== 'object' || data === null || Array.isArray(data)) {
105
- return { valid: false, errors: ['Root value must be a JSON object'] };
106
- }
107
-
108
- const obj = data as Record<string, unknown>;
109
-
110
- if (typeof obj['name'] !== 'string' || obj['name'].trim() === '') {
111
- errors.push('"name" must be a non-empty string');
112
- }
113
-
114
- if (typeof obj['displayName'] !== 'string' || obj['displayName'].trim() === '') {
115
- errors.push('"displayName" must be a non-empty string');
116
- }
117
-
118
- if (obj['type'] !== 'openai-compat' && obj['type'] !== 'anthropic-compat') {
119
- errors.push('"type" must be "openai-compat" or "anthropic-compat"');
120
- }
121
-
122
- if (typeof obj['baseURL'] !== 'string' || obj['baseURL'].trim() === '') {
123
- errors.push('"baseURL" must be a non-empty string');
124
- }
125
-
126
- if (obj['reasoningFormat'] !== undefined) {
127
- if (!['mercury', 'openrouter', 'llamacpp', 'none'].includes(obj['reasoningFormat'] as string)) {
128
- errors.push('"reasoningFormat" must be "mercury", "openrouter", "llamacpp", or "none"');
129
- }
130
- }
131
-
132
- if (!Array.isArray(obj['models']) || (obj['models'] as unknown[]).length === 0) {
133
- errors.push('"models" must be a non-empty array');
134
- } else {
135
- const models = obj['models'] as unknown[];
136
- models.forEach((m, i) => {
137
- if (typeof m !== 'object' || m === null || Array.isArray(m)) {
138
- errors.push(`models[${i}]: must be an object`);
139
- return;
140
- }
141
- const model = m as Record<string, unknown>;
142
- if (typeof model['id'] !== 'string' || model['id'].trim() === '') {
143
- errors.push(`models[${i}]: "id" must be a non-empty string`);
144
- }
145
- if (typeof model['displayName'] !== 'string' || model['displayName'].trim() === '') {
146
- errors.push(`models[${i}]: "displayName" must be a non-empty string`);
147
- }
148
- if (typeof model['contextWindow'] !== 'number' || model['contextWindow'] <= 0) {
149
- errors.push(`models[${i}]: "contextWindow" must be a positive number`);
150
- }
151
- if (typeof model['capabilities'] !== 'object' || model['capabilities'] === null) {
152
- errors.push(`models[${i}]: "capabilities" must be an object`);
153
- } else {
154
- const caps = model['capabilities'] as Record<string, unknown>;
155
- for (const cap of ['toolCalling', 'codeEditing', 'reasoning', 'multimodal']) {
156
- if (typeof caps[cap] !== 'boolean') {
157
- errors.push(`models[${i}]: capabilities.${cap} must be a boolean`);
158
- }
159
- }
160
- }
161
- });
162
- }
163
-
164
- return { valid: errors.length === 0, errors };
165
- }
166
-
167
- /**
168
- * Ensure the providers directory exists, creating it if necessary.
169
- */
170
- async function ensureProvidersDir(providersDir: string): Promise<void> {
171
- try {
172
- await fsPromises.mkdir(providersDir, { recursive: true });
173
- } catch (err) {
174
- throw new Error(
175
- `[custom-loader] Failed to create providers directory '${providersDir}': ${
176
- summarizeError(err)
177
- }`,
178
- );
179
- }
180
- }
181
-
182
- /**
183
- * Load all custom providers from an owned providers directory.
184
- * Auto-creates the directory if it does not exist.
185
- * Invalid files are skipped with a warning rather than failing the whole load.
186
- *
187
- * When `options.ingestContextWindows` is true, each provider's /v1/models
188
- * endpoint is queried concurrently (via Promise.allSettled) to resolve
189
- * `max_context_length` with `provider_api` provenance.
190
- */
191
- export async function loadCustomProviders(
192
- options: LoadCustomProvidersOptions,
193
- ): Promise<LoadCustomProvidersResult> {
194
- const warnings: string[] = [];
195
- const providers: Array<{ config: CustomProviderConfig; provider: LLMProvider }> = [];
196
- const models: ModelDefinition[] = [];
197
- const { providersDir } = options;
198
-
199
- await ensureProvidersDir(providersDir);
200
-
201
- let entries: string[];
202
- try {
203
- const dirents = await fsPromises.readdir(providersDir, { withFileTypes: true });
204
- entries = dirents
205
- .filter((d) => d.isFile() && d.name.endsWith('.json'))
206
- .map((d) => d.name);
207
- } catch (err) {
208
- warnings.push(
209
- `[custom-loader] Could not read providers directory: ${
210
- summarizeError(err)
211
- }`,
212
- );
213
- return { providers, models, warnings };
214
- }
215
-
216
- // Phase 1: Parse and validate all provider files, instantiate provider objects.
217
- // Collect valid entries; skip invalid ones with warnings.
218
- const validConfigs: Array<{ cfg: CustomProviderConfig; provider: LLMProvider; apiKey: string }> = [];
219
-
220
- for (const filename of entries) {
221
- const filepath = path.join(providersDir, filename);
222
- let raw: string;
223
- try {
224
- raw = await fsPromises.readFile(filepath, 'utf-8');
225
- } catch (err) {
226
- warnings.push(
227
- `[custom-loader] Could not read '${filename}': ${
228
- summarizeError(err)
229
- }`,
230
- );
231
- continue;
232
- }
233
-
234
- let parsed: unknown;
235
- try {
236
- parsed = JSON.parse(raw);
237
- } catch (err) {
238
- warnings.push(
239
- `[custom-loader] Invalid JSON in '${filename}': ${
240
- summarizeError(err)
241
- }`,
242
- );
243
- continue;
244
- }
245
-
246
- const { valid, errors } = validateCustomProvider(parsed);
247
- if (!valid) {
248
- warnings.push(
249
- `[custom-loader] Skipping '${filename}' — validation errors:\n ${errors.join('\n ')}`,
250
- );
251
- continue;
252
- }
253
-
254
- const cfg = parsed as CustomProviderConfig;
255
-
256
- const apiKey = resolveApiKey(cfg);
257
- const modelIds = cfg.models.map((m) => m.id);
258
-
259
- let provider: LLMProvider;
260
- try {
261
- if (cfg.type === 'anthropic-compat') {
262
- provider = new AnthropicCompatProvider({
263
- name: cfg.name,
264
- baseURL: cfg.baseURL,
265
- apiKey,
266
- defaultModel: modelIds[0]!,
267
- models: modelIds,
268
- ...(cfg.defaultHeaders ? { defaultHeaders: cfg.defaultHeaders } : {}),
269
- });
270
- } else {
271
- provider = new OpenAICompatProvider({
272
- name: cfg.name,
273
- baseURL: cfg.baseURL,
274
- apiKey,
275
- defaultModel: modelIds[0]!,
276
- models: modelIds,
277
- ...(cfg.defaultHeaders ? { defaultHeaders: cfg.defaultHeaders } : {}),
278
- reasoningFormat: cfg.reasoningFormat ?? 'none',
279
- });
280
- }
281
- } catch (err) {
282
- warnings.push(
283
- `[custom-loader] Failed to instantiate provider from '${filename}': ${
284
- summarizeError(err)
285
- }`,
286
- );
287
- continue;
288
- }
289
-
290
- validConfigs.push({ cfg, provider, apiKey });
291
- }
292
-
293
- // Phase 2: Ingest context windows concurrently for all valid providers.
294
- // Runs only when options.ingestContextWindows is true.
295
- const ingestionResults: Array<Map<string, number> | null> = validConfigs.map(() => null);
296
- if (options.ingestContextWindows && options.contextIngestion && validConfigs.length > 0) {
297
- const ingestionPromises = validConfigs.map(({ cfg, apiKey }) =>
298
- options.contextIngestion?.ingestProviderContextWindows(
299
- cfg.name,
300
- cfg.baseURL,
301
- apiKey || undefined,
302
- ),
303
- );
304
- const settled = await Promise.allSettled(ingestionPromises);
305
- for (let i = 0; i < settled.length; i++) {
306
- const result = settled[i];
307
- if (result) {
308
- ingestionResults[i] = result.status === 'fulfilled' ? (result.value ?? null) : null;
309
- }
310
- }
311
- }
312
-
313
- // Phase 3: Build model definitions and populate output arrays.
314
- for (let i = 0; i < validConfigs.length; i++) {
315
- const { cfg, provider } = validConfigs[i]!;
316
- const apiContextMap = ingestionResults[i] ?? null;
317
-
318
- const modelDefs: ModelDefinition[] = cfg.models.map((m) => {
319
- const apiContextLength = apiContextMap?.get(m.id) ?? null;
320
- const resolved = resolveContextWindow(m.id, apiContextLength, m.contextWindow);
321
- return {
322
- id: m.id,
323
- provider: cfg.name,
324
- registryKey: `${cfg.name}:${m.id}`,
325
- displayName: m.displayName,
326
- description: m.description ?? '',
327
- contextWindow: resolved.tokens,
328
- contextWindowProvenance: resolved.provenance,
329
- selectable: m.selectable ?? true,
330
- capabilities: {
331
- toolCalling: m.capabilities.toolCalling,
332
- codeEditing: m.capabilities.codeEditing,
333
- reasoning: m.capabilities.reasoning,
334
- multimodal: m.capabilities.multimodal,
335
- },
336
- ...(m.reasoningEffort ? { reasoningEffort: m.reasoningEffort } : {}),
337
- ...(m.tier ? { tier: m.tier } : {}),
338
- };
339
- });
340
-
341
- providers.push({ config: cfg, provider });
342
- models.push(...modelDefs);
343
- }
344
-
345
- return { providers, models, warnings };
346
- }
347
-
348
- /**
349
- * Start watching an owned providers directory for file changes.
350
- * Debounces rapid events by 300ms before invoking the onChange callback.
351
- * Emits typed provider warnings if the watcher cannot be started.
352
- * Returns a handle with a `close()` method to stop watching.
353
- */
354
- export function watchCustomProviders(
355
- runtimeBus: RuntimeEventBus | null,
356
- onChange: () => void,
357
- providersDir: string,
358
- ): { close: () => void } {
359
- let debounceTimer: ReturnType<typeof setTimeout> | null = null;
360
- let watcher: fs.FSWatcher | null = null;
361
- let closed = false;
362
-
363
- const emitWarning = (message: string): void => {
364
- if (runtimeBus) {
365
- emitProviderWarning(runtimeBus, {
366
- sessionId: 'system',
367
- traceId: `providers:warning:${Date.now()}`,
368
- source: 'custom-provider-loader',
369
- }, { message });
370
- }
371
- };
372
-
373
- const startWatch = () => {
374
- if (closed) return;
375
- try {
376
- // Note: fs.watch() may miss atomic renames (e.g. editor save-via-rename) on
377
- // some Linux filesystems. If that becomes a problem, consider replacing this
378
- // with the 'chokidar' library which uses inotify directly.
379
- watcher = fs.watch(
380
- providersDir,
381
- { persistent: false }, // Don't keep the Node process alive just for this watcher
382
- (_eventType, _filename) => {
383
- if (debounceTimer) clearTimeout(debounceTimer);
384
- debounceTimer = setTimeout(() => {
385
- debounceTimer = null;
386
- onChange();
387
- }, WATCH_DEBOUNCE_MS);
388
- });
389
-
390
- watcher.on('error', (err) => {
391
- if (closed) return;
392
- emitWarning(`[custom-loader] Watcher error: ${err.message}`);
393
- });
394
- } catch (err) {
395
- if (closed) return;
396
- emitWarning(`[custom-loader] Could not watch providers directory: ${summarizeError(err)}`);
397
- }
398
- };
399
-
400
- // Ensure the directory exists before starting the watcher
401
- fsPromises
402
- .mkdir(providersDir, { recursive: true })
403
- .then(() => {
404
- if (closed) return;
405
- startWatch();
406
- })
407
- .catch((err) => {
408
- if (closed) return;
409
- emitWarning(`[custom-loader] Could not create/watch providers directory: ${summarizeError(err)}`);
410
- });
411
-
412
- return {
413
- close() {
414
- closed = true;
415
- if (debounceTimer) {
416
- clearTimeout(debounceTimer);
417
- debounceTimer = null;
418
- }
419
- if (watcher) {
420
- watcher.close();
421
- watcher = null;
422
- }
423
- },
424
- };
425
- }
@@ -1,7 +0,0 @@
1
- export type { DiscoveredCompatOptions } from '@pellux/goodvibes-sdk/platform/providers/discovered-compat';
2
- export {
3
- LocalAIProvider,
4
- LlamaCppProvider,
5
- TGIProvider,
6
- VLLMProvider,
7
- } from '@pellux/goodvibes-sdk/platform/providers/discovered-compat';