@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,467 @@
1
+ /**
2
+ * Context Compiler — Implementa las 4 estrategias de Context Engineering:
3
+ *
4
+ * 1. ESCRIBIR (Write) — Guardar información fuera del contexto:
5
+ * - Scratchpad: notas persistentes por conversación
6
+ * - Trazas de ejecución: registro en traces table
7
+ *
8
+ * 2. SELECCIONAR (Select) — Traer solo lo relevante:
9
+ * - Tool Loadout: máx 3-5 tools relevantes por turno
10
+ * - Playbook filtering: reglas ACE aplicables a esta tarea
11
+ * - Historial selectivo: resumen + mensajes recientes
12
+ *
13
+ * 3. COMPRIMIR (Compress) — Reducir tokens manteniendo información:
14
+ * - Compaction: resumir mensajes viejos
15
+ * - Tool result clearing: reemplazar resultados antiguos por resúmenes
16
+ *
17
+ * 4. AISLAR (Isolate) — Separar contextos por agente:
18
+ * - Cada worker recibe su propio contexto mínimo
19
+ * - El Coordinador ve el panorama completo
20
+ *
21
+ * TODOS los datos se formatean en TOON para ahorro de tokens.
22
+ */
23
+
24
+ import { getDb } from "../storage/sqlite"
25
+ import { logger } from "../utils/logger"
26
+ import type { LLMMessage, LLMToolDef, ContentPart } from "./llm-client"
27
+ import type { MCPClientManager } from "@johpaz/hive-agents-mcp"
28
+ import { syncToolCatalogToFTS, mcpToolFullName } from "./tool-selector"
29
+ import { syncSkillsToFTS, getMinimalSkills, selectSkills, type SkillDescriptor } from "./skill-selector"
30
+ import { syncPlaybookToFTS } from "./playbook-selector"
31
+ import { getRecentMessages, getSummary, getScratchpad, toAPIMessages } from "./conversation-store"
32
+ import { formatContext, estimateTokens } from "../utils/toon"
33
+ import { buildSystemPromptWithProjects } from "./prompt-builder"
34
+ import { createAllTools } from "../tools/index.ts"
35
+ import { resolveUserId } from "../storage/onboarding"
36
+ import { getMCPManager as getSingletonMCPManager } from "../mcp/singleton"
37
+ import { syncMCPToolsToDB, syncMCPToolsToFTS } from "../mcp/tool-sync"
38
+ import { getUserDate, getUserTime } from "../utils/date"
39
+
40
+ const log = logger.child("context-compiler")
41
+
42
+ // Configuration constants
43
+ const KEEP_LAST_N_MESSAGES = 15 // Always keep last N messages (Strategy: SELECT) — increased because tool calls/results are now persisted
44
+ const DEFAULT_CONTEXT_WINDOW = 250000 // Default context window when model is unknown
45
+ const COMPACT_RATIO = 0.80 // Compact when estimated input exceeds 70% of context window
46
+ const MAX_SYSTEM_PROMPT_CHARS_CAP = 128000 // Hard cap for pathological prompts; normal budget is model-aware
47
+
48
+ // MINIMAL TOOL SET — fixed always-available tools
49
+ // The agent discovers the rest via search_knowledge
50
+ const MINIMAL_TOOLS = new Set([
51
+ "save_note",
52
+ "notify",
53
+ "report_progress",
54
+ "search_knowledge",
55
+ ])
56
+
57
+ // MINIMAL SKILL SET — fixed always-available skills
58
+ // These skills are ALWAYS in context - the agent uses them to discover everything else
59
+ const MINIMAL_SKILL_NAMES = [
60
+ "busqueda_fts5", // Core: how to find tools, skills, MCP, playbook via search_knowledge
61
+ "memory_manager", // Persistent notes that survive context compression
62
+ "canvas_report", // Display results to users with charts, tables, cards
63
+ "task_orchestrator", // Agent coordination via notify
64
+ ]
65
+
66
+ // ─── Types ─────────────────────────────────────────────────────────────────
67
+
68
+ // Simple tool interface for context compilation
69
+ export interface ContextTool {
70
+ name: string
71
+ description: string
72
+ parameters: Record<string, unknown>
73
+ execute?: (params: Record<string, unknown>) => Promise<unknown>
74
+ }
75
+
76
+ export interface CompiledContext {
77
+ systemPrompt: string
78
+ messages: LLMMessage[]
79
+ tools: LLMToolDef[]
80
+ allTools: ContextTool[]
81
+ skills: SkillDescriptor[] // Skills loaded (minimal + discovered)
82
+ }
83
+
84
+ // ─── Main compiler ─────────────────────────────────────────────────────────
85
+
86
+ /**
87
+ * Compile context for agent execution implementing 4 strategies:
88
+ * 1. WRITE - Load scratchpad notes
89
+ * 2. SELECT - Tool loadout, playbook rules, selective history
90
+ * 3. COMPRESS - Use summaries, clear old tool results
91
+ * 4. ISOLATE - Worker gets minimal context
92
+ */
93
+ export async function compileContext(opts: {
94
+ agentId: string
95
+ threadId: string
96
+ userId?: string
97
+ userMessage: string | ContentPart[]
98
+ channel?: string
99
+ isolated?: boolean
100
+ taskContext?: string | ContentPart[]
101
+ mcpManager?: MCPClientManager | null
102
+ }): Promise<CompiledContext> {
103
+ const db = getDb()
104
+ const { agentId, threadId, mcpManager, userMessage, isolated, taskContext } = opts
105
+
106
+ // Fallback: Get MCP Manager from singleton if not provided
107
+ const effectiveMcpManager = mcpManager ?? (() => {
108
+ const singletonMcp = getSingletonMCPManager()
109
+ if (singletonMcp) {
110
+ log.info(`[context-compiler] Using MCP Manager from singleton`)
111
+ return singletonMcp
112
+ }
113
+ return null
114
+ })()
115
+
116
+ // Resolve userId from database with priority: explicit param → channel identity → single user
117
+ const userId = opts.userId || resolveUserId({
118
+ threadId,
119
+ channel: opts.channel,
120
+ channelUserId: threadId
121
+ }) || threadId || ""
122
+
123
+ // [STEP-1] Load agent config
124
+ log.info(`[context-compiler] [STEP-1] Loading agent config for id=${agentId}`)
125
+ let agent: any
126
+ try {
127
+ agent = db.query<any, [string]>(
128
+ "SELECT * FROM agents WHERE id = ?"
129
+ ).get(agentId)
130
+ } catch (err) {
131
+ log.error(`[context-compiler] [STEP-1] ❌ FAILED loading agent: ${JSON.stringify(err)}`)
132
+ throw err
133
+ }
134
+
135
+ if (!agent) {
136
+ throw new Error(`Agent not found: ${agentId}`)
137
+ }
138
+
139
+ const isWorker = agent.role === 'worker' || !!isolated
140
+ log.info(`[context-compiler] [STEP-1] ✅ Compiling for ${isWorker ? 'worker' : 'coordinator'} agent=${agent.name}`)
141
+
142
+ // Load model's context window for compaction decisions
143
+ let modelContextWindow = DEFAULT_CONTEXT_WINDOW
144
+ if (agent.model_id) {
145
+ try {
146
+ const mRow = db.query<any, [string]>("SELECT context_window FROM models WHERE id = ?").get(agent.model_id.replace(/^[^/]+\//, ''))
147
+ if (mRow?.context_window) modelContextWindow = mRow.context_window
148
+ } catch { /* use default */ }
149
+ }
150
+
151
+ // [STEP-2] STRATEGY 1: WRITE — Load scratchpad (persistent notes)
152
+ log.info(`[context-compiler] [STEP-2] Loading scratchpad...`)
153
+ let scratchpadNotes: ReturnType<typeof getScratchpad> = []
154
+ try {
155
+ scratchpadNotes = getScratchpad(threadId)
156
+ log.info(`[context-compiler] [STEP-2] ✅ Loaded ${scratchpadNotes.length} scratchpad notes`)
157
+ } catch (err) {
158
+ log.error(`[context-compiler] [STEP-2] ❌ FAILED loading scratchpad: ${JSON.stringify(err)}`)
159
+ throw err
160
+ }
161
+
162
+ // [STEP-3c] Load MCP tools (executors only — FTS sync happens here too)
163
+ log.info(`[context-compiler] [STEP-3c] Loading MCP tools...`)
164
+ const mcpToolExecutors: ContextTool[] = []
165
+
166
+ if (effectiveMcpManager) {
167
+ try {
168
+ const dbServers = db.query<any, []>(
169
+ "SELECT id, name, status FROM mcp_servers WHERE enabled = 1"
170
+ ).all()
171
+
172
+ for (const server of dbServers) {
173
+ // Try ID first (normalized), then name
174
+ let serverTools = effectiveMcpManager.getServerTools(server.id)
175
+ if (!serverTools || serverTools.length === 0) {
176
+ serverTools = effectiveMcpManager.getServerTools(server.name)
177
+ }
178
+
179
+ if (serverTools && serverTools.length > 0) {
180
+ log.info(`[context-compiler] [STEP-3c] Server ${server.name}: ${serverTools.length} tools`)
181
+
182
+ for (const mcpTool of serverTools) {
183
+ // Sanitized name valid for all LLM providers (no spaces, max 64 chars)
184
+ const fullName = mcpToolFullName(server.name, mcpTool.name)
185
+
186
+ // Executor for agent-loop (has the real call)
187
+ mcpToolExecutors.push({
188
+ name: fullName,
189
+ description: mcpTool.description || `Tool from ${server.name}`,
190
+ parameters: mcpTool.inputSchema || { type: "object", properties: {} },
191
+ execute: async (params: Record<string, unknown>) => {
192
+ // Return raw JS value — agent-loop will TOON-encode via formatToolResult.
193
+ // Never pre-stringify here: formatToolResult(string) double-encodes.
194
+ return await effectiveMcpManager.callTool(server.id, mcpTool.name, params)
195
+ },
196
+ })
197
+
198
+ }
199
+ } else {
200
+ log.warn(`[context-compiler] [STEP-3c] Server ${server.name} has no tools (not connected yet)`)
201
+ }
202
+ }
203
+
204
+ log.info(`[context-compiler] [STEP-3c] ✅ Loaded ${mcpToolExecutors.length} MCP tools`)
205
+
206
+ // Persist MCP tool definitions to DB for search_knowledge and FTS5 search
207
+ if (mcpToolExecutors.length > 0) {
208
+ try {
209
+ for (const server of dbServers) {
210
+ let serverTools = effectiveMcpManager!.getServerTools(server.id)
211
+ if (!serverTools || serverTools.length === 0) {
212
+ serverTools = effectiveMcpManager!.getServerTools(server.name)
213
+ }
214
+ if (serverTools && serverTools.length > 0) {
215
+ syncMCPToolsToDB(server.id || server.name, server.name, serverTools)
216
+ }
217
+ }
218
+ await syncMCPToolsToFTS();
219
+ log.info(`[context-compiler] [STEP-3c] ✅ Persisted MCP tools to DB + FTS5`)
220
+ } catch (syncErr) {
221
+ log.warn(`[context-compiler] [STEP-3c] ⚠️ Failed to persist MCP tools to DB: ${(syncErr as Error).message}`)
222
+ }
223
+ }
224
+ } catch (err) {
225
+ log.error(`[context-compiler] [STEP-3c] ❌ Failed: ${(err as Error).message}`)
226
+ }
227
+ } else {
228
+ log.info(`[context-compiler] [STEP-3c] ⚠️ No MCP manager, skipping MCP tools`)
229
+ }
230
+
231
+ // [STEP-4] Minimal tool set — agent discovers the rest via search_knowledge
232
+ log.info(`[context-compiler] [STEP-4] Building minimal tool set`)
233
+
234
+ // [STEP-8] Combine native tools + MCP executors loaded in STEP-3c
235
+ const config = { tools: {} }
236
+ const allNativeTools = createAllTools(config)
237
+ const nativeTools: ContextTool[] = allNativeTools.map(t => ({
238
+ name: t.name,
239
+ description: t.description || "",
240
+ parameters: t.parameters as any,
241
+ execute: t.execute,
242
+ }))
243
+
244
+ const allTools = [...nativeTools, ...mcpToolExecutors]
245
+
246
+ // Only native minimal tools in LLM context
247
+ // MCP tools are discovered dynamically via search_knowledge(type="mcp")
248
+ const filteredNativeTools: ContextTool[] = nativeTools.filter(t => MINIMAL_TOOLS.has(t.name))
249
+
250
+ const nativeToolsForLLM: LLMToolDef[] = filteredNativeTools.map(t => ({
251
+ type: "function" as const,
252
+ function: {
253
+ name: t.name,
254
+ description: t.description,
255
+ parameters: t.parameters,
256
+ },
257
+ }))
258
+
259
+ const toolsForLLM: LLMToolDef[] = nativeToolsForLLM
260
+
261
+ log.info(`[context-compiler] [STEP-4] Minimal native tool set: ${filteredNativeTools.length} tools`)
262
+ log.info(`[context-compiler] [STEP-4b] MCP tools available via search_knowledge: ${mcpToolExecutors.length} (not injected)`)
263
+ log.info(`[context-compiler] [STEP-8] ✅ Combined tools: ${allTools.length} total executors, ${toolsForLLM.length} in LLM context`)
264
+
265
+ // [STEP-8b] STRATEGY 2: SELECT — Skill Loadout (minimal + discovered)
266
+ log.info(`[context-compiler] [STEP-8b] Building skill loadout...`)
267
+ let minimalSkills: SkillDescriptor[] = []
268
+ let discoveredSkills: SkillDescriptor[] = []
269
+
270
+ try {
271
+ // Load minimal skills (always available)
272
+ minimalSkills = getMinimalSkills()
273
+ log.info(`[context-compiler] [STEP-8b] ✅ Loaded ${minimalSkills.length} minimal skills`)
274
+
275
+ // Discover additional skills via FTS5 (coordinator only)
276
+ if (!isWorker) {
277
+ const inputForSkills = taskContext || userMessage
278
+ const textMessage = typeof inputForSkills === "string"
279
+ ? inputForSkills
280
+ : Array.isArray(inputForSkills)
281
+ ? inputForSkills.filter(p => p.type === "text").map(p => (p as any).text).join("\n")
282
+ : String(inputForSkills)
283
+ discoveredSkills = selectSkills(textMessage)
284
+ log.info(`[context-compiler] [STEP-8b] ✅ Discovered ${discoveredSkills.length} additional skills via FTS5`)
285
+ }
286
+ } catch (err) {
287
+ log.warn(`[context-compiler] [STEP-8b] ⚠️ Skill loadout failed: ${(err as Error).message}`)
288
+ }
289
+
290
+ // Combine skills (minimal + discovered, avoiding duplicates)
291
+ const skillMap = new Map<string, SkillDescriptor>()
292
+ for (const skill of minimalSkills) {
293
+ skillMap.set(skill.name, skill)
294
+ }
295
+ for (const skill of discoveredSkills) {
296
+ if (!skillMap.has(skill.name)) {
297
+ skillMap.set(skill.name, skill)
298
+ }
299
+ }
300
+ const allSkills = Array.from(skillMap.values())
301
+
302
+ // [STEP-9] STRATEGY 3: COMPRESS — Load history with compaction
303
+ log.info(`[context-compiler] [STEP-9] Loading conversation history...`)
304
+ let recentMessages: ReturnType<typeof getRecentMessages> = []
305
+ try {
306
+ recentMessages = getRecentMessages(threadId, KEEP_LAST_N_MESSAGES)
307
+ log.info(`[context-compiler] [STEP-9] ✅ Loaded ${recentMessages.length} recent messages`)
308
+ } catch (err) {
309
+ log.error(`[context-compiler] [STEP-9] ❌ FAILED loading history: ${JSON.stringify(err)}`)
310
+ throw err
311
+ }
312
+
313
+ // Check if we need to use summary (conversation is long)
314
+ let summary: ReturnType<typeof getSummary> = null
315
+ try {
316
+ summary = getSummary(threadId)
317
+ } catch (err) {
318
+ log.error(`[context-compiler] [STEP-9b] ❌ FAILED loading summary: ${JSON.stringify(err)}`)
319
+ throw err
320
+ }
321
+
322
+ const totalTokens = recentMessages.reduce((sum, m) => sum + estimateTokens(m.content), 0)
323
+
324
+ let messages: LLMMessage[]
325
+
326
+ const compactThreshold = Math.floor(modelContextWindow * COMPACT_RATIO)
327
+ if (summary && totalTokens > compactThreshold) {
328
+ // Use summary + recent messages (Strategy: COMPRESS)
329
+ messages = [
330
+ { role: "system", content: `[Conversation Summary]: ${summary.summary}` },
331
+ ...toAPIMessages(recentMessages),
332
+ ]
333
+ log.info(`[context-compiler] [STEP-9c] Using summary (${summary.messages_covered} messages compressed)`)
334
+ } else {
335
+ // Conversation is short enough, use all recent messages
336
+ messages = toAPIMessages(recentMessages)
337
+ }
338
+
339
+ // [STEP-10] STRATEGY 4: ISOLATE — Build context based on agent role
340
+ log.info(`[context-compiler] [STEP-10] Building system prompt...`)
341
+ let systemPrompt: string
342
+ try {
343
+ systemPrompt = await buildSystemPromptWithProjects({ agentId, userId })
344
+ log.info(`[context-compiler] [STEP-10] ✅ System prompt built (${systemPrompt.length} chars)`)
345
+ } catch (err) {
346
+ log.error(`[context-compiler] [STEP-10] ❌ FAILED building system prompt: ${JSON.stringify(err)}`)
347
+ throw err
348
+ }
349
+
350
+ // [STEP-10b] Inject current date/time (ENTORNO ACTUAL)
351
+ const userRow = db.query<any, [string]>(
352
+ "SELECT timezone FROM users WHERE id = ?"
353
+ ).get(userId)
354
+ const userTimezone = userRow?.timezone || "UTC"
355
+ const now = new Date()
356
+ const fecha = getUserDate(userTimezone, now)
357
+ const hora = getUserTime(userTimezone, now)
358
+ const workspaceLine = agent.workspace ? `\n**Workspace**: ${agent.workspace} (usa SIEMPRE este path como basePath en herramientas de filesystem)` : ""
359
+ systemPrompt += `\n\n# ENTORNO ACTUAL\n**Fecha**: ${fecha}\n**Hora**: ${hora}\n**Zona horaria**: ${userTimezone}${workspaceLine}\n`
360
+ log.info(`[context-compiler] [STEP-10b] ✅ Injected current date/time: ${fecha} ${hora} (${userTimezone})`)
361
+
362
+ // Inject scratchpad (Strategy: WRITE) — usando TOON para ahorro de tokens
363
+ if (scratchpadNotes.length > 0) {
364
+ const scratchpadData: Record<string, string> = {}
365
+ for (const n of scratchpadNotes) {
366
+ scratchpadData[n.key] = n.value
367
+ }
368
+ // TOON comprime el formato clave-valor
369
+ const scratchpadContent = formatContext(scratchpadData)
370
+ systemPrompt += `\n\n# SCRATCHPAD (Persistent Notes)\n${scratchpadContent}\n`
371
+ }
372
+
373
+ // Dynamic tool discovery instruction (coordinator only)
374
+ // Note: MCP tools are already available directly, no search needed
375
+ if (!isWorker) {
376
+ // Build minimal tools documentation from filtered native tools
377
+ const minimalToolsDocs = filteredNativeTools
378
+ .filter(t => MINIMAL_TOOLS.has(t.name))
379
+ .map(t => `- **${t.name}**: ${t.description || "Herramienta nativa"}`)
380
+ .join("\n")
381
+
382
+ systemPrompt += `\n\n# HERRAMIENTAS SIEMPRE DISPONIBLES\n` +
383
+ `${minimalToolsDocs}\n\n` +
384
+ `## Delegación a workers\n` +
385
+ `Los workers arrancan con estas mismas 4 herramientas mínimas.\n` +
386
+ `**Antes de delegar**, usá \`search_knowledge(type="tools", query="<tarea>")\` para identificar qué tools necesita el worker e incluirlas en la instrucción de \`task_delegate\`.\n`
387
+
388
+
389
+ // Inject available skills (minimal + discovered)
390
+ if (allSkills.length > 0) {
391
+ // Minimal skills: inject full body (always-loaded instructions)
392
+ const minimalWithBody = allSkills.filter(s => MINIMAL_SKILL_NAMES.includes(s.name) && s.body)
393
+ if (minimalWithBody.length > 0) {
394
+ let minimalSection = `\n\n# SKILLS SIEMPRE ACTIVAS\n`
395
+ for (const skill of minimalWithBody) {
396
+ minimalSection += `\n## ${skill.name}\n${skill.body}\n`
397
+ }
398
+ systemPrompt += minimalSection
399
+ }
400
+
401
+ // Discovered skills: list only (body arrives via agent-loop when tools are injected)
402
+ const discoveredOnly = allSkills.filter(s => !MINIMAL_SKILL_NAMES.includes(s.name))
403
+ if (discoveredOnly.length > 0) {
404
+ let discoveredSection = `\n\n# SKILLS DESCUBIERTAS (relevantes para esta tarea)\n`
405
+ for (const skill of discoveredOnly) {
406
+ const desc = skill.description ? ` — ${skill.description}` : ""
407
+ discoveredSection += `- **${skill.name}**${desc}\n`
408
+ }
409
+ systemPrompt += discoveredSection
410
+ }
411
+
412
+ log.info(`[context-compiler] [STEP-10d] Injected ${minimalWithBody.length} minimal skill bodies + ${discoveredOnly.length} discovered skills`)
413
+ }
414
+
415
+ }
416
+
417
+ // For isolated workers, add task context + tool discovery instruction
418
+ if (isWorker && opts.taskContext) {
419
+ systemPrompt += `\n\n# HERRAMIENTAS DISPONIBLES\n` +
420
+ `Arrancas con herramientas básicas. Si tu tarea requiere herramientas adicionales (web_search, fs_read, browser_navigate, etc.):\n` +
421
+ `1. Usá \`search_knowledge(type="tools", query="<herramienta o tarea>")\` para encontrarlas.\n` +
422
+ `2. Las herramientas que encuentres estarán disponibles para usar inmediatamente.\n` +
423
+ `Si el coordinador te indicó herramientas específicas, buscalas primero con search_knowledge antes de ejecutar tu tarea.\n` +
424
+ `\n# CURRENT TASK\n${opts.taskContext}\n\nFocus ONLY on this task. Do not deviate.`
425
+ }
426
+
427
+ // Truncate system prompt only when it exceeds a model-aware budget.
428
+ const maxSystemPromptChars = Math.min(
429
+ MAX_SYSTEM_PROMPT_CHARS_CAP,
430
+ Math.max(8000, Math.floor(modelContextWindow * COMPACT_RATIO * 4))
431
+ )
432
+ if (systemPrompt.length > maxSystemPromptChars) {
433
+ const originalLen = systemPrompt.length
434
+ systemPrompt = systemPrompt.substring(0, maxSystemPromptChars) +
435
+ `\n\n[... System prompt truncated (${originalLen} chars → ${maxSystemPromptChars} chars) ...]`
436
+ log.info(`[context-compiler] System prompt truncated: ${originalLen} → ${maxSystemPromptChars} chars`)
437
+ }
438
+
439
+ const estimatedSystemTokens = estimateTokens(systemPrompt)
440
+ const estimatedMsgTokens = messages.reduce((sum, m) => sum + estimateTokens(typeof m.content === 'string' ? m.content : JSON.stringify(m.content)), 0)
441
+ const estimatedToolTokens = toolsForLLM.reduce((sum, t) => sum + estimateTokens(JSON.stringify(t)), 0)
442
+ const estimatedTotal = estimatedSystemTokens + estimatedMsgTokens + estimatedToolTokens
443
+ const budgetPct = modelContextWindow > 0 ? Math.round((estimatedTotal / modelContextWindow) * 100) : 0
444
+
445
+ log.info(
446
+ `[context-compiler] ✅ DONE: ${allTools.length} total tools, ` +
447
+ `${toolsForLLM.length} selected tools, ${messages.length} messages, ` +
448
+ `${allSkills.length} skills, isolated=${isWorker}, ` +
449
+ `est.tokens: sys=${estimatedSystemTokens} msgs=${estimatedMsgTokens} tools=${estimatedToolTokens} ` +
450
+ `total=${estimatedTotal}/${modelContextWindow} (${budgetPct}%)`
451
+ )
452
+
453
+ return {
454
+ systemPrompt,
455
+ messages,
456
+ tools: toolsForLLM,
457
+ allTools,
458
+ skills: allSkills,
459
+ }
460
+ }
461
+
462
+ // Re-export sync functions for gateway/initializer
463
+ export {
464
+ syncToolCatalogToFTS as syncToolsToFTS,
465
+ syncSkillsToFTS,
466
+ syncPlaybookToFTS,
467
+ }
@@ -0,0 +1,91 @@
1
+ import type { Config } from "../config/loader.ts";
2
+ import { logger } from "../utils/logger.ts";
3
+ import type { LLMMessage as Message } from "../agent/llm-client";
4
+
5
+ export interface ContextGuardResult {
6
+ canProceed: boolean;
7
+ currentTokens: number;
8
+ maxTokens: number;
9
+ utilizationPercent: number;
10
+ needsCompaction: boolean;
11
+ }
12
+
13
+ export class ContextGuard {
14
+ private config: Config;
15
+ private log = logger.child("context-guard");
16
+
17
+ constructor(config: Config) {
18
+ this.config = config;
19
+ }
20
+
21
+ estimateTokens(messages: Message[]): number {
22
+ let total = 0;
23
+
24
+ for (const msg of messages) {
25
+ total += Math.ceil(msg.content.length / 4);
26
+
27
+ if (msg.name) {
28
+ total += Math.ceil(msg.name.length / 4);
29
+ }
30
+
31
+ if (msg.tool_calls) {
32
+ for (const tc of msg.tool_calls) {
33
+ total += Math.ceil(tc.function.name.length / 4);
34
+ total += Math.ceil(tc.function.arguments.length / 4);
35
+ }
36
+ }
37
+ }
38
+
39
+ return total;
40
+ }
41
+
42
+ check(messages: Message[], systemPrompt?: string): ContextGuardResult {
43
+ const maxTokens = this.config.agent?.context?.maxTokens || 128000;
44
+ const threshold = this.config.agent?.context?.compactionThreshold || 0.8;
45
+
46
+ let currentTokens = this.estimateTokens(messages);
47
+
48
+ if (systemPrompt) {
49
+ currentTokens += Math.ceil(systemPrompt.length / 4);
50
+ }
51
+
52
+ currentTokens += 500;
53
+
54
+ const utilizationPercent = currentTokens / maxTokens;
55
+ const needsCompaction = utilizationPercent >= threshold;
56
+ const canProceed = currentTokens < maxTokens * 0.95;
57
+
58
+ this.log.debug(`Context check: ${currentTokens}/${maxTokens} tokens (${(utilizationPercent * 100).toFixed(1)}%)`);
59
+
60
+ return {
61
+ canProceed,
62
+ currentTokens,
63
+ maxTokens,
64
+ utilizationPercent,
65
+ needsCompaction,
66
+ };
67
+ }
68
+
69
+ shouldCompact(messages: Message[], systemPrompt?: string): boolean {
70
+ const result = this.check(messages, systemPrompt);
71
+ return result.needsCompaction;
72
+ }
73
+
74
+ getRecommendedAction(messages: Message[], systemPrompt?: string): "proceed" | "compact" | "error" {
75
+ const result = this.check(messages, systemPrompt);
76
+
77
+ if (result.utilizationPercent >= 0.95) {
78
+ return "error";
79
+ }
80
+
81
+ if (result.needsCompaction) {
82
+ return "compact";
83
+ }
84
+
85
+ return "proceed";
86
+ }
87
+ }
88
+
89
+ export function createContextGuard(config: Config): ContextGuard {
90
+ return new ContextGuard(config);
91
+ }