@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,4 @@
1
+ export { TOOL_NARRATIONS, getNarration } from "./narration.ts";
2
+ export { expandPath } from "./path.ts";
3
+ export { CORS_ORIGINS, addCorsHeaders } from "./cors.ts";
4
+ export { redactValue, redactConfig } from "./redact.ts";
@@ -0,0 +1,57 @@
1
+ // ─── Tool narration map ───────────────────────────────────────────────────────
2
+ // Maps tool name prefixes/exact names to human-readable Spanish narrations.
3
+ // Shown to the user while the agent executes a tool.
4
+ export const TOOL_NARRATIONS: Record<string, string> = {
5
+ // Web
6
+ web_search: "Buscando en la web...",
7
+ web_fetch: "Leyendo página web...",
8
+ // Files
9
+ read: "Leyendo archivo...",
10
+ write: "Escribiendo archivo...",
11
+ edit: "Editando archivo...",
12
+ exec: "Ejecutando comando...",
13
+ // Cron
14
+ "cron.create": "Programando tarea...",
15
+ "cron.list": "Consultando tareas programadas...",
16
+ "cron.update": "Actualizando tarea programada...",
17
+ "cron.delete": "Eliminando tarea programada...",
18
+ "cron.pause": "Pausando tarea programada...",
19
+ "cron.resume": "Reanudando tarea programada...",
20
+ "cron.trigger": "Ejecutando tarea ahora...",
21
+ "cron.history": "Consultando historial...",
22
+ // Agents
23
+ create_agent: "Creando agente worker...",
24
+ find_agent: "Buscando agente disponible...",
25
+ archive_agent: "Archivando agente...",
26
+ // Memory
27
+ save_note: "Guardando nota...",
28
+ memory_write: "Guardando en memoria...",
29
+ memory_read: "Leyendo memoria...",
30
+ memory_search: "Buscando en memoria...",
31
+ memory_delete: "Eliminando de memoria...",
32
+ memory_list: "Listando notas...",
33
+ // Browser
34
+ browser_navigate: "Navegando a la página...",
35
+ browser_click: "Haciendo clic...",
36
+ browser_type: "Escribiendo en la página...",
37
+ browser_screenshot: "Tomando captura de pantalla...",
38
+ browser_extract: "Extrayendo información de la página...",
39
+ // Canvas
40
+ canvas_add_node: "Actualizando canvas...",
41
+ canvas_update: "Actualizando canvas...",
42
+ // Code Bridge
43
+ bridge_send: "Enviando tarea al CLI...",
44
+ bridge_exec: "Ejecutando en el Code Bridge...",
45
+ // Notify
46
+ notify: "Enviando notificación...",
47
+ report_progress: "Reportando progreso...",
48
+ }
49
+
50
+ export function getNarration(toolName: string): string {
51
+ if (TOOL_NARRATIONS[toolName]) return TOOL_NARRATIONS[toolName]
52
+ // Prefix matching for MCP tools like "github__create_pr" → "Ejecutando github..."
53
+ const prefix = toolName.split("__")[0]
54
+ if (prefix && prefix !== toolName) return `Ejecutando ${prefix}...`
55
+ // Fallback
56
+ return `Ejecutando ${toolName.replace(/_/g, " ")}...`
57
+ }
@@ -0,0 +1,13 @@
1
+ import * as path from "node:path";
2
+
3
+ /**
4
+ * Expands a path that starts with ~ to the user's home directory.
5
+ * @param p - The path to expand
6
+ * @returns The expanded path
7
+ */
8
+ export function expandPath(p: string): string {
9
+ if (p.startsWith("~")) {
10
+ return path.join(process.env.HOME ?? "", p.slice(1));
11
+ }
12
+ return p;
13
+ }
@@ -0,0 +1,61 @@
1
+ import type { Config } from "../../config/loader.ts";
2
+
3
+ /**
4
+ * Redacts a sensitive value by showing only the first 4 characters.
5
+ * @param value - The value to redact
6
+ * @returns The redacted value or a string of bullets if too short
7
+ */
8
+ export function redactValue(value: string): string {
9
+ if (!value || value.length < 8) return "••••••••";
10
+ return `${value.slice(0, 4)}••••••••`;
11
+ }
12
+
13
+ /**
14
+ * Redacts sensitive information from a config object for safe exposure.
15
+ * @param cfg - The config object to redact
16
+ * @returns A new config object with sensitive values redacted
17
+ */
18
+ export function redactConfig(cfg: Config): Record<string, unknown> {
19
+ const redacted = JSON.parse(JSON.stringify(cfg)) as any;
20
+
21
+ // Redact gateway authToken
22
+ if (redacted.gateway?.authToken) {
23
+ redacted.gateway.authToken = redactValue(redacted.gateway.authToken);
24
+ }
25
+
26
+ // Redact provider API keys
27
+ if (redacted.models?.providers) {
28
+ for (const provider of Object.values(redacted.models.providers) as any[]) {
29
+ if (provider?.apiKey) provider.apiKey = redactValue(provider.apiKey);
30
+ }
31
+ }
32
+
33
+ // Redact channel tokens
34
+ if (redacted.channels) {
35
+ for (const channel of Object.values(redacted.channels) as any[]) {
36
+ if (channel?.accounts) {
37
+ for (const acc of Object.values(channel.accounts) as any[]) {
38
+ if (acc?.botToken) acc.botToken = redactValue(acc.botToken);
39
+ if (acc?.appToken) acc.appToken = redactValue(acc.appToken);
40
+ if (acc?.signingSecret) acc.signingSecret = redactValue(acc.signingSecret);
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ // Redact MCP server headers
47
+ if (redacted.mcp?.servers) {
48
+ for (const server of Object.values(redacted.mcp.servers) as any[]) {
49
+ if (server?.headers) {
50
+ for (const [k, v] of Object.entries(server.headers)) {
51
+ const lk = k.toLowerCase();
52
+ if (lk.includes("auth") || lk.includes("token") || lk.includes("key")) {
53
+ server.headers[k] = redactValue(v as string);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ return redacted;
61
+ }
@@ -0,0 +1,5 @@
1
+ import { loadConfig } from "../config/loader.ts";
2
+ import { startGateway } from "./server.ts";
3
+ import { logger } from "../utils/logger.ts";
4
+
5
+ export { loadConfig, startGateway, logger };
@@ -0,0 +1,363 @@
1
+ import type { Config } from "../config/loader";
2
+ import { logger } from "../utils/logger";
3
+ import { getDb, initializeDatabase, getDbPathLazy } from "../storage/sqlite";
4
+ import { buildAgentLoop } from "../agent/agent-loop";
5
+ import { AgentRunner } from "../agent/providers/index";
6
+ import { ChannelManager } from "../channels/manager";
7
+ import { syncToolsToFTS, syncSkillsToFTS, syncPlaybookToFTS } from "../agent/context-compiler";
8
+ import { syncMCPToolsToFTS } from "../mcp/tool-sync";
9
+ import { AgentService, createAgentService } from "../agent/service";
10
+ import { mkdirSync, existsSync } from "node:fs";
11
+ import * as path from "node:path";
12
+ import { resolveAgentId, runStartupMigrations } from "../storage/onboarding";
13
+ import { createMCPManager, type MCPClientManager } from "@johpaz/hive-agents-mcp";
14
+ import { setMCPManager } from "../mcp/singleton";
15
+ import { startMCPHotReload } from "../mcp/hot-reload";
16
+ import { loadMcpHeaders } from "../storage/crypto";
17
+ import { initializeBrowserService } from "../tools/web/browser-service";
18
+ import { activateBrowserTools } from "../storage/onboarding";
19
+
20
+ const log = logger.child("gateway:init");
21
+
22
+ /**
23
+ * Verifica que exista al menos un usuario en la base de datos
24
+ */
25
+ export async function verifyDatabaseUsers(): Promise<void> {
26
+ // Setup mode: no DB yet — skip verification, gateway starts to serve the web setup
27
+ if (!existsSync(getDbPathLazy())) {
28
+ log.info("Setup mode: no database found — gateway will serve web setup at /setup");
29
+ return;
30
+ }
31
+
32
+ try {
33
+ initializeDatabase();
34
+
35
+ const db = getDb();
36
+ const userCount = db.query("SELECT COUNT(*) as count FROM users").get() as { count: number };
37
+
38
+ if (userCount.count === 0) {
39
+ const error = new Error("No users found in the database. A valid user is required to start the Hive Gateway.");
40
+ log.error(error.message);
41
+ log.error("Please run the onboarding process or manually insert a user.");
42
+ throw error;
43
+ }
44
+
45
+ log.info(`Database verified: ${userCount.count} user(s) found`);
46
+ } catch (error) {
47
+ log.error(`Database verification failed: ${(error as Error).message}`);
48
+ throw error;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Escribe el archivo PID del proceso
54
+ */
55
+ export async function writePidFile(pidFile: string): Promise<void> {
56
+ try {
57
+ const dir = path.dirname(pidFile);
58
+ mkdirSync(dir, { recursive: true });
59
+ await Bun.write(pidFile, process.pid.toString());
60
+ log.info(`PID file written: ${pidFile}`);
61
+ } catch (error) {
62
+ log.warn(`Could not write PID file: ${(error as Error).message}`);
63
+ // No throw - PID file is not critical
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Carga la configuración del agente desde la base de datos
69
+ * @returns Provider y modelo configurados
70
+ */
71
+ export async function loadAgentConfigFromDB(
72
+ config: Config
73
+ ): Promise<{ provider: string; model: string }> {
74
+ const defaultProvider = "gemini";
75
+ const defaultModel = "gemini-2.5-flash";
76
+
77
+ try {
78
+ const db = getDb();
79
+
80
+ // Get coordinator agent ID from database
81
+ const coordinatorAgentId = resolveAgentId(null);
82
+
83
+ // Obtener configuración del agente coordinador
84
+ const agentConfig = db.query(`
85
+ SELECT provider_id, model_id FROM agents
86
+ WHERE id = ? OR role = 'coordinator'
87
+ ORDER BY (CASE WHEN id = ? THEN 1 ELSE 0 END) DESC
88
+ LIMIT 1
89
+ `).get(coordinatorAgentId || "", coordinatorAgentId || "") as
90
+ { provider_id: string | null; model_id: string | null } | undefined;
91
+
92
+ let provider = agentConfig?.provider_id || defaultProvider;
93
+ let model = agentConfig?.model_id || defaultModel;
94
+
95
+ // Cargar API keys de los providers desde la DB
96
+ const providers = db.query(`
97
+ SELECT id, name, base_url FROM providers WHERE active = 1
98
+ `).all() as Array<{ id: string; name: string; base_url: string | null }>;
99
+
100
+ if (providers.length > 0) {
101
+ config.models = config.models || {};
102
+ config.models.providers = config.models.providers || {};
103
+
104
+ const { loadProviderApiKey } = await import("../storage/crypto");
105
+
106
+ for (const p of providers) {
107
+ const apiKey = await loadProviderApiKey(p.id);
108
+
109
+ config.models.providers[p.name] = {
110
+ apiKey,
111
+ baseUrl: p.base_url || undefined,
112
+ defaultModel: model,
113
+ availableModels: [],
114
+ maxRetries: 3,
115
+ timeoutMs: 30000,
116
+ } as any;
117
+ }
118
+
119
+ log.info(`Loaded ${providers.length} provider(s) from DB with API keys`);
120
+ }
121
+
122
+ log.info(`Agent config loaded from DB: ${provider}/${model}`);
123
+ return { provider, model };
124
+
125
+ } catch (error) {
126
+ log.debug(`Could not read agent config from DB, using defaults: ${defaultProvider}/${defaultModel}`);
127
+ return { provider: defaultProvider, model: defaultModel };
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Inicializa el agent loop
133
+ */
134
+ export async function initializeAgentLoop(mcpManager?: any): Promise<void> {
135
+ try {
136
+ await buildAgentLoop({ mcpManager });
137
+ log.info("Agent loop initialized");
138
+ } catch (error) {
139
+ log.warn(`Agent loop initialization failed: ${(error as Error).message}`);
140
+ // No throw - agent loop can be rebuilt later
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Inicializa el runner de LLM
146
+ */
147
+ export async function initializeLLMRunner(
148
+ config: Config,
149
+ provider: string,
150
+ model: string
151
+ ): Promise<AgentRunner> {
152
+ try {
153
+ const runner = new AgentRunner(config);
154
+ log.info(`LLM runner initialized: ${provider}/${model}`);
155
+ return runner;
156
+ } catch (error) {
157
+ log.error(`Failed to initialize LLM runner: ${(error as Error).message}`);
158
+ throw error;
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Inicializa el manager de canales
164
+ */
165
+ export async function initializeChannelManager(
166
+ config: Config
167
+ ): Promise<ChannelManager> {
168
+ try {
169
+ const channelManager = new ChannelManager(config);
170
+ await channelManager.initialize();
171
+ await channelManager.startAll();
172
+ log.info("Channel manager initialized and started");
173
+ return channelManager;
174
+ } catch (error) {
175
+ log.error(`Failed to initialize channel manager: ${(error as Error).message}`);
176
+ throw error;
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Función principal de inicialización que orquesta todos los módulos
182
+ */
183
+ export interface GatewayInitializationResult {
184
+ agent: AgentService;
185
+ runner: AgentRunner;
186
+ channelManager: ChannelManager;
187
+ provider: string;
188
+ model: string;
189
+ }
190
+
191
+ export async function initializeGateway(
192
+ config: Config,
193
+ pidFile: string
194
+ ): Promise<GatewayInitializationResult> {
195
+ // Setup mode: 0 usuarios (initializeDatabase() ya fue llamado antes en server.ts)
196
+ let setupMode = false;
197
+ try {
198
+ const count = (getDb().query("SELECT COUNT(*) as count FROM users").get() as { count: number }).count;
199
+ setupMode = count === 0;
200
+ } catch {
201
+ setupMode = true;
202
+ }
203
+
204
+ if (setupMode) {
205
+ log.info("Setup mode: skipping full initialization — only setup routes will be available");
206
+ await writePidFile(pidFile);
207
+ // Return stubs; server.ts checks isSetupMode() before using these
208
+ return {
209
+ agent: null as any,
210
+ runner: null as any,
211
+ channelManager: null as any,
212
+ provider: "",
213
+ model: "",
214
+ };
215
+ }
216
+
217
+ try {
218
+ // 1. Verificar base de datos (crítico)
219
+ await verifyDatabaseUsers();
220
+
221
+ // 2. Escribir archivo PID (no crítico)
222
+ await writePidFile(pidFile);
223
+
224
+ // 3a. Startup migrations (idempotent, version-keyed)
225
+ runStartupMigrations();
226
+
227
+ // 3b. Migrate AES-encrypted secrets → OS keychain (one-shot, idempotent)
228
+ const { migrateEncryptedSecretsToKeychain } = await import("../storage/migrate");
229
+ await migrateEncryptedSecretsToKeychain();
230
+
231
+ // 3. Cargar configuración del agente desde DB
232
+ const { provider, model } = await loadAgentConfigFromDB(config);
233
+
234
+ // 4. Sync FTS5 indexes (tools + skills + playbook + mcp_tools)
235
+ log.info("[initialize] Syncing FTS5 indexes (asynchronous & transactional)...")
236
+ try {
237
+ await Promise.all([
238
+ syncToolsToFTS(),
239
+ syncSkillsToFTS(),
240
+ syncPlaybookToFTS(),
241
+ syncMCPToolsToFTS()
242
+ ]);
243
+ log.info("[initialize] ✅ FTS5 indexes synced (tools, skills, playbook, mcp_tools)")
244
+ } catch (err) {
245
+ log.error(`[initialize] FTS5 sync failed during startup: ${(err as Error).message}`);
246
+ // Consider if we should throw or continue. For now, continue but log error.
247
+ }
248
+
249
+ // 5. Crear AgentService (reemplaza la clase Agent legacy)
250
+ const agent = createAgentService();
251
+ await agent.initialize();
252
+
253
+ // 5b. Initialize Browser Service (Chrome via Bun.WebView nativo)
254
+ let browserAvailable = false;
255
+
256
+ try {
257
+ log.info("Detecting browser (lazy launch — will open on first agent use)...");
258
+
259
+ const browserService = initializeBrowserService(config);
260
+ browserAvailable = await browserService.start();
261
+
262
+ if (browserAvailable) {
263
+ activateBrowserTools();
264
+ } else {
265
+ log.warn("⚠️ No se encontró Chrome/Chromium - browser tools desactivadas");
266
+ log.warn(" Linux: sudo dnf install chromium | macOS: brew install --cask google-chrome");
267
+ }
268
+ } catch (error) {
269
+ log.warn(`Browser Service initialization skipped: ${(error as Error).message}`);
270
+ }
271
+
272
+ // 6. Inicializar MCP Manager y agent loop
273
+ // MCP se inicializa con los servidores de la config + DB
274
+ let mcpManager: MCPClientManager | null = null;
275
+
276
+ // Load MCP servers from DB and merge with config
277
+ const db = getDb();
278
+ const dbServers = db.query(`SELECT * FROM mcp_servers WHERE enabled = 1`).all() as Record<string, any>[];
279
+
280
+ const mcpServersFromDB: Record<string, any> = {};
281
+ for (const server of dbServers) {
282
+ try {
283
+ const mcpServerConfig: any = {
284
+ transport: server.transport,
285
+ command: server.command,
286
+ args: server.args ? JSON.parse(server.args) : [],
287
+ url: server.url,
288
+ enabled: true,
289
+ };
290
+
291
+ // Load headers from keychain (modern), fall back to legacy AES
292
+ const keychainHeaders = await loadMcpHeaders(server.id || server.name);
293
+ if (Object.keys(keychainHeaders).length > 0) {
294
+ mcpServerConfig.headers = keychainHeaders;
295
+ } else if (server.headers_encrypted && server.headers_iv) {
296
+ const { legacyDecryptAES } = await import("../storage/crypto");
297
+ mcpServerConfig.headers = legacyDecryptAES(server.headers_encrypted, server.headers_iv);
298
+ }
299
+
300
+ mcpServersFromDB[server.id || server.name] = mcpServerConfig;
301
+ } catch (error) {
302
+ log.warn(`Failed to load MCP server ${server.name} from DB: ${(error as Error).message}`);
303
+ }
304
+ }
305
+
306
+ // Merge config MCP servers with DB servers
307
+ const configMcpServers = config.mcp?.servers || {};
308
+ const mergedMcpServers = { ...configMcpServers, ...mcpServersFromDB };
309
+
310
+ if (Object.keys(mergedMcpServers).length > 0) {
311
+ try {
312
+ mcpManager = createMCPManager({
313
+ ...config.mcp,
314
+ servers: mergedMcpServers,
315
+ });
316
+ const mcpLog = logger.child("mcp");
317
+ mcpManager.setLogHandler((level, context, message) => {
318
+ mcpLog[level](`[${context}] ${message}`);
319
+ });
320
+ await mcpManager.initialize();
321
+ setMCPManager(mcpManager); // Save to singleton for global access
322
+ log.info(`MCP Manager initialized with ${Object.keys(mergedMcpServers).length} server(s) from config + DB`);
323
+
324
+ // Start hot reload watcher for dynamic server changes
325
+ startMCPHotReload(mcpManager);
326
+ log.info("MCP Hot Reload started - new servers will auto-connect");
327
+ } catch (error) {
328
+ log.warn(`MCP Manager initialization failed: ${(error as Error).message}`);
329
+ }
330
+ } else {
331
+ log.info("No MCP servers found in config or DB");
332
+ // Initialize empty MCP Manager for hot reload to work
333
+ try {
334
+ mcpManager = createMCPManager({ servers: {} });
335
+ const mcpLog2 = logger.child("mcp");
336
+ mcpManager.setLogHandler((level, context, message) => {
337
+ mcpLog2[level](`[${context}] ${message}`);
338
+ });
339
+ await mcpManager.initialize();
340
+ setMCPManager(mcpManager);
341
+ startMCPHotReload(mcpManager);
342
+ log.info("MCP Hot Reload started - waiting for first server");
343
+ } catch (error) {
344
+ log.warn(`Empty MCP Manager initialization failed: ${(error as Error).message}`);
345
+ }
346
+ }
347
+
348
+ // Inicializar agent loop con MCP Manager
349
+ await initializeAgentLoop(mcpManager || undefined);
350
+
351
+ // 7. Inicializar LLM runner (crítico)
352
+ const runner = await initializeLLMRunner(config, provider, model);
353
+
354
+ // 8. Inicializar channel manager (crítico)
355
+ const channelManager = await initializeChannelManager(config);
356
+
357
+ return { agent, runner, channelManager, provider, model };
358
+
359
+ } catch (error) {
360
+ log.error(`Gateway initialization failed: ${(error as Error).message}`);
361
+ throw error;
362
+ }
363
+ }
@@ -0,0 +1,169 @@
1
+ export type TaskStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
2
+
3
+ export interface Task {
4
+ id: string;
5
+ sessionId: string;
6
+ status: TaskStatus;
7
+ priority: number;
8
+ createdAt: Date;
9
+ startedAt?: Date;
10
+ completedAt?: Date;
11
+ error?: string;
12
+ abortController: AbortController;
13
+ }
14
+
15
+ export interface LaneQueueOptions {
16
+ maxConcurrency?: number;
17
+ taskTimeoutMs?: number;
18
+ }
19
+
20
+ type TaskHandler<T> = (task: Task, signal: AbortSignal) => Promise<T>;
21
+
22
+ export class LaneQueue {
23
+ private queues: Map<string, Task[]> = new Map();
24
+ private running: Map<string, Task> = new Map();
25
+ private handlers: Map<string, TaskHandler<unknown>> = new Map();
26
+ private taskIdCounter = 0;
27
+ private options: Required<LaneQueueOptions>;
28
+
29
+ constructor(options: LaneQueueOptions = {}) {
30
+ this.options = {
31
+ maxConcurrency: options.maxConcurrency ?? 1,
32
+ taskTimeoutMs: options.taskTimeoutMs ?? 300000,
33
+ };
34
+ }
35
+
36
+ private generateTaskId(): string {
37
+ return `task-${Date.now()}-${++this.taskIdCounter}`;
38
+ }
39
+
40
+ private getQueue(sessionId: string): Task[] {
41
+ let queue = this.queues.get(sessionId);
42
+ if (!queue) {
43
+ queue = [];
44
+ this.queues.set(sessionId, queue);
45
+ }
46
+ return queue;
47
+ }
48
+
49
+ enqueue<T>(
50
+ sessionId: string,
51
+ handler: TaskHandler<T>,
52
+ priority = 0
53
+ ): Task {
54
+ const task: Task = {
55
+ id: this.generateTaskId(),
56
+ sessionId,
57
+ status: "pending",
58
+ priority,
59
+ createdAt: new Date(),
60
+ abortController: new AbortController(),
61
+ };
62
+
63
+ this.handlers.set(task.id, handler as TaskHandler<unknown>);
64
+
65
+ const queue = this.getQueue(sessionId);
66
+ queue.push(task);
67
+ queue.sort((a, b) => b.priority - a.priority);
68
+
69
+ this.processQueue(sessionId);
70
+
71
+ return task;
72
+ }
73
+
74
+ private async processQueue(sessionId: string): Promise<void> {
75
+ const running = this.running.get(sessionId);
76
+ if (running) {
77
+ return;
78
+ }
79
+
80
+ const queue = this.getQueue(sessionId);
81
+ if (queue.length === 0) {
82
+ return;
83
+ }
84
+
85
+ const task = queue.shift();
86
+ if (!task) return;
87
+
88
+ task.status = "running";
89
+ task.startedAt = new Date();
90
+ this.running.set(sessionId, task);
91
+
92
+ const handler = this.handlers.get(task.id);
93
+
94
+ const timeoutId = setTimeout(() => {
95
+ task.abortController.abort();
96
+ }, this.options.taskTimeoutMs);
97
+
98
+ try {
99
+ if (handler) {
100
+ await handler(task, task.abortController.signal);
101
+ }
102
+ task.status = "completed";
103
+ task.completedAt = new Date();
104
+ } catch (error) {
105
+ if ((error as Error).name === "AbortError") {
106
+ task.status = "cancelled";
107
+ } else {
108
+ task.status = "failed";
109
+ task.error = (error as Error).message;
110
+ }
111
+ task.completedAt = new Date();
112
+ } finally {
113
+ clearTimeout(timeoutId);
114
+ this.running.delete(sessionId);
115
+ this.handlers.delete(task.id);
116
+
117
+ if (queue.length > 0) {
118
+ this.processQueue(sessionId);
119
+ }
120
+ }
121
+ }
122
+
123
+ cancel(sessionId: string): boolean {
124
+ const task = this.running.get(sessionId);
125
+ if (task) {
126
+ task.abortController.abort();
127
+ return true;
128
+ }
129
+
130
+ const queue = this.getQueue(sessionId);
131
+ const index = queue.findIndex((t) => t.status === "pending");
132
+ if (index >= 0) {
133
+ const cancelled = queue.splice(index, 1)[0];
134
+ if (cancelled) {
135
+ cancelled.status = "cancelled";
136
+ cancelled.completedAt = new Date();
137
+ }
138
+ return true;
139
+ }
140
+
141
+ return false;
142
+ }
143
+
144
+ getStatus(sessionId: string): {
145
+ queueLength: number;
146
+ running?: Task;
147
+ } {
148
+ const queue = this.getQueue(sessionId);
149
+ const running = this.running.get(sessionId);
150
+
151
+ return {
152
+ queueLength: queue.length,
153
+ running,
154
+ };
155
+ }
156
+
157
+ isProcessing(sessionId: string): boolean {
158
+ return this.running.has(sessionId);
159
+ }
160
+
161
+ prune(sessionId: string): void {
162
+ const queue = this.getQueue(sessionId);
163
+ if (queue.length === 0 && !this.running.has(sessionId)) {
164
+ this.queues.delete(sessionId);
165
+ }
166
+ }
167
+ }
168
+
169
+ export const laneQueue = new LaneQueue();