@johpaz/hive-agents 0.0.35 → 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 (440) hide show
  1. package/README.md +64 -39
  2. package/dist/hive.js +3127 -3104
  3. package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
  4. package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
  5. package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  6. package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
  7. package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
  8. package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
  9. package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
  10. package/dist/ui/assets/{LoginPage-C8j_urUD.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-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
  14. package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  15. package/dist/ui/assets/{RecoverPage-DNb1Pr8h.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-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
  19. package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
  20. package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
  21. package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
  22. package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
  23. package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
  24. package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
  25. package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
  26. package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.js} +1 -1
  27. package/dist/ui/assets/index-B2fCYtTS.css +2 -0
  28. package/dist/ui/assets/index-DMCjjdqf.js +116 -0
  29. package/dist/ui/assets/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
  30. package/dist/ui/assets/progress-BherYzY6.js +1 -0
  31. package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
  32. package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
  33. package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
  34. package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
  35. package/dist/ui/assets/terminal-DN38Q456.js +1 -0
  36. package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
  37. package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
  38. package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
  39. package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
  40. package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
  41. package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
  42. package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
  43. package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
  44. package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
  45. package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
  46. package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
  47. package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
  48. package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
  49. package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
  50. package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
  51. package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
  52. package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
  53. package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
  54. package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
  55. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
  56. package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
  57. package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
  58. package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
  59. package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
  60. package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
  61. package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
  62. package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
  63. package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
  64. package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
  65. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
  66. package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
  67. package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
  68. package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
  69. package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
  70. package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
  71. package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
  72. package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
  73. package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
  74. package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
  75. package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
  76. package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
  77. package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
  78. package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
  79. package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
  80. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
  81. package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
  82. package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
  83. package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
  84. package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
  85. package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
  86. package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
  87. package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
  88. package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
  89. package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
  90. package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
  91. package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
  92. package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
  93. package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
  94. package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
  95. package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  96. package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
  97. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
  98. package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
  99. package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
  100. package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
  101. package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
  102. package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
  103. package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
  104. package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
  105. package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
  106. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
  107. package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
  108. package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
  109. package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
  110. package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
  111. package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
  112. package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
  113. package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
  114. package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
  115. package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
  116. package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
  117. package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
  118. package/dist/ui/dist/favicon.ico +0 -0
  119. package/dist/ui/dist/index.html +40 -0
  120. package/dist/ui/dist/placeholder.svg +1 -0
  121. package/dist/ui/index.html +6 -6
  122. package/package.json +137 -13
  123. package/packages/cli/src/adapters/binary.ts +461 -0
  124. package/packages/cli/src/adapters/bun-global.ts +378 -0
  125. package/packages/cli/src/adapters/config.ts +314 -0
  126. package/packages/cli/src/adapters/docker.ts +308 -0
  127. package/packages/cli/src/adapters/factory.ts +168 -0
  128. package/packages/cli/src/adapters/index.ts +80 -0
  129. package/packages/cli/src/adapters/types.ts +218 -0
  130. package/packages/cli/src/commands/agent-run.ts +168 -0
  131. package/packages/cli/src/commands/agents.ts +398 -0
  132. package/packages/cli/src/commands/chat.ts +142 -0
  133. package/packages/cli/src/commands/config.ts +49 -0
  134. package/packages/cli/src/commands/cron.ts +487 -0
  135. package/packages/cli/src/commands/dev.ts +58 -0
  136. package/packages/cli/src/commands/doctor.ts +320 -0
  137. package/packages/cli/src/commands/gateway.ts +719 -0
  138. package/packages/cli/src/commands/logs.ts +57 -0
  139. package/packages/cli/src/commands/mcp.ts +175 -0
  140. package/packages/cli/src/commands/message.ts +77 -0
  141. package/packages/cli/src/commands/migrate.ts +90 -0
  142. package/packages/cli/src/commands/onboard.ts +1656 -0
  143. package/packages/cli/src/commands/security.ts +144 -0
  144. package/packages/cli/src/commands/service.ts +50 -0
  145. package/packages/cli/src/commands/sessions.ts +116 -0
  146. package/packages/cli/src/commands/skills.ts +215 -0
  147. package/packages/cli/src/commands/update.ts +203 -0
  148. package/packages/cli/src/index.ts +210 -0
  149. package/packages/cli/src/ui-bundle.generated.ts +3 -0
  150. package/packages/cli/src/utils/token.ts +6 -0
  151. package/packages/core/src/agent/agent-loop.ts +691 -0
  152. package/packages/core/src/agent/compaction.ts +240 -0
  153. package/packages/core/src/agent/context-compiler.ts +467 -0
  154. package/packages/core/src/agent/context-guard.ts +91 -0
  155. package/packages/core/src/agent/conversation-store.ts +244 -0
  156. package/packages/core/src/agent/curator.ts +158 -0
  157. package/packages/core/src/agent/hooks.ts +166 -0
  158. package/packages/core/src/agent/llm-client.ts +167 -0
  159. package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
  160. package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
  161. package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
  162. package/packages/core/src/agent/llm-providers/groq.ts +5 -0
  163. package/packages/core/src/agent/llm-providers/interface.ts +195 -0
  164. package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
  165. package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
  166. package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
  167. package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
  168. package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
  169. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
  170. package/packages/core/src/agent/llm-providers/openai.ts +5 -0
  171. package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
  172. package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
  173. package/packages/core/src/agent/native-tools.ts +31 -0
  174. package/packages/core/src/agent/playbook-selector.ts +147 -0
  175. package/packages/core/src/agent/prompt-builder.ts +169 -0
  176. package/packages/core/src/agent/providers/index.ts +204 -0
  177. package/packages/core/src/agent/providers.ts +1 -0
  178. package/packages/core/src/agent/reflector.ts +200 -0
  179. package/packages/core/src/agent/service.ts +267 -0
  180. package/packages/core/src/agent/skill-selector.ts +479 -0
  181. package/packages/core/src/agent/stuck-loop.ts +133 -0
  182. package/packages/core/src/agent/tool-selector.ts +569 -0
  183. package/packages/core/src/agent/tracer.ts +100 -0
  184. package/packages/core/src/auth/auth.ts +108 -0
  185. package/packages/core/src/auth/index.ts +1 -0
  186. package/packages/core/src/canvas/a2ui-tools.ts +255 -0
  187. package/packages/core/src/canvas/canvas-manager.ts +390 -0
  188. package/packages/core/src/canvas/canvas-tools.ts +448 -0
  189. package/packages/core/src/canvas/emitter.ts +149 -0
  190. package/packages/core/src/canvas/index.ts +3 -0
  191. package/packages/core/src/channels/base.ts +154 -0
  192. package/packages/core/src/channels/discord.ts +273 -0
  193. package/packages/core/src/channels/index.ts +7 -0
  194. package/packages/core/src/channels/manager.ts +450 -0
  195. package/packages/core/src/channels/slack.ts +323 -0
  196. package/packages/core/src/channels/telegram.ts +612 -0
  197. package/packages/core/src/channels/webchat.ts +139 -0
  198. package/packages/core/src/channels/whatsapp.ts +548 -0
  199. package/packages/core/src/config/index.ts +12 -0
  200. package/packages/core/src/config/loader.ts +569 -0
  201. package/packages/core/src/events/agent-bus.ts +460 -0
  202. package/packages/core/src/events/event-bus.ts +169 -0
  203. package/packages/core/src/gateway/channel-notify.ts +64 -0
  204. package/packages/core/src/gateway/helpers/cors.ts +32 -0
  205. package/packages/core/src/gateway/helpers/index.ts +4 -0
  206. package/packages/core/src/gateway/helpers/narration.ts +57 -0
  207. package/packages/core/src/gateway/helpers/path.ts +13 -0
  208. package/packages/core/src/gateway/helpers/redact.ts +61 -0
  209. package/packages/core/src/gateway/index.ts +5 -0
  210. package/packages/core/src/gateway/initializer.ts +363 -0
  211. package/packages/core/src/gateway/lane-queue.ts +169 -0
  212. package/packages/core/src/gateway/llm-local/client.ts +94 -0
  213. package/packages/core/src/gateway/llm-local/detector.ts +321 -0
  214. package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
  215. package/packages/core/src/gateway/llm-local/index.ts +34 -0
  216. package/packages/core/src/gateway/llm-local/manager.ts +186 -0
  217. package/packages/core/src/gateway/llm-local/models.ts +149 -0
  218. package/packages/core/src/gateway/llm-local/server.ts +179 -0
  219. package/packages/core/src/gateway/resolver.ts +108 -0
  220. package/packages/core/src/gateway/router.ts +124 -0
  221. package/packages/core/src/gateway/routes/agents.ts +210 -0
  222. package/packages/core/src/gateway/routes/auth.ts +244 -0
  223. package/packages/core/src/gateway/routes/channels.ts +484 -0
  224. package/packages/core/src/gateway/routes/chat.ts +241 -0
  225. package/packages/core/src/gateway/routes/config.ts +12 -0
  226. package/packages/core/src/gateway/routes/cron-api.ts +544 -0
  227. package/packages/core/src/gateway/routes/ethics.ts +46 -0
  228. package/packages/core/src/gateway/routes/llm-local.ts +271 -0
  229. package/packages/core/src/gateway/routes/mcp.ts +319 -0
  230. package/packages/core/src/gateway/routes/meeting.ts +232 -0
  231. package/packages/core/src/gateway/routes/models.ts +163 -0
  232. package/packages/core/src/gateway/routes/multimodal.ts +93 -0
  233. package/packages/core/src/gateway/routes/providers.ts +220 -0
  234. package/packages/core/src/gateway/routes/setup.ts +441 -0
  235. package/packages/core/src/gateway/routes/skills.ts +115 -0
  236. package/packages/core/src/gateway/routes/system.ts +469 -0
  237. package/packages/core/src/gateway/routes/tasks.ts +44 -0
  238. package/packages/core/src/gateway/routes/tools.ts +59 -0
  239. package/packages/core/src/gateway/routes/tts-local.ts +388 -0
  240. package/packages/core/src/gateway/routes/users.ts +122 -0
  241. package/packages/core/src/gateway/routes/voice.ts +189 -0
  242. package/packages/core/src/gateway/routes/workspace.ts +281 -0
  243. package/packages/core/src/gateway/server.ts +2744 -0
  244. package/packages/core/src/gateway/session.ts +95 -0
  245. package/packages/core/src/gateway/slash-commands.ts +207 -0
  246. package/packages/core/src/gateway/tts/README.md +94 -0
  247. package/packages/core/src/gateway/tts/package.json +25 -0
  248. package/packages/core/src/gateway/tts/src/client.ts +59 -0
  249. package/packages/core/src/gateway/tts/src/detect.ts +42 -0
  250. package/packages/core/src/gateway/tts/src/index.ts +15 -0
  251. package/packages/core/src/gateway/tts/src/install.ts +129 -0
  252. package/packages/core/src/gateway/tts/src/models.ts +50 -0
  253. package/packages/core/src/gateway/tts/src/server.ts +252 -0
  254. package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
  255. package/packages/core/src/heartbeat/index.ts +157 -0
  256. package/packages/core/src/index.ts +56 -0
  257. package/packages/core/src/mcp/hot-reload.ts +148 -0
  258. package/packages/core/src/mcp/singleton.ts +21 -0
  259. package/packages/core/src/mcp/tool-sync.ts +176 -0
  260. package/packages/core/src/multimodal/index.ts +2 -0
  261. package/packages/core/src/multimodal/types.ts +28 -0
  262. package/packages/core/src/multimodal/vision-service.ts +283 -0
  263. package/packages/core/src/plugins/api.ts +128 -0
  264. package/packages/core/src/plugins/index.ts +2 -0
  265. package/packages/core/src/plugins/loader.ts +365 -0
  266. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  267. package/packages/core/src/scheduler/CronScheduler.ts +699 -0
  268. package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
  269. package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
  270. package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
  271. package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
  272. package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
  273. package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
  274. package/packages/core/src/scheduler/dag/errors.ts +37 -0
  275. package/packages/core/src/scheduler/dag/index.ts +26 -0
  276. package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
  277. package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
  278. package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
  279. package/packages/core/src/scheduler/index.ts +22 -0
  280. package/packages/core/src/scheduler/integration.ts +237 -0
  281. package/packages/core/src/scheduler/types.ts +164 -0
  282. package/packages/core/src/security/google-chat.ts +269 -0
  283. package/packages/core/src/security/index.ts +192 -0
  284. package/packages/core/src/security/pairing.ts +250 -0
  285. package/packages/core/src/security/rate-limit.ts +270 -0
  286. package/packages/core/src/security/signal.ts +321 -0
  287. package/packages/core/src/state/store.ts +312 -0
  288. package/packages/core/src/storage/crypto.ts +197 -0
  289. package/packages/core/src/storage/migrate.ts +147 -0
  290. package/packages/core/src/storage/onboarding.ts +1506 -0
  291. package/packages/core/src/storage/schema.ts +666 -0
  292. package/packages/core/src/storage/seed.ts +628 -0
  293. package/packages/core/src/storage/sqlite.ts +407 -0
  294. package/packages/core/src/storage/usage.ts +374 -0
  295. package/packages/core/src/tool-runtime/index.ts +476 -0
  296. package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
  297. package/packages/core/src/tools/agents/get-available-models.ts +118 -0
  298. package/packages/core/src/tools/agents/index.ts +610 -0
  299. package/packages/core/src/tools/canvas/index.ts +420 -0
  300. package/packages/core/src/tools/cli/index.ts +142 -0
  301. package/packages/core/src/tools/core/index.ts +478 -0
  302. package/packages/core/src/tools/cron/index.ts +635 -0
  303. package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
  304. package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
  305. package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
  306. package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
  307. package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
  308. package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
  309. package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
  310. package/packages/core/src/tools/filesystem/index.ts +34 -0
  311. package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
  312. package/packages/core/src/tools/index.ts +197 -0
  313. package/packages/core/src/tools/meeting/index.ts +363 -0
  314. package/packages/core/src/tools/office/index.ts +47 -0
  315. package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
  316. package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
  317. package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
  318. package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
  319. package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
  320. package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
  321. package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
  322. package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
  323. package/packages/core/src/tools/types.ts +39 -0
  324. package/packages/core/src/tools/voice/index.ts +104 -0
  325. package/packages/core/src/tools/web/browser-click.ts +78 -0
  326. package/packages/core/src/tools/web/browser-extract.ts +139 -0
  327. package/packages/core/src/tools/web/browser-navigate.ts +106 -0
  328. package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
  329. package/packages/core/src/tools/web/browser-script.ts +88 -0
  330. package/packages/core/src/tools/web/browser-service.ts +554 -0
  331. package/packages/core/src/tools/web/browser-type.ts +101 -0
  332. package/packages/core/src/tools/web/browser-wait.ts +136 -0
  333. package/packages/core/src/tools/web/index.ts +41 -0
  334. package/packages/core/src/tools/web/web-fetch.ts +78 -0
  335. package/packages/core/src/tools/web/web-search.ts +123 -0
  336. package/packages/core/src/utils/benchmark.ts +80 -0
  337. package/packages/core/src/utils/crypto.ts +73 -0
  338. package/packages/core/src/utils/date.ts +42 -0
  339. package/packages/core/src/utils/index.ts +5 -0
  340. package/packages/core/src/utils/logger.ts +389 -0
  341. package/packages/core/src/utils/retry.ts +70 -0
  342. package/packages/core/src/utils/toon.ts +253 -0
  343. package/packages/core/src/voice/index.ts +643 -0
  344. package/packages/mcp/src/config.ts +13 -0
  345. package/packages/mcp/src/index.ts +1 -0
  346. package/packages/mcp/src/logger.ts +47 -0
  347. package/packages/mcp/src/manager.ts +439 -0
  348. package/packages/mcp/src/transports/index.ts +67 -0
  349. package/packages/mcp/src/transports/sse.ts +238 -0
  350. package/packages/mcp/src/transports/websocket.ts +159 -0
  351. package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
  352. package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
  353. package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
  354. package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
  355. package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
  356. package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
  357. package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
  358. package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
  359. package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
  360. package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
  361. package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
  362. package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
  363. package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
  364. package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
  365. package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
  366. package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
  367. package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
  368. package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
  369. package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
  370. package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
  371. package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
  372. package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
  373. package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
  374. package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
  375. package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
  376. package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
  377. package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
  378. package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
  379. package/packages/skills/src/bundled-data.generated.ts +1964 -0
  380. package/packages/skills/src/index.ts +1 -0
  381. package/packages/skills/src/loader.ts +388 -0
  382. package/dist/ui/assets/AgentNewPage-GB-tVN50.js +0 -1
  383. package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
  384. package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
  385. package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
  386. package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
  387. package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
  388. package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
  389. package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
  390. package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
  391. package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
  392. package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
  393. package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
  394. package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
  395. package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
  396. package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
  397. package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
  398. package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
  399. package/dist/ui/assets/index-BN0875JH.css +0 -2
  400. package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
  401. package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
  402. package/dist/ui/assets/progress-JN30I5fF.js +0 -1
  403. package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
  404. package/dist/ui/assets/search-ChPgnVKj.js +0 -1
  405. package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
  406. package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
  407. package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
  408. /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
  409. /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
  410. /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
  411. /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
  412. /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
  413. /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
  414. /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
  415. /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
  416. /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
  417. /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
  418. /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
  419. /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
  420. /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
  421. /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
  422. /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
  423. /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
  424. /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
  425. /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
  426. /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
  427. /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
  428. /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
  429. /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
  430. /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
  431. /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
  432. /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
  433. /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
  434. /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
  435. /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
  436. /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
  437. /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
  438. /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
  439. /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
  440. /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Hive Local LLM — Server Manager
3
+ * Gestiona procesos persistentes de llama-server
4
+ */
5
+
6
+ import { spawn, type Subprocess } from "bun"
7
+ import { getModelConfig, buildLlamaServerArgs, type ModelConfig } from "./models"
8
+ import { type ModelId } from "./downloader"
9
+ import { findLlamaServerBinary } from "./downloader"
10
+ import { logger } from "../../utils/logger"
11
+
12
+ const log = logger.child("llama-manager")
13
+
14
+ export type ServerMode = "TEXT" | "IMAGE" | "AUDIO"
15
+
16
+ interface ManagedServer {
17
+ mode: ServerMode
18
+ port: number
19
+ process: Subprocess
20
+
21
+ modelId: ModelId
22
+ startedAt: number
23
+ }
24
+
25
+ class LlamaServerManager {
26
+ private servers = new Map<ServerMode, ManagedServer>()
27
+ private logs = new Map<ServerMode, string[]>()
28
+
29
+ async start(mode: ServerMode, modelId: ModelId): Promise<ManagedServer> {
30
+ const existing = this.servers.get(mode)
31
+ if (existing) {
32
+ if (existing.process.killed) {
33
+ this.servers.delete(mode)
34
+ } else {
35
+ return existing
36
+ }
37
+ }
38
+
39
+ // Solo 1 modo a la vez para evitar Out of Memory (VRAM compartida)
40
+ this.stopAll()
41
+ await Bun.sleep(1000) // Dar tiempo a liberar la VRAM y puertos
42
+
43
+ const port = this.getPortForMode(mode)
44
+ // NO auto-descargar: verificar que el binario ya exista
45
+ const binaryPath = await findLlamaServerBinary()
46
+ if (!binaryPath) {
47
+ throw new Error(
48
+ "llama-server no está instalado. Ve a Configuración > LLM Local y haz clic en 'Instalar' primero."
49
+ )
50
+ }
51
+ const config = getModelConfig(modelId, port)
52
+
53
+ if ((mode === "IMAGE" || mode === "AUDIO") && !config.mmprojPath) {
54
+ throw new Error(`El modo ${mode} requiere el proyector de visión (mmproj). Por favor, descárgalo primero.`)
55
+ }
56
+
57
+ const args = buildLlamaServerArgs(config, mode)
58
+
59
+ log.info(`Iniciando llama-server para modo ${mode} en puerto ${port}...`)
60
+
61
+ const proc = Bun.spawn([binaryPath, ...args], {
62
+ stdout: "pipe",
63
+ stderr: "pipe",
64
+ env: {
65
+ ...process.env,
66
+ LD_LIBRARY_PATH: `${require("path").dirname(binaryPath)}:${process.env.LD_LIBRARY_PATH || ""}`,
67
+ GGML_VULKAN_CHECK_RESULTS: "0",
68
+ GGML_VULKAN_DEBUG: "0",
69
+ },
70
+ })
71
+
72
+ const server: ManagedServer = {
73
+ mode,
74
+ port,
75
+ process: proc,
76
+ modelId,
77
+ startedAt: Date.now(),
78
+ }
79
+
80
+ this.servers.set(mode, server)
81
+ this.logs.set(mode, [])
82
+
83
+ // Capturar logs
84
+ this.captureLogs(mode, proc)
85
+
86
+ // Esperar a que el servidor esté listo (health check)
87
+ const ready = await this.waitForReady(port)
88
+ if (!ready) {
89
+ this.stop(mode)
90
+ throw new Error(`Servidor ${mode} no respondió en puerto ${port} tras iniciar.`)
91
+ }
92
+
93
+ return server
94
+ }
95
+
96
+ stop(mode: ServerMode): void {
97
+ const server = this.servers.get(mode)
98
+ if (server) {
99
+ server.process.kill()
100
+ this.servers.delete(mode)
101
+ log.info(`Servidor ${mode} detenido.`)
102
+ }
103
+ }
104
+
105
+ stopAll(): void {
106
+ for (const mode of this.servers.keys()) {
107
+ this.stop(mode)
108
+ }
109
+ }
110
+
111
+ getStatus() {
112
+ const status: any[] = []
113
+ for (const [mode, server] of this.servers.entries()) {
114
+ status.push({
115
+ mode,
116
+ port: server.port,
117
+ modelId: server.modelId,
118
+ uptime: Math.floor((Date.now() - server.startedAt) / 1000),
119
+ pid: server.process.pid,
120
+ })
121
+ }
122
+ return status
123
+ }
124
+
125
+ getLogs(mode: ServerMode): string[] {
126
+ return this.logs.get(mode) || []
127
+ }
128
+
129
+ private getPortForMode(mode: ServerMode): number {
130
+ switch (mode) {
131
+ case "TEXT": return 8081
132
+ case "IMAGE": return 8082
133
+ case "AUDIO": return 8083
134
+ default: return 8081
135
+ }
136
+ }
137
+
138
+ private async waitForReady(port: number, retries = 20): Promise<boolean> {
139
+ for (let i = 0; i < retries; i++) {
140
+ try {
141
+ const res = await fetch(`http://localhost:${port}/health`, {
142
+ signal: AbortSignal.timeout(500),
143
+ })
144
+ if (res.ok) return true
145
+ } catch {
146
+ // next retry
147
+ }
148
+ await Bun.sleep(500)
149
+ }
150
+ return false
151
+ }
152
+
153
+ private async captureLogs(mode: ServerMode, proc: Subprocess) {
154
+ if (!proc.stderr || typeof proc.stderr === "number") {
155
+ log.warn(`No se pudo capturar logs para ${mode}: stderr no es un stream.`)
156
+ return
157
+ }
158
+
159
+ const reader = proc.stderr.getReader()
160
+ const decoder = new TextDecoder()
161
+ const logs = this.logs.get(mode)!
162
+
163
+ try {
164
+ while (true) {
165
+ const { done, value } = await reader.read()
166
+ if (done) break
167
+ const text = decoder.decode(value, { stream: true })
168
+ const lines = text.split("\n")
169
+ for (const line of lines) {
170
+ if (line.trim()) {
171
+ logs.push(line.trim())
172
+ if (logs.length > 500) logs.shift()
173
+ // Logear errores críticos al logger principal
174
+ if (line.includes("error") || line.includes("FAILED")) {
175
+ log.error(`[${mode}] ${line.trim()}`)
176
+ }
177
+ }
178
+ }
179
+ }
180
+ } catch (e) {
181
+ log.error(`Error capturando logs de ${mode}: ${e}`)
182
+ }
183
+ }
184
+ }
185
+
186
+ export const llamaManager = new LlamaServerManager()
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Hive Local LLM — Model Utils
3
+ * Gestión de rutas y configuración de modelos
4
+ */
5
+
6
+
7
+ import { existsSync } from "fs"
8
+ import { MODELS_DIR, getModelPath, type ModelId } from "./downloader"
9
+
10
+ export interface ModelConfig {
11
+ modelPath: string
12
+ mmprojPath?: string
13
+ ctxSize: number
14
+ ngl: number
15
+ threads: number
16
+ batchSize: number
17
+ ubatchSize: number
18
+ cacheTypeK: string
19
+ cacheTypeV: string
20
+ flashAttn: boolean
21
+ host: string
22
+ port: number
23
+ jinja: boolean
24
+ }
25
+
26
+ const DEFAULT_CONFIG: Omit<ModelConfig, "modelPath" | "mmprojPath" | "port"> = {
27
+ ctxSize: 16000,
28
+ ngl: 999,
29
+ threads: 16,
30
+ batchSize: 2048,
31
+ ubatchSize: 512,
32
+ cacheTypeK: "f16",
33
+ cacheTypeV: "f16",
34
+ flashAttn: true,
35
+ host: "0.0.0.0",
36
+ jinja: true,
37
+ }
38
+
39
+ export function getModelConfig(modelId: ModelId, port: number = 8081): ModelConfig {
40
+ const modelPath = getModelPath(modelId)
41
+
42
+ if (!existsSync(modelPath)) {
43
+ throw new Error(`Modelo no descargado: ${modelId}. Ejecuta downloadModel("${modelId}") primero.`)
44
+ }
45
+
46
+ const mmprojPath = getModelPath("mmproj")
47
+ const hasMMProj = existsSync(mmprojPath)
48
+
49
+ return {
50
+ modelPath,
51
+ mmprojPath: hasMMProj ? mmprojPath : undefined,
52
+ port,
53
+ ...DEFAULT_CONFIG,
54
+ }
55
+ }
56
+
57
+ /** Construye los argumentos de línea de comando para llama-server */
58
+ export function buildLlamaServerArgs(config: ModelConfig, mode: string): string[] {
59
+ const args: string[] = [
60
+ "-m", config.modelPath,
61
+ "--host", config.host,
62
+ "--port", String(config.port),
63
+ "-c", String(config.ctxSize),
64
+ "-ngl", String(config.ngl),
65
+ "-t", String(config.threads),
66
+ "-b", String(config.batchSize),
67
+ "-ub", String(config.ubatchSize),
68
+ "--cache-type-k", config.cacheTypeK,
69
+ "--cache-type-v", config.cacheTypeV,
70
+ ]
71
+
72
+ // Solo añadir mmproj si estamos en modo IMAGE para evitar errores de arquitectura en modo texto
73
+ if (config.mmprojPath && (mode === "IMAGE" || mode === "AUDIO")) {
74
+ args.push("--mmproj", config.mmprojPath)
75
+ }
76
+
77
+ if (config.flashAttn) {
78
+ args.push("--flash-attn", "on")
79
+ }
80
+
81
+ if (config.jinja) {
82
+ args.push("--jinja")
83
+ }
84
+
85
+ return args
86
+ }
87
+
88
+ /** Construye los argumentos de línea de comando para hive-cli (legacy) */
89
+ export function buildHiveCLIArgs(config: ModelConfig, options: {
90
+ prompt?: string
91
+ imagePath?: string
92
+ audioPath?: string
93
+ interactive?: boolean
94
+ nPredict?: number
95
+ }): string[] {
96
+ const args: string[] = [
97
+ "-m", config.modelPath,
98
+ "--mmproj", config.mmprojPath,
99
+ "-c", String(config.ctxSize),
100
+ "-ngl", String(config.ngl),
101
+ "-t", String(config.threads),
102
+ "-b", String(config.batchSize),
103
+ "-ub", String(config.ubatchSize),
104
+ "--cache-type-k", config.cacheTypeK,
105
+ "--cache-type-v", config.cacheTypeV,
106
+ ]
107
+
108
+ if (config.flashAttn) {
109
+ args.push("--flash-attn", "on")
110
+ }
111
+
112
+ if (options.imagePath && existsSync(options.imagePath)) {
113
+ args.push("--image", options.imagePath)
114
+ }
115
+
116
+ if (options.audioPath && existsSync(options.audioPath)) {
117
+ args.push("--audio", options.audioPath)
118
+ }
119
+
120
+ if (options.prompt) {
121
+ args.push("-p", options.prompt)
122
+ }
123
+
124
+ if (options.nPredict !== undefined) {
125
+ args.push("-n", String(options.nPredict))
126
+ }
127
+
128
+ if (options.interactive && !options.prompt) {
129
+ args.push("-i")
130
+ }
131
+
132
+ return args
133
+ }
134
+
135
+ /** Determina el modelo recomendado según el modo */
136
+ export function getRecommendedModel(mode: "text" | "image" | "audio" | "all"): ModelId {
137
+ switch (mode) {
138
+ case "text":
139
+ return "e2b_Q4_K_XL"
140
+ case "image":
141
+ return "e2b_Q4_K_XL"
142
+ case "audio":
143
+ return "e2b_Q4_K_XL"
144
+ case "all":
145
+ return "e4b_Q4_K_XL"
146
+ default:
147
+ return "e2b_Q4_K_XL"
148
+ }
149
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Hive Local LLM — WebSocket Server
3
+
4
+ */
5
+
6
+ import type { ServerWebSocket } from "bun"
7
+ import { existsSync } from "fs"
8
+ import { llamaManager, type ServerMode } from "./manager"
9
+ import type { ModelId } from "./downloader"
10
+
11
+ interface WSData {
12
+ sessionId: string
13
+ }
14
+
15
+ interface GenerateRequest {
16
+ type: "generate"
17
+ prompt: string
18
+ model: ModelId
19
+ imagePath?: string
20
+ audioPath?: string
21
+ nPredict?: number
22
+ }
23
+
24
+ interface DownloadRequest {
25
+ type: "download"
26
+ model: ModelId
27
+ }
28
+
29
+ export type LLMMessage = GenerateRequest | DownloadRequest
30
+
31
+ const sessions = new Map<string, ServerWebSocket<WSData>>()
32
+
33
+ export async function handleLLMWebSocket(
34
+ ws: ServerWebSocket<WSData>,
35
+ message: string
36
+ ): Promise<void> {
37
+ let req: LLMMessage
38
+ try {
39
+ req = JSON.parse(message)
40
+ } catch {
41
+ ws.send(JSON.stringify({ type: "error", message: "JSON inválido" }))
42
+ return
43
+ }
44
+
45
+ if (req.type === "download") {
46
+ await handleDownload(ws, req)
47
+ return
48
+ }
49
+
50
+ if (req.type === "generate") {
51
+ await handleGenerate(ws, req)
52
+ return
53
+ }
54
+
55
+ ws.send(JSON.stringify({ type: "error", message: `Tipo desconocido: ${(req as any).type}` }))
56
+ }
57
+
58
+ async function handleDownload(
59
+ ws: ServerWebSocket<WSData>,
60
+ req: DownloadRequest
61
+ ): Promise<void> {
62
+ const { downloadModel, isModelDownloaded } = await import("./downloader")
63
+
64
+ if (isModelDownloaded(req.model)) {
65
+ ws.send(JSON.stringify({ type: "download_progress", model: req.model, percent: 100, done: true }))
66
+ return
67
+ }
68
+
69
+ try {
70
+ await downloadModel(req.model, (downloaded, total) => {
71
+ const percent = total > 0 ? Math.round((downloaded / total) * 100) : 0
72
+ ws.send(JSON.stringify({
73
+ type: "download_progress",
74
+ model: req.model,
75
+ percent,
76
+ downloaded,
77
+ total,
78
+ done: false,
79
+ }))
80
+ })
81
+
82
+ ws.send(JSON.stringify({ type: "download_progress", model: req.model, percent: 100, done: true }))
83
+ } catch (err) {
84
+ ws.send(JSON.stringify({
85
+ type: "error",
86
+ message: err instanceof Error ? err.message : "Error descargando modelo",
87
+ }))
88
+ }
89
+ }
90
+
91
+ async function handleGenerate(
92
+ ws: ServerWebSocket<WSData>,
93
+ req: GenerateRequest
94
+ ): Promise<void> {
95
+ try {
96
+ // Determinar modo (por ahora simplificado a TEXT, pero podríamos soportar IMAGE/AUDIO si el req lo pide)
97
+ const mode: ServerMode = req.imagePath ? "IMAGE" : (req.audioPath ? "AUDIO" : "TEXT")
98
+
99
+ // Asegurar que el servidor esté corriendo
100
+ const server = await llamaManager.start(mode, req.model)
101
+
102
+ ws.send(JSON.stringify({ type: "status", message: `Generando vía llama-server (${mode})...` }))
103
+
104
+ // Llamar a la API de llama-server (formato OpenAI)
105
+ const response = await fetch(`http://localhost:${server.port}/v1/chat/completions`, {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ body: JSON.stringify({
109
+ model: req.model,
110
+ messages: [{ role: "user", content: req.prompt }],
111
+ stream: true,
112
+ max_tokens: req.nPredict || 512,
113
+ })
114
+ })
115
+
116
+ if (!response.ok) {
117
+ throw new Error(`llama-server respondió ${response.status}: ${await response.text()}`)
118
+ }
119
+
120
+ const reader = response.body?.getReader()
121
+ if (!reader) throw new Error("No se pudo obtener el reader de la respuesta")
122
+
123
+ const decoder = new TextDecoder()
124
+
125
+ try {
126
+ while (true) {
127
+ const { done, value } = await reader.read()
128
+ if (done) break
129
+
130
+ const chunk = decoder.decode(value, { stream: true })
131
+ const lines = chunk.split("\n")
132
+
133
+ for (const line of lines) {
134
+ const trimmed = line.trim()
135
+ if (!trimmed || !trimmed.startsWith("data: ")) continue
136
+
137
+ const dataStr = trimmed.slice(6)
138
+ if (dataStr === "[DONE]") break
139
+
140
+ try {
141
+ const data = JSON.parse(dataStr)
142
+ const token = data.choices[0]?.delta?.content
143
+ if (token) {
144
+ ws.send(JSON.stringify({ type: "token", text: token }))
145
+ }
146
+ } catch { /* ignore parse errors in chunks */ }
147
+ }
148
+ }
149
+ } finally {
150
+ reader.releaseLock()
151
+ }
152
+
153
+ ws.send(JSON.stringify({ type: "done" }))
154
+ } catch (err) {
155
+ ws.send(JSON.stringify({
156
+ type: "error",
157
+ message: err instanceof Error ? err.message : "Error en generación",
158
+ }))
159
+ }
160
+ }
161
+
162
+ /** HTTP handler para status de modelos */
163
+ export async function handleLLMStatus(): Promise<Response> {
164
+ const { listLocalModels, isModelDownloaded } = await import("./downloader")
165
+ const { detectGPU } = await import("./detector")
166
+
167
+ const gpu = await detectGPU()
168
+ const models = listLocalModels()
169
+
170
+ return Response.json({
171
+ ok: true,
172
+ gpu: {
173
+ backend: gpu.backend,
174
+ deviceName: gpu.deviceName,
175
+ platform: gpu.platform,
176
+ },
177
+ models,
178
+ })
179
+ }
@@ -0,0 +1,108 @@
1
+ import { getDb } from "../storage/sqlite"
2
+
3
+ export interface ResolveContextResult {
4
+ userId: string
5
+ agentId: string
6
+ isNewUser: boolean
7
+ }
8
+
9
+ export interface ResolveContextOptions {
10
+ channel: string
11
+ channelUserId: string
12
+ }
13
+
14
+ export function resolveContext(options: ResolveContextOptions): ResolveContextResult {
15
+ const { channel, channelUserId } = options
16
+ const db = getDb()
17
+
18
+ const identity = db
19
+ .query<any, [string, string]>(
20
+ "SELECT user_id FROM user_identities WHERE channel = ? AND channel_user_id = ?"
21
+ )
22
+ .get(channel, channelUserId)
23
+
24
+ let userId: string
25
+ let isNewUser = false
26
+
27
+ if (identity) {
28
+ userId = identity.user_id
29
+ } else {
30
+ // Sistema mono-usuario: reutilizar el usuario del onboarding
31
+ const existingUser = db
32
+ .query<any, []>("SELECT id FROM users ORDER BY created_at ASC LIMIT 1")
33
+ .get() as { id: string } | undefined
34
+
35
+ if (!existingUser) {
36
+ throw new Error("No user found in database. Please run the onboarding process first.")
37
+ }
38
+
39
+ userId = existingUser.id
40
+
41
+ // Vincular este canal al usuario existente (auto-link en el primer mensaje)
42
+ // INSERT OR REPLACE: si ya existe una fila (user_id, channel), actualiza channel_user_id
43
+ // con el valor real del canal (e.g. chat ID numérico de Telegram).
44
+ db.query(
45
+ "INSERT OR REPLACE INTO user_identities (user_id, channel, channel_user_id, linked_at) VALUES (?, ?, ?, ?)"
46
+ ).run(userId, channel, channelUserId, Math.floor(Date.now() / 1000))
47
+ }
48
+
49
+ const coordinatorAgent = db
50
+ .query<any, []>("SELECT id FROM agents WHERE role = 'coordinator' LIMIT 1")
51
+ .get()
52
+
53
+ const agentId = coordinatorAgent?.id || "bee"
54
+
55
+ return { userId, agentId, isNewUser }
56
+ }
57
+
58
+ export function getDefaultAgentId(): string {
59
+ const db = getDb()
60
+ const coordinatorAgent = db
61
+ .query<any, []>("SELECT id FROM agents WHERE role = 'coordinator' LIMIT 1")
62
+ .get()
63
+
64
+ return coordinatorAgent?.id || "bee"
65
+ }
66
+
67
+ export function getUserById(userId: string): any {
68
+ const db = getDb()
69
+ return db.query<any, [string]>("SELECT * FROM users WHERE id = ?").get(userId)
70
+ }
71
+
72
+ export function updateUserProfile(userId: string, updates: {
73
+ name?: string
74
+ language?: string
75
+ timezone?: string
76
+ occupation?: string
77
+ notes?: string
78
+ }): void {
79
+ const db = getDb()
80
+ const setClauses: string[] = []
81
+ const values: any[] = []
82
+
83
+ if (updates.name !== undefined) {
84
+ setClauses.push("name = ?")
85
+ values.push(updates.name)
86
+ }
87
+ if (updates.language !== undefined) {
88
+ setClauses.push("language = ?")
89
+ values.push(updates.language)
90
+ }
91
+ if (updates.timezone !== undefined) {
92
+ setClauses.push("timezone = ?")
93
+ values.push(updates.timezone)
94
+ }
95
+ if (updates.occupation !== undefined) {
96
+ setClauses.push("occupation = ?")
97
+ values.push(updates.occupation)
98
+ }
99
+ if (updates.notes !== undefined) {
100
+ setClauses.push("notes = ?")
101
+ values.push(updates.notes)
102
+ }
103
+
104
+ if (setClauses.length > 0) {
105
+ values.push(userId)
106
+ db.query(`UPDATE users SET ${setClauses.join(", ")} WHERE id = ?`).run(...values)
107
+ }
108
+ }