@johpaz/hive-agents 0.0.34 → 0.0.36

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 (466) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +4539 -4586
  3. package/dist/ui/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  4. package/dist/ui/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  5. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  6. package/dist/ui/assets/{AgentsPage-DhCjvDNa.js → AgentsPage-YvSgWRiw.js} +7 -7
  7. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  8. package/dist/ui/assets/ChannelsPage-BdBXWHjj.js +8 -0
  9. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  10. package/dist/ui/assets/{LoginPage-B30OrEBy.js → LoginPage-CAmSI9Vy.js} +1 -1
  11. package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
  12. package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
  13. package/dist/ui/assets/{NotFound-HD1Yp9yK.js → NotFound-BMeQSGcG.js} +1 -1
  14. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  15. package/dist/ui/assets/{RecoverPage-CLF6buGP.js → RecoverPage-DpW3l-yv.js} +1 -1
  16. package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
  17. package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
  18. package/dist/ui/assets/{WebChatPage-Um3VANzn.js → WebChatPage-CVRcKept.js} +2 -2
  19. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  20. package/dist/ui/assets/{activity-SfJ6UDF2.js → activity-c3pNngT_.js} +1 -1
  21. package/dist/ui/assets/alert-C-NE-P3s.js +1 -0
  22. package/dist/ui/assets/{alert-dialog-M893TdvF.js → alert-dialog-C5mzbHdP.js} +1 -1
  23. package/dist/ui/assets/arrow-left-CBcbX5EZ.js +1 -0
  24. package/dist/ui/assets/badge-ChpACfWO.js +1 -0
  25. package/dist/ui/assets/{calendar-CMMeWsP-.js → calendar-B-KZ9RQO.js} +1 -1
  26. package/dist/ui/assets/{card-C7P3W6_y.js → card-CNf6BS2e.js} +1 -1
  27. package/dist/ui/assets/chevron-left-D4U-5A27.js +1 -0
  28. package/dist/ui/assets/chevron-right-CR4Skrf3.js +1 -0
  29. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  30. package/dist/ui/assets/{circle-alert-7koABcbO.js → circle-alert-CyHDwUj8.js} +1 -1
  31. package/dist/ui/assets/circle-check-Bb54Ebmu.js +1 -0
  32. package/dist/ui/assets/{cpu-mBJgRJzM.js → cpu-Cdgc_B1K.js} +1 -1
  33. package/dist/ui/assets/dialog-QnZ0ad8O.js +1 -0
  34. package/dist/ui/assets/{download-oaofq4K1.js → download-C3ifGMjJ.js} +1 -1
  35. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  36. package/dist/ui/assets/{es-eUrU2hyB.js → es-NQNoaWDx.js} +1 -1
  37. package/dist/ui/assets/{external-link-SkkF2Z7B.js → external-link-BvxYeTP1.js} +1 -1
  38. package/dist/ui/assets/{eye-B8lq7sWG.js → eye-DqNTU_GD.js} +1 -1
  39. package/dist/ui/assets/{file-text-0oYol8Bb.js → file-text-BT_9S9SM.js} +1 -1
  40. package/dist/ui/assets/{folder-open-DVYu2lgk.js → folder-open-BhH8y9ac.js} +1 -1
  41. package/dist/ui/assets/gauge-D_TMa4i9.js +1 -0
  42. package/dist/ui/assets/{globe-BVPd5DRa.js → globe-DeCQTCDJ.js} +1 -1
  43. package/dist/ui/assets/{hexagon-BIAFUAlQ.js → hexagon-DsGOUl-H.js} +1 -1
  44. package/dist/ui/assets/{history-BUAnaMQo.js → history-BSG-Ypqf.js} +1 -1
  45. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  46. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  47. package/dist/ui/assets/{info-DWioleen.js → info-NwLoa2Mj.js} +1 -1
  48. package/dist/ui/assets/{key-BCGwSKKc.js → key-3EP0dhkT.js} +1 -1
  49. package/dist/ui/assets/label-D2H1IR_J.js +1 -0
  50. package/dist/ui/assets/loader-circle-CZNax6kS.js +1 -0
  51. package/dist/ui/assets/{lock-D7PCO7GC.js → lock-Ei1_J-Nq.js} +1 -1
  52. package/dist/ui/assets/{pause-CI1JFH6r.js → pause-BUqah9Bi.js} +1 -1
  53. package/dist/ui/assets/play-NcZ4swwL.js +1 -0
  54. package/dist/ui/assets/plus-CX1xyhp5.js +1 -0
  55. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  56. package/dist/ui/assets/{refresh-cw-BLmKlO4J.js → refresh-cw-DaYdjQFk.js} +1 -1
  57. package/dist/ui/assets/{save-M1nv6H3P.js → save-CUdYyHNy.js} +1 -1
  58. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  59. package/dist/ui/assets/{send-ijRfR0gp.js → send-B0H5SEIE.js} +1 -1
  60. package/dist/ui/assets/{settings-BvXhlJCF.js → settings-Ds4SqD8s.js} +1 -1
  61. package/dist/ui/assets/{slider-DrDFLwXh.js → slider-CsiUDxc3.js} +1 -1
  62. package/dist/ui/assets/{sparkles-C4MACMbE.js → sparkles-yUEb-7oH.js} +1 -1
  63. package/dist/ui/assets/{square-D_-gRT1l.js → square-BD81nFtN.js} +1 -1
  64. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  65. package/dist/ui/assets/{table-DWEJJiuF.js → table-CSc8ubon.js} +1 -1
  66. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  67. package/dist/ui/assets/{textarea-CwPvQVAG.js → textarea-CXgXWKrT.js} +1 -1
  68. package/dist/ui/assets/{trash-2-Blkv31Dz.js → trash-2-CNjMkoq6.js} +1 -1
  69. package/dist/ui/assets/{triangle-alert-BKgbd30k.js → triangle-alert-C9Y8Ub4X.js} +1 -1
  70. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  71. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  72. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  73. package/dist/ui/assets/{volume-2-BiUgObeI.js → volume-2-CeSXNDv4.js} +1 -1
  74. package/dist/ui/assets/{zap-CpyuQJEC.js → zap-hlXjpSeA.js} +1 -1
  75. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  76. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  77. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  78. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  79. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  80. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  81. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  82. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  83. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  84. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  85. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  86. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  87. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  88. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  89. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  90. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  91. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  92. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  93. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  94. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  95. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  96. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  97. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  98. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  99. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  100. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  101. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  102. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  103. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  104. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  105. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  106. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  107. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  108. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  109. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  110. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  111. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  112. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  113. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  114. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  115. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  116. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  117. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  118. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  119. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  120. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  121. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  122. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  123. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  124. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  125. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  126. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  127. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  128. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  129. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  130. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  131. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  132. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  133. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  134. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  135. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  136. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  137. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  138. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  139. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  140. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  141. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  142. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  143. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  144. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  145. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  146. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  147. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  148. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  149. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  150. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  151. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  152. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  153. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  154. package/dist/ui/dist/favicon.ico +0 -0
  155. package/dist/ui/dist/index.html +40 -0
  156. package/dist/ui/dist/placeholder.svg +1 -0
  157. package/dist/ui/index.html +7 -11
  158. package/package.json +137 -15
  159. package/packages/cli/src/adapters/binary.ts +461 -0
  160. package/packages/cli/src/adapters/bun-global.ts +378 -0
  161. package/packages/cli/src/adapters/config.ts +314 -0
  162. package/packages/cli/src/adapters/docker.ts +308 -0
  163. package/packages/cli/src/adapters/factory.ts +168 -0
  164. package/packages/cli/src/adapters/index.ts +80 -0
  165. package/packages/cli/src/adapters/types.ts +218 -0
  166. package/packages/cli/src/commands/agent-run.ts +168 -0
  167. package/packages/cli/src/commands/agents.ts +398 -0
  168. package/packages/cli/src/commands/chat.ts +142 -0
  169. package/packages/cli/src/commands/config.ts +49 -0
  170. package/packages/cli/src/commands/cron.ts +487 -0
  171. package/packages/cli/src/commands/dev.ts +58 -0
  172. package/packages/cli/src/commands/doctor.ts +320 -0
  173. package/packages/cli/src/commands/gateway.ts +719 -0
  174. package/packages/cli/src/commands/logs.ts +57 -0
  175. package/packages/cli/src/commands/mcp.ts +175 -0
  176. package/packages/cli/src/commands/message.ts +77 -0
  177. package/packages/cli/src/commands/migrate.ts +90 -0
  178. package/packages/cli/src/commands/onboard.ts +1656 -0
  179. package/packages/cli/src/commands/security.ts +144 -0
  180. package/packages/cli/src/commands/service.ts +50 -0
  181. package/packages/cli/src/commands/sessions.ts +116 -0
  182. package/packages/cli/src/commands/skills.ts +215 -0
  183. package/packages/cli/src/commands/update.ts +203 -0
  184. package/packages/cli/src/index.ts +210 -0
  185. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  186. package/packages/cli/src/utils/token.ts +6 -0
  187. package/packages/core/src/agent/agent-loop.ts +691 -0
  188. package/packages/core/src/agent/compaction.ts +240 -0
  189. package/packages/core/src/agent/context-compiler.ts +467 -0
  190. package/packages/core/src/agent/context-guard.ts +91 -0
  191. package/packages/core/src/agent/conversation-store.ts +244 -0
  192. package/packages/core/src/agent/curator.ts +158 -0
  193. package/packages/core/src/agent/hooks.ts +166 -0
  194. package/packages/core/src/agent/llm-client.ts +167 -0
  195. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  196. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  197. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  198. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  199. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  200. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  201. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  202. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  203. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  204. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  205. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  206. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  207. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  208. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  209. package/packages/core/src/agent/native-tools.ts +31 -0
  210. package/packages/core/src/agent/playbook-selector.ts +147 -0
  211. package/packages/core/src/agent/prompt-builder.ts +169 -0
  212. package/packages/core/src/agent/providers/index.ts +204 -0
  213. package/packages/core/src/agent/providers.ts +1 -0
  214. package/packages/core/src/agent/reflector.ts +200 -0
  215. package/packages/core/src/agent/service.ts +267 -0
  216. package/packages/core/src/agent/skill-selector.ts +479 -0
  217. package/packages/core/src/agent/stuck-loop.ts +133 -0
  218. package/packages/core/src/agent/tool-selector.ts +569 -0
  219. package/packages/core/src/agent/tracer.ts +100 -0
  220. package/packages/core/src/auth/auth.ts +108 -0
  221. package/packages/core/src/auth/index.ts +1 -0
  222. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  223. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  224. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  225. package/packages/core/src/canvas/emitter.ts +149 -0
  226. package/packages/core/src/canvas/index.ts +3 -0
  227. package/packages/core/src/channels/base.ts +154 -0
  228. package/packages/core/src/channels/discord.ts +273 -0
  229. package/packages/core/src/channels/index.ts +7 -0
  230. package/packages/core/src/channels/manager.ts +450 -0
  231. package/packages/core/src/channels/slack.ts +323 -0
  232. package/packages/core/src/channels/telegram.ts +612 -0
  233. package/packages/core/src/channels/webchat.ts +139 -0
  234. package/packages/core/src/channels/whatsapp.ts +548 -0
  235. package/packages/core/src/config/index.ts +12 -0
  236. package/packages/core/src/config/loader.ts +569 -0
  237. package/packages/core/src/events/agent-bus.ts +460 -0
  238. package/packages/core/src/events/event-bus.ts +169 -0
  239. package/packages/core/src/gateway/channel-notify.ts +64 -0
  240. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  241. package/packages/core/src/gateway/helpers/index.ts +4 -0
  242. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  243. package/packages/core/src/gateway/helpers/path.ts +13 -0
  244. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  245. package/packages/core/src/gateway/index.ts +5 -0
  246. package/packages/core/src/gateway/initializer.ts +363 -0
  247. package/packages/core/src/gateway/lane-queue.ts +169 -0
  248. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  249. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  250. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  251. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  252. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  253. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  254. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  255. package/packages/core/src/gateway/resolver.ts +108 -0
  256. package/packages/core/src/gateway/router.ts +124 -0
  257. package/packages/core/src/gateway/routes/agents.ts +210 -0
  258. package/packages/core/src/gateway/routes/auth.ts +244 -0
  259. package/packages/core/src/gateway/routes/channels.ts +484 -0
  260. package/packages/core/src/gateway/routes/chat.ts +241 -0
  261. package/packages/core/src/gateway/routes/config.ts +12 -0
  262. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  263. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  264. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  265. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  266. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  267. package/packages/core/src/gateway/routes/models.ts +163 -0
  268. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  269. package/packages/core/src/gateway/routes/providers.ts +220 -0
  270. package/packages/core/src/gateway/routes/setup.ts +441 -0
  271. package/packages/core/src/gateway/routes/skills.ts +115 -0
  272. package/packages/core/src/gateway/routes/system.ts +469 -0
  273. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  274. package/packages/core/src/gateway/routes/tools.ts +59 -0
  275. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  276. package/packages/core/src/gateway/routes/users.ts +122 -0
  277. package/packages/core/src/gateway/routes/voice.ts +189 -0
  278. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  279. package/packages/core/src/gateway/server.ts +2744 -0
  280. package/packages/core/src/gateway/session.ts +95 -0
  281. package/packages/core/src/gateway/slash-commands.ts +207 -0
  282. package/packages/core/src/gateway/tts/README.md +94 -0
  283. package/packages/core/src/gateway/tts/package.json +25 -0
  284. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  285. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  286. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  287. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  288. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  289. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  290. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  291. package/packages/core/src/heartbeat/index.ts +157 -0
  292. package/packages/core/src/index.ts +56 -0
  293. package/packages/core/src/mcp/hot-reload.ts +148 -0
  294. package/packages/core/src/mcp/singleton.ts +21 -0
  295. package/packages/core/src/mcp/tool-sync.ts +176 -0
  296. package/packages/core/src/multimodal/index.ts +2 -0
  297. package/packages/core/src/multimodal/types.ts +28 -0
  298. package/packages/core/src/multimodal/vision-service.ts +283 -0
  299. package/packages/core/src/plugins/api.ts +128 -0
  300. package/packages/core/src/plugins/index.ts +2 -0
  301. package/packages/core/src/plugins/loader.ts +365 -0
  302. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  303. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  304. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  305. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  306. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  307. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  308. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  309. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  310. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  311. package/packages/core/src/scheduler/dag/index.ts +26 -0
  312. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  313. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  314. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  315. package/packages/core/src/scheduler/index.ts +22 -0
  316. package/packages/core/src/scheduler/integration.ts +237 -0
  317. package/packages/core/src/scheduler/types.ts +164 -0
  318. package/packages/core/src/security/google-chat.ts +269 -0
  319. package/packages/core/src/security/index.ts +192 -0
  320. package/packages/core/src/security/pairing.ts +250 -0
  321. package/packages/core/src/security/rate-limit.ts +270 -0
  322. package/packages/core/src/security/signal.ts +321 -0
  323. package/packages/core/src/state/store.ts +312 -0
  324. package/packages/core/src/storage/crypto.ts +197 -0
  325. package/packages/core/src/storage/migrate.ts +147 -0
  326. package/packages/core/src/storage/onboarding.ts +1506 -0
  327. package/packages/core/src/storage/schema.ts +666 -0
  328. package/packages/core/src/storage/seed.ts +628 -0
  329. package/packages/core/src/storage/sqlite.ts +407 -0
  330. package/packages/core/src/storage/usage.ts +374 -0
  331. package/packages/core/src/tool-runtime/index.ts +476 -0
  332. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  333. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  334. package/packages/core/src/tools/agents/index.ts +610 -0
  335. package/packages/core/src/tools/canvas/index.ts +420 -0
  336. package/packages/core/src/tools/cli/index.ts +142 -0
  337. package/packages/core/src/tools/core/index.ts +478 -0
  338. package/packages/core/src/tools/cron/index.ts +635 -0
  339. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  340. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  341. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  342. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  343. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  344. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  345. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  346. package/packages/core/src/tools/filesystem/index.ts +34 -0
  347. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  348. package/packages/core/src/tools/index.ts +197 -0
  349. package/packages/core/src/tools/meeting/index.ts +363 -0
  350. package/packages/core/src/tools/office/index.ts +47 -0
  351. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  352. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  353. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  354. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  355. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  356. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  357. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  358. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  359. package/packages/core/src/tools/types.ts +39 -0
  360. package/packages/core/src/tools/voice/index.ts +104 -0
  361. package/packages/core/src/tools/web/browser-click.ts +78 -0
  362. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  363. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  364. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  365. package/packages/core/src/tools/web/browser-script.ts +88 -0
  366. package/packages/core/src/tools/web/browser-service.ts +554 -0
  367. package/packages/core/src/tools/web/browser-type.ts +101 -0
  368. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  369. package/packages/core/src/tools/web/index.ts +41 -0
  370. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  371. package/packages/core/src/tools/web/web-search.ts +123 -0
  372. package/packages/core/src/utils/benchmark.ts +80 -0
  373. package/packages/core/src/utils/crypto.ts +73 -0
  374. package/packages/core/src/utils/date.ts +42 -0
  375. package/packages/core/src/utils/index.ts +5 -0
  376. package/packages/core/src/utils/logger.ts +389 -0
  377. package/packages/core/src/utils/retry.ts +70 -0
  378. package/packages/core/src/utils/toon.ts +253 -0
  379. package/packages/core/src/voice/index.ts +643 -0
  380. package/packages/mcp/src/config.ts +13 -0
  381. package/packages/mcp/src/index.ts +1 -0
  382. package/packages/mcp/src/logger.ts +47 -0
  383. package/packages/mcp/src/manager.ts +439 -0
  384. package/packages/mcp/src/transports/index.ts +67 -0
  385. package/packages/mcp/src/transports/sse.ts +238 -0
  386. package/packages/mcp/src/transports/websocket.ts +159 -0
  387. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  388. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  389. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  390. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  391. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  392. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  393. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  394. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  395. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  396. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  397. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  398. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  399. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  400. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  401. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  402. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  403. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  404. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  405. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  406. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  407. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  408. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  409. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  410. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  411. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  412. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  413. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  414. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  415. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  416. package/packages/skills/src/index.ts +1 -0
  417. package/packages/skills/src/loader.ts +388 -0
  418. package/dist/ui/assets/AgentCreateForm-DS6yXjGV.js +0 -1
  419. package/dist/ui/assets/AgentDetailPage-Ud552U7_.js +0 -1
  420. package/dist/ui/assets/AgentNewPage-DWWs1P7s.js +0 -1
  421. package/dist/ui/assets/BridgePage-BD93aBKM.js +0 -1
  422. package/dist/ui/assets/CanvasPage-CM35yj0Q.js +0 -33
  423. package/dist/ui/assets/ChannelsPage-CtsWtJdc.js +0 -8
  424. package/dist/ui/assets/DashboardPage-BpiwR5Jg.js +0 -6
  425. package/dist/ui/assets/LogsPage-DqUsG3MW.js +0 -1
  426. package/dist/ui/assets/MeetingPage-C5B8-IzE.js +0 -1
  427. package/dist/ui/assets/ProjectsPage-zic2sjUf.js +0 -1
  428. package/dist/ui/assets/ProvidersPage-BxyIGKzh.js +0 -1
  429. package/dist/ui/assets/SettingsPage-CNFm3nun.js +0 -9
  430. package/dist/ui/assets/SetupPage-RBcjQtv7.js +0 -1
  431. package/dist/ui/assets/accordion-BEVqJf2A.js +0 -1
  432. package/dist/ui/assets/alert-BeGcM0nb.js +0 -1
  433. package/dist/ui/assets/api-q5Ax-vD2.js +0 -63
  434. package/dist/ui/assets/arrow-left-B_jlw8X_.js +0 -1
  435. package/dist/ui/assets/badge-pNhtItyt.js +0 -1
  436. package/dist/ui/assets/chevron-down-B16UVNlu.js +0 -1
  437. package/dist/ui/assets/chevron-left-_8ly7Fz0.js +0 -1
  438. package/dist/ui/assets/chevron-right-yzZLjezG.js +0 -1
  439. package/dist/ui/assets/chevron-up-CxKDQEE5.js +0 -1
  440. package/dist/ui/assets/circle-CFKiO9Ds.js +0 -1
  441. package/dist/ui/assets/circle-check-E2u7ZS2r.js +0 -1
  442. package/dist/ui/assets/circle-minus-1-TZF2pu.js +0 -1
  443. package/dist/ui/assets/circle-x-Cm3Sr-xb.js +0 -1
  444. package/dist/ui/assets/dialog-BaJbZsQF.js +0 -1
  445. package/dist/ui/assets/dist-DB-fE0Co.js +0 -1
  446. package/dist/ui/assets/dropdown-menu-DJoOchfz.js +0 -1
  447. package/dist/ui/assets/gauge-BTpFKuAj.js +0 -1
  448. package/dist/ui/assets/index-BN0875JH.css +0 -2
  449. package/dist/ui/assets/index-D4pdc0Uw.js +0 -54
  450. package/dist/ui/assets/label-C6tqnnKd.js +0 -1
  451. package/dist/ui/assets/loader-circle-CK3qRV3f.js +0 -1
  452. package/dist/ui/assets/pencil-BF2_XX-i.js +0 -1
  453. package/dist/ui/assets/play-DidATMfT.js +0 -1
  454. package/dist/ui/assets/plus-DXm1XDhQ.js +0 -1
  455. package/dist/ui/assets/progress-B1HC9cB_.js +0 -1
  456. package/dist/ui/assets/scroll-area-DKNpYkRA.js +0 -1
  457. package/dist/ui/assets/search-Co6mulZS.js +0 -1
  458. package/dist/ui/assets/switch-7AuR7x2g.js +0 -1
  459. package/dist/ui/assets/terminal-CjZu0OZ0.js +0 -1
  460. package/dist/ui/assets/useProviders-Bxsnav4y.js +0 -1
  461. package/dist/ui/assets/useWebSocketStore-ZCW_Nt1w.js +0 -1
  462. package/dist/ui/assets/x-5cXW_1ZS.js +0 -1
  463. /package/dist/ui/assets/{format-C0EOLKvf.js → format-GVHeOyWI.js} +0 -0
  464. /package/dist/ui/assets/{gateway-url-OqLaEDK-.js → gateway-url-COCbW0IR.js} +0 -0
  465. /package/dist/ui/assets/{utils-_qMjiZaF.js → utils-3pnRFmFe.js} +0 -0
  466. /package/dist/ui/assets/{vendor-router-DhLEd920.js → vendor-router-C9pIYwbJ.js} +0 -0
@@ -0,0 +1,379 @@
1
+ import { logger } from "../../utils/logger"
2
+ import {
3
+ sanitizeMessages, requiresTemperature1, OPENAI_COMPAT_BASE_URLS,
4
+ getProviderProfile, modelSupportsTools, normalizeToolName, normalizeToolSchema,
5
+ } from "./interface"
6
+ import type { LLMCallOptions, LLMProvider, LLMResponse, LLMToolCall } from "./interface"
7
+ import type { ContentPart, LLMMessage } from "../llm-client"
8
+
9
+ const log = logger.child("llm-client")
10
+
11
+ export abstract class OpenAICompatBase implements LLMProvider {
12
+ constructor(protected readonly providerName: string) {}
13
+
14
+ /** Override to true when the provider requires reasoning_content to be round-tripped. */
15
+ protected needsReasoningRoundtrip(): boolean { return false }
16
+
17
+ /** Override to true for providers running on localhost. */
18
+ protected isLocalProvider(): boolean { return false }
19
+
20
+ /** Hook called before each request. Override for e.g. auto-starting a local server. */
21
+ protected async beforeCall(_options: LLMCallOptions): Promise<void> {}
22
+
23
+ /**
24
+ * Hook called after tools are prepared when sendTools is true.
25
+ * Override to inject tool descriptions into the system prompt
26
+ * (for local models whose chat templates don't support native tool calling).
27
+ */
28
+ protected injectToolsIntoPrompt(_body: any, _preparedTools: any[]): void {}
29
+
30
+ private _convertContentPart(part: ContentPart): any {
31
+ switch (part.type) {
32
+ case "text":
33
+ return { type: "text", text: part.text }
34
+ case "image_url":
35
+ return { type: "image_url", image_url: { url: part.image_url.url } }
36
+ case "image_base64":
37
+ return { type: "image_url", image_url: { url: `data:${part.mimeType};base64,${part.base64}` } }
38
+ case "document":
39
+ log.warn(`[llm-client] ${this.providerName}: document content parts are not supported — content will be omitted`)
40
+ return { type: "text", text: `[Document: ${(part as any).fileName || "file"}] (content not supported for this provider)` }
41
+ default:
42
+ return { type: "text", text: JSON.stringify(part) }
43
+ }
44
+ }
45
+
46
+ private _convertMessage(msg: LLMMessage): any {
47
+ if (Array.isArray(msg.content)) {
48
+ return { ...msg, content: msg.content.map(p => this._convertContentPart(p)) }
49
+ }
50
+ return msg
51
+ }
52
+
53
+ async call(options: LLMCallOptions): Promise<LLMResponse> {
54
+ const { default: OpenAI } = await import("openai")
55
+
56
+ const baseURL = options.baseUrl?.trim() || OPENAI_COMPAT_BASE_URLS[this.providerName] || undefined
57
+ const isLocal = this.isLocalProvider()
58
+
59
+ await this.beforeCall(options)
60
+
61
+ const apiKey = options.apiKey || (isLocal ? "ollama" : undefined)
62
+ if (!apiKey) {
63
+ throw new Error(`API key missing for provider: ${this.providerName}. Configure it in Settings → Providers.`)
64
+ }
65
+
66
+ const client = new OpenAI({ apiKey, baseURL })
67
+
68
+ const sanitized = sanitizeMessages(options.messages)
69
+ const rawMessages = this.needsReasoningRoundtrip()
70
+ ? sanitized
71
+ : sanitized.map(({ reasoning_content: _rc, ...rest }) => rest as typeof sanitized[number])
72
+ const messagesForProvider = rawMessages.map(m => this._convertMessage(m))
73
+
74
+ const providerPrefix = new RegExp(`^${this.providerName}\\/`, "i")
75
+ const body: any = {
76
+ model: options.model.replace(providerPrefix, ""),
77
+ messages: messagesForProvider,
78
+ temperature: requiresTemperature1(this.providerName, options.model) ? 1 : (options.temperature ?? 0.7),
79
+ }
80
+ if (options.maxTokens) {
81
+ body.max_tokens = options.maxTokens
82
+ } else if (options.contextWindow) {
83
+ // Reserve 15% of context window for output tokens, cap at 8192
84
+ body.max_tokens = Math.min(8192, Math.floor(options.contextWindow * 0.15))
85
+ }
86
+ if (options.numCtx && isLocal) body.num_ctx = options.numCtx
87
+
88
+ const profile = getProviderProfile(this.providerName)
89
+ const sendTools = modelSupportsTools(this.providerName, options.model) && !!(options.tools?.length)
90
+
91
+ const toolNameMap = new Map<string, string>()
92
+
93
+ if (sendTools) {
94
+ const preparedTools = options.tools!.map((t) => {
95
+ const originalName = t.function.name
96
+ const wireName = profile.normalizeToolNames
97
+ ? normalizeToolName(originalName, profile.toolNameReplacement)
98
+ : originalName
99
+ if (wireName !== originalName) toolNameMap.set(wireName, originalName)
100
+ return {
101
+ ...t,
102
+ function: {
103
+ ...t.function,
104
+ name: wireName,
105
+ parameters: normalizeToolSchema(t.function.parameters as Record<string, unknown>, profile),
106
+ },
107
+ }
108
+ })
109
+ body.tools = preparedTools
110
+ body.tool_choice = profile.toolChoiceAuto
111
+ if (profile.disableParallelToolCalls) body.parallel_tool_calls = false
112
+
113
+ this.injectToolsIntoPrompt(body, preparedTools)
114
+ }
115
+
116
+ log.info(`[llm-client] ${this.providerName}/${body.model} — ${options.messages.length} msgs, ${options.tools?.length ?? 0} tools${sendTools ? "" : " (tools suppressed)"}`)
117
+
118
+ if (options.onToken) {
119
+ return this._streamCall(client, body, options, toolNameMap, sendTools, profile)
120
+ }
121
+
122
+ let response
123
+ try {
124
+ response = await client.chat.completions.create(body)
125
+ } catch (err: any) {
126
+ const status = err?.status ?? err?.response?.status
127
+ const errMsg = (err?.error?.message ?? err?.message ?? "").toLowerCase()
128
+
129
+ // Retry 1: tools rejected by provider — remove tools and retry
130
+ if (sendTools && profile.retryWithoutToolsOnCodes.includes(status)) {
131
+ log.warn(`[llm-client] ${this.providerName}: tools rejected (HTTP ${status}) — retrying without tools`)
132
+ const bodyNoTools = { ...body }
133
+ delete bodyNoTools.tools
134
+ delete bodyNoTools.tool_choice
135
+ delete bodyNoTools.parallel_tool_calls
136
+ response = await client.chat.completions.create(bodyNoTools)
137
+ }
138
+ // Retry 2: context overflow — compact messages and retry
139
+ else if (status === 400 && (errMsg.includes("context length") || errMsg.includes("input_tokens") || errMsg.includes("maximum input length"))) {
140
+ log.warn(`[llm-client] ${this.providerName}: context overflow — compacting messages and retrying`)
141
+ const compacted = [...body.messages]
142
+ const kept: any[] = []
143
+ let systemMsg: any = null
144
+ for (const m of compacted) {
145
+ if (m.role === "system") { systemMsg = m; continue }
146
+ kept.push(m)
147
+ }
148
+ // Keep only 33% of messages to free enough context budget
149
+ const keepRatio = Math.max(1, Math.floor(kept.length / 3))
150
+ const trimmed = kept.slice(-keepRatio)
151
+ body.messages = systemMsg ? [systemMsg, ...trimmed] : trimmed
152
+ // Reduce output budget to leave more room for input
153
+ if (body.max_tokens) body.max_tokens = Math.min(body.max_tokens, 4096)
154
+
155
+ log.info(`[llm-client] ${this.providerName}: compacted ${compacted.length} msgs → ${body.messages.length} msgs, max_tokens=${body.max_tokens}`)
156
+ response = await client.chat.completions.create(body)
157
+ }
158
+ else {
159
+ throw err
160
+ }
161
+ }
162
+
163
+ const choice = response.choices[0]
164
+ const msg = choice.message
165
+
166
+ let final_tool_calls: LLMToolCall[] | undefined = (msg.tool_calls as any[])?.map((tc: any) => ({
167
+ id: tc.id,
168
+ type: "function" as const,
169
+ function: {
170
+ name: toolNameMap.get(tc.function.name) ?? tc.function.name,
171
+ arguments: tc.function.arguments,
172
+ },
173
+ }))
174
+
175
+ let final_content = msg.content ?? ""
176
+
177
+ if (sendTools && (!final_tool_calls || final_tool_calls.length === 0) && final_content) {
178
+ const extracted = extractToolCallsFromText(final_content, toolNameMap)
179
+ if (extracted.tool_calls.length > 0) {
180
+ final_tool_calls = extracted.tool_calls
181
+ final_content = extracted.content
182
+ }
183
+ }
184
+
185
+ return {
186
+ content: final_content,
187
+ tool_calls: final_tool_calls,
188
+ reasoning_content: (msg as any).reasoning_content ?? undefined,
189
+ stop_reason:
190
+ choice.finish_reason === "tool_calls" ? "tool_calls"
191
+ : choice.finish_reason === "length" ? "max_tokens"
192
+ : "stop",
193
+ usage: response.usage ? {
194
+ input_tokens: response.usage.prompt_tokens,
195
+ output_tokens: response.usage.completion_tokens,
196
+ } : undefined,
197
+ }
198
+ }
199
+
200
+ private async _streamCall(
201
+ client: any,
202
+ body: any,
203
+ options: LLMCallOptions,
204
+ toolNameMap: Map<string, string>,
205
+ sendTools: boolean,
206
+ profile: ReturnType<typeof getProviderProfile>,
207
+ ): Promise<LLMResponse> {
208
+ let stream
209
+ try {
210
+ stream = await client.chat.completions.create({ ...body, stream: true })
211
+ } catch (err: any) {
212
+ const status = err?.status ?? err?.response?.status
213
+ const errMsg = (err?.error?.message ?? err?.message ?? "").toLowerCase()
214
+
215
+ if (sendTools && profile.retryWithoutToolsOnCodes.includes(status)) {
216
+ log.warn(`[llm-client] ${this.providerName}: tools rejected (HTTP ${status}) — retrying stream without tools`)
217
+ const bodyNoTools = { ...body }
218
+ delete bodyNoTools.tools
219
+ delete bodyNoTools.tool_choice
220
+ delete bodyNoTools.parallel_tool_calls
221
+ stream = await client.chat.completions.create({ ...bodyNoTools, stream: true })
222
+ } else if (status === 400 && (errMsg.includes("context length") || errMsg.includes("input_tokens") || errMsg.includes("maximum input length"))) {
223
+ log.warn(`[llm-client] ${this.providerName}: context overflow — compacting messages and retrying stream`)
224
+ const compacted = [...body.messages]
225
+ const kept: any[] = []
226
+ let systemMsg: any = null
227
+ for (const m of compacted) {
228
+ if (m.role === "system") { systemMsg = m; continue }
229
+ kept.push(m)
230
+ }
231
+ const keepRatio = Math.max(1, Math.floor(kept.length / 3))
232
+ const trimmed = kept.slice(-keepRatio)
233
+ body.messages = systemMsg ? [systemMsg, ...trimmed] : trimmed
234
+ if (body.max_tokens) body.max_tokens = Math.min(body.max_tokens, 4096)
235
+ log.info(`[llm-client] ${this.providerName}: compacted ${compacted.length} msgs → ${body.messages.length} msgs, max_tokens=${body.max_tokens}`)
236
+ stream = await client.chat.completions.create({ ...body, stream: true })
237
+ } else {
238
+ throw err
239
+ }
240
+ }
241
+
242
+ let content = ""
243
+ let reasoning_content = ""
244
+ let finish_reason = "stop"
245
+ const toolCallMap: Map<number, { id: string; name: string; arguments: string }> = new Map()
246
+ let input_tokens = 0
247
+ let output_tokens = 0
248
+
249
+ for await (const chunk of stream) {
250
+ const choice = chunk.choices?.[0]
251
+ if (!choice) continue
252
+
253
+ const delta = choice.delta as any
254
+ if (delta.content) {
255
+ content += delta.content
256
+ options.onToken!(delta.content)
257
+ }
258
+ if (delta.reasoning_content) {
259
+ reasoning_content += delta.reasoning_content
260
+ }
261
+ if (delta.tool_calls) {
262
+ for (const tc of delta.tool_calls) {
263
+ const idx: number = tc.index
264
+ if (!toolCallMap.has(idx)) {
265
+ toolCallMap.set(idx, { id: tc.id ?? "", name: tc.function?.name ?? "", arguments: "" })
266
+ }
267
+ const entry = toolCallMap.get(idx)!
268
+ if (tc.id) entry.id = tc.id
269
+ if (tc.function?.name) entry.name = tc.function.name
270
+ if (tc.function?.arguments) entry.arguments += tc.function.arguments
271
+ }
272
+ }
273
+ if (choice.finish_reason) finish_reason = choice.finish_reason
274
+
275
+ if (chunk.usage) {
276
+ input_tokens = chunk.usage.prompt_tokens ?? 0
277
+ output_tokens = chunk.usage.completion_tokens ?? 0
278
+ }
279
+ }
280
+
281
+ const tool_calls: LLMToolCall[] = [...toolCallMap.values()].map((tc) => ({
282
+ id: tc.id,
283
+ type: "function" as const,
284
+ function: {
285
+ name: toolNameMap.get(tc.name) ?? tc.name,
286
+ arguments: tc.arguments || "{}",
287
+ },
288
+ }))
289
+
290
+ let final_tool_calls: LLMToolCall[] | undefined = tool_calls.length ? tool_calls : undefined
291
+ let final_content = content
292
+
293
+ if (sendTools && !final_tool_calls && final_content) {
294
+ const extracted = extractToolCallsFromText(final_content, toolNameMap)
295
+ if (extracted.tool_calls.length > 0) {
296
+ final_tool_calls = extracted.tool_calls
297
+ final_content = extracted.content
298
+ }
299
+ }
300
+
301
+ return {
302
+ content: final_content,
303
+ tool_calls: final_tool_calls,
304
+ reasoning_content: reasoning_content || undefined,
305
+ stop_reason:
306
+ finish_reason === "tool_calls" ? "tool_calls"
307
+ : finish_reason === "length" ? "max_tokens"
308
+ : "stop",
309
+ usage: input_tokens > 0 || output_tokens > 0
310
+ ? { input_tokens, output_tokens }
311
+ : undefined,
312
+ }
313
+ }
314
+ }
315
+
316
+ /**
317
+ * Extracts tool_calls from text when the model fails to emit native tool_calls.
318
+ * Supports common formats used by Gemma, Qwen, and other local models.
319
+ */
320
+ export function extractToolCallsFromText(
321
+ content: string,
322
+ toolNameMap: Map<string, string>,
323
+ knownToolNames?: Set<string>,
324
+ ): { content: string; tool_calls: LLMToolCall[] } {
325
+ const tool_calls: LLMToolCall[] = []
326
+ let extractedContent = content
327
+
328
+ const regexes = [
329
+ /<tool_call>\s*({[\s\S]*?})\s*<\/tool_call>/g,
330
+ /<function_call>\s*({[\s\S]*?})\s*<\/function_call>/g,
331
+ /```(?:tool_call|json)\s*({[\s\S]*?})\s*```/g,
332
+ ]
333
+
334
+ for (const regex of regexes) {
335
+ let match
336
+ while ((match = regex.exec(content)) !== null) {
337
+ try {
338
+ const json = JSON.parse(match[1])
339
+ if (json.name) {
340
+ tool_calls.push({
341
+ id: crypto.randomUUID(),
342
+ type: "function",
343
+ function: {
344
+ name: toolNameMap.get(json.name) ?? json.name,
345
+ arguments: typeof json.arguments === "object" ? JSON.stringify(json.arguments) : (json.arguments || "{}"),
346
+ },
347
+ })
348
+ extractedContent = extractedContent.replace(match[0], "").trim()
349
+ }
350
+ } catch {
351
+ // ignore parse errors
352
+ }
353
+ }
354
+ }
355
+
356
+ // Fallback: entire output is a bare JSON tool call — only if name matches a known tool
357
+ if (tool_calls.length === 0 && knownToolNames && knownToolNames.size > 0) {
358
+ try {
359
+ const json = JSON.parse(content.trim())
360
+ const resolvedName = toolNameMap.get(json.name) ?? json.name
361
+ if (json.name && knownToolNames.has(resolvedName) && (json.arguments || json.parameters)) {
362
+ const args = json.arguments || json.parameters
363
+ tool_calls.push({
364
+ id: crypto.randomUUID(),
365
+ type: "function",
366
+ function: {
367
+ name: resolvedName,
368
+ arguments: typeof args === "object" ? JSON.stringify(args) : (args || "{}"),
369
+ },
370
+ })
371
+ extractedContent = ""
372
+ }
373
+ } catch {
374
+ // not valid JSON
375
+ }
376
+ }
377
+
378
+ return { content: extractedContent, tool_calls }
379
+ }
@@ -0,0 +1,5 @@
1
+ import { OpenAICompatBase } from "./openai-compat-base"
2
+
3
+ export class OpenAIProvider extends OpenAICompatBase {
4
+ constructor() { super("openai") }
5
+ }
@@ -0,0 +1,5 @@
1
+ import { OpenAICompatBase } from "./openai-compat-base"
2
+
3
+ export class OpenRouterProvider extends OpenAICompatBase {
4
+ constructor() { super("openrouter") }
5
+ }
@@ -0,0 +1,5 @@
1
+ import { OpenAICompatBase } from "./openai-compat-base"
2
+
3
+ export class QwenProvider extends OpenAICompatBase {
4
+ constructor() { super("qwen") }
5
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Native Tools Type Definitions
3
+ *
4
+ * Tool interface for native Hive tools (no LangChain)
5
+ */
6
+
7
+ export interface Tool {
8
+ name: string
9
+ description: string
10
+ parameters: {
11
+ type: "object"
12
+ properties: Record<string, ToolParameter>
13
+ required?: string[]
14
+ }
15
+ execute: (params: Record<string, unknown>, config?: any) => Promise<string | object>
16
+ }
17
+
18
+ export interface ToolParameter {
19
+ type: string
20
+ description?: string
21
+ enum?: string[]
22
+ items?: ToolParameter
23
+ properties?: Record<string, ToolParameter>
24
+ required?: string[]
25
+ }
26
+
27
+ export interface ToolResult {
28
+ success: boolean
29
+ result?: any
30
+ error?: string
31
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * FTS5-based Playbook Rules Selector (ACE Curator)
3
+ *
4
+ * This module allows the Context Compiler to inject relevant evolved rules
5
+ * into the agent prompt based on semantic relevance to the current message.
6
+ */
7
+
8
+ import { getDb } from "../storage/sqlite"
9
+ import { logger } from "../utils/logger"
10
+
11
+ const log = logger.child("playbook-selector")
12
+
13
+ // ─── Types ───────────────────────────────────────────────────────────────────────
14
+
15
+ export interface PlaybookRule {
16
+ id: number
17
+ rule: string
18
+ category: string
19
+ applicable_to?: string
20
+ }
21
+
22
+ // ─── Configuration ─────────────────────────────────────────────────────────────
23
+
24
+ /** Maximum rules to inject per context window */
25
+ const MAX_RULES_PER_TURN = 5
26
+
27
+ /** Minimum bm25 score threshold for rules */
28
+ const MIN_RELEVANCE_THRESHOLD = -10 // Relaxed for better matching
29
+
30
+ // ─── Selection Logic ───────────────────────────────────────────────────────────
31
+
32
+ /**
33
+ * Select relevant rules from the Playbook based on semantic matching
34
+ */
35
+ export function selectPlaybookRules(message: string): PlaybookRule[] {
36
+ const db = getDb()
37
+ const startTime = performance.now()
38
+
39
+ // Clean query — use prefix matching for consistency with skill-selector and tool-selector
40
+ const keywords = message
41
+ .toLowerCase()
42
+ // Keep only letters, numbers, spaces (strips ALL FTS5 special syntax)
43
+ .replace(/[^\p{L}\p{N}\s]/gu, " ")
44
+ .split(/\s+/)
45
+ .filter(w => w.length > 3)
46
+ .slice(0, 5)
47
+
48
+ if (keywords.length === 0) return []
49
+
50
+ // Use prefix matching for better recall (e.g., "program*" matches "programar", "programación")
51
+ const ftsQuery = keywords.map(w => `${w}*`).join(" OR ")
52
+
53
+ try {
54
+ // Query FTS table
55
+ const ftsResults = db.query(`
56
+ SELECT rowid, bm25(playbook_fts) as score
57
+ FROM playbook_fts
58
+ WHERE playbook_fts MATCH ?
59
+ ORDER BY score ASC
60
+ LIMIT ?
61
+ `).all(ftsQuery, MAX_RULES_PER_TURN) as Array<{ rowid: number; score: number }>
62
+
63
+ const relevantIds = ftsResults
64
+ .filter(r => r.score >= MIN_RELEVANCE_THRESHOLD)
65
+ .map(r => r.rowid)
66
+
67
+ if (relevantIds.length === 0) return []
68
+
69
+ // Fetch full rules
70
+ const rules = db.query(`
71
+ SELECT id, rule, category, applicable_to
72
+ FROM playbook
73
+ WHERE id IN (${relevantIds.map(() => '?').join(',')})
74
+ AND active = 1
75
+ `).all(...relevantIds) as PlaybookRule[]
76
+
77
+ const timing = performance.now() - startTime
78
+ log.info(`[playbook-selector] Selected ${rules.length} rules in ${timing.toFixed(2)}ms`)
79
+ if (rules.length > 0) {
80
+ log.debug(`[playbook-selector] Rules: ${rules.map(r => `[${r.id}] ${r.rule.substring(0, 60)}`).join(', ')}`)
81
+ }
82
+
83
+ return rules
84
+ } catch (err) {
85
+ log.error(`[playbook-selector] Failed to select rules:`, err)
86
+ return []
87
+ }
88
+ }
89
+
90
+ // ─── Sync Logic ───────────────────────────────────────────────────────────────
91
+
92
+ /**
93
+ * Sync active playbook rules to FTS5 virtual table
94
+ */
95
+ export async function syncPlaybookToFTS(): Promise<void> {
96
+ const db = getDb()
97
+
98
+ try {
99
+ // Step 1: Get active rules
100
+ const rules = db.query(`
101
+ SELECT id, rule, category, applicable_to
102
+ FROM playbook
103
+ WHERE active = 1
104
+ `).all() as Array<{
105
+ id: number
106
+ rule: string
107
+ category: string
108
+ applicable_to: string
109
+ }>
110
+
111
+ if (rules.length === 0) {
112
+ log.debug(`[playbook-selector] No rules in playbook to sync`)
113
+ }
114
+
115
+ // Step 2: Atomic transaction for FTS5 sync
116
+ const syncTransaction = db.transaction(() => {
117
+ // Verify table exists
118
+ const tableCheck = db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='playbook_fts'").get()
119
+ if (!tableCheck) {
120
+ throw new Error("playbook_fts table does not exist!")
121
+ }
122
+
123
+ // A: Clear existing data
124
+ db.run("DELETE FROM playbook_fts")
125
+
126
+ // B: Prepare insertion
127
+ const insert = db.prepare(`
128
+ INSERT INTO playbook_fts(rowid, rule, category, applicable_to)
129
+ VALUES (?, ?, ?, ?)
130
+ `)
131
+
132
+ // C: Re-populate
133
+ for (const item of rules) {
134
+ insert.run(item.id, item.rule, item.category, item.applicable_to)
135
+ }
136
+ })
137
+
138
+ // Execute transaction
139
+ syncTransaction()
140
+
141
+ log.info(`[playbook-selector] Atomic sync complete: ${rules.length} rules indexed in FTS5`)
142
+
143
+ } catch (err) {
144
+ log.error(`[playbook-selector] Transactional sync failed:`, err)
145
+ throw err
146
+ }
147
+ }