@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,544 @@
1
+ /**
2
+ * REST API Endpoints for Cron Jobs
3
+ *
4
+ * Endpoints for the dashboard to manage cron jobs.
5
+ * These endpoints delegate to the CronScheduler instance.
6
+ */
7
+
8
+ import type { CronScheduler } from "../../scheduler/CronScheduler";
9
+ import { getDb } from "../../storage/sqlite";
10
+
11
+ // Global scheduler instance (set during gateway initialization)
12
+ let _scheduler: CronScheduler | null = null;
13
+
14
+ export function setSchedulerInstance(scheduler: CronScheduler): void {
15
+ _scheduler = scheduler;
16
+ }
17
+
18
+ export function getSchedulerInstance(): CronScheduler | null {
19
+ return _scheduler;
20
+ }
21
+
22
+ /**
23
+ * GET /api/cron
24
+ * List all scheduled tasks
25
+ */
26
+ export async function handleGetCronJobs(
27
+ req: Request,
28
+ addCorsHeaders: (r: Response, req: Request) => Response
29
+ ): Promise<Response> {
30
+ const url = new URL(req.url);
31
+ const status = url.searchParams.get("status") || undefined;
32
+
33
+ try {
34
+ if (_scheduler) {
35
+ const tasks = _scheduler.listTasks(status);
36
+ return addCorsHeaders(Response.json({ tasks, count: tasks.length }), req);
37
+ } else {
38
+ // Fallback: direct DB query
39
+ const db = getDb();
40
+ let query = "SELECT * FROM cron_jobs WHERE 1=1";
41
+ const args: any[] = [];
42
+
43
+ if (status) {
44
+ query += " AND status = ?";
45
+ args.push(status);
46
+ }
47
+
48
+ query += " ORDER BY next_run_at ASC";
49
+
50
+ const tasks = db.query(query).all(...args);
51
+ return addCorsHeaders(Response.json({ tasks, count: tasks.length }), req);
52
+ }
53
+ } catch (err) {
54
+ return addCorsHeaders(
55
+ Response.json({ error: `Failed to list tasks: ${(err as Error).message}` }, { status: 500 }),
56
+ req
57
+ );
58
+ }
59
+ }
60
+
61
+ /**
62
+ * GET /api/cron/:id
63
+ * Get a single scheduled task by ID
64
+ */
65
+ export async function handleGetCronJob(
66
+ req: Request,
67
+ addCorsHeaders: (r: Response, req: Request) => Response,
68
+ taskId: string
69
+ ): Promise<Response> {
70
+ try {
71
+ if (_scheduler) {
72
+ const task = _scheduler.getTask(taskId);
73
+ if (task) {
74
+ return addCorsHeaders(Response.json({ task }), req);
75
+ } else {
76
+ return addCorsHeaders(
77
+ Response.json({ error: "Task not found" }, { status: 404 }),
78
+ req
79
+ );
80
+ }
81
+ } else {
82
+ // Fallback: direct DB query
83
+ const db = getDb();
84
+ const task = db.query("SELECT * FROM cron_jobs WHERE id = ?").get(taskId);
85
+ if (task) {
86
+ return addCorsHeaders(Response.json({ task }), req);
87
+ } else {
88
+ return addCorsHeaders(
89
+ Response.json({ error: "Task not found" }, { status: 404 }),
90
+ req
91
+ );
92
+ }
93
+ }
94
+ } catch (err) {
95
+ return addCorsHeaders(
96
+ Response.json({ error: `Failed to get task: ${(err as Error).message}` }, { status: 500 }),
97
+ req
98
+ );
99
+ }
100
+ }
101
+
102
+ /**
103
+ * POST /api/cron
104
+ * Create a new cron job
105
+ */
106
+ export async function handleCreateCronJob(
107
+ req: Request,
108
+ addCorsHeaders: (r: Response, req: Request) => Response
109
+ ): Promise<Response> {
110
+ try {
111
+ const body = await req.json().catch(() => ({}));
112
+
113
+ const {
114
+ name,
115
+ task,
116
+ task_type,
117
+ cron_expression,
118
+ fire_at,
119
+ payload,
120
+ agent_id,
121
+ tool_name,
122
+ max_runs,
123
+ channel,
124
+ start_at,
125
+ stop_at,
126
+ dom_and_dow,
127
+ protect,
128
+ interval_sec,
129
+ } = body;
130
+
131
+ if (!name || !task_type || !task) {
132
+ return addCorsHeaders(
133
+ Response.json({ error: "Missing required fields: name, task, task_type" }, { status: 400 }),
134
+ req
135
+ );
136
+ }
137
+
138
+ // Get user timezone
139
+ const db = getDb();
140
+ const user = db.query("SELECT timezone FROM users LIMIT 1").get() as { timezone: string } | undefined;
141
+ const timezone = user?.timezone || "UTC";
142
+
143
+ if (_scheduler) {
144
+ const result = _scheduler.create({
145
+ name,
146
+ task,
147
+ task_type,
148
+ cron_expression,
149
+ fire_at,
150
+ timezone,
151
+ payload: payload || { prompt: task },
152
+ agent_id: agent_id || null,
153
+ tool_name: tool_name || null,
154
+ max_runs: max_runs || null,
155
+ channel: channel || "system",
156
+ start_at: start_at || undefined,
157
+ stop_at: stop_at || undefined,
158
+ dom_and_dow: dom_and_dow || false,
159
+ protect: protect !== false,
160
+ interval_sec: interval_sec || null,
161
+ });
162
+
163
+ return addCorsHeaders(Response.json({
164
+ ok: true,
165
+ task_id: result.id,
166
+ next_run: result.nextRun,
167
+ }), req);
168
+ } else {
169
+ // Fallback: direct insert
170
+ const id = crypto.randomUUID().replace(/-/g, "").slice(0, 16);
171
+ const now = new Date().toISOString();
172
+
173
+ db.query(`
174
+ INSERT INTO cron_jobs (
175
+ id, name, task, task_type, cron_expression, fire_at, timezone,
176
+ start_at, stop_at, dom_and_dow,
177
+ payload, agent_id, tool_name, max_runs, channel, protect, interval_sec,
178
+ created_at, updated_at
179
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
180
+ `).run(
181
+ id, name, task, task_type, cron_expression || null, fire_at || null, timezone,
182
+ start_at || null, stop_at || null, dom_and_dow ? 1 : 0,
183
+ JSON.stringify(payload || {}), agent_id || null, tool_name || null,
184
+ max_runs || null, channel || "system", protect !== false ? 1 : 0,
185
+ interval_sec || null, now, now
186
+ );
187
+
188
+ return addCorsHeaders(Response.json({
189
+ ok: true,
190
+ task_id: id,
191
+ }), req);
192
+ }
193
+ } catch (err) {
194
+ return addCorsHeaders(
195
+ Response.json({ error: `Failed to create job: ${(err as Error).message}` }, { status: 500 }),
196
+ req
197
+ );
198
+ }
199
+ }
200
+
201
+ /**
202
+ * PATCH /api/cron/:id
203
+ * Update a cron job
204
+ */
205
+ export async function handleUpdateCronJob(
206
+ req: Request,
207
+ addCorsHeaders: (r: Response, req: Request) => Response,
208
+ taskId: string
209
+ ): Promise<Response> {
210
+ try {
211
+ const body = await req.json().catch(() => ({}));
212
+
213
+ if (_scheduler) {
214
+ const success = _scheduler.update(taskId, body);
215
+ if (success) {
216
+ return addCorsHeaders(Response.json({ ok: true }), req);
217
+ } else {
218
+ return addCorsHeaders(
219
+ Response.json({ error: "Job not found" }, { status: 404 }),
220
+ req
221
+ );
222
+ }
223
+ } else {
224
+ // Fallback: direct update
225
+ const db = getDb();
226
+ const fields: string[] = [];
227
+ const values: any[] = [];
228
+
229
+ if (body.name !== undefined) {
230
+ fields.push("name = ?");
231
+ values.push(body.name);
232
+ }
233
+ if (body.task !== undefined) {
234
+ fields.push("task = ?");
235
+ values.push(body.task);
236
+ }
237
+ if (body.cron_expression !== undefined) {
238
+ fields.push("cron_expression = ?");
239
+ values.push(body.cron_expression);
240
+ }
241
+ if (body.fire_at !== undefined) {
242
+ fields.push("fire_at = ?");
243
+ values.push(body.fire_at);
244
+ }
245
+ if (body.start_at !== undefined) {
246
+ fields.push("start_at = ?");
247
+ values.push(body.start_at);
248
+ }
249
+ if (body.stop_at !== undefined) {
250
+ fields.push("stop_at = ?");
251
+ values.push(body.stop_at);
252
+ }
253
+ if (body.dom_and_dow !== undefined) {
254
+ fields.push("dom_and_dow = ?");
255
+ values.push(body.dom_and_dow ? 1 : 0);
256
+ }
257
+ if (body.payload !== undefined) {
258
+ fields.push("payload = ?");
259
+ values.push(JSON.stringify(body.payload));
260
+ }
261
+ if (body.status !== undefined) {
262
+ fields.push("status = ?");
263
+ values.push(body.status);
264
+ }
265
+ if (body.max_runs !== undefined) {
266
+ fields.push("max_runs = ?");
267
+ values.push(body.max_runs);
268
+ }
269
+
270
+ if (fields.length === 0) {
271
+ return addCorsHeaders(Response.json({ ok: true }), req);
272
+ }
273
+
274
+ values.push(taskId);
275
+ const result = db.query(`UPDATE cron_jobs SET ${fields.join(", ")} WHERE id = ?`).run(...values);
276
+
277
+ if (result.changes > 0) {
278
+ return addCorsHeaders(Response.json({ ok: true }), req);
279
+ } else {
280
+ return addCorsHeaders(
281
+ Response.json({ error: "Task not found" }, { status: 404 }),
282
+ req
283
+ );
284
+ }
285
+ }
286
+ } catch (err) {
287
+ return addCorsHeaders(
288
+ Response.json({ error: `Failed to update task: ${(err as Error).message}` }, { status: 500 }),
289
+ req
290
+ );
291
+ }
292
+ }
293
+
294
+ /**
295
+ * DELETE /api/cron/:id
296
+ * Delete a scheduled task
297
+ */
298
+ export async function handleDeleteCronJob(
299
+ req: Request,
300
+ addCorsHeaders: (r: Response, req: Request) => Response,
301
+ taskId: string
302
+ ): Promise<Response> {
303
+ try {
304
+ if (_scheduler) {
305
+ const success = _scheduler.delete(taskId);
306
+ if (success) {
307
+ return addCorsHeaders(Response.json({ ok: true }), req);
308
+ } else {
309
+ return addCorsHeaders(
310
+ Response.json({ error: "Task not found" }, { status: 404 }),
311
+ req
312
+ );
313
+ }
314
+ } else {
315
+ // Fallback: direct delete
316
+ const db = getDb();
317
+ const result = db.query("DELETE FROM cron_jobs WHERE id = ?").run(taskId);
318
+
319
+ if (result.changes > 0) {
320
+ return addCorsHeaders(Response.json({ ok: true }), req);
321
+ } else {
322
+ return addCorsHeaders(
323
+ Response.json({ error: "Task not found" }, { status: 404 }),
324
+ req
325
+ );
326
+ }
327
+ }
328
+ } catch (err) {
329
+ return addCorsHeaders(
330
+ Response.json({ error: `Failed to delete task: ${(err as Error).message}` }, { status: 500 }),
331
+ req
332
+ );
333
+ }
334
+ }
335
+
336
+ /**
337
+ * POST /api/cron/:id/pause
338
+ * Pause a scheduled task
339
+ */
340
+ export async function handlePauseCronJob(
341
+ req: Request,
342
+ addCorsHeaders: (r: Response, req: Request) => Response,
343
+ taskId: string
344
+ ): Promise<Response> {
345
+ try {
346
+ if (_scheduler) {
347
+ const success = _scheduler.pause(taskId);
348
+ if (success) {
349
+ return addCorsHeaders(Response.json({ ok: true, message: `Task "${taskId}" paused` }), req);
350
+ } else {
351
+ return addCorsHeaders(
352
+ Response.json({ error: "Task not found or already paused" }, { status: 404 }),
353
+ req
354
+ );
355
+ }
356
+ } else {
357
+ // Fallback: direct update
358
+ const db = getDb();
359
+ const result = db.query("UPDATE cron_jobs SET status = 'paused' WHERE id = ?").run(taskId);
360
+
361
+ if (result.changes > 0) {
362
+ return addCorsHeaders(Response.json({ ok: true }), req);
363
+ } else {
364
+ return addCorsHeaders(
365
+ Response.json({ error: "Task not found" }, { status: 404 }),
366
+ req
367
+ );
368
+ }
369
+ }
370
+ } catch (err) {
371
+ return addCorsHeaders(
372
+ Response.json({ error: `Failed to pause task: ${(err as Error).message}` }, { status: 500 }),
373
+ req
374
+ );
375
+ }
376
+ }
377
+
378
+ /**
379
+ * POST /api/cron/:id/resume
380
+ * Resume a paused scheduled task
381
+ */
382
+ export async function handleResumeCronJob(
383
+ req: Request,
384
+ addCorsHeaders: (r: Response, req: Request) => Response,
385
+ taskId: string
386
+ ): Promise<Response> {
387
+ try {
388
+ if (_scheduler) {
389
+ const success = _scheduler.resume(taskId);
390
+ if (success) {
391
+ return addCorsHeaders(Response.json({ ok: true, message: `Task "${taskId}" resumed` }), req);
392
+ } else {
393
+ return addCorsHeaders(
394
+ Response.json({ error: "Task not found or already active" }, { status: 404 }),
395
+ req
396
+ );
397
+ }
398
+ } else {
399
+ // Fallback: direct update
400
+ const db = getDb();
401
+ const result = db.query("UPDATE cron_jobs SET status = 'active' WHERE id = ?").run(taskId);
402
+
403
+ if (result.changes > 0) {
404
+ return addCorsHeaders(Response.json({ ok: true }), req);
405
+ } else {
406
+ return addCorsHeaders(
407
+ Response.json({ error: "Task not found" }, { status: 404 }),
408
+ req
409
+ );
410
+ }
411
+ }
412
+ } catch (err) {
413
+ return addCorsHeaders(
414
+ Response.json({ error: `Failed to resume task: ${(err as Error).message}` }, { status: 500 }),
415
+ req
416
+ );
417
+ }
418
+ }
419
+
420
+ /**
421
+ * POST /api/cron/:id/trigger
422
+ * Manually trigger a scheduled task
423
+ */
424
+ export async function handleTriggerCronJob(
425
+ req: Request,
426
+ addCorsHeaders: (r: Response, req: Request) => Response,
427
+ taskId: string
428
+ ): Promise<Response> {
429
+ try {
430
+ if (_scheduler) {
431
+ const success = _scheduler.trigger(taskId);
432
+ if (success) {
433
+ return addCorsHeaders(Response.json({ ok: true, message: `Task "${taskId}" triggered` }), req);
434
+ } else {
435
+ return addCorsHeaders(
436
+ Response.json({ error: "Task not found or not active" }, { status: 404 }),
437
+ req
438
+ );
439
+ }
440
+ } else {
441
+ return addCorsHeaders(
442
+ Response.json({ error: "Scheduler not active" }, { status: 503 }),
443
+ req
444
+ );
445
+ }
446
+ } catch (err) {
447
+ return addCorsHeaders(
448
+ Response.json({ error: `Failed to trigger task: ${(err as Error).message}` }, { status: 500 }),
449
+ req
450
+ );
451
+ }
452
+ }
453
+
454
+ /**
455
+ * GET /api/cron/:id/history
456
+ * Get execution history for a scheduled task
457
+ */
458
+ export async function handleGetCronJobHistory(
459
+ req: Request,
460
+ addCorsHeaders: (r: Response, req: Request) => Response,
461
+ taskId: string
462
+ ): Promise<Response> {
463
+ try {
464
+ const url = new URL(req.url);
465
+ const limit = parseInt(url.searchParams.get("limit") || "10", 10);
466
+
467
+ const db = getDb();
468
+ const runs = db.query(`
469
+ SELECT * FROM task_runs
470
+ WHERE task_id = ?
471
+ ORDER BY started_at DESC
472
+ LIMIT ?
473
+ `).all(taskId, limit);
474
+
475
+ return addCorsHeaders(Response.json({ history: runs, count: runs.length }), req);
476
+ } catch (err) {
477
+ return addCorsHeaders(
478
+ Response.json({ error: `Failed to get history: ${(err as Error).message}` }, { status: 500 }),
479
+ req
480
+ );
481
+ }
482
+ }
483
+
484
+ /**
485
+ * GET /api/cron/status
486
+ * Get scheduler status (all tasks with their runtime status)
487
+ */
488
+ export async function handleGetCronStatus(
489
+ req: Request,
490
+ addCorsHeaders: (r: Response, req: Request) => Response
491
+ ): Promise<Response> {
492
+ try {
493
+ if (_scheduler) {
494
+ const status = _scheduler.getStatus();
495
+ return addCorsHeaders(Response.json({ status }), req);
496
+ } else {
497
+ return addCorsHeaders(Response.json({ status: [], message: "Scheduler not active" }), req);
498
+ }
499
+ } catch (err) {
500
+ return addCorsHeaders(
501
+ Response.json({ error: `Failed to get status: ${(err as Error).message}` }, { status: 500 }),
502
+ req
503
+ );
504
+ }
505
+ }
506
+
507
+ /**
508
+ * GET /api/cron/channels
509
+ * Get available notification channels for cron jobs
510
+ */
511
+ export async function handleGetCronChannels(
512
+ req: Request,
513
+ addCorsHeaders: (r: Response, req: Request) => Response
514
+ ): Promise<Response> {
515
+ try {
516
+ const db = getDb();
517
+ const user = db.query("SELECT id FROM users LIMIT 1").get() as { id: string } | undefined;
518
+ const userId = user?.id || "";
519
+
520
+ const channels = db.query(`
521
+ SELECT DISTINCT c.id, c.type, c.active, c.status
522
+ FROM channels c
523
+ INNER JOIN user_identities ui ON ui.channel = c.type
524
+ WHERE ui.user_id = ? AND c.active = 1
525
+ `).all(userId) as Array<{ id: string; type: string; active: number; status: string }>;
526
+
527
+ const recommended = ["telegram", "discord", "slack", "whatsapp", "webchat"];
528
+ const formatted = channels.map(ch => ({
529
+ id: ch.id,
530
+ type: ch.type || ch.id,
531
+ active: ch.active === 1,
532
+ recommended: recommended.includes(ch.type || ch.id),
533
+ }));
534
+
535
+ if (formatted.length === 0) {
536
+ formatted.push({ id: "webchat", type: "webchat", active: true, recommended: true });
537
+ }
538
+
539
+ return addCorsHeaders(Response.json({ channels: formatted }), req);
540
+ } catch (err) {
541
+ // Non-critical — return empty channels
542
+ return addCorsHeaders(Response.json({ channels: [{ id: "webchat", type: "webchat", active: true, recommended: true }] }), req);
543
+ }
544
+ }
@@ -0,0 +1,46 @@
1
+ import { getDb } from "../../storage/sqlite"
2
+
3
+ export async function handleGetEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
4
+ const ethics = getDb().query(`
5
+ SELECT id, name, description, content, active, enabled
6
+ FROM ethics
7
+ ORDER BY name
8
+ `).all() as Record<string, unknown>[]
9
+
10
+ return addCorsHeaders(Response.json({
11
+ ethics: ethics.map(e => ({
12
+ id: e.id,
13
+ name: e.name,
14
+ description: e.description,
15
+ content: e.content,
16
+ active: e.active === 1,
17
+ enabled: e.enabled === 1,
18
+ }))
19
+ }), req)
20
+ }
21
+
22
+ export async function handleActivateEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
23
+ const body = await req.json().catch(() => ({}))
24
+ const { ethicsId, active } = body
25
+
26
+ if (!ethicsId) {
27
+ return addCorsHeaders(Response.json({ success: false, error: "ethicsId required" }), req)
28
+ }
29
+
30
+ getDb().query(`UPDATE ethics SET active = ?, enabled = ? WHERE id = ?`).run(active ? 1 : 0, active ? 1 : 0, ethicsId)
31
+
32
+ return addCorsHeaders(Response.json({ success: true, ethicsId, active }), req)
33
+ }
34
+
35
+ export async function handleDeleteEthics(req: Request, addCorsHeaders: (r: Response, req: Request) => Response): Promise<Response> {
36
+ const url = new URL(req.url)
37
+ const id = url.pathname.split("/").pop()
38
+
39
+ if (!id) {
40
+ return addCorsHeaders(Response.json({ success: false, error: "id required" }), req)
41
+ }
42
+
43
+ getDb().query("DELETE FROM ethics WHERE id = ?").run(id)
44
+
45
+ return addCorsHeaders(Response.json({ success: true }), req)
46
+ }