@johpaz/hive-agents 0.0.38 → 0.0.40

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 (263) hide show
  1. package/README.md +31 -71
  2. package/dist/hive.js +4318 -2898
  3. package/dist/tool-worker.js +2691 -1969
  4. package/dist/ui/assets/AgentCreateForm-b7xHyfNc.js +1 -0
  5. package/dist/ui/assets/AgentDetailPage-VHy3M7mI.js +1 -0
  6. package/dist/ui/assets/AgentNewPage-BnWImQMx.js +1 -0
  7. package/dist/ui/{dist/assets/AgentsPage-DGNLDXjR.js → assets/AgentsPage-WFy5abqx.js} +5 -5
  8. package/dist/ui/assets/ApiClientPage-BV7zLIL7.js +3 -0
  9. package/dist/ui/assets/{CanvasPage-CnMO1FN8.js → CanvasPage-B9zuIrTm.js} +7 -7
  10. package/dist/ui/assets/ChannelsPage-DiN3NvIM.js +8 -0
  11. package/dist/ui/{dist/assets/DashboardPage-VyXXp3U1.js → assets/DashboardPage-CHjARjVK.js} +2 -2
  12. package/dist/ui/assets/{LoginPage-DPj2s2Qq.js → LoginPage-Dwd_XxoU.js} +1 -1
  13. package/dist/ui/assets/LogsPage-DW8Nnqe6.js +1 -0
  14. package/dist/ui/assets/MeetingPage-D3bkiKYt.js +1 -0
  15. package/dist/ui/assets/{NotFound-BMeQSGcG.js → NotFound-BIUDlIXU.js} +1 -1
  16. package/dist/ui/assets/ProvidersPage-UqsDAxPQ.js +1 -0
  17. package/dist/ui/{dist/assets/RecoverPage-B-hDZUM2.js → assets/RecoverPage-8hTjr_JU.js} +1 -1
  18. package/dist/ui/assets/SettingsPage-DNa0jOkA.js +9 -0
  19. package/dist/ui/assets/SetupPage-Bdm2irQG.js +1 -0
  20. package/dist/ui/assets/WebChatPage-DElJg6P2.js +16 -0
  21. package/dist/ui/assets/accordion-CnLzKNHK.js +1 -0
  22. package/dist/ui/{dist/assets/alert-Bq6awLlW.js → assets/alert-DylmSCDJ.js} +1 -1
  23. package/dist/ui/{dist/assets/alert-dialog-DQvltYmf.js → assets/alert-dialog-DNNWN_SI.js} +1 -1
  24. package/dist/ui/assets/{badge-DXUDdTed.js → badge-ChENFgkC.js} +1 -1
  25. package/dist/ui/assets/bell-8BqRYmzf.js +1 -0
  26. package/dist/ui/assets/chevron-down-DIosfU_U.js +1 -0
  27. package/dist/ui/assets/chevron-up-CI-W21Fy.js +1 -0
  28. package/dist/ui/assets/circle-x-DjLkFDO8.js +1 -0
  29. package/dist/ui/assets/copy-Bu5d7C-0.js +1 -0
  30. package/dist/ui/{dist/assets/dialog-bI9jImCS.js → assets/dialog-BJ-npIv8.js} +1 -1
  31. package/dist/ui/{dist/assets/dropdown-menu-BK-CO3Od.js → assets/dropdown-menu-DDiaHg5y.js} +1 -1
  32. package/dist/ui/assets/{es-Cg8zdT52.js → es-ecSKCyB6.js} +1 -1
  33. package/dist/ui/assets/index-CawKP29y.js +116 -0
  34. package/dist/ui/assets/index-DIcsEkyd.css +2 -0
  35. package/dist/ui/{dist/assets/label-CrH0Jj3v.js → assets/label-Bi6udtSd.js} +1 -1
  36. package/dist/ui/assets/progress-D5c-Eilm.js +1 -0
  37. package/dist/ui/assets/scroll-area-CihOx0cb.js +1 -0
  38. package/dist/ui/assets/search-DzDptO9s.js +1 -0
  39. package/dist/ui/assets/select-BQCOjM2j.js +1 -0
  40. package/dist/ui/assets/send-BPk9XbIq.js +1 -0
  41. package/dist/ui/assets/shield-CxhcUT39.js +1 -0
  42. package/dist/ui/assets/{slider-CsiUDxc3.js → slider-bcUiUfx0.js} +1 -1
  43. package/dist/ui/assets/switch-BR30E4ej.js +1 -0
  44. package/dist/ui/assets/table-B3aGEaVp.js +1 -0
  45. package/dist/ui/assets/tabs-LQidMKRS.js +1 -0
  46. package/dist/ui/assets/textarea-B6Z1Zc6W.js +1 -0
  47. package/dist/ui/assets/useProviders-Dlizq_8q.js +1 -0
  48. package/dist/ui/{dist/assets/vendor-radix-cw1bQaVC.js → assets/vendor-radix-D6rA7xKY.js} +4 -4
  49. package/dist/ui/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
  50. package/dist/ui/dist/assets/AgentCreateForm-b7xHyfNc.js +1 -0
  51. package/dist/ui/dist/assets/AgentDetailPage-VHy3M7mI.js +1 -0
  52. package/dist/ui/dist/assets/AgentNewPage-BnWImQMx.js +1 -0
  53. package/dist/ui/{assets/AgentsPage-DGNLDXjR.js → dist/assets/AgentsPage-WFy5abqx.js} +5 -5
  54. package/dist/ui/dist/assets/ApiClientPage-BV7zLIL7.js +3 -0
  55. package/dist/ui/dist/assets/{CanvasPage-CnMO1FN8.js → CanvasPage-B9zuIrTm.js} +7 -7
  56. package/dist/ui/dist/assets/ChannelsPage-DiN3NvIM.js +8 -0
  57. package/dist/ui/{assets/DashboardPage-VyXXp3U1.js → dist/assets/DashboardPage-CHjARjVK.js} +2 -2
  58. package/dist/ui/dist/assets/{LoginPage-DPj2s2Qq.js → LoginPage-Dwd_XxoU.js} +1 -1
  59. package/dist/ui/dist/assets/LogsPage-DW8Nnqe6.js +1 -0
  60. package/dist/ui/dist/assets/MeetingPage-D3bkiKYt.js +1 -0
  61. package/dist/ui/dist/assets/{NotFound-BMeQSGcG.js → NotFound-BIUDlIXU.js} +1 -1
  62. package/dist/ui/dist/assets/ProvidersPage-UqsDAxPQ.js +1 -0
  63. package/dist/ui/{assets/RecoverPage-B-hDZUM2.js → dist/assets/RecoverPage-8hTjr_JU.js} +1 -1
  64. package/dist/ui/dist/assets/SettingsPage-DNa0jOkA.js +9 -0
  65. package/dist/ui/dist/assets/SetupPage-Bdm2irQG.js +1 -0
  66. package/dist/ui/dist/assets/WebChatPage-DElJg6P2.js +16 -0
  67. package/dist/ui/dist/assets/accordion-CnLzKNHK.js +1 -0
  68. package/dist/ui/{assets/alert-Bq6awLlW.js → dist/assets/alert-DylmSCDJ.js} +1 -1
  69. package/dist/ui/{assets/alert-dialog-DQvltYmf.js → dist/assets/alert-dialog-DNNWN_SI.js} +1 -1
  70. package/dist/ui/dist/assets/{badge-DXUDdTed.js → badge-ChENFgkC.js} +1 -1
  71. package/dist/ui/dist/assets/bell-8BqRYmzf.js +1 -0
  72. package/dist/ui/dist/assets/chevron-down-DIosfU_U.js +1 -0
  73. package/dist/ui/dist/assets/chevron-up-CI-W21Fy.js +1 -0
  74. package/dist/ui/dist/assets/circle-x-DjLkFDO8.js +1 -0
  75. package/dist/ui/dist/assets/copy-Bu5d7C-0.js +1 -0
  76. package/dist/ui/{assets/dialog-bI9jImCS.js → dist/assets/dialog-BJ-npIv8.js} +1 -1
  77. package/dist/ui/{assets/dropdown-menu-BK-CO3Od.js → dist/assets/dropdown-menu-DDiaHg5y.js} +1 -1
  78. package/dist/ui/dist/assets/{es-Cg8zdT52.js → es-ecSKCyB6.js} +1 -1
  79. package/dist/ui/dist/assets/index-CawKP29y.js +116 -0
  80. package/dist/ui/dist/assets/index-DIcsEkyd.css +2 -0
  81. package/dist/ui/{assets/label-CrH0Jj3v.js → dist/assets/label-Bi6udtSd.js} +1 -1
  82. package/dist/ui/dist/assets/progress-D5c-Eilm.js +1 -0
  83. package/dist/ui/dist/assets/scroll-area-CihOx0cb.js +1 -0
  84. package/dist/ui/dist/assets/search-DzDptO9s.js +1 -0
  85. package/dist/ui/dist/assets/select-BQCOjM2j.js +1 -0
  86. package/dist/ui/dist/assets/send-BPk9XbIq.js +1 -0
  87. package/dist/ui/dist/assets/shield-CxhcUT39.js +1 -0
  88. package/dist/ui/dist/assets/{slider-CsiUDxc3.js → slider-bcUiUfx0.js} +1 -1
  89. package/dist/ui/dist/assets/switch-BR30E4ej.js +1 -0
  90. package/dist/ui/dist/assets/table-B3aGEaVp.js +1 -0
  91. package/dist/ui/dist/assets/tabs-LQidMKRS.js +1 -0
  92. package/dist/ui/dist/assets/textarea-B6Z1Zc6W.js +1 -0
  93. package/dist/ui/dist/assets/useProviders-Dlizq_8q.js +1 -0
  94. package/dist/ui/{assets/vendor-radix-cw1bQaVC.js → dist/assets/vendor-radix-D6rA7xKY.js} +4 -4
  95. package/dist/ui/dist/assets/{vendor-react-D4s9E-zj.js → vendor-react-BU5iQU4f.js} +1 -1
  96. package/dist/ui/dist/index.html +6 -6
  97. package/dist/ui/index.html +6 -6
  98. package/package.json +1 -1
  99. package/packages/cli/src/adapters/binary.ts +8 -4
  100. package/packages/cli/src/adapters/bun-global.ts +5 -1
  101. package/packages/cli/src/adapters/config.ts +4 -3
  102. package/packages/cli/src/adapters/docker.ts +2 -1
  103. package/packages/cli/src/commands/gateway.ts +123 -9
  104. package/packages/cli/src/commands/logs.ts +2 -1
  105. package/packages/cli/src/commands/onboard.ts +27 -1
  106. package/packages/cli/src/commands/sessions.ts +2 -1
  107. package/packages/cli/src/commands/skills.ts +2 -1
  108. package/packages/core/src/agent/agent-loop.ts +104 -2
  109. package/packages/core/src/agent/context-compiler.ts +6 -0
  110. package/packages/core/src/agent/llm-client.ts +6 -0
  111. package/packages/core/src/agent/llm-providers/anthropic.ts +23 -8
  112. package/packages/core/src/agent/llm-providers/hiveagents.ts +248 -0
  113. package/packages/core/src/agent/llm-providers/interface.ts +7 -1
  114. package/packages/core/src/agent/llm-providers/minimax.ts +13 -0
  115. package/packages/core/src/agent/llm-providers/openai-compat-base.ts +49 -25
  116. package/packages/core/src/agent/llm-providers/opencode-go.ts +9 -0
  117. package/packages/core/src/agent/providers/index.ts +3 -2
  118. package/packages/core/src/agent/stuck-loop.ts +90 -14
  119. package/packages/core/src/channels/base.ts +7 -1
  120. package/packages/core/src/channels/whatsapp.ts +13 -1
  121. package/packages/core/src/config/loader.ts +8 -8
  122. package/packages/core/src/gateway/helpers/path.ts +2 -1
  123. package/packages/core/src/gateway/initializer.ts +4 -4
  124. package/packages/core/src/gateway/llm-local/downloader.ts +130 -11
  125. package/packages/core/src/gateway/llm-local/index.ts +2 -0
  126. package/packages/core/src/gateway/llm-local/models.ts +4 -3
  127. package/packages/core/src/gateway/router.ts +7 -5
  128. package/packages/core/src/gateway/routes/http-client.ts +16 -0
  129. package/packages/core/src/gateway/routes/llm-local.ts +51 -5
  130. package/packages/core/src/gateway/routes/providers.ts +99 -2
  131. package/packages/core/src/gateway/server.ts +131 -57
  132. package/packages/core/src/gateway/slash-commands.ts +7 -1
  133. package/packages/core/src/gateway/tts/src/install.ts +17 -9
  134. package/packages/core/src/storage/crypto.ts +152 -20
  135. package/packages/core/src/storage/migrate.ts +51 -18
  136. package/packages/core/src/storage/onboarding.ts +28 -0
  137. package/packages/core/src/storage/seed.ts +52 -2
  138. package/packages/core/src/tool-runtime/index.ts +22 -1
  139. package/packages/core/src/tools/api/api-request.ts +174 -0
  140. package/packages/core/src/tools/api/index.ts +16 -0
  141. package/packages/core/src/tools/index.ts +12 -0
  142. package/packages/core/src/tools/web/browser-click.ts +2 -2
  143. package/packages/core/src/tools/web/browser-extract.ts +22 -6
  144. package/packages/core/src/tools/web/browser-navigate.ts +34 -18
  145. package/packages/core/src/tools/web/browser-screenshot.ts +40 -8
  146. package/packages/core/src/tools/web/browser-script.ts +2 -2
  147. package/packages/core/src/tools/web/browser-service.ts +295 -341
  148. package/packages/core/src/tools/web/browser-type.ts +5 -10
  149. package/packages/core/src/tools/web/browser-wait.ts +2 -2
  150. package/packages/core/src/tools/web/index.ts +1 -1
  151. package/packages/core/src/utils/logger.ts +2 -1
  152. package/packages/mcp/src/manager.ts +2 -1
  153. package/packages/skills/src/bundled/api/api_client/SKILL.md +132 -0
  154. package/packages/skills/src/bundled-data.generated.ts +1191 -1134
  155. package/packages/skills/src/loader.ts +2 -1
  156. package/dist/ui/assets/AgentCreateForm-0oFbN3gj.js +0 -1
  157. package/dist/ui/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
  158. package/dist/ui/assets/AgentNewPage-B3n0LUck.js +0 -1
  159. package/dist/ui/assets/ChannelsPage-fbF8K4MR.js +0 -8
  160. package/dist/ui/assets/LogsPage-B2lY9maY.js +0 -1
  161. package/dist/ui/assets/MeetingPage-2ky_hKiG.js +0 -1
  162. package/dist/ui/assets/ProvidersPage-CEyUM2tD.js +0 -1
  163. package/dist/ui/assets/SettingsPage-eO0i3g8p.js +0 -9
  164. package/dist/ui/assets/SetupPage-ByYqTELb.js +0 -1
  165. package/dist/ui/assets/WebChatPage-BuGT2AL0.js +0 -16
  166. package/dist/ui/assets/accordion-C5d5Rm5z.js +0 -1
  167. package/dist/ui/assets/chevron-up-BYhk0K2J.js +0 -1
  168. package/dist/ui/assets/globe-DeCQTCDJ.js +0 -1
  169. package/dist/ui/assets/index-B2fCYtTS.css +0 -2
  170. package/dist/ui/assets/index-CQ7fn00w.js +0 -116
  171. package/dist/ui/assets/progress-BherYzY6.js +0 -1
  172. package/dist/ui/assets/scroll-area-DkeyX32e.js +0 -1
  173. package/dist/ui/assets/send-B0H5SEIE.js +0 -1
  174. package/dist/ui/assets/switch-BDwN8RYV.js +0 -1
  175. package/dist/ui/assets/table-CSc8ubon.js +0 -1
  176. package/dist/ui/assets/textarea-CXgXWKrT.js +0 -1
  177. package/dist/ui/assets/useProviders-CnlC_qCS.js +0 -1
  178. package/dist/ui/dist/assets/AgentCreateForm-0oFbN3gj.js +0 -1
  179. package/dist/ui/dist/assets/AgentDetailPage-BJ4L2fNJ.js +0 -1
  180. package/dist/ui/dist/assets/AgentNewPage-B3n0LUck.js +0 -1
  181. package/dist/ui/dist/assets/ChannelsPage-fbF8K4MR.js +0 -8
  182. package/dist/ui/dist/assets/LogsPage-B2lY9maY.js +0 -1
  183. package/dist/ui/dist/assets/MeetingPage-2ky_hKiG.js +0 -1
  184. package/dist/ui/dist/assets/ProvidersPage-CEyUM2tD.js +0 -1
  185. package/dist/ui/dist/assets/SettingsPage-eO0i3g8p.js +0 -9
  186. package/dist/ui/dist/assets/SetupPage-ByYqTELb.js +0 -1
  187. package/dist/ui/dist/assets/WebChatPage-BuGT2AL0.js +0 -16
  188. package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +0 -1
  189. package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +0 -1
  190. package/dist/ui/dist/assets/globe-DeCQTCDJ.js +0 -1
  191. package/dist/ui/dist/assets/index-B2fCYtTS.css +0 -2
  192. package/dist/ui/dist/assets/index-CQ7fn00w.js +0 -116
  193. package/dist/ui/dist/assets/progress-BherYzY6.js +0 -1
  194. package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +0 -1
  195. package/dist/ui/dist/assets/send-B0H5SEIE.js +0 -1
  196. package/dist/ui/dist/assets/switch-BDwN8RYV.js +0 -1
  197. package/dist/ui/dist/assets/table-CSc8ubon.js +0 -1
  198. package/dist/ui/dist/assets/textarea-CXgXWKrT.js +0 -1
  199. package/dist/ui/dist/assets/useProviders-CnlC_qCS.js +0 -1
  200. /package/dist/ui/assets/{card-CNf6BS2e.js → card-DFKnZ6ky.js} +0 -0
  201. /package/dist/ui/assets/{circle-alert-CyHDwUj8.js → circle-alert-KuAm2FWh.js} +0 -0
  202. /package/dist/ui/assets/{circle-check-Bb54Ebmu.js → circle-check-6Ard1-2z.js} +0 -0
  203. /package/dist/ui/assets/{cpu-Cdgc_B1K.js → cpu-KDy6-FAI.js} +0 -0
  204. /package/dist/ui/assets/{download-C3ifGMjJ.js → download-Cjbk4Rek.js} +0 -0
  205. /package/dist/ui/assets/{external-link-BvxYeTP1.js → external-link-6sTlRDUR.js} +0 -0
  206. /package/dist/ui/assets/{eye-DqNTU_GD.js → eye-Df8o0tkC.js} +0 -0
  207. /package/dist/ui/assets/{file-text-BT_9S9SM.js → file-text-lnxnjBp0.js} +0 -0
  208. /package/dist/ui/assets/{folder-open-BhH8y9ac.js → folder-open-DJBLDFjv.js} +0 -0
  209. /package/dist/ui/assets/{format-GVHeOyWI.js → format-BwdV8bB5.js} +0 -0
  210. /package/dist/ui/assets/{gateway-url-COCbW0IR.js → gateway-url-DwzPmoc8.js} +0 -0
  211. /package/dist/ui/assets/{gauge-D_TMa4i9.js → gauge-B8Tj43rC.js} +0 -0
  212. /package/dist/ui/assets/{hexagon-DsGOUl-H.js → hexagon-6L79pgVK.js} +0 -0
  213. /package/dist/ui/assets/{history-BSG-Ypqf.js → history-CAF_R34_.js} +0 -0
  214. /package/dist/ui/assets/{info-NwLoa2Mj.js → info-WjromB4Y.js} +0 -0
  215. /package/dist/ui/assets/{key-3EP0dhkT.js → key-DyKOoQh5.js} +0 -0
  216. /package/dist/ui/assets/{loader-circle-CZNax6kS.js → loader-circle-BmBOgYze.js} +0 -0
  217. /package/dist/ui/assets/{lock-Ei1_J-Nq.js → lock-BS6OLXPv.js} +0 -0
  218. /package/dist/ui/assets/{pause-BUqah9Bi.js → pause-VqeUmp2Z.js} +0 -0
  219. /package/dist/ui/assets/{play-NcZ4swwL.js → play-zJpWuhrr.js} +0 -0
  220. /package/dist/ui/assets/{plus-CX1xyhp5.js → plus-BZQX26Dr.js} +0 -0
  221. /package/dist/ui/assets/{refresh-cw-DaYdjQFk.js → refresh-cw-CCzDCAuz.js} +0 -0
  222. /package/dist/ui/assets/{save-CUdYyHNy.js → save-hUmZhceG.js} +0 -0
  223. /package/dist/ui/assets/{settings-Ds4SqD8s.js → settings-BGfrZ_zM.js} +0 -0
  224. /package/dist/ui/assets/{sparkles-yUEb-7oH.js → sparkles-BhwlS1pc.js} +0 -0
  225. /package/dist/ui/assets/{square-BD81nFtN.js → square-DMNWw4Hi.js} +0 -0
  226. /package/dist/ui/assets/{terminal-DN38Q456.js → terminal--7G943As.js} +0 -0
  227. /package/dist/ui/assets/{trash-2-CNjMkoq6.js → trash-2-xD2o4SgX.js} +0 -0
  228. /package/dist/ui/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-pVIJGjga.js} +0 -0
  229. /package/dist/ui/assets/{vendor-router-C9pIYwbJ.js → vendor-router-gqiZ7xhx.js} +0 -0
  230. /package/dist/ui/assets/{volume-2-CeSXNDv4.js → volume-2-BekVQl6P.js} +0 -0
  231. /package/dist/ui/assets/{zap-hlXjpSeA.js → zap-B4RaNNO5.js} +0 -0
  232. /package/dist/ui/dist/assets/{card-CNf6BS2e.js → card-DFKnZ6ky.js} +0 -0
  233. /package/dist/ui/dist/assets/{circle-alert-CyHDwUj8.js → circle-alert-KuAm2FWh.js} +0 -0
  234. /package/dist/ui/dist/assets/{circle-check-Bb54Ebmu.js → circle-check-6Ard1-2z.js} +0 -0
  235. /package/dist/ui/dist/assets/{cpu-Cdgc_B1K.js → cpu-KDy6-FAI.js} +0 -0
  236. /package/dist/ui/dist/assets/{download-C3ifGMjJ.js → download-Cjbk4Rek.js} +0 -0
  237. /package/dist/ui/dist/assets/{external-link-BvxYeTP1.js → external-link-6sTlRDUR.js} +0 -0
  238. /package/dist/ui/dist/assets/{eye-DqNTU_GD.js → eye-Df8o0tkC.js} +0 -0
  239. /package/dist/ui/dist/assets/{file-text-BT_9S9SM.js → file-text-lnxnjBp0.js} +0 -0
  240. /package/dist/ui/dist/assets/{folder-open-BhH8y9ac.js → folder-open-DJBLDFjv.js} +0 -0
  241. /package/dist/ui/dist/assets/{format-GVHeOyWI.js → format-BwdV8bB5.js} +0 -0
  242. /package/dist/ui/dist/assets/{gateway-url-COCbW0IR.js → gateway-url-DwzPmoc8.js} +0 -0
  243. /package/dist/ui/dist/assets/{gauge-D_TMa4i9.js → gauge-B8Tj43rC.js} +0 -0
  244. /package/dist/ui/dist/assets/{hexagon-DsGOUl-H.js → hexagon-6L79pgVK.js} +0 -0
  245. /package/dist/ui/dist/assets/{history-BSG-Ypqf.js → history-CAF_R34_.js} +0 -0
  246. /package/dist/ui/dist/assets/{info-NwLoa2Mj.js → info-WjromB4Y.js} +0 -0
  247. /package/dist/ui/dist/assets/{key-3EP0dhkT.js → key-DyKOoQh5.js} +0 -0
  248. /package/dist/ui/dist/assets/{loader-circle-CZNax6kS.js → loader-circle-BmBOgYze.js} +0 -0
  249. /package/dist/ui/dist/assets/{lock-Ei1_J-Nq.js → lock-BS6OLXPv.js} +0 -0
  250. /package/dist/ui/dist/assets/{pause-BUqah9Bi.js → pause-VqeUmp2Z.js} +0 -0
  251. /package/dist/ui/dist/assets/{play-NcZ4swwL.js → play-zJpWuhrr.js} +0 -0
  252. /package/dist/ui/dist/assets/{plus-CX1xyhp5.js → plus-BZQX26Dr.js} +0 -0
  253. /package/dist/ui/dist/assets/{refresh-cw-DaYdjQFk.js → refresh-cw-CCzDCAuz.js} +0 -0
  254. /package/dist/ui/dist/assets/{save-CUdYyHNy.js → save-hUmZhceG.js} +0 -0
  255. /package/dist/ui/dist/assets/{settings-Ds4SqD8s.js → settings-BGfrZ_zM.js} +0 -0
  256. /package/dist/ui/dist/assets/{sparkles-yUEb-7oH.js → sparkles-BhwlS1pc.js} +0 -0
  257. /package/dist/ui/dist/assets/{square-BD81nFtN.js → square-DMNWw4Hi.js} +0 -0
  258. /package/dist/ui/dist/assets/{terminal-DN38Q456.js → terminal--7G943As.js} +0 -0
  259. /package/dist/ui/dist/assets/{trash-2-CNjMkoq6.js → trash-2-xD2o4SgX.js} +0 -0
  260. /package/dist/ui/dist/assets/{triangle-alert-C9Y8Ub4X.js → triangle-alert-pVIJGjga.js} +0 -0
  261. /package/dist/ui/dist/assets/{vendor-router-C9pIYwbJ.js → vendor-router-gqiZ7xhx.js} +0 -0
  262. /package/dist/ui/dist/assets/{volume-2-CeSXNDv4.js → volume-2-BekVQl6P.js} +0 -0
  263. /package/dist/ui/dist/assets/{zap-hlXjpSeA.js → zap-B4RaNNO5.js} +0 -0
@@ -13,663 +13,773 @@ export interface BundledSkillEntry {
13
13
 
14
14
  export const BUNDLED_SKILLS_DATA: BundledSkillEntry[] = [
15
15
  {
16
- name: "voice_assistant",
17
- description: `Full voice-to-voice interaction: transcribe user speech, process request, and respond with synthesized speech`,
18
- category: "voice",
19
- version: "1.0.0",
20
- tools: ["voice_transcribe","voice_speak"],
21
- triggers: ["modo voz","voice mode","asistente de voz","voice assistant","hablá conmigo","talk to me","interacción por voz","voice interaction","respuesta hablada","spoken response","comando de voz","voice command","diálogo por voz","voice dialogue"],
16
+ name: "cron_manager",
17
+ description: `Complete management of cron jobs with cron expressions. Create, list, update, pause, resume, delete, trigger, and view history. Use for reminders, automated reports, periodic checks.`,
18
+ category: "cron",
19
+ version: "2.0.0",
20
+ tools: ["cron.create","cron.list","cron.update","cron.delete","cron.pause","cron.resume","cron.trigger","cron.history"],
21
+ triggers: ["programá una tarea","schedule task","creá un cron","create cron","editá el cron","edit cron","eliminá el cron","remove cron","lista las tareas","list cron jobs","modificá el cron","modify cron","tarea recurrente","recurring task","todos los días","daily","cada semana","weekly"],
22
22
  body: `
23
- # Voice Assistant Skill
23
+ # Cron Manager Skill
24
24
 
25
25
  ## Cuándo se Activa
26
26
 
27
- Esta skill se activa para interacción completa voz a voz: el usuario habla, el asistente procesa y responde con voz.
27
+ Para gestionar tareas programadas (cron jobs): crear, listar, actualizar, pausar, reanudar, eliminar, ejecutar y ver historial.
28
28
 
29
29
  ## Herramientas Disponibles
30
30
 
31
31
  | Tool | Qué hace | Cuándo usarla |
32
32
  |------|----------|---------------|
33
- | \`voice_transcribe\` | Audio texto | Input del usuario |
34
- | \`voice_speak\` | Texto audio | Respuesta del asistente |
33
+ | \`cron.create\` | Crear cron job | Nueva tarea |
34
+ | \`cron.list\` | Listar todos | Ver existentes |
35
+ | \`cron.update\` | Actualizar existente | Cambiar horario/instrucción |
36
+ | \`cron.pause\` | Pausar temporalmente | Sin eliminar |
37
+ | \`cron.resume\` | Reanudar pausado | Continuar ejecución |
38
+ | \`cron.delete\` | Eliminar permanentemente | Cancelar para siempre |
39
+ | \`cron.trigger\` | Ejecutar ahora | Forzar ejecución |
40
+ | \`cron.history\` | Ver historial | Ver logs de ejecuciones |
35
41
 
36
- ## Workflow
42
+ ## Campos Principales
37
43
 
38
- ### Voice-to-Voice
39
- \`\`\`javascript
40
- // 1. Usuario habla
41
- const userAudio = receiveAudio()
44
+ | Campo | Tipo | Descripción |
45
+ |-------|------|-------------|
46
+ | \`name\` | string | Identificador corto (e.g., 'daily-report') |
47
+ | \`task\` | string | **REQUERIDO** - Instrucciones para el agente al ejecutarse |
48
+ | \`task_type\` | string | 'recurring' (repite) o 'one_shot' (una vez) |
49
+ | \`cron_expression\` | string | Expresión cron (solo para recurring) |
50
+ | \`fire_at\` | string | Datetime ISO (solo para one_shot) |
51
+ | \`channel\` | string | Canal de notificación |
52
+ | \`start_at\` | string | Inicio de ventana opcional (Croner startAt) |
53
+ | \`stop_at\` | string | Fin de ventana opcional (Croner stopAt) |
54
+ | \`dom_and_dow\` | number | 0=OR (default), 1=AND (día mes + día semana) |
42
55
 
43
- // 2. Transcribir
44
- const userText = voice_transcribe({
45
- audio: userAudio,
46
- language: "auto"
47
- })
48
- // → "¿Cuál es el clima hoy?"
56
+ ## Cron Expression Format
49
57
 
50
- // 3. Procesar request
51
- // - Entender intención
52
- // - Ejecutar acción (ej. consultar API clima)
53
- // - Generar respuesta
54
- const responseText = "Hoy hay 25 grados y soleado en Buenos Aires"
58
+ \`\`\`
59
+ * * * * *
60
+
61
+ │ │ │ └── Día semana (0-6, 0=Domingo)
62
+ └──── Mes (1-12)
63
+ │ │ └────── Día del mes (1-31)
64
+ │ └──────── Hora (0-23)
65
+ └────────── Minuto (0-59)
66
+ \`\`\`
55
67
 
56
- // 4. Sintetizar respuesta
57
- const responseAudio = voice_speak({
58
- text: responseText,
59
- voice_id: "eleven_flash_v2_5",
60
- language: "es"
61
- })
68
+ ## Ejemplos Comunes
62
69
 
63
- // 5. Enviar audio
64
- sendAudio(responseAudio)
65
- \`\`\`
70
+ | Expresión | Significado |
71
+ |-----------|-------------|
72
+ | \`0 9 * * *\` | Diario 9:00 AM |
73
+ | \`0 7 * * 1-5\` | Lun-Vie 7:00 AM |
74
+ | \`0 */2 * * *\` | Cada 2 horas |
75
+ | \`0 0 * * 0\` | Domingos medianoche |
76
+ | \`0 0 1 * *\` | Día 1 de cada mes |
66
77
 
67
- ## Casos de Uso
78
+ ## Cómo Usar start_at / stop_at
68
79
 
69
- | Caso | Flujo |
70
- |------|-------|
71
- | Pregunta simple | Transcribe → responde → sintetiza |
72
- | Comando | Transcribe → ejecuta → confirma por voz |
73
- | Diálogo | Mantener contexto entre exchanges |
74
- | Wake word | Escuchar "hey bee" → activar → procesar |
80
+ - \`start_at\`: La tarea no ejecuta antes de esta fecha
81
+ - \`stop_at\`: La tarea no ejecuta después de esta fecha
82
+ - Formato ISO: \`'2026-04-01T00:00:00'\`
75
83
 
76
- ## Configuración
84
+ ## Cómo Usar dom_and_dow
77
85
 
78
- ### Wake Word
79
- \`\`\`json
80
- {
81
- "voice_wake_word": "hey bee",
82
- "voice_wake_enabled": true
83
- }
84
- \`\`\`
86
+ - \`0\` (default): Se ejecuta si es el día del mes O el día de semana
87
+ - \`1\`: Se ejecuta solo si es EL MISMO día del mes Y el día de semana
85
88
 
86
- ### Canal Voice
87
- \`\`\`json
88
- {
89
- "voice_enabled": true,
90
- "tts_enabled": true,
91
- "stt_provider": "groq-whisper",
92
- "tts_provider": "elevenlabs",
93
- "tts_voice_id": "eleven_flash_v2_5"
94
- }
95
- \`\`\`
89
+ Ejemplo: \`0 9 15 * *\` con dom_and_dow=1 significa "los 15 de cada mes QUE SEA domingo"
96
90
 
97
- ## Mejores Prácticas
91
+ ## Workflow para Crear
98
92
 
99
- - Respuestas cortas y naturales (<60s)
100
- - Mantener contexto conversacional
101
- - Indicadores de procesamiento
102
- - Fallback a texto si falla voz
93
+ 1. **Preguntar** ¿one_shot o recurring?
94
+ 2. **Obtener** Hora y canal de notificación
95
+ 3. **Crear** \`cron.create\` con campo \`task\` obligatorio
96
+ 4. **Confirmar** \`cron.list\` mostrar next runs
103
97
 
104
98
  ## Errores a Evitar
105
99
 
106
- - ❌ Respuestas muy largas para audio
107
- - ❌ Perder contexto entre exchanges
108
- - ❌ No indicar que está procesando
109
- - ❌ No tener fallback si falla TTS/STT
110
- `,
100
+ - ❌ Olvidar el campo \`task\` — es obligatorio
101
+ - ❌ Usar exec para tareas programadas
102
+ - ❌ No preguntar si es one_shot o recurring
103
+ - ❌ No mostrar próximos horarios al crear
104
+ - ❌ Llamar \`cron.update\` sin \`task_id\` — siempre hacer \`cron.list\` primero`,
111
105
  },
112
106
  {
113
- name: "voice_input",
114
- description: `Transcribe audio input to text using STT (Speech-to-Text) providers like Groq Whisper or OpenAI Whisper`,
115
- category: "voice",
107
+ name: "browser_automate",
108
+ description: `Automate web workflows with navigation, clicks, form filling, and visual verification`,
109
+ category: "web",
116
110
  version: "1.0.0",
117
- tools: ["voice_transcribe"],
118
- triggers: ["transcribí este audio","transcribe audio","convertí voz a texto","convert voice to text","qué dice el audio","what does audio say","escuchá esto","listen to this","audio a texto","audio to text","reconocimiento de voz","speech recognition","nota de voz","voice note"],
111
+ tools: ["browser_navigate","browser_click","browser_type","browser_screenshot"],
112
+ triggers: ["automatizá el navegador","automate browser","completá el formulario","fill form","hacé clic en","click on","iniciá sesión","login","registrate","sign up","interactuá con la web","interact with website","flujo web","web workflow"],
119
113
  body: `
120
- # Voice Input Skill
114
+ # Browser Automate Skill
121
115
 
122
116
  ## Cuándo se Activa
123
117
 
124
- Esta skill se activa cuando el usuario envía audio y necesita transcripción a texto: notas de voz, grabaciones, comandos de voz.
118
+ Esta skill se activa para automatizar flujos de interacción con aplicaciones web: logins, formularios, navegación programática.
125
119
 
126
120
  ## Herramientas Disponibles
127
121
 
128
122
  | Tool | Qué hace | Cuándo usarla |
129
123
  |------|----------|---------------|
130
- | \`voice_transcribe\` | Convierte audio texto | Transcripción de cualquier audio |
131
-
132
- ## Workflow
133
-
134
- ### Transcripción
135
- \`\`\`javascript
136
- // 1. Recibir audio
137
- // - File upload
138
- // - Voice message (Telegram, WhatsApp)
139
- // - Stream en vivo
140
-
141
- // 2. Transcribir
142
- const result = voice_transcribe({
143
- audio: audioBuffer,
144
- language: "es" // o "auto" para detectar
145
- })
146
-
147
- // 3. Formatear
148
- // - Agregar puntuación
149
- // - Capitalizar
150
- // - Marcar speakers si hay múltiples
151
-
152
- // 4. Entregar resultado
153
- \`\`\`
154
-
155
- ## Proveedores STT Soportados
156
-
157
- | Provider | Modelos | Idiomas |
158
- |----------|---------|---------|
159
- | Groq | whisper-large-v3, turbo | Multi |
160
- | OpenAI | whisper-1 | Multi |
124
+ | \`browser_navigate\` | Navega a URL | Inicio de flujo |
125
+ | \`browser_click\` | Click en elementos | Botones, enlaces, triggers |
126
+ | \`browser_type\` | Escribe en inputs | Formularios, búsquedas |
127
+ | \`browser_screenshot\` | Captura estado | Verificación visual |
161
128
 
162
- ## Configuración por Canal
129
+ ## Workflow Típico
163
130
 
164
- Cada canal puede configurar su proveedor STT preferido:
165
- - \`stt_provider\`: "groq-whisper" | "openai-whisper"
131
+ 1. **Navegar** URL inicial
132
+ 2. **Interactuar** click/type según flujo
133
+ 3. **Verificar** → screenshot después de acciones críticas
134
+ 4. **Repetir** → para flujos multi-paso
166
135
 
167
136
  ## Mejores Prácticas
168
137
 
169
- - Detectar idioma automáticamente
170
- - Agregar puntuación para legibilidad
171
- - Marcar segmentos inaudibles
172
- - Preservar idioma original
138
+ - Selectores estables (IDs > classes > XPath)
139
+ - Esperar carga después de navegación
140
+ - Verificar estado visual con screenshots
141
+ - Manejar errores de elementos no encontrados
173
142
 
174
143
  ## Errores a Evitar
175
144
 
176
- - ❌ Traducir sin pedir (mantener idioma)
177
- - ❌ Omitir puntuación
178
- - ❌ No indicar baja confianza
179
- - ❌ Ignorar ruido de fondo que afecta calidad
145
+ - ❌ Selectores frágiles que cambian
146
+ - ❌ No esperar carga de página
147
+ - ❌ Ignorar errores de elementos
148
+ - ❌ No verificar estado después de acciones
180
149
  `,
181
150
  },
182
151
  {
183
- name: "voice_output",
184
- description: `Convert text to synthesized speech using TTS (Text-to-Speech) providers like ElevenLabs, OpenAI TTS, or Gemini TTS`,
185
- category: "voice",
152
+ name: "web_research",
153
+ description: `Search and synthesize information from multiple web sources into structured reports`,
154
+ category: "web",
186
155
  version: "1.0.0",
187
- tools: ["voice_speak"],
188
- triggers: ["leé esto en voz alta","read this aloud","convertí a voz","convert to speech","hablá este texto","speak this text","texto a voz","text to speech","generá audio","generate audio","síntesis de voz","voice synthesis","escuchá la respuesta","listen to response"],
156
+ tools: ["web_search","web_fetch"],
157
+ triggers: ["investigá sobre","research","buscá información de","find information about","qué es","what is","explicame","explain","últimos avances","latest advances","tendencias de","trends in","información actualizada","current information"],
189
158
  body: `
190
- # Voice Output Skill
159
+ # Web Research Skill
191
160
 
192
161
  ## Cuándo se Activa
193
162
 
194
- Esta skill se activa cuando el usuario necesita convertir texto a voz: leer respuestas, generar audio, síntesis de voz.
163
+ Esta skill se activa cuando el usuario necesita información actualizada de internet, verificar datos, o investigar temas específicos.
195
164
 
196
165
  ## Herramientas Disponibles
197
166
 
198
167
  | Tool | Qué hace | Cuándo usarla |
199
168
  |------|----------|---------------|
200
- | \`voice_speak\` | Convierte texto audio | Síntesis de voz |
169
+ | \`web_search\` | Busca en internet, devuelve títulos, URLs, snippets | Búsqueda inicial, encontrar fuentes |
170
+ | \`web_fetch\` | Descarga contenido completo de URL (HTML→Markdown) | Profundizar en resultados específicos |
201
171
 
202
172
  ## Workflow
203
173
 
204
- ### Text-to-Speech
205
- \`\`\`javascript
206
- // 1. Recibir texto
207
- const text = "Hola, ¿cómo estás?"
208
-
209
- // 2. Preprocesar
210
- // - Expandir números: "5" → "cinco"
211
- // - Expandir fechas: "01/01" → "primero de enero"
212
- // - Expandir abbreviaturas: "Dr." → "Doctor"
174
+ 1. **Búsqueda inicial** → \`web_search({ query, numResults: 8 })\`
175
+ 2. **Fetch contenido** → \`web_fetch({ urls: top 2-3 })\`
176
+ 3. **Búsqueda complementaria** → Segundo search si hay gaps
177
+ 4. **Síntesis** summary + key points + sources
213
178
 
214
- // 3. Sintetizar
215
- const audio = voice_speak({
216
- text: optimizedText,
217
- voice_id: "eleven_flash_v2_5", // o configured voice
218
- language: "es"
219
- })
179
+ ## Mejores Prácticas
220
180
 
221
- // 4. Entregar audio
222
- // - Enviar como archivo
223
- // - Streaming si el canal lo soporta
224
- \`\`\`
181
+ - Queries específicos (máx 6 palabras)
182
+ - Mínimo 2-3 fuentes independientes
183
+ - Priorizar contenido reciente (<1 año)
184
+ - Citas con URLs completas
225
185
 
226
- ## Proveedores TTS Soportados
186
+ ## Errores a Evitar
227
187
 
228
- | Provider | Modelos | Voces |
229
- |----------|---------|-------|
230
- | ElevenLabs | Flash V2.5, Turbo V2.5, Multilingual V2, V3 | 1000+ |
231
- | OpenAI | tts-1, tts-1-hd, gpt-4o-mini-tts | 6+ |
232
- | Gemini | 2.5 Flash TTS, 2.5 Pro TTS | Multi |
233
- | Qwen | Qwen TTS Flash, Instruct | Multi |
234
-
235
- ## Configuración por Canal
236
-
237
- Cada canal configura su proveedor TTS:
238
- - \`tts_provider\`: "elevenlabs" | "openai-tts" | "gemini-tts"
239
- - \`tts_voice_id\`: ID específico de voz (ej. ElevenLabs voice ID)
240
-
241
- ## Mejores Prácticas
242
-
243
- - Preprocesar texto para naturalidad
244
- - Usar voz configurada por usuario
245
- - Cachear respuestas frecuentes
246
- - Split de textos largos
247
-
248
- ## Errores a Evitar
249
-
250
- - ❌ Enviar texto crudo sin preprocesar
251
- - ❌ Ignorar preferencia de voz
252
- - ❌ No manejar límites de longitud
253
- - ❌ No cachear (costo API)
188
+ - Inventar datos no encontrados
189
+ - ❌ Concluir con una sola búsqueda
190
+ - No verificar fecha de fuentes
191
+ - Copiar contenido literal (usar paráfrasis)
254
192
  `,
255
193
  },
256
194
  {
257
- name: "cli_safe_exec",
258
- description: `Execute shell commands safely with error handling, timeouts, and output validation`,
259
- category: "cli",
195
+ name: "web_monitor",
196
+ description: `Monitor changes in web sources and track updates over time with persistent memory`,
197
+ category: "web",
260
198
  version: "1.0.0",
261
- tools: ["exec","terminal"],
262
- triggers: ["ejecutá este comando","run this command","corré el comando","execute command","terminal","bash","shell","npm","yarn","bun","git","docker","comando de sistema","system command"],
199
+ tools: ["web_search","web_fetch","memory_write","memory_read"],
200
+ triggers: ["monitoreá","monitor","seguí los cambios","track changes","avisame si cambia","notify if changes","actualización de","update on","novedades de","news about","cambios en","changes in"],
263
201
  body: `
264
- # CLI Safe Exec Skill
202
+ # Web Monitor Skill
265
203
 
266
204
  ## Cuándo se Activa
267
205
 
268
- Para ejecutar comandos de shell de forma segura con manejo de errores y timeouts.
206
+ Esta skill se activa cuando el usuario necesita:
207
+ - Monitorear cambios en una URL específica
208
+ - Recibir notificaciones de actualizaciones
209
+ - Seguir novedades sobre un tema
210
+ - Trackear evolución de contenido
269
211
 
270
212
  ## Herramientas Disponibles
271
213
 
272
214
  | Tool | Qué hace | Cuándo usarla |
273
215
  |------|----------|---------------|
274
- | \`exec\` | Ejecuta con validación y timeout | Comandos simples (<30s) |
275
- | \`terminal\` | Ejecuta con entorno completo | Comandos complejos, Git, npm |
276
-
277
- ## ⚠️ ADVERTENCIA CRÍTICA
278
-
279
- **NUNCA usar para tareas programadas** — usar \`cron.create\` en su lugar.
216
+ | \`web_fetch\` | Descarga contenido de URL | Obtener contenido actual |
217
+ | \`web_search\` | Busca novedades | Monitoreo por tema (no URL fija) |
218
+ | \`memory_write\` | Guarda baseline | Almacenar contenido para comparación |
219
+ | \`memory_read\` | Recupera baseline anterior | Comparar con contenido actual |
280
220
 
281
221
  ## Workflow
282
222
 
283
- 1. **Validar** Comando es seguro, no destructivo
284
- 2. **Ejecutar** → \`exec\` o \`terminal\` con timeout apropiado
285
- 3. **Parsear** Check exitCode, stdout, stderr
286
- 4. **Manejar error** → Si falló, analizar y sugerir fixes
223
+ 1. **Primera ejecución**: \`web_fetch\` \`memory_write\` (baseline)
224
+ 2. **Chequeos siguientes**: \`memory_read\` → \`web_fetch\` comparar → \`notify\` si cambia
225
+ 3. **Actualizar baseline**: \`memory_write\` con nuevo contenido
287
226
 
288
- ## Timeouts Apropiados
227
+ ## Mejores Prácticas
289
228
 
290
- | Tipo | Timeout |
291
- |------|---------|
292
- | Listar archivos | 10s |
293
- | Git operations | 30s |
294
- | npm install | 120s |
295
- | npm run build | 120s |
296
- | npm test | 180s |
297
- | Docker builds | 300s |
229
+ - Ignorar cambios menores (timestamps, ads, contenido dinámico irrelevante)
230
+ - Notificar solo cambios significativos
231
+ - Para monitoreo periódico, combinar con \`cron.create\`
298
232
 
299
233
  ## Errores a Evitar
300
234
 
301
- - ❌ Usar para cron (usar cron.create)
302
- - ❌ Sin timeout apropiado
303
- - ❌ Ignorar exitCode
304
- - ❌ Comandos destructivos sin confirmar
235
+ - ❌ No almacenar baseline inicial
236
+ - ❌ Notificar por cambios triviales
237
+ - ❌ No actualizar timestamp de baseline
305
238
  `,
306
239
  },
307
240
  {
308
- name: "cli_pipeline",
309
- description: `Execute shell commands and pipe output to files for logging and further processing`,
310
- category: "cli",
241
+ name: "browser_scrape",
242
+ description: `Navigate to web pages and capture rendered content including screenshots for dynamic sites`,
243
+ category: "web",
311
244
  version: "1.0.0",
312
- tools: ["exec","terminal","project_write"],
313
- triggers: ["guardá el output","save output","pipeline","pipe to file","redireccioná el output","redirect output","log del comando","command log","ejecutá y guardá","run and save","resultado en archivo","result to file"],
245
+ tools: ["browser_navigate","browser_screenshot","web_fetch"],
246
+ triggers: ["capturá el contenido","scrape content","obtené la página renderizada","get rendered page","sitios dinámicos","dynamic sites","web con javascript","javascript websites","tomá screenshot y contenido","screenshot and content"],
314
247
  body: `
315
- # CLI Pipeline Skill
248
+ # Browser Scrape Skill
316
249
 
317
250
  ## Cuándo se Activa
318
251
 
319
- Para ejecutar comandos y guardar el output en archivos para logging o procesamiento posterior.
252
+ Esta skill se activa para sitios web dinámicos que requieren JavaScript rendering, donde el contenido no está disponible en HTML estático.
320
253
 
321
254
  ## Herramientas Disponibles
322
255
 
323
256
  | Tool | Qué hace | Cuándo usarla |
324
257
  |------|----------|---------------|
325
- | \`exec\` | Ejecuta comando | Comandos simples |
326
- | \`terminal\` | Ejecuta con entorno | Comandos complejos |
327
- | \`project_write\` | Escribe archivo | Guardar output |
258
+ | \`browser_navigate\` | Navega y renderiza página completa | Sitios con JavaScript/SPA |
259
+ | \`browser_screenshot\` | Captura estado visual | Evidencia de contenido renderizado |
260
+ | \`web_fetch\` | Extrae texto como markdown | Contenido textual de página renderizada |
328
261
 
329
262
  ## Workflow
330
263
 
331
- 1. **Validar comando** → Seguro para ejecución
332
- 2. **Ejecutar** → Capturar stdout + stderr
333
- 3. **Formatear** → Agregar timestamp, comando, metadata
334
- 4. **Escribir** → \`project_write({ path, content })\`
264
+ 1. **Navegar** → \`browser_navigate({ url })\` + esperar renderizado JS
265
+ 2. **Capturar visual** → \`browser_screenshot()\`
266
+ 3. **Extraer texto** → \`web_fetch()\`
267
+ 4. **Combinar** → screenshot + texto para scrape completo
335
268
 
336
- ## Formato de Log
269
+ ## Mejores Prácticas
337
270
 
338
- \`\`\`markdown
339
- # Command Log
271
+ - Esperar renderizado completo de JavaScript
272
+ - Para infinite scroll: hacer scroll y múltiples screenshots
273
+ - Capturar antes y después de interacciones si es dinámico
340
274
 
341
- **Command**: npm install
342
- **Timestamp**: 2025-03-09 14:30:00
343
- **Exit Code**: 0
344
- **Execution Time**: 45.2s
275
+ ## Errores a Evitar
345
276
 
346
- ---
277
+ - ❌ No esperar renderizado JavaScript
278
+ - ❌ Solo capturar HTML estático para sitios SPA
279
+ - ❌ Ignorar términos de servicio del sitio
280
+ `,
281
+ },
282
+ {
283
+ name: "busqueda_fts5",
284
+ description: `Core discovery skill - find any capability with a single keyword`,
285
+ category: "core",
286
+ version: "1.2.0",
287
+ tools: ["search_knowledge"],
288
+ triggers: ["cómo busco herramientas","cómo encuentro skills","how to find tools","search knowledge","discovery","buscar en la base","encontrar herramientas"],
289
+ body: `
290
+ # busqueda_fts5 — Sistema de Discovery
347
291
 
348
- ## Output
292
+ Arrancás con solo 4 herramientas. Todo lo demás se descubre con **search_knowledge**.
293
+
294
+ ## Regla de oro: UNA PALABRA, busca TODO
349
295
 
350
- [stdout content...]
351
- [stderr if any...]
296
+ \`\`\`
297
+ search_knowledge(query="email")
352
298
  \`\`\`
353
299
 
354
- ## Mejores Prácticas
300
+ Eso solo — sin type, sin frases largas — devuelve tools, skills, MCP y playbook relacionados con "email".
355
301
 
356
- - Filenames con timestamp para tracking
357
- - Incluir metadata completa (exitCode, tiempo)
358
- - Capturar stdout y stderr
359
- - Para outputs grandes, escribir incrementalmente
302
+ **NO hagas esto:** \`search_knowledge(type="tools", query="enviar correo electrónico")\` — AND entre palabras no encuentra nada.
360
303
 
361
- ## Errores a Evitar
304
+ **SÍ hagas esto:** \`search_knowledge(query="email")\` — encuentra todo lo relacionado.
362
305
 
363
- - No incluir metadata en log
364
- - ❌ Filenames genéricos sin timestamp
365
- - ❌ No capturar stderr
366
- `,
367
- },
368
- {
369
- name: "cron_reminder",
370
- description: `Schedule a reminder for yourself at a specific time. Creates a one_shot cron job that sends a notification message via your preferred channel.`,
371
- category: "cron",
372
- version: "2.0.0",
373
- tools: ["cron.create","notify"],
374
- triggers: ["recordame","remind me","recordatorio","reminder","alerta","alert","avísame","notify me","programá","schedule","para mañana","for tomorrow","en 30 minutos","in 30 minutes"],
375
- body: `
376
- # Cron Reminder Skill
306
+ ## Cuándo especificar type
377
307
 
378
- ## Cuándo se Activa
308
+ Solo si querés filtrar resultados que ya son muchos:
379
309
 
380
- Para crear recordatorios de una sola ejecución (one_shot): "recuerdame a las 3pm", "avísame en 30 minutos", etc.
310
+ \`\`\`
311
+ search_knowledge(query="email", type="mcp") → solo herramientas externas de email
312
+ search_knowledge(query="email", type="tools") → solo herramientas nativas de email
313
+ \`\`\`
381
314
 
382
- ## Herramientas
315
+ Por defecto type="all" — no hace falta especificarlo.
383
316
 
384
- | Tool | Qué hace |
385
- |------|----------|
386
- | \`cron.create\` | Crear recordatorio one_shot |
387
- | \`notify\` | Enviar notificación directa |
317
+ ## Regla de prioridad
388
318
 
389
- ## Cómo Funciona
319
+ **Preferí herramientas nativas sobre MCP** cuando ambas sirven.
320
+ - Nativas: más rápidas, sin red, siempre disponibles
321
+ - MCP: cuando no hay equivalente nativo
390
322
 
391
- 1. **Preguntar** ¿De qué te aviso? ¿A qué hora? ¿Por qué canal?
392
- 2. **Crear** → \`cron.create\` con \`task_type: 'one_shot'\` y \`fire_at\` en formato ISO
393
- 3. **Confirmar** → Mostrar hora programada
323
+ ## Flujo de uso
394
324
 
395
- ## Parámetros
325
+ 1. Identificá la palabra clave de lo que necesitás
326
+ 2. \`search_knowledge(query="<palabra>")\` → resultados de todos los tipos
327
+ 3. Las tools encontradas se inyectan automáticamente en tu contexto
328
+ 4. Usás las tools en el siguiente paso
396
329
 
397
- | Campo | Descripción |
398
- |-------|-------------|
399
- | \`task\` | **REQUERIDO** - Mensaje del recordatorio |
400
- | \`task_type\` | Siempre \`'one_shot'\` |
401
- | \`fire_at\` | Fecha/hora ISO (ej: \`'2026-04-20T15:00:00'\`) |
402
- | \`channel\` | Canal (telegram, discord, whatsapp, webchat) |
330
+ ---
403
331
 
404
- ## Errores Comunes
332
+ ## Ejemplos
405
333
 
406
- - ❌ Olvidar el campo \`task\` — obligatorio para que el agente sepa qué enviar
407
- - Usar expresiones cron para recordatorios (usar \`fire_at\` en vez de \`cron_expression\`)
408
- - Poner \`fire_at\` en el pasado`,
334
+ \`\`\`
335
+ search_knowledge(query="pdf") → tools para leer/escribir PDFs
336
+ search_knowledge(query="browser") → tools de navegación web
337
+ search_knowledge(query="github") → tools MCP de GitHub si están configuradas
338
+ search_knowledge(query="calendar") → tools de Google Calendar
339
+ search_knowledge(query="canvas") → skills de visualización
340
+ search_knowledge(query="slack") → tools de Slack si están configuradas
341
+ \`\`\`
342
+ `,
409
343
  },
410
344
  {
411
- name: "meeting_transcription",
412
- description: `Transcribir reuniones en tiempo real y generar informes gerenciales con decisiones, action items y próximos pasos`,
413
- category: "meeting",
345
+ name: "api_client",
346
+ description: `Make HTTP requests to REST APIs using curl-like methods (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)`,
347
+ category: "api",
414
348
  version: "1.0.0",
415
- tools: ["meeting_start","meeting_add_segment","meeting_stop","meeting_report","office_escribir_docx","notify","report_progress"],
416
- triggers: ["transcribir reunión","iniciar transcripción","meeting transcription","grabar reunión","iniciar reunión","start meeting","detener reunión","stop meeting","reporte de reunión","generar reporte reunión","informe de reunión","acta de reunión","transcripción de reunión","meeting report"],
349
+ tools: ["api_request"],
350
+ triggers: ["llama a la api","llama al api","consume la api","haz una petición","haz un request","envía un post","envía un put","envía un delete","curl","api request","rest api","endpoint","webhook","integrar con api","conectar con api","obtener datos de api","enviar datos a api"],
417
351
  body: `
418
- # Meeting Transcription Skill
352
+ # API Client Skill
419
353
 
420
354
  ## Cuándo se Activa
421
355
 
422
- Esta skill se activa para gestión completa del ciclo de vida de una reunión: inicio, transcripción en tiempo real, detención y generación de informe gerencial.
356
+ Esta skill se activa cuando el usuario necesita interactuar con una API REST: consultar datos, crear recursos, actualizar, eliminar, o cualquier operación HTTP.
423
357
 
424
358
  ## Herramientas Disponibles
425
359
 
426
360
  | Tool | Qué hace | Cuándo usarla |
427
361
  |------|----------|---------------|
428
- | \`meeting_start\` | Crea una sesión en DB devuelve session_id | Al iniciar la reunión |
429
- | \`meeting_add_segment\` | Transcribe un chunk de audio y lo persiste | Por cada audio recibido |
430
- | \`meeting_stop\` | Marca la sesión como detenida | Cuando termina la reunión |
431
- | \`meeting_report\` | Lee todos los segmentos y arma el transcript | Para generar el reporte |
432
- | \`office_escribir_docx\` | Guarda el reporte como archivo Word | Al finalizar el análisis |
433
- | \`notify\` | Envía mensajes en tiempo real al canal | Para mostrar transcripciones y el reporte |
434
- | \`report_progress\` | Muestra progreso en barra | Durante transcripción larga |
362
+ | \`api_request\` | Realiza peticiones HTTP completas (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) con headers, body, query params y timeout | Siempre que necesites llamar un endpoint REST, webhook, o servicio externo |
435
363
 
436
- ## Workflow Completo
364
+ ## Parámetros de api_request
437
365
 
438
- \`\`\`
439
- Usuario: "transcribir reunión"
440
- Agente pregunta título
441
- meeting_start(title) session_id: "abc123"
442
- Agente: "✅ Sesión abc123 iniciada. Habla cuando quieras."
366
+ - \`method\` (requerido): GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS
367
+ - \`url\` (requerido): URL completa del endpoint
368
+ - \`headers\` (opcional): objeto con headers HTTP. Ej: \`{ "Authorization": "Bearer TOKEN", "Content-Type": "application/json" }\`
369
+ - \`body\` (opcional): cuerpo de la petición como string. Para JSON, enviar JSON.stringify(objeto)
370
+ - \`query_params\` (opcional): parámetros de query que se codificarán automáticamente en la URL
371
+ - \`timeout_ms\` (opcional): timeout en ms. Default: 30000. Máx: 120000
443
372
 
444
- [Usuario graba audio en la UI]
445
- → meeting_add_segment(session_id, audio_base64)
446
- → notify: "[Speaker]: Texto transcrito..."
373
+ ## Diferencia con web_fetch
447
374
 
448
- Usuario: "detener reunión"
449
- meeting_stop(session_id)
450
- → Agente: "⏹️ 47 segmentos transcritos. ¿Genero el reporte?"
375
+ - \`web_fetch\`: solo GET, sin headers custom, ideal para scraping de páginas web
376
+ - \`api_request\`: cualquier método HTTP, headers custom, body, query params — ideal para APIs REST
451
377
 
452
- Usuario: "sí"
453
- → meeting_report(session_id) → transcript completo
454
- → LLM analiza → secciones estructuradas
455
- → office_escribir_docx → informe_reunion_abc123.docx
456
- → notify: [Markdown del informe completo]
457
- → Agente: "✅ DOCX guardado en workspace."
458
- \`\`\`
378
+ ## Workflow
459
379
 
460
- ## Formato del Informe Gerencial
380
+ 1. **Identificar endpoint y método** → Determinar URL, método, headers necesarios
381
+ 2. **Construir request** → \`api_request({ method, url, headers, body })\`
382
+ 3. **Validar respuesta** → Si 2xx: extraer datos. Si error: analizar y sugerir fix
383
+ 4. **Presentar resultados** → JSON parseado en formato legible, no crudo a menos que se pida
461
384
 
462
- El informe generado incluye:
385
+ ## Mejores Prácticas
463
386
 
464
- 1. **Resumen Ejecutivo** Captura la esencia en 3-5 oraciones
465
- 2. **Participantes** Detectados automáticamente del transcript
466
- 3. **Decisiones Tomadas** Lista numerada de cada decisión
467
- 4. **Action Items** Tabla con Tarea / Responsable / Fecha
468
- 5. **Próximos Pasos** Acciones inmediatas
469
- 6. **Temas de Seguimiento** — Pendientes para futuras reuniones
387
+ - Siempre enviar \`Content-Type: application/json\` cuando el body es JSON
388
+ - Usar \`query_params\` en lugar de append manual a la URL
389
+ - No exponer tokens/secrets en la respuesta final al usuario
390
+ - Si la API requiere auth, pedirla al usuario o usar variables de entorno
391
+ - Para errores 4xx, revisar: auth, formato del body, campos requeridos, rate limits
470
392
 
471
- ## Consideraciones
393
+ ## Errores a Evitar
472
394
 
473
- - El informe se entrega en dos formatos: **Markdown en chat** + **DOCX descargable**
474
- - El idioma del informe es siempre **español**
475
- - La latencia de transcripción es ~4s por chunk de 3s de audio (normal para Whisper)
476
- - El session_id debe conservarse durante toda la reunión
395
+ - Usar web_fetch para POST/PUT/DELETE con headers
396
+ - Enviar objetos directamente en body (debe ser string)
397
+ - Olvidar Content-Type al enviar JSON
398
+ - Exponer API keys en la respuesta visible
477
399
  `,
478
400
  },
479
401
  {
480
- name: "web_monitor",
481
- description: `Monitor changes in web sources and track updates over time with persistent memory`,
482
- category: "web",
402
+ name: "file_manager",
403
+ description: `Explore project structure and locate files using glob patterns and directory listing`,
404
+ category: "filesystem",
483
405
  version: "1.0.0",
484
- tools: ["web_search","web_fetch","memory_write","memory_read"],
485
- triggers: ["monitoreá","monitor","seguí los cambios","track changes","avisame si cambia","notify if changes","actualización de","update on","novedades de","news about","cambios en","changes in"],
406
+ tools: ["fs_list","fs_glob","fs_exists"],
407
+ triggers: ["lista los archivos","list files","buscá archivos","find files","explorá el proyecto","explore project","qué archivos hay","what files exist","buscá por patrón","search by pattern","existe este archivo","file exists","dónde está","where is"],
486
408
  body: `
487
- # Web Monitor Skill
409
+ # File Manager Skill
488
410
 
489
411
  ## Cuándo se Activa
490
412
 
491
413
  Esta skill se activa cuando el usuario necesita:
492
- - Monitorear cambios en una URL específica
493
- - Recibir notificaciones de actualizaciones
494
- - Seguir novedades sobre un tema
495
- - Trackear evolución de contenido
414
+ - Explorar la estructura del proyecto
415
+ - Buscar archivos por extensión o patrón
416
+ - Verificar si existe un archivo o directorio
417
+ - Encontrar la ubicación de un archivo
496
418
 
497
419
  ## Herramientas Disponibles
498
420
 
499
421
  | Tool | Qué hace | Cuándo usarla |
500
422
  |------|----------|---------------|
501
- | \`web_fetch\` | Descarga contenido de URL | Obtener contenido actual |
502
- | \`web_search\` | Busca novedades | Monitoreo por tema (no URL fija) |
503
- | \`memory_write\` | Guarda baseline | Almacenar contenido para comparación |
504
- | \`memory_read\` | Recupera baseline anterior | Comparar con contenido actual |
423
+ | \`fs_list\` | Lista directorios y archivos | Exploración inicial |
424
+ | \`fs_glob\` | Busca archivos por patrón wildcard | Búsqueda por extensión/patrón |
425
+ | \`fs_exists\` | Verifica existencia | Pre-check antes de operaciones |
505
426
 
506
427
  ## Workflow
507
428
 
508
- 1. **Primera ejecución**: \`web_fetch\` \`memory_write\` (baseline)
509
- 2. **Chequeos siguientes**: \`memory_read\` → \`web_fetch\` comparar \`notify\` si cambia
510
- 3. **Actualizar baseline**: \`memory_write\` con nuevo contenido
429
+ 1. **Explorar** \`fs_list({ path })\` para estructura general
430
+ 2. **Buscar por patrón** → \`fs_glob({ pattern })\` para tipos específicos
431
+ 3. **Verificar** \`fs_exists({ path })\` para confirmación
511
432
 
512
- ## Mejores Prácticas
433
+ ## Patrones Glob Comunes
513
434
 
514
- - Ignorar cambios menores (timestamps, ads, contenido dinámico irrelevante)
515
- - Notificar solo cambios significativos
516
- - Para monitoreo periódico, combinar con \`cron.create\`
435
+ | Patrón | Encuentra |
436
+ |--------|-----------|
437
+ | \`**/*.ts\` | Todos los TypeScript |
438
+ | \`**/*.test.ts\` | Solo tests |
439
+ | \`**/*.md\` | Documentación |
440
+ | \`**/package.json\` | Todos los package.json |
441
+ | \`src/**/*.tsx\` | React components en src |
517
442
 
518
443
  ## Errores a Evitar
519
444
 
520
- - ❌ No almacenar baseline inicial
521
- - ❌ Notificar por cambios triviales
522
- - ❌ No actualizar timestamp de baseline
445
+ - ❌ No verificar existencia antes de leer/editar
446
+ - ❌ Usar fs_list cuando se conoce el patrón (usar glob)
447
+ - ❌ Patrones muy amplios sin filtrado
523
448
  `,
524
449
  },
525
450
  {
526
- name: "web_research",
527
- description: `Search and synthesize information from multiple web sources into structured reports`,
528
- category: "web",
451
+ name: "file_writer",
452
+ description: `Create, modify, and delete files with safe edit operations and confirmation for large changes`,
453
+ category: "filesystem",
529
454
  version: "1.0.0",
530
- tools: ["web_search","web_fetch"],
531
- triggers: ["investigá sobre","research","buscá información de","find information about","qué es","what is","explicame","explain","últimos avances","latest advances","tendencias de","trends in","información actualizada","current information"],
455
+ tools: ["project_read","project_write","project_edit","project_exists"],
456
+ triggers: ["creá un archivo","create a file","escribí en","write to","editá este archivo","edit this file","modificá","modify","eliminá el archivo","delete file","guardá esto","save this","actualizá el archivo","update file"],
532
457
  body: `
533
- # Web Research Skill
458
+ # File Writer Skill
534
459
 
535
460
  ## Cuándo se Activa
536
461
 
537
- Esta skill se activa cuando el usuario necesita información actualizada de internet, verificar datos, o investigar temas específicos.
462
+ Esta skill se activa cuando el usuario necesita:
463
+ - Crear nuevos archivos
464
+ - Modificar contenido existente
465
+ - Eliminar archivos
466
+ - Guardar cambios
538
467
 
539
468
  ## Herramientas Disponibles
540
469
 
541
470
  | Tool | Qué hace | Cuándo usarla |
542
471
  |------|----------|---------------|
543
- | \`web_search\` | Busca en internet, devuelve títulos, URLs, snippets | Búsqueda inicial, encontrar fuentes |
544
- | \`web_fetch\` | Descarga contenido completo de URL (HTML→Markdown) | Profundizar en resultados específicos |
472
+ | \`project_read\` | Lee archivo existente | Antes de editar para entender estructura |
473
+ | \`project_write\` | Crea o sobreescribe archivo | Archivos nuevos o reescritura completa |
474
+ | \`project_edit\` | Edita secciones específicas | Cambios puntuales (find/replace) |
475
+ | \`project_exists\` | Verifica existencia | Para decidir crear vs editar |
545
476
 
546
477
  ## Workflow
547
478
 
548
- 1. **Búsqueda inicial** → \`web_search({ query, numResults: 8 })\`
549
- 2. **Fetch contenido** → \`web_fetch({ urls: top 2-3 })\`
550
- 3. **Búsqueda complementaria** Segundo search si hay gaps
551
- 4. **Síntesis** → summary + key points + sources
479
+ ### Crear Archivo Nuevo
480
+ 1. \`project_exists({ path })\` → verificar no existe
481
+ 2. \`project_write({ path, content })\` crear
482
+
483
+ ### Editar Archivo Existente
484
+ 1. \`project_exists({ path })\` → verificar existe
485
+ 2. \`project_read({ path })\` → entender estructura
486
+ 3. \`project_edit({ path, old_string, new_string })\` → modificar
487
+ 4. \`canvas_confirm()\` si cambios >50 líneas
488
+
489
+ ### Eliminar Archivo
490
+ 1. \`project_exists({ path })\` → verificar existe
491
+ 2. \`canvas_confirm({ message: '¿Eliminar archivo?' })\` → confirmar
492
+ 3. Operación de delete
552
493
 
553
494
  ## Mejores Prácticas
554
495
 
555
- - Queries específicos (máx 6 palabras)
556
- - Mínimo 2-3 fuentes independientes
557
- - Priorizar contenido reciente (<1 año)
558
- - Citas con URLs completas
496
+ - **Leer antes de editar**: Nunca modificar sin entender estructura
497
+ - **Edit vs Write**: Usar edit para cambios pequeños, write para nuevos archivos
498
+ - **Confirmar cambios grandes**: >50 líneas requiere confirmación explícita
499
+ - **Paths seguros**: Trabajar dentro del workspace por defecto
559
500
 
560
501
  ## Errores a Evitar
561
502
 
562
- - ❌ Inventar datos no encontrados
563
- - ❌ Concluir con una sola búsqueda
564
- - ❌ No verificar fecha de fuentes
565
- - ❌ Copiar contenido literal (usar paráfrasis)
503
+ - ❌ Editar sin leer primero
504
+ - ❌ Sobreescribir sin confirmar si es cambio grande
505
+ - ❌ Eliminar sin confirmación explícita
506
+ - ❌ Usar write cuando edit es suficiente
566
507
  `,
567
508
  },
568
509
  {
569
- name: "browser_automate",
570
- description: `Automate web workflows with navigation, clicks, form filling, and visual verification`,
571
- category: "web",
510
+ name: "file_read_and_summarize",
511
+ description: `Read and understand file content with automatic summarization for large files`,
512
+ category: "filesystem",
572
513
  version: "1.0.0",
573
- tools: ["browser_navigate","browser_click","browser_type","browser_screenshot"],
574
- triggers: ["automatizá el navegador","automate browser","completá el formulario","fill form","hacé clic en","click on","iniciá sesión","login","registrate","sign up","interactuá con la web","interact with website","flujo web","web workflow"],
514
+ tools: ["project_read"],
515
+ triggers: ["leé este archivo","read this file","mostrame el contenido","show content","qué dice este archivo","resumí este archivo","summarize this file","entendé este código","understand this code"],
575
516
  body: `
576
- # Browser Automate Skill
517
+ # File Read and Summarize Skill
577
518
 
578
519
  ## Cuándo se Activa
579
520
 
580
- Esta skill se activa para automatizar flujos de interacción con aplicaciones web: logins, formularios, navegación programática.
521
+ Esta skill se activa cuando el usuario necesita leer y entender el contenido de un archivo, especialmente cuando:
522
+ - El archivo es grande y necesita resumen
523
+ - Se requiere comprensión del contenido (no solo lectura)
524
+ - El usuario pide "qué dice", "resumí", "entendé"
581
525
 
582
526
  ## Herramientas Disponibles
583
527
 
584
528
  | Tool | Qué hace | Cuándo usarla |
585
529
  |------|----------|---------------|
586
- | \`browser_navigate\` | Navega a URL | Inicio de flujo |
587
- | \`browser_click\` | Click en elementos | Botones, enlaces, triggers |
588
- | \`browser_type\` | Escribe en inputs | Formularios, búsquedas |
589
- | \`browser_screenshot\` | Captura estado | Verificación visual |
530
+ | \`project_read\` | Lee contenido de archivo del workspace | Lectura de cualquier archivo |
590
531
 
591
- ## Workflow Típico
532
+ ## Workflow
592
533
 
593
- 1. **Navegar** → URL inicial
594
- 2. **Interactuar** → click/type según flujo
595
- 3. **Verificar** → screenshot después de acciones críticas
596
- 4. **Repetir** → para flujos multi-paso
534
+ 1. **Verificar existencia** → \`project_exists({ path })\`
535
+ 2. **Leer contenido** → \`project_read({ path, offset, limit })\`
536
+ 3. **Sintetizar** → Resumir si es grande, extraer puntos clave
597
537
 
598
538
  ## Mejores Prácticas
599
539
 
600
- - Selectores estables (IDs > classes > XPath)
601
- - Esperar carga después de navegación
602
- - Verificar estado visual con screenshots
603
- - Manejar errores de elementos no encontrados
540
+ - Para archivos >1000 líneas, usar \`offset\` y \`limit\`
541
+ - Identificar tipo de archivo por extensión y adaptar formato de resumen
542
+ - Para código: identificar funciones, clases, exports principales
543
+ - Para config: explicar settings clave en lenguaje simple
544
+ - Para texto: extraer ideas principales
604
545
 
605
546
  ## Errores a Evitar
606
547
 
607
- - ❌ Selectores frágiles que cambian
608
- - ❌ No esperar carga de página
609
- - ❌ Ignorar errores de elementos
610
- - ❌ No verificar estado después de acciones
548
+ - ❌ Leer sin verificar existencia
549
+ - ❌ Retornar archivo completo sin resumir si es muy grande
550
+ - ❌ No identificar tipo de archivo para adaptar resumen
611
551
  `,
612
552
  },
613
553
  {
614
- name: "browser_scrape",
615
- description: `Navigate to web pages and capture rendered content including screenshots for dynamic sites`,
616
- category: "web",
554
+ name: "office_document_manager",
555
+ description: `Leer, crear y manipular archivos Office (PDF, Word, Excel, PowerPoint) desde el workspace`,
556
+ category: "office",
617
557
  version: "1.0.0",
618
- tools: ["browser_navigate","browser_screenshot","web_fetch"],
619
- triggers: ["capturá el contenido","scrape content","obtené la página renderizada","get rendered page","sitios dinámicos","dynamic sites","web con javascript","javascript websites","tomá screenshot y contenido","screenshot and content"],
558
+ tools: ["office_leer_pdf","office_escribir_pdf","office_leer_docx","office_escribir_docx","office_leer_xlsx","office_escribir_xlsx","office_leer_pptx","office_escribir_pptx"],
559
+ triggers: ["leer pdf","abrir pdf","extraer texto de pdf","pdf a texto","crear pdf","generar pdf","exportar a pdf","leer word","abrir docx","extraer texto de word","crear word","generar docx","documento word","leer excel","abrir xlsx","datos de excel","crear excel","generar xlsx","exportar a excel","leer powerpoint","abrir pptx","presentacion","diapositivas","crear presentacion","generar pptx","read pdf","open pdf","create pdf","read excel","create excel","read word","create word","read powerpoint","create presentation"],
620
560
  body: `
621
- # Browser Scrape Skill
561
+ # Office Document Manager Skill
622
562
 
623
563
  ## Cuándo se Activa
624
564
 
625
- Esta skill se activa para sitios web dinámicos que requieren JavaScript rendering, donde el contenido no está disponible en HTML estático.
565
+ Esta skill se activa cuando el usuario necesita:
566
+ - **Leer** archivos PDF, Word (.docx), Excel (.xlsx) o PowerPoint (.pptx)
567
+ - **Generar** nuevos archivos en cualquiera de esos formatos
568
+ - **Convertir** contenido entre formatos (ej: texto → PDF, JSON → Excel)
569
+ - **Extraer** datos estructurados de documentos (tablas de Excel, slides de presentación)
626
570
 
627
571
  ## Herramientas Disponibles
628
572
 
629
573
  | Tool | Qué hace | Cuándo usarla |
630
574
  |------|----------|---------------|
631
- | \`browser_navigate\` | Navega y renderiza página completa | Sitios con JavaScript/SPA |
632
- | \`browser_screenshot\` | Captura estado visual | Evidencia de contenido renderizado |
633
- | \`web_fetch\` | Extrae texto como markdown | Contenido textual de página renderizada |
575
+ | \`office_leer_pdf\` | Extrae texto + metadata de PDF | Leer informes, contratos, libros en PDF |
576
+ | \`office_escribir_pdf\` | Genera PDF desde texto | Crear reportes, resúmenes, documentación |
577
+ | \`office_leer_docx\` | Extrae texto y tablas de Word | Leer documentos, contratos, informes Word |
578
+ | \`office_escribir_docx\` | Genera Word con estructura | Crear documentos formales con títulos/tablas |
579
+ | \`office_leer_xlsx\` | Lee hojas de Excel como JSON | Procesar datos, tablas, inventarios |
580
+ | \`office_escribir_xlsx\` | Genera Excel desde JSON | Exportar datos, crear reportes tabulares |
581
+ | \`office_leer_pptx\` | Extrae texto de cada slide | Resumir presentaciones, extraer contenido |
582
+ | \`office_escribir_pptx\` | Genera presentación PowerPoint | Crear slides desde datos o resúmenes |
634
583
 
635
- ## Workflow
584
+ ## Workflow por Caso de Uso
636
585
 
637
- 1. **Navegar** \`browser_navigate({ url })\` + esperar renderizado JS
638
- 2. **Capturar visual** \`browser_screenshot()\`
639
- 3. **Extraer texto** \`web_fetch()\`
640
- 4. **Combinar**screenshot + texto para scrape completo
586
+ ### Leer y resumir un documento
587
+ 1. \`office_leer_pdf/docx/xlsx/pptx\`extraer contenido
588
+ 2. Procesar y resumir el texto
589
+ 3. \`notify\`enviar resumen al usuario
641
590
 
642
- ## Mejores Prácticas
591
+ ### Transformar datos a Excel
592
+ 1. Obtener datos (de memoria, herramienta o cálculo)
593
+ 2. Estructurar en \`hojas\` con \`datos\` como array de objetos
594
+ 3. \`office_escribir_xlsx\` → generar archivo
595
+ 4. Confirmar ruta al usuario
643
596
 
644
- - Esperar renderizado completo de JavaScript
645
- - Para infinite scroll: hacer scroll y múltiples screenshots
646
- - Capturar antes y después de interacciones si es dinámico
597
+ ### Crear un informe PDF
598
+ 1. Compilar el contenido del informe como texto
599
+ 2. \`office_escribir_pdf\` generar con título y márgenes
600
+ 3. Confirmar que el archivo quedó en la ruta esperada
647
601
 
648
- ## Errores a Evitar
602
+ ### Generar una presentación
603
+ 1. Definir estructura: título + array de slides (título + puntos)
604
+ 2. \`office_escribir_pptx\` → generar .pptx
605
+ 3. Opcional: incluir notas del presentador en cada slide
649
606
 
650
- - No esperar renderizado JavaScript
651
- - ❌ Solo capturar HTML estático para sitios SPA
652
- - ❌ Ignorar términos de servicio del sitio
653
- `,
654
- },
655
- {
656
- name: "a2ui_interactive",
657
- description: `Create multi-step interactive workflows using A2UI v0.9 protocol with tabs, modals, choice pickers, and dynamic updates based on user actions`,
658
- category: "canvas",
659
- version: "1.0.0",
660
- tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
661
- triggers: ["interfaz interactiva A2UI","A2UI interactive UI","flujo A2UI","A2UI workflow","asistente A2UI","A2UI assistant","wizard A2UI","flujo multi-paso A2UI","multi-step flow A2UI","workflow interactivo","interactive workflow","asistente paso a paso","step-by-step assistant","A2UI con tabs y modales"],
662
- body: `
663
- # A2UI Interactive Skill
607
+ ## Parámetros Clave
664
608
 
665
- ## Cuándo se Activa
609
+ ### \`parrafos\` para DOCX
610
+ \`\`\`json
611
+ [
612
+ { "texto": "Capítulo 1", "tipo": "titulo1" },
613
+ { "texto": "Subtítulo", "tipo": "titulo2" },
614
+ { "texto": "Contenido normal", "tipo": "parrafo" },
615
+ { "texto": "Ítem de lista", "tipo": "lista" },
616
+ { "texto": "Texto importante", "tipo": "parrafo", "negrita": true }
617
+ ]
618
+ \`\`\`
666
619
 
667
- Para crear flujos interactivos multi-paso usando A2UI v0.9. Usar cuando se necesita:
668
- - Wizards paso a paso
669
- - Flujos de onboarding
670
- - Asistentes de reserva/configuración
671
- - Formularios con selections dinámicas
672
- - Interacciones con modales de confirmación
620
+ ### \`hojas\` para XLSX
621
+ \`\`\`json
622
+ [
623
+ {
624
+ "nombre": "Ventas",
625
+ "datos": [
626
+ { "Mes": "Enero", "Total": 5000 },
627
+ { "Mes": "Febrero", "Total": 6200 }
628
+ ]
629
+ }
630
+ ]
631
+ \`\`\`
632
+
633
+ ### \`diapositivas\` para PPTX
634
+ \`\`\`json
635
+ [
636
+ {
637
+ "titulo": "¿Qué es Machine Learning?",
638
+ "puntos": ["Subcampo de IA", "Aprende de datos", "Hace predicciones"],
639
+ "notas": "Mencionar el enfoque supervisado y no supervisado"
640
+ }
641
+ ]
642
+ \`\`\`
643
+
644
+ ## Errores a Evitar
645
+
646
+ - ❌ Intentar leer un archivo que no existe (verifica con \`fs_exists\` primero)
647
+ - ❌ Sobrescribir sin confirmar cuando el archivo destino ya existe
648
+ - ❌ Usar \`contenido\` y \`puntos\` a la vez en PPTX — \`puntos\` tiene prioridad
649
+ - ❌ Pasar un array de arrays como \`datos\` de XLSX cuando se esperan objetos con claves
650
+ - ❌ Intentar leer PDF de más de 100 páginas sin especificar rango (usar \`pagina_inicio\`/\`pagina_fin\`)
651
+ `,
652
+ },
653
+ {
654
+ name: "cron_reminder",
655
+ description: `Schedule a reminder for yourself at a specific time. Creates a one_shot cron job that sends a notification message via your preferred channel.`,
656
+ category: "cron",
657
+ version: "2.0.0",
658
+ tools: ["cron.create","notify"],
659
+ triggers: ["recordame","remind me","recordatorio","reminder","alerta","alert","avísame","notify me","programá","schedule","para mañana","for tomorrow","en 30 minutos","in 30 minutes"],
660
+ body: `
661
+ # Cron Reminder Skill
662
+
663
+ ## Cuándo se Activa
664
+
665
+ Para crear recordatorios de una sola ejecución (one_shot): "recuerdame a las 3pm", "avísame en 30 minutos", etc.
666
+
667
+ ## Herramientas
668
+
669
+ | Tool | Qué hace |
670
+ |------|----------|
671
+ | \`cron.create\` | Crear recordatorio one_shot |
672
+ | \`notify\` | Enviar notificación directa |
673
+
674
+ ## Cómo Funciona
675
+
676
+ 1. **Preguntar** → ¿De qué te aviso? ¿A qué hora? ¿Por qué canal?
677
+ 2. **Crear** → \`cron.create\` con \`task_type: 'one_shot'\` y \`fire_at\` en formato ISO
678
+ 3. **Confirmar** → Mostrar hora programada
679
+
680
+ ## Parámetros
681
+
682
+ | Campo | Descripción |
683
+ |-------|-------------|
684
+ | \`task\` | **REQUERIDO** - Mensaje del recordatorio |
685
+ | \`task_type\` | Siempre \`'one_shot'\` |
686
+ | \`fire_at\` | Fecha/hora ISO (ej: \`'2026-04-20T15:00:00'\`) |
687
+ | \`channel\` | Canal (telegram, discord, whatsapp, webchat) |
688
+
689
+ ## Errores Comunes
690
+
691
+ - ❌ Olvidar el campo \`task\` — obligatorio para que el agente sepa qué enviar
692
+ - ❌ Usar expresiones cron para recordatorios (usar \`fire_at\` en vez de \`cron_expression\`)
693
+ - ❌ Poner \`fire_at\` en el pasado`,
694
+ },
695
+ {
696
+ name: "canvas_dashboard",
697
+ description: `Real-time visual dashboard for monitoring task status, progress, and system state`,
698
+ category: "canvas",
699
+ version: "1.0.0",
700
+ tools: ["canvas_render","canvas_show_progress","canvas_clear"],
701
+ triggers: ["mostrá el dashboard","show dashboard","estado en tiempo real","real-time status","monitoreo visual","visual monitoring","panel de control","control panel","limpiá el canvas","clear canvas","actualizá el dashboard","update dashboard"],
702
+ body: `
703
+ # Canvas Dashboard Skill
704
+
705
+ ## Cuándo se Activa
706
+
707
+ Para mostrar dashboards visuales de monitoreo en tiempo real de tareas, proyectos, o estado del sistema.
708
+
709
+ ## Herramientas Disponibles
710
+
711
+ | Tool | Qué hace | Cuándo usarla |
712
+ |------|----------|---------------|
713
+ | \`canvas_render\` | Renderiza componentes | Layout del dashboard |
714
+ | \`canvas_show_progress\` | Barras de progreso | Estado de tasks |
715
+ | \`canvas_clear\` | Limpia canvas | Antes de nuevo dashboard |
716
+
717
+ ## Workflow
718
+
719
+ 1. **Clear** → \`canvas_clear()\` — limpiar previo
720
+ 2. **Render layout** → \`canvas_render({ sections })\`
721
+ 3. **Update progress** → \`canvas_show_progress()\` en tiempo real
722
+ 4. **Refresh** → \`canvas_render({ updates })\` para cambios
723
+
724
+ ## Estructura de Dashboard
725
+
726
+ \`\`\`javascript
727
+ canvas_render({
728
+ component: {
729
+ id: "dashboard-main",
730
+ type: "markdown",
731
+ props: { content: "## Dashboard\\n..." },
732
+ span: "full" // ← ancho completo del canvas
733
+ }
734
+ })
735
+
736
+ // O con tarjetas individuales:
737
+ canvas_show_card({ title: "Métricas", span: "full", items: [...] })
738
+ canvas_show_progress({ tasks: [...], span: "full" })
739
+ \`\`\`
740
+
741
+ ## Color Coding
742
+
743
+ | Color | Estado |
744
+ |-------|--------|
745
+ | 🟢 Verde | Complete |
746
+ | 🔵 Azul | In Progress |
747
+ | 🔴 Rojo | Error/Blocked |
748
+ | 🟡 Amarillo | Pending |
749
+
750
+ ## Mejores Prácticas
751
+
752
+ - Clear antes de renderizar nuevo dashboard
753
+ - Layout consistente (header, progress, status, metrics)
754
+ - Update en tiempo real con progreso
755
+ - Solo información crítica (no sobrecargar)
756
+
757
+ ## Errores a Evitar
758
+
759
+ - ❌ No clear entre dashboards (clutter)
760
+ - ❌ Demasiada información (sobrecarga visual)
761
+ - ❌ No actualizar en tiempo real
762
+ - ❌ Sin color coding para estados
763
+ `,
764
+ },
765
+ {
766
+ name: "a2ui_interactive",
767
+ description: `Create multi-step interactive workflows using A2UI v0.9 protocol with tabs, modals, choice pickers, and dynamic updates based on user actions`,
768
+ category: "canvas",
769
+ version: "1.0.0",
770
+ tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
771
+ triggers: ["interfaz interactiva A2UI","A2UI interactive UI","flujo A2UI","A2UI workflow","asistente A2UI","A2UI assistant","wizard A2UI","flujo multi-paso A2UI","multi-step flow A2UI","workflow interactivo","interactive workflow","asistente paso a paso","step-by-step assistant","A2UI con tabs y modales"],
772
+ body: `
773
+ # A2UI Interactive Skill
774
+
775
+ ## Cuándo se Activa
776
+
777
+ Para crear flujos interactivos multi-paso usando A2UI v0.9. Usar cuando se necesita:
778
+ - Wizards paso a paso
779
+ - Flujos de onboarding
780
+ - Asistentes de reserva/configuración
781
+ - Formularios con selections dinámicas
782
+ - Interacciones con modales de confirmación
673
783
  - UIs que cambian según las acciones del usuario
674
784
 
675
785
  ## Herramientes Disponibles
@@ -760,193 +870,76 @@ Para crear flujos interactivos multi-paso usando A2UI v0.9. Usar cuando se neces
760
870
  - Eliminar surfaces con \`a2ui_delete_surface\` al completar o cancelar`,
761
871
  },
762
872
  {
763
- name: "a2ui_form",
764
- description: `Create rich interactive forms using A2UI v0.9 protocol with validation, data binding, and multi-step flows`,
873
+ name: "canvas_interact",
874
+ description: `Collect user input and confirmations through interactive forms and dialogs`,
765
875
  category: "canvas",
766
876
  version: "1.0.0",
767
- tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
768
- triggers: ["crear formulario A2UI","create A2UI form","formulario interactivo A2UI","A2UI form","pedir datos con A2UI","collect data A2UI","formulario con validación","form with validation","formulario multi-paso","multi-step form A2UI","form dinámico A2UI","dynamic form A2UI"],
877
+ tools: ["canvas_ask","canvas_confirm"],
878
+ triggers: ["preguntame","ask me","formulario","form","confirmame","confirm","necesito ingresar datos","need to enter data","dialogo","dialog","input del usuario","user input","seleccionar opcion","select option"],
769
879
  body: `
770
- # A2UI Form Skill
880
+ # Canvas Interact Skill
771
881
 
772
882
  ## Cuándo se Activa
773
883
 
774
- Para crear formularios interactivos ricos usando el protocolo A2UI v0.9. Usar cuando se necesita:
775
- - Validación de campos (required, email, regex)
776
- - Data binding dinámico
777
- - Formularios multi-paso
778
- - Choice pickers, sliders, checkboxes
779
- - Formularios con acciones personalizadas
884
+ Para recoger input del usuario mediante formularios interactivos o confirmaciones.
780
885
 
781
886
  ## Herramientas Disponibles
782
887
 
783
888
  | Tool | Qué hace | Cuándo usarla |
784
889
  |------|----------|---------------|
785
- | \`a2ui_create_surface\` | Crea la superficie A2UI | Siempre primero |
786
- | \`a2ui_update_components\` | Envía componentes | Después de crear surface |
787
- | \`a2ui_update_data_model\` | Actualiza datos | Para valores iniciales o dinámicos |
788
- | \`a2ui_delete_surface\` | Elimina la superficie | Al terminar |
890
+ | \`canvas_ask\` | Muestra formulario | Input multi-campo |
891
+ | \`canvas_confirm\` | Diálogo confirmación | Yes/No decisions |
789
892
 
790
- ## Flujo Obligatorio
893
+ ## Workflow
791
894
 
895
+ ### Confirmación Simple
896
+ \`\`\`javascript
897
+ canvas_confirm({
898
+ message: "¿Eliminar archivo?",
899
+ confirmLabel: "Sí, eliminar",
900
+ cancelLabel: "Cancelar"
901
+ })
792
902
  \`\`\`
793
- 1. a2ui_create_surface(surfaceId, catalogId, theme)
794
- 2. a2ui_update_components(surfaceId, components[])
795
- 3. a2ui_update_data_model(surfaceId, path, value) // opcional, para datos iniciales
796
- 4. [esperar acción del usuario]
797
- 5. a2ui_delete_surface(surfaceId) // al terminar
903
+
904
+ ### Formulario Complejo
905
+ \`\`\`javascript
906
+ canvas_ask({
907
+ title: "User Registration",
908
+ fields: [
909
+ { name: "email", label: "Email", type: "email", required: true },
910
+ { name: "password", label: "Password", type: "password", required: true },
911
+ {
912
+ name: "role",
913
+ label: "Role",
914
+ type: "select",
915
+ options: [
916
+ { label: "Admin", value: "admin" },
917
+ { label: "User", value: "user" }
918
+ ]
919
+ }
920
+ ]
921
+ })
798
922
  \`\`\`
799
923
 
800
- ## Componentes Disponibles
924
+ ## Tipos de Campo
801
925
 
802
- | Componente | Descripción | Props clave |
803
- |------------|-------------|-------------|
804
- | \`Column\` | Layout vertical | \`children\`, \`distribution\`, \`alignment\` |
805
- | \`Row\` | Layout horizontal | \`children\`, \`distribution\`, \`alignment\` |
806
- | \`Text\` | Texto | \`text\`, \`usageHint\` (h1-h5, body, caption, code) |
807
- | \`Button\` | Botón | \`child\`, \`variant\`, \`action\` |
808
- | \`TextField\` | Campo de texto | \`label\`, \`value\`, \`variant\` (shortText/longText/number/obscured), \`validationRegexp\`, \`checks\`, \`action\` |
809
- | \`CheckBox\` | Checkbox | \`label\`, \`value\` |
810
- | \`ChoicePicker\` | Selector múltiple | \`options\`, \`value\` (DynamicStringList), \`variant\` (mutuallyExclusive/multipleSelection), \`displayStyle\`, \`filterable\`, \`action\` |
811
- | \`Slider\` | Slider numérico | \`value\`, \`minValue\`, \`maxValue\` |
812
- | \`DateTimeInput\` | Fecha/hora | \`value\`, \`enableDate\`, \`enableTime\` |
813
- | \`Card\` | Tarjeta | \`child\` |
814
- | \`Divider\` | Separador | \`axis\` |
815
- | \`Image\` | Imagen | \`url\`, \`fit\` |
816
- | \`Tabs\` | Pestañas | \`tabItems\` |
926
+ | Type | Uso |
927
+ |------|-----|
928
+ | \`text\` | Texto libre |
929
+ | \`email\` | Email con validación |
930
+ | \`password\` | Contraseña (oculto) |
931
+ | \`number\` | Números |
932
+ | \`select\` | Dropdown con opciones |
933
+ | \`checkbox\` | Booleano |
934
+ | \`textarea\` | Texto multilínea |
817
935
 
818
- ## Data Binding
936
+ ## Mejores Prácticas
819
937
 
820
- - Literal: \`"texto directo"\` o número
821
- - Path: \`{ "path": "/form/name" }\` — se resuelve contra el data model
822
- - Function call: \`{ "call": "formatDate", "args": {...} }\`
823
-
824
- ## Cuándo disparan acciones los inputs
825
-
826
- | Componente | Cuándo dispara | Formato de action |
827
- |------------|---------------|-------------------|
828
- | \`Button\` | Al hacer click | \`{name: "...", context: {...}}\` o \`{event: {name: "...", context: {...}}}\` |
829
- | \`TextField\` | Al perder foco (blur) o presionar Enter (en shortText) | \`{name: "...", context: {...}}\` |
830
- | \`ChoicePicker\` | Inmediatamente al seleccionar/deseleccionar | \`{name: "...", context: {...}}\` |
831
- | \`Slider\` | Al soltar el slider (onValueCommit) | \`{name: "...", context: {...}}\` |
832
- | \`CheckBox\` | Al cambiar estado | — (solo two-way binding) |
833
- | \`DateTimeInput\` | Al cambiar valor | — (solo two-way binding) |
834
-
835
- **Nota**: Tanto \`{name: "...", context: {...}}\` (directo) como \`{event: {name: "...", context: {...}}}\` (con wrapper) son formatos válidos.
836
-
837
- **Nota**: Para ChoicePicker usa siempre \`selections: {path: "..."}\` (no \`value\`) para two-way binding.
838
-
839
- ## Validación (checks)
840
-
841
- \`\`\`json
842
- "checks": [
843
- { "call": "required", "args": { "value": { "path": "/form/email" } }, "message": "Email is required" },
844
- { "call": "email", "args": { "value": { "path": "/form/email" } }, "message": "Invalid email" },
845
- { "call": "regex", "args": { "value": { "path": "/form/phone" }, "pattern": "^\\\\d{10}$" }, "message": "10 digits required" }
846
- ]
847
- \`\`\`
848
-
849
- ## Ejemplo: Formulario de Contacto
850
-
851
- \`\`\`json
852
- // 1. Create surface
853
- a2ui_create_surface(surfaceId: "contact_form", catalogId: "https://a2ui.org/specification/v0_9/basic_catalog.json", theme: {primaryColor: "#3B82F6", agentDisplayName: "Asistente"})
854
-
855
- // 2. Send components
856
- a2ui_update_components(surfaceId: "contact_form", components: [
857
- {"id": "root", "component": "Column", "children": ["header","name_field","email_field","msg_field","submit_btn"]},
858
- {id: "header", component: "Text", text: "Contacto", variant: "h2"},
859
- {id: "name_field", component: "TextField", label: "Nombre", value: {path: "/form/name"}, variant: "shortText"},
860
- {id: "email_field", component: "TextField", label: "Email", value: {path: "/form/email"}, variant: "shortText", validationRegexp: "^[^@]+@[^@]+\\\\.[^@]+$", checks: [{call: "required", args: {value: {path: "/form/email"}}, message: "Email obligatorio"}, {call: "email", args: {value: {path: "/form/email"}}, message: "Email inválido"}]},
861
- {id: "msg_field", component: "TextField", label: "Mensaje", value: {path: "/form/message"}, variant: "longText"},
862
- {id: "submit_label", component: "Text", text: "Enviar"},
863
- {id: "submit_btn", component: "Button", child: "submit_label", variant: "primary", action: {event: {name: "submit_contact", context: {name: {path: "/form/name"}, email: {path: "/form/email"}, message: {path: "/form/message"}}}}
864
- ])
865
-
866
- // 3. Initialize data model
867
- a2ui_update_data_model(surfaceId: "contact_form", path: "/form", value: {name: "", email: "", message: ""})
868
- \`\`\`
869
-
870
- ## Mejores Prácticas
871
-
872
- - Siempre incluir un componente \`root\` con id="root"
873
- - Usar \`{ path: "/..." }\` para data binding en TextField values
874
- - Agregar \`checks\` para validación de campos obligatorios
875
- - Usar \`variant: "primary"\` para botones principales
876
- - Eliminar surfaces con \`a2ui_delete_surface\` al terminar
877
- - Preferir A2UI forms sobre \`canvas_ask\` para formularios complejos con validación`,
878
- },
879
- {
880
- name: "canvas_interact",
881
- description: `Collect user input and confirmations through interactive forms and dialogs`,
882
- category: "canvas",
883
- version: "1.0.0",
884
- tools: ["canvas_ask","canvas_confirm"],
885
- triggers: ["preguntame","ask me","formulario","form","confirmame","confirm","necesito ingresar datos","need to enter data","dialogo","dialog","input del usuario","user input","seleccionar opcion","select option"],
886
- body: `
887
- # Canvas Interact Skill
888
-
889
- ## Cuándo se Activa
890
-
891
- Para recoger input del usuario mediante formularios interactivos o confirmaciones.
892
-
893
- ## Herramientas Disponibles
894
-
895
- | Tool | Qué hace | Cuándo usarla |
896
- |------|----------|---------------|
897
- | \`canvas_ask\` | Muestra formulario | Input multi-campo |
898
- | \`canvas_confirm\` | Diálogo confirmación | Yes/No decisions |
899
-
900
- ## Workflow
901
-
902
- ### Confirmación Simple
903
- \`\`\`javascript
904
- canvas_confirm({
905
- message: "¿Eliminar archivo?",
906
- confirmLabel: "Sí, eliminar",
907
- cancelLabel: "Cancelar"
908
- })
909
- \`\`\`
910
-
911
- ### Formulario Complejo
912
- \`\`\`javascript
913
- canvas_ask({
914
- title: "User Registration",
915
- fields: [
916
- { name: "email", label: "Email", type: "email", required: true },
917
- { name: "password", label: "Password", type: "password", required: true },
918
- {
919
- name: "role",
920
- label: "Role",
921
- type: "select",
922
- options: [
923
- { label: "Admin", value: "admin" },
924
- { label: "User", value: "user" }
925
- ]
926
- }
927
- ]
928
- })
929
- \`\`\`
930
-
931
- ## Tipos de Campo
932
-
933
- | Type | Uso |
934
- |------|-----|
935
- | \`text\` | Texto libre |
936
- | \`email\` | Email con validación |
937
- | \`password\` | Contraseña (oculto) |
938
- | \`number\` | Números |
939
- | \`select\` | Dropdown con opciones |
940
- | \`checkbox\` | Booleano |
941
- | \`textarea\` | Texto multilínea |
942
-
943
- ## Mejores Prácticas
944
-
945
- - Labels claros y descriptivos
946
- - Placeholders con ejemplos
947
- - Marcar required explícitamente
948
- - Validar tipos (email, number)
949
- - Manejar cancel gracefully
938
+ - Labels claros y descriptivos
939
+ - Placeholders con ejemplos
940
+ - Marcar required explícitamente
941
+ - Validar tipos (email, number)
942
+ - Manejar cancel gracefully
950
943
 
951
944
  ## Errores a Evitar
952
945
 
@@ -1035,96 +1028,143 @@ canvas_show_progress({
1035
1028
  `,
1036
1029
  },
1037
1030
  {
1038
- name: "canvas_dashboard",
1039
- description: `Real-time visual dashboard for monitoring task status, progress, and system state`,
1031
+ name: "a2ui_form",
1032
+ description: `Create rich interactive forms using A2UI v0.9 protocol with validation, data binding, and multi-step flows`,
1040
1033
  category: "canvas",
1041
1034
  version: "1.0.0",
1042
- tools: ["canvas_render","canvas_show_progress","canvas_clear"],
1043
- triggers: ["mostrá el dashboard","show dashboard","estado en tiempo real","real-time status","monitoreo visual","visual monitoring","panel de control","control panel","limpiá el canvas","clear canvas","actualizá el dashboard","update dashboard"],
1035
+ tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
1036
+ triggers: ["crear formulario A2UI","create A2UI form","formulario interactivo A2UI","A2UI form","pedir datos con A2UI","collect data A2UI","formulario con validación","form with validation","formulario multi-paso","multi-step form A2UI","form dinámico A2UI","dynamic form A2UI"],
1044
1037
  body: `
1045
- # Canvas Dashboard Skill
1038
+ # A2UI Form Skill
1046
1039
 
1047
1040
  ## Cuándo se Activa
1048
1041
 
1049
- Para mostrar dashboards visuales de monitoreo en tiempo real de tareas, proyectos, o estado del sistema.
1042
+ Para crear formularios interactivos ricos usando el protocolo A2UI v0.9. Usar cuando se necesita:
1043
+ - Validación de campos (required, email, regex)
1044
+ - Data binding dinámico
1045
+ - Formularios multi-paso
1046
+ - Choice pickers, sliders, checkboxes
1047
+ - Formularios con acciones personalizadas
1050
1048
 
1051
1049
  ## Herramientas Disponibles
1052
1050
 
1053
1051
  | Tool | Qué hace | Cuándo usarla |
1054
1052
  |------|----------|---------------|
1055
- | \`canvas_render\` | Renderiza componentes | Layout del dashboard |
1056
- | \`canvas_show_progress\` | Barras de progreso | Estado de tasks |
1057
- | \`canvas_clear\` | Limpia canvas | Antes de nuevo dashboard |
1053
+ | \`a2ui_create_surface\` | Crea la superficie A2UI | Siempre primero |
1054
+ | \`a2ui_update_components\` | Envía componentes | Después de crear surface |
1055
+ | \`a2ui_update_data_model\` | Actualiza datos | Para valores iniciales o dinámicos |
1056
+ | \`a2ui_delete_surface\` | Elimina la superficie | Al terminar |
1058
1057
 
1059
- ## Workflow
1058
+ ## Flujo Obligatorio
1060
1059
 
1061
- 1. **Clear** → \`canvas_clear()\` — limpiar previo
1062
- 2. **Render layout** → \`canvas_render({ sections })\`
1063
- 3. **Update progress** → \`canvas_show_progress()\` en tiempo real
1064
- 4. **Refresh** → \`canvas_render({ updates })\` para cambios
1060
+ \`\`\`
1061
+ 1. a2ui_create_surface(surfaceId, catalogId, theme)
1062
+ 2. a2ui_update_components(surfaceId, components[])
1063
+ 3. a2ui_update_data_model(surfaceId, path, value) // opcional, para datos iniciales
1064
+ 4. [esperar acción del usuario]
1065
+ 5. a2ui_delete_surface(surfaceId) // al terminar
1066
+ \`\`\`
1065
1067
 
1066
- ## Estructura de Dashboard
1068
+ ## Componentes Disponibles
1067
1069
 
1068
- \`\`\`javascript
1069
- canvas_render({
1070
- component: {
1071
- id: "dashboard-main",
1072
- type: "markdown",
1073
- props: { content: "## Dashboard\\n..." },
1074
- span: "full" // ancho completo del canvas
1075
- }
1076
- })
1070
+ | Componente | Descripción | Props clave |
1071
+ |------------|-------------|-------------|
1072
+ | \`Column\` | Layout vertical | \`children\`, \`distribution\`, \`alignment\` |
1073
+ | \`Row\` | Layout horizontal | \`children\`, \`distribution\`, \`alignment\` |
1074
+ | \`Text\` | Texto | \`text\`, \`usageHint\` (h1-h5, body, caption, code) |
1075
+ | \`Button\` | Botón | \`child\`, \`variant\`, \`action\` |
1076
+ | \`TextField\` | Campo de texto | \`label\`, \`value\`, \`variant\` (shortText/longText/number/obscured), \`validationRegexp\`, \`checks\`, \`action\` |
1077
+ | \`CheckBox\` | Checkbox | \`label\`, \`value\` |
1078
+ | \`ChoicePicker\` | Selector múltiple | \`options\`, \`value\` (DynamicStringList), \`variant\` (mutuallyExclusive/multipleSelection), \`displayStyle\`, \`filterable\`, \`action\` |
1079
+ | \`Slider\` | Slider numérico | \`value\`, \`minValue\`, \`maxValue\` |
1080
+ | \`DateTimeInput\` | Fecha/hora | \`value\`, \`enableDate\`, \`enableTime\` |
1081
+ | \`Card\` | Tarjeta | \`child\` |
1082
+ | \`Divider\` | Separador | \`axis\` |
1083
+ | \`Image\` | Imagen | \`url\`, \`fit\` |
1084
+ | \`Tabs\` | Pestañas | \`tabItems\` |
1077
1085
 
1078
- // O con tarjetas individuales:
1079
- canvas_show_card({ title: "Métricas", span: "full", items: [...] })
1080
- canvas_show_progress({ tasks: [...], span: "full" })
1081
- \`\`\`
1086
+ ## Data Binding
1082
1087
 
1083
- ## Color Coding
1088
+ - Literal: \`"texto directo"\` o número
1089
+ - Path: \`{ "path": "/form/name" }\` — se resuelve contra el data model
1090
+ - Function call: \`{ "call": "formatDate", "args": {...} }\`
1084
1091
 
1085
- | Color | Estado |
1086
- |-------|--------|
1087
- | 🟢 Verde | Complete |
1088
- | 🔵 Azul | In Progress |
1089
- | 🔴 Rojo | Error/Blocked |
1090
- | 🟡 Amarillo | Pending |
1092
+ ## Cuándo disparan acciones los inputs
1091
1093
 
1092
- ## Mejores Prácticas
1094
+ | Componente | Cuándo dispara | Formato de action |
1095
+ |------------|---------------|-------------------|
1096
+ | \`Button\` | Al hacer click | \`{name: "...", context: {...}}\` o \`{event: {name: "...", context: {...}}}\` |
1097
+ | \`TextField\` | Al perder foco (blur) o presionar Enter (en shortText) | \`{name: "...", context: {...}}\` |
1098
+ | \`ChoicePicker\` | Inmediatamente al seleccionar/deseleccionar | \`{name: "...", context: {...}}\` |
1099
+ | \`Slider\` | Al soltar el slider (onValueCommit) | \`{name: "...", context: {...}}\` |
1100
+ | \`CheckBox\` | Al cambiar estado | — (solo two-way binding) |
1101
+ | \`DateTimeInput\` | Al cambiar valor | — (solo two-way binding) |
1093
1102
 
1094
- - Clear antes de renderizar nuevo dashboard
1095
- - Layout consistente (header, progress, status, metrics)
1096
- - Update en tiempo real con progreso
1097
- - Solo información crítica (no sobrecargar)
1103
+ **Nota**: Tanto \`{name: "...", context: {...}}\` (directo) como \`{event: {name: "...", context: {...}}}\` (con wrapper) son formatos válidos.
1098
1104
 
1099
- ## Errores a Evitar
1105
+ **Nota**: Para ChoicePicker usa siempre \`selections: {path: "..."}\` (no \`value\`) para two-way binding.
1100
1106
 
1101
- - No clear entre dashboards (clutter)
1102
- - ❌ Demasiada información (sobrecarga visual)
1103
- - ❌ No actualizar en tiempo real
1104
- - ❌ Sin color coding para estados
1105
- `,
1106
- },
1107
- {
1108
- name: "a2ui_dashboard",
1109
- description: `Create real-time interactive dashboards using A2UI v0.9 protocol with dynamic data binding and live updates`,
1110
- category: "canvas",
1111
- version: "1.0.0",
1112
- tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
1113
- triggers: ["dashboard A2UI","panel de control A2UI","A2UI dashboard","mostrar métricas A2UI","A2UI metrics","dashboard interactivo A2UI","interactive dashboard","A2UI dashboard en tiempo real","real-time dashboard A2UI","mostrar datos A2UI","visualizar datos con A2UI"],
1114
- body: `
1115
- # A2UI Dashboard Skill
1107
+ ## Validación (checks)
1116
1108
 
1117
- ## Cuándo se Activa
1109
+ \`\`\`json
1110
+ "checks": [
1111
+ { "call": "required", "args": { "value": { "path": "/form/email" } }, "message": "Email is required" },
1112
+ { "call": "email", "args": { "value": { "path": "/form/email" } }, "message": "Invalid email" },
1113
+ { "call": "regex", "args": { "value": { "path": "/form/phone" }, "pattern": "^\\\\d{10}$" }, "message": "10 digits required" }
1114
+ ]
1115
+ \`\`\`
1118
1116
 
1119
- Para crear dashboards interactivos en tiempo real usando A2UI v0.9. Usar cuando se necesita:
1120
- - Métricas que se actualizan dinámicamente
1121
- - Dashboards con data binding
1122
- - Paneles con Cards, Rows, Columns
1123
- - Visualización de datos que cambia en tiempo real
1117
+ ## Ejemplo: Formulario de Contacto
1124
1118
 
1125
- ## Herramientas Disponibles
1119
+ \`\`\`json
1120
+ // 1. Create surface
1121
+ a2ui_create_surface(surfaceId: "contact_form", catalogId: "https://a2ui.org/specification/v0_9/basic_catalog.json", theme: {primaryColor: "#3B82F6", agentDisplayName: "Asistente"})
1126
1122
 
1127
- | Tool | Qué hace | Cuándo usarla |
1123
+ // 2. Send components
1124
+ a2ui_update_components(surfaceId: "contact_form", components: [
1125
+ {"id": "root", "component": "Column", "children": ["header","name_field","email_field","msg_field","submit_btn"]},
1126
+ {id: "header", component: "Text", text: "Contacto", variant: "h2"},
1127
+ {id: "name_field", component: "TextField", label: "Nombre", value: {path: "/form/name"}, variant: "shortText"},
1128
+ {id: "email_field", component: "TextField", label: "Email", value: {path: "/form/email"}, variant: "shortText", validationRegexp: "^[^@]+@[^@]+\\\\.[^@]+$", checks: [{call: "required", args: {value: {path: "/form/email"}}, message: "Email obligatorio"}, {call: "email", args: {value: {path: "/form/email"}}, message: "Email inválido"}]},
1129
+ {id: "msg_field", component: "TextField", label: "Mensaje", value: {path: "/form/message"}, variant: "longText"},
1130
+ {id: "submit_label", component: "Text", text: "Enviar"},
1131
+ {id: "submit_btn", component: "Button", child: "submit_label", variant: "primary", action: {event: {name: "submit_contact", context: {name: {path: "/form/name"}, email: {path: "/form/email"}, message: {path: "/form/message"}}}}
1132
+ ])
1133
+
1134
+ // 3. Initialize data model
1135
+ a2ui_update_data_model(surfaceId: "contact_form", path: "/form", value: {name: "", email: "", message: ""})
1136
+ \`\`\`
1137
+
1138
+ ## Mejores Prácticas
1139
+
1140
+ - Siempre incluir un componente \`root\` con id="root"
1141
+ - Usar \`{ path: "/..." }\` para data binding en TextField values
1142
+ - Agregar \`checks\` para validación de campos obligatorios
1143
+ - Usar \`variant: "primary"\` para botones principales
1144
+ - Eliminar surfaces con \`a2ui_delete_surface\` al terminar
1145
+ - Preferir A2UI forms sobre \`canvas_ask\` para formularios complejos con validación`,
1146
+ },
1147
+ {
1148
+ name: "a2ui_dashboard",
1149
+ description: `Create real-time interactive dashboards using A2UI v0.9 protocol with dynamic data binding and live updates`,
1150
+ category: "canvas",
1151
+ version: "1.0.0",
1152
+ tools: ["a2ui_create_surface","a2ui_update_components","a2ui_update_data_model","a2ui_delete_surface"],
1153
+ triggers: ["dashboard A2UI","panel de control A2UI","A2UI dashboard","mostrar métricas A2UI","A2UI metrics","dashboard interactivo A2UI","interactive dashboard","A2UI dashboard en tiempo real","real-time dashboard A2UI","mostrar datos A2UI","visualizar datos con A2UI"],
1154
+ body: `
1155
+ # A2UI Dashboard Skill
1156
+
1157
+ ## Cuándo se Activa
1158
+
1159
+ Para crear dashboards interactivos en tiempo real usando A2UI v0.9. Usar cuando se necesita:
1160
+ - Métricas que se actualizan dinámicamente
1161
+ - Dashboards con data binding
1162
+ - Paneles con Cards, Rows, Columns
1163
+ - Visualización de datos que cambia en tiempo real
1164
+
1165
+ ## Herramientas Disponibles
1166
+
1167
+ | Tool | Qué hace | Cuándo usarla |
1128
1168
  |------|----------|---------------|
1129
1169
  | \`a2ui_create_surface\` | Crea la superficie A2UI | Siempre primero |
1130
1170
  | \`a2ui_update_components\` | Envía componentes | Para layout del dashboard |
@@ -1185,234 +1225,307 @@ a2ui_update_data_model(surfaceId: "dash", path: "/", value: {metrics: {completio
1185
1225
  - Eliminar surfaces al terminar para evitar memory leaks`,
1186
1226
  },
1187
1227
  {
1188
- name: "task_orchestrator",
1189
- description: `Orchestrate tasks across multiple workers with delegation, status tracking, and bus communication`,
1190
- category: "agents",
1191
- version: "1.1.0",
1192
- tools: ["get_available_models","task_delegate","task_status","agent_find","agent_create","bus_publish","bus_read"],
1193
- triggers: ["delegá esta tarea","delegate task","orquestá los workers","orchestrate workers","coordiná el equipo","coordinate team","estado de las tareas","task status","comunicá los workers","communicate workers","mensaje al bus","bus message","tarea en paralelo","parallel tasks"],
1228
+ name: "voice_input",
1229
+ description: `Transcribe audio input to text using STT (Speech-to-Text) providers like Groq Whisper or OpenAI Whisper`,
1230
+ category: "voice",
1231
+ version: "1.0.0",
1232
+ tools: ["voice_transcribe"],
1233
+ triggers: ["transcribí este audio","transcribe audio","convertí voz a texto","convert voice to text","qué dice el audio","what does audio say","escuchá esto","listen to this","audio a texto","audio to text","reconocimiento de voz","speech recognition","nota de voz","voice note"],
1194
1234
  body: `
1195
- # Task Orchestrator Skill
1235
+ # Voice Input Skill
1196
1236
 
1197
1237
  ## Cuándo se Activa
1198
1238
 
1199
- Para coordinar múltiples workers, delegar tareas, monitorear progreso, y facilitar comunicación worker-to-worker.
1239
+ Esta skill se activa cuando el usuario envía audio y necesita transcripción a texto: notas de voz, grabaciones, comandos de voz.
1200
1240
 
1201
1241
  ## Herramientas Disponibles
1202
1242
 
1203
1243
  | Tool | Qué hace | Cuándo usarla |
1204
1244
  |------|----------|---------------|
1205
- | \`get_available_models\` | Consulta providers y modelos activos | Al crear workers seleccionar modelo óptimo |
1206
- | \`agent_find\` | Busca workers disponibles | Antes de delegar |
1207
- | \`agent_create\` | Crea nuevo worker | Si no hay uno adecuado |
1208
- | \`task_delegate\` | Asigna y EJECUTA tarea | Delegar con ejecución inmediata |
1209
- | \`task_status\` | Verifica estado de tareas | Monitorear progreso |
1210
- | \`bus_publish\` | Publica mensaje | Coordinación worker-to-worker |
1211
- | \`bus_read\` | Lee mensajes del bus | Ver solicitudes de workers |
1245
+ | \`voice_transcribe\` | Convierte audio texto | Transcripción de cualquier audio |
1212
1246
 
1213
1247
  ## Workflow
1214
1248
 
1215
- ### Delegación
1216
- 1. **Consultar modelos** → \`get_available_models({ capabilities })\` — si necesita crear workers
1217
- 2. **Buscar worker** → \`agent_find({ search })\`
1218
- 3. **Si no existe** → \`agent_create({...})\` — con providerId y modelId OBLIGATORIOS
1219
- 4. **Delegar** → \`task_delegate({ worker_id, task_description, task_id?, project_id? })\` — **BLOQUEANTE**
1220
- 5. **Resultado retornado** → Worker ejecuta inmediatamente y devuelve resultado
1221
-
1222
- ### Create Agent Config (providerId y modelId son OBLIGATORIOS)
1249
+ ### Transcripción
1223
1250
  \`\`\`javascript
1224
- // 1. Consultar modelos disponibles
1225
- get_available_models({ capabilities: "analysis" })
1226
- // → [{ providerId: "anthropic", modelId: "claude-sonnet-4-6", contextWindow: 200000 }, ...]
1251
+ // 1. Recibir audio
1252
+ // - File upload
1253
+ // - Voice message (Telegram, WhatsApp)
1254
+ // - Stream en vivo
1227
1255
 
1228
- // 2. Crear worker con modelo óptimo
1229
- agent_create({
1230
- name: "data_analyst",
1231
- description: "Especialista en análisis de datos y visualización",
1232
- system_prompt: "Sos analista de datos experto...",
1233
- tools_json: ["web_search", "web_fetch", "save_note"],
1234
- providerId: "anthropic", // OBLIGATORIO
1235
- modelId: "claude-sonnet-4-6", // OBLIGATORIO
1236
- tone: "analytical"
1256
+ // 2. Transcribir
1257
+ const result = voice_transcribe({
1258
+ audio: audioBuffer,
1259
+ language: "es" // o "auto" para detectar
1237
1260
  })
1261
+
1262
+ // 3. Formatear
1263
+ // - Agregar puntuación
1264
+ // - Capitalizar
1265
+ // - Marcar speakers si hay múltiples
1266
+
1267
+ // 4. Entregar resultado
1238
1268
  \`\`\`
1239
1269
 
1240
- ### Monitoreo
1241
- 1. **Check estado** → \`task_status({ task_ids })\`
1242
- 2. **Publicar coordinación** → \`bus_publish()\` si needed
1243
- 3. **Leer bus** → \`bus_read()\` para respuestas
1270
+ ## Proveedores STT Soportados
1244
1271
 
1245
- ## Agent Bus Communication
1272
+ | Provider | Modelos | Idiomas |
1273
+ |----------|---------|---------|
1274
+ | Groq | whisper-large-v3, turbo | Multi |
1275
+ | OpenAI | whisper-1 | Multi |
1246
1276
 
1247
- \`\`\`javascript
1248
- // Worker notifica completado:
1249
- bus_publish({
1250
- event_type: "task_complete",
1251
- to_worker_id: "next_worker",
1252
- content: "Research done. Found 7 trends. Ready for content generation."
1253
- })
1277
+ ## Configuración por Canal
1254
1278
 
1255
- // Worker solicita contexto:
1256
- bus_read() [{ from: "writer", content: "Need research results" }]
1257
- \`\`\`
1279
+ Cada canal puede configurar su proveedor STT preferido:
1280
+ - \`stt_provider\`: "groq-whisper" | "openai-whisper"
1258
1281
 
1259
1282
  ## Mejores Prácticas
1260
1283
 
1261
- - \`task_delegate\` es bloqueante — el resultado llega en el retorno de la tool
1262
- - Consultar modelos disponibles antes de crear workers (\`get_available_models\`)
1263
- - Asignar workers por especialidad (\`agent_find\`)
1264
- - Usar \`bus_publish\` / \`bus_read\` para coordinación entre workers
1265
- - Pasar \`task_id\` y \`project_id\` a \`task_delegate\` para auto-tracking de progreso
1266
- - Seleccionar modelo según capacidad: coding → modelos grandes, chat → modelos rápidos
1284
+ - Detectar idioma automáticamente
1285
+ - Agregar puntuación para legibilidad
1286
+ - Marcar segmentos inaudibles
1287
+ - Preservar idioma original
1267
1288
 
1268
1289
  ## Errores a Evitar
1269
1290
 
1270
- - ❌ Usar \`delegate_task\` (no existe) — usar \`task_delegate\`
1271
- - ❌ Usar \`find_agent\` (no existe) — usar \`agent_find\`
1272
- - ❌ Usar \`publish_to_bus\` / \`get_bus_messages\` (no existen) — usar \`bus_publish\` / \`bus_read\`
1273
- - ❌ Usar \`get_task_status\` (no existe) usar \`task_status\`
1274
- - ❌ No consultar modelos disponibles antes de crear workers
1275
- - ❌ No monitorear estado de tasks
1276
- - ❌ No coordinar workers cuando hay dependencias
1291
+ - ❌ Traducir sin pedir (mantener idioma)
1292
+ - ❌ Omitir puntuación
1293
+ - ❌ No indicar baja confianza
1294
+ - ❌ Ignorar ruido de fondo que afecta calidad
1277
1295
  `,
1278
1296
  },
1279
1297
  {
1280
- name: "memory_manager",
1281
- description: `Complete management of persistent memory including write, read, search, list, and delete operations`,
1282
- category: "agents",
1298
+ name: "voice_assistant",
1299
+ description: `Full voice-to-voice interaction: transcribe user speech, process request, and respond with synthesized speech`,
1300
+ category: "voice",
1283
1301
  version: "1.0.0",
1284
- tools: ["memory_write","memory_read","memory_list","memory_search","memory_delete"],
1285
- triggers: ["guardá en memoria","save to memory","recordá esto","remember this","leé la memoria","read memory","qué hay en memoria","what's in memory","buscá en memoria","search memory","lista las memorias","list memories","eliminá de memoria","delete from memory","preferencias","preferences","datos persistentes","persistent data"],
1302
+ tools: ["voice_transcribe","voice_speak"],
1303
+ triggers: ["modo voz","voice mode","asistente de voz","voice assistant","hablá conmigo","talk to me","interacción por voz","voice interaction","respuesta hablada","spoken response","comando de voz","voice command","diálogo por voz","voice dialogue"],
1286
1304
  body: `
1287
- # Memory Manager Skill
1305
+ # Voice Assistant Skill
1288
1306
 
1289
1307
  ## Cuándo se Activa
1290
1308
 
1291
- Para guardar, recuperar, buscar, listar o eliminar información persistente entre sesiones.
1309
+ Esta skill se activa para interacción completa voz a voz: el usuario habla, el asistente procesa y responde con voz.
1292
1310
 
1293
1311
  ## Herramientas Disponibles
1294
1312
 
1295
1313
  | Tool | Qué hace | Cuándo usarla |
1296
1314
  |------|----------|---------------|
1297
- | \`memory_write\` | Almacena con título único | Guardar preferencias, datos |
1298
- | \`memory_read\` | Recupera por título exacto | Cuando conocés el título |
1299
- | \`memory_list\` | Lista todos los títulos | Explorar qué hay guardado |
1300
- | \`memory_search\` | Busca por keywords | Cuando no recordás título exacto |
1301
- | \`memory_delete\` | Elimina entrada | Limpiar datos obsoletos |
1315
+ | \`voice_transcribe\` | Audio texto | Input del usuario |
1316
+ | \`voice_speak\` | Texto audio | Respuesta del asistente |
1302
1317
 
1303
1318
  ## Workflow
1304
1319
 
1305
- ### Write
1320
+ ### Voice-to-Voice
1306
1321
  \`\`\`javascript
1307
- memory_write({
1308
- title: "Preferencias de Desarrollo",
1309
- content: "TypeScript, VS Code, Prettier single quotes"
1322
+ // 1. Usuario habla
1323
+ const userAudio = receiveAudio()
1324
+
1325
+ // 2. Transcribir
1326
+ const userText = voice_transcribe({
1327
+ audio: userAudio,
1328
+ language: "auto"
1310
1329
  })
1311
- \`\`\`
1330
+ // → "¿Cuál es el clima hoy?"
1312
1331
 
1313
- ### Read/Search
1314
- \`\`\`javascript
1315
- memory_read({ title: "Preferencias" }) // Título exacto
1316
- memory_search({ query: "preferencias" }) // Fuzzy match
1332
+ // 3. Procesar request
1333
+ // - Entender intención
1334
+ // - Ejecutar acción (ej. consultar API clima)
1335
+ // - Generar respuesta
1336
+ const responseText = "Hoy hay 25 grados y soleado en Buenos Aires"
1337
+
1338
+ // 4. Sintetizar respuesta
1339
+ const responseAudio = voice_speak({
1340
+ text: responseText,
1341
+ voice_id: "eleven_flash_v2_5",
1342
+ language: "es"
1343
+ })
1344
+
1345
+ // 5. Enviar audio
1346
+ sendAudio(responseAudio)
1317
1347
  \`\`\`
1318
1348
 
1319
- ### List
1320
- \`\`\`javascript
1321
- memory_list({}) // Todos los títulos
1349
+ ## Casos de Uso
1350
+
1351
+ | Caso | Flujo |
1352
+ |------|-------|
1353
+ | Pregunta simple | Transcribe → responde → sintetiza |
1354
+ | Comando | Transcribe → ejecuta → confirma por voz |
1355
+ | Diálogo | Mantener contexto entre exchanges |
1356
+ | Wake word | Escuchar "hey bee" → activar → procesar |
1357
+
1358
+ ## Configuración
1359
+
1360
+ ### Wake Word
1361
+ \`\`\`json
1362
+ {
1363
+ "voice_wake_word": "hey bee",
1364
+ "voice_wake_enabled": true
1365
+ }
1322
1366
  \`\`\`
1323
1367
 
1324
- ### Delete
1325
- \`\`\`javascript
1326
- memory_delete({ title: "Datos Temporales" })
1368
+ ### Canal Voice
1369
+ \`\`\`json
1370
+ {
1371
+ "voice_enabled": true,
1372
+ "tts_enabled": true,
1373
+ "stt_provider": "groq-whisper",
1374
+ "tts_provider": "elevenlabs",
1375
+ "tts_voice_id": "eleven_flash_v2_5"
1376
+ }
1327
1377
  \`\`\`
1328
1378
 
1329
1379
  ## Mejores Prácticas
1330
1380
 
1331
- - Títulos descriptivos y únicos
1332
- - Agrupar datos relacionados en misma entrada
1333
- - Confirmar antes de sobrescribir
1334
- - No guardar datos sensibles
1381
+ - Respuestas cortas y naturales (<60s)
1382
+ - Mantener contexto conversacional
1383
+ - Indicadores de procesamiento
1384
+ - Fallback a texto si falla voz
1335
1385
 
1336
1386
  ## Errores a Evitar
1337
1387
 
1338
- - ❌ Datos sensibles (passwords, API keys)
1339
- - ❌ Títulos genéricos ("Config", "Datos")
1340
- - ❌ Sobrescribir sin confirmar
1341
- - ❌ Entradas gigantes (split por tema)
1388
+ - ❌ Respuestas muy largas para audio
1389
+ - ❌ Perder contexto entre exchanges
1390
+ - ❌ No indicar que está procesando
1391
+ - ❌ No tener fallback si falla TTS/STT
1342
1392
  `,
1343
1393
  },
1344
1394
  {
1345
- name: "agent_spawner",
1346
- description: `Create and manage specialized worker agents with optimal tool assignments and lifecycle control`,
1347
- category: "agents",
1348
- version: "1.1.0",
1349
- tools: ["get_available_models","find_agent","create_agent","archive_agent"],
1350
- triggers: ["creá un agente","create agent","creá un worker","create worker","nuevo agente","new agent","agente especializado","specialized agent","buscá un agente","find agent","archivá agente","archive agent","worker inactivo","inactive worker"],
1395
+ name: "voice_output",
1396
+ description: `Convert text to synthesized speech using TTS (Text-to-Speech) providers like ElevenLabs, OpenAI TTS, or Gemini TTS`,
1397
+ category: "voice",
1398
+ version: "1.0.0",
1399
+ tools: ["voice_speak"],
1400
+ triggers: ["leé esto en voz alta","read this aloud","convertí a voz","convert to speech","hablá este texto","speak this text","texto a voz","text to speech","generá audio","generate audio","síntesis de voz","voice synthesis","escuchá la respuesta","listen to response"],
1351
1401
  body: `
1352
- # Agent Spawner Skill
1402
+ # Voice Output Skill
1353
1403
 
1354
1404
  ## Cuándo se Activa
1355
1405
 
1356
- Para crear nuevos workers especializados o gestionar el ciclo de vida de agents existentes.
1406
+ Esta skill se activa cuando el usuario necesita convertir texto a voz: leer respuestas, generar audio, síntesis de voz.
1357
1407
 
1358
1408
  ## Herramientas Disponibles
1359
1409
 
1360
1410
  | Tool | Qué hace | Cuándo usarla |
1361
1411
  |------|----------|---------------|
1362
- | \`get_available_models\` | Consulta providers y modelos activos de la BD | **ANTES de crear** — seleccionar modelo óptimo |
1363
- | \`find_agent\` | Busca agents existentes | **PRIMERO** — antes de crear |
1364
- | \`create_agent\` | Crea nuevo worker | Si no existe apto |
1365
- | \`archive_agent\` | Archiva worker | Limpieza, inactivos |
1412
+ | \`voice_speak\` | Convierte texto audio | Síntesis de voz |
1366
1413
 
1367
1414
  ## Workflow
1368
1415
 
1369
- ### Crear Agent
1370
- 1. **Buscar** → \`find_agent({ search })\` — ¿existe?
1371
- 2. **Si existe** → Reutilizar
1372
- 3. **Si no existe** → \`get_available_models({ capabilities })\` — seleccionar modelo óptimo
1373
- 4. **Crear** → \`create_agent({...})\` con providerId y modelId seleccionados
1374
-
1375
- ### Create Agent Config
1416
+ ### Text-to-Speech
1376
1417
  \`\`\`javascript
1377
- // 1. Consultar modelos disponibles para coding
1378
- get_available_models({ capabilities: "coding" })
1379
- // → [{ providerId: "openai", modelId: "gpt-4o", contextWindow: 128000 }, ...]
1418
+ // 1. Recibir texto
1419
+ const text = "Hola, ¿cómo estás?"
1380
1420
 
1381
- // 2. Crear agente con modelo óptimo (providerId y modelId son OBLIGATORIOS)
1382
- create_agent({
1383
- name: "ai_coder",
1384
- description: "Especialista en código y refactorización",
1385
- system_prompt: \`
1386
- Sos desarrollador experto. Tu rol:
1387
- 1. Escribir código limpio y testeable
1388
- 2. Refactorizar código existente
1389
- 3. Revisar PRs y sugerir mejoras
1390
- \`,
1391
- tools_json: ["fs_read", "fs_write", "fs_edit", "cli_exec"],
1392
- providerId: "openai", // OBLIGATORIO - seleccionado de get_available_models
1393
- modelId: "gpt-4o", // OBLIGATORIO - seleccionado de get_available_models
1394
- tone: "professional",
1395
- max_iterations: 15
1421
+ // 2. Preprocesar
1422
+ // - Expandir números: "5" → "cinco"
1423
+ // - Expandir fechas: "01/01" → "primero de enero"
1424
+ // - Expandir abbreviaturas: "Dr." "Doctor"
1425
+
1426
+ // 3. Sintetizar
1427
+ const audio = voice_speak({
1428
+ text: optimizedText,
1429
+ voice_id: "eleven_flash_v2_5", // o configured voice
1430
+ language: "es"
1396
1431
  })
1432
+
1433
+ // 4. Entregar audio
1434
+ // - Enviar como archivo
1435
+ // - Streaming si el canal lo soporta
1397
1436
  \`\`\`
1398
1437
 
1438
+ ## Proveedores TTS Soportados
1439
+
1440
+ | Provider | Modelos | Voces |
1441
+ |----------|---------|-------|
1442
+ | ElevenLabs | Flash V2.5, Turbo V2.5, Multilingual V2, V3 | 1000+ |
1443
+ | OpenAI | tts-1, tts-1-hd, gpt-4o-mini-tts | 6+ |
1444
+ | Gemini | 2.5 Flash TTS, 2.5 Pro TTS | Multi |
1445
+ | Qwen | Qwen TTS Flash, Instruct | Multi |
1446
+
1447
+ ## Configuración por Canal
1448
+
1449
+ Cada canal configura su proveedor TTS:
1450
+ - \`tts_provider\`: "elevenlabs" | "openai-tts" | "gemini-tts"
1451
+ - \`tts_voice_id\`: ID específico de voz (ej. ElevenLabs voice ID)
1452
+
1399
1453
  ## Mejores Prácticas
1400
1454
 
1401
- - **Buscar primero**: Nunca duplicar workers
1402
- - **Consultar modelos**: Usar \`get_available_models\` ANTES de crear para seleccionar provider/model óptimo
1403
- - **System prompt específico**: Enfocado en especialidad
1404
- - **Mínimo privilegio**: Solo tools necesarias
1405
- - **Nombres descriptivos**: Que indiquen propósito
1406
- - **Modelo adecuado**: Seleccionar según capacidad requerida (coding, chat, analysis, vision)
1455
+ - Preprocesar texto para naturalidad
1456
+ - Usar voz configurada por usuario
1457
+ - Cachear respuestas frecuentes
1458
+ - Split de textos largos
1407
1459
 
1408
1460
  ## Errores a Evitar
1409
1461
 
1410
- - ❌ Crear sin buscar primero
1411
- - ❌ Crear sin consultar modelos disponibles (\`get_available_models\`)
1412
- - ❌ Usar modelo inadecuado para la tarea (ej: modelo pequeño para coding complejo)
1413
- - ❌ Tools en exceso ("por las dudas")
1414
- - ❌ System prompt genérico
1415
- - ❌ Nombres vagos ("worker1", "agent1")
1462
+ - ❌ Enviar texto crudo sin preprocesar
1463
+ - ❌ Ignorar preferencia de voz
1464
+ - ❌ No manejar límites de longitud
1465
+ - ❌ No cachear (costo API)
1466
+ `,
1467
+ },
1468
+ {
1469
+ name: "research_and_remember",
1470
+ description: `Research information from web sources and save findings to persistent memory`,
1471
+ category: "agents",
1472
+ version: "1.0.0",
1473
+ tools: ["web_search","web_fetch","memory_write"],
1474
+ triggers: ["investigá y guardá","research and save","buscá y recordá","find and remember","aprendé sobre","learn about","estudiá esto","study this","documentate y guardá","research and store"],
1475
+ body: `
1476
+ # Research and Remember Skill
1477
+
1478
+ ## Cuándo se Activa
1479
+
1480
+ Para investigar temas en la web y guardar el conocimiento sintetizado en memoria persistente.
1481
+
1482
+ ## Herramientas Disponibles
1483
+
1484
+ | Tool | Qué hace | Cuándo usarla |
1485
+ |------|----------|---------------|
1486
+ | \`web_search\` | Busca en internet | Encontrar fuentes |
1487
+ | \`web_fetch\` | Descarga contenido | Obtener detalles |
1488
+ | \`memory_write\` | Guarda conocimiento | Almacenar para futuro |
1489
+
1490
+ ## Workflow
1491
+
1492
+ 1. **Buscar** → \`web_search({ query, numResults: 8 })\`
1493
+ 2. **Fetch** → \`web_fetch({ urls: top 2-3 })\`
1494
+ 3. **Sintetizar** → Compilar hallazgos con estructura clara
1495
+ 4. **Guardar** → \`memory_write({ title, content })\`
1496
+
1497
+ ## Estructura de Conocimiento
1498
+
1499
+ \`\`\`markdown
1500
+ # {Topic}
1501
+
1502
+ ## Summary
1503
+ 2-3 oración resumen
1504
+
1505
+ ## Key Findings
1506
+ - Punto clave 1
1507
+ - Punto clave 2
1508
+ - ...
1509
+
1510
+ ## Sources
1511
+ - [Source 1](url)
1512
+ - [Source 2](url)
1513
+ \`\`\`
1514
+
1515
+ ## Mejores Prácticas
1516
+
1517
+ - Mínimo 2 searches para cobertura completa
1518
+ - Cruzar información entre fuentes múltiples
1519
+ - Incluir URLs para verificación
1520
+ - Estructura clara con headings
1521
+ - Flaggear información incierta
1522
+
1523
+ ## Errores a Evitar
1524
+
1525
+ - ❌ Una sola búsqueda (insuficiente)
1526
+ - ❌ Sin fuentes (no verificable)
1527
+ - ❌ Títulos vagos para memoria
1528
+ - ❌ No flaggear información conflictiva
1416
1529
  `,
1417
1530
  },
1418
1531
  {
@@ -1494,471 +1607,415 @@ const result = task_status({ task_id })
1494
1607
  `,
1495
1608
  },
1496
1609
  {
1497
- name: "research_and_remember",
1498
- description: `Research information from web sources and save findings to persistent memory`,
1610
+ name: "agent_spawner",
1611
+ description: `Create and manage specialized worker agents with optimal tool assignments and lifecycle control`,
1499
1612
  category: "agents",
1500
- version: "1.0.0",
1501
- tools: ["web_search","web_fetch","memory_write"],
1502
- triggers: ["investigá y guardá","research and save","buscá y recordá","find and remember","aprendé sobre","learn about","estudiá esto","study this","documentate y guardá","research and store"],
1613
+ version: "1.1.0",
1614
+ tools: ["get_available_models","find_agent","create_agent","archive_agent"],
1615
+ triggers: ["creá un agente","create agent","creá un worker","create worker","nuevo agente","new agent","agente especializado","specialized agent","buscá un agente","find agent","archivá agente","archive agent","worker inactivo","inactive worker"],
1503
1616
  body: `
1504
- # Research and Remember Skill
1617
+ # Agent Spawner Skill
1505
1618
 
1506
1619
  ## Cuándo se Activa
1507
1620
 
1508
- Para investigar temas en la web y guardar el conocimiento sintetizado en memoria persistente.
1621
+ Para crear nuevos workers especializados o gestionar el ciclo de vida de agents existentes.
1509
1622
 
1510
1623
  ## Herramientas Disponibles
1511
1624
 
1512
1625
  | Tool | Qué hace | Cuándo usarla |
1513
1626
  |------|----------|---------------|
1514
- | \`web_search\` | Busca en internet | Encontrar fuentes |
1515
- | \`web_fetch\` | Descarga contenido | Obtener detalles |
1516
- | \`memory_write\` | Guarda conocimiento | Almacenar para futuro |
1627
+ | \`get_available_models\` | Consulta providers y modelos activos de la BD | **ANTES de crear** — seleccionar modelo óptimo |
1628
+ | \`find_agent\` | Busca agents existentes | **PRIMERO** antes de crear |
1629
+ | \`create_agent\` | Crea nuevo worker | Si no existe apto |
1630
+ | \`archive_agent\` | Archiva worker | Limpieza, inactivos |
1517
1631
 
1518
1632
  ## Workflow
1519
1633
 
1520
- 1. **Buscar** → \`web_search({ query, numResults: 8 })\`
1521
- 2. **Fetch** → \`web_fetch({ urls: top 2-3 })\`
1522
- 3. **Sintetizar** → Compilar hallazgos con estructura clara
1523
- 4. **Guardar** → \`memory_write({ title, content })\`
1524
-
1525
- ## Estructura de Conocimiento
1526
-
1527
- \`\`\`markdown
1528
- # {Topic}
1529
-
1530
- ## Summary
1531
- 2-3 oración resumen
1634
+ ### Crear Agent
1635
+ 1. **Buscar** → \`find_agent({ search })\` — ¿existe?
1636
+ 2. **Si existe** → Reutilizar
1637
+ 3. **Si no existe** → \`get_available_models({ capabilities })\` — seleccionar modelo óptimo
1638
+ 4. **Crear** → \`create_agent({...})\` con providerId y modelId seleccionados
1532
1639
 
1533
- ## Key Findings
1534
- - Punto clave 1
1535
- - Punto clave 2
1536
- - ...
1640
+ ### Create Agent Config
1641
+ \`\`\`javascript
1642
+ // 1. Consultar modelos disponibles para coding
1643
+ get_available_models({ capabilities: "coding" })
1644
+ // → [{ providerId: "openai", modelId: "gpt-4o", contextWindow: 128000 }, ...]
1537
1645
 
1538
- ## Sources
1539
- - [Source 1](url)
1540
- - [Source 2](url)
1646
+ // 2. Crear agente con modelo óptimo (providerId y modelId son OBLIGATORIOS)
1647
+ create_agent({
1648
+ name: "ai_coder",
1649
+ description: "Especialista en código y refactorización",
1650
+ system_prompt: \`
1651
+ Sos desarrollador experto. Tu rol:
1652
+ 1. Escribir código limpio y testeable
1653
+ 2. Refactorizar código existente
1654
+ 3. Revisar PRs y sugerir mejoras
1655
+ \`,
1656
+ tools_json: ["fs_read", "fs_write", "fs_edit", "cli_exec"],
1657
+ providerId: "openai", // OBLIGATORIO - seleccionado de get_available_models
1658
+ modelId: "gpt-4o", // OBLIGATORIO - seleccionado de get_available_models
1659
+ tone: "professional",
1660
+ max_iterations: 15
1661
+ })
1541
1662
  \`\`\`
1542
1663
 
1543
1664
  ## Mejores Prácticas
1544
1665
 
1545
- - Mínimo 2 searches para cobertura completa
1546
- - Cruzar información entre fuentes múltiples
1547
- - Incluir URLs para verificación
1548
- - Estructura clara con headings
1549
- - Flaggear información incierta
1666
+ - **Buscar primero**: Nunca duplicar workers
1667
+ - **Consultar modelos**: Usar \`get_available_models\` ANTES de crear para seleccionar provider/model óptimo
1668
+ - **System prompt específico**: Enfocado en especialidad
1669
+ - **Mínimo privilegio**: Solo tools necesarias
1670
+ - **Nombres descriptivos**: Que indiquen propósito
1671
+ - **Modelo adecuado**: Seleccionar según capacidad requerida (coding, chat, analysis, vision)
1550
1672
 
1551
1673
  ## Errores a Evitar
1552
1674
 
1553
- - ❌ Una sola búsqueda (insuficiente)
1554
- - ❌ Sin fuentes (no verificable)
1555
- - ❌ Títulos vagos para memoria
1556
- - ❌ No flaggear información conflictiva
1675
+ - ❌ Crear sin buscar primero
1676
+ - ❌ Crear sin consultar modelos disponibles (\`get_available_models\`)
1677
+ - ❌ Usar modelo inadecuado para la tarea (ej: modelo pequeño para coding complejo)
1678
+ - ❌ Tools en exceso ("por las dudas")
1679
+ - ❌ System prompt genérico
1680
+ - ❌ Nombres vagos ("worker1", "agent1")
1557
1681
  `,
1558
1682
  },
1559
1683
  {
1560
- name: "office_document_manager",
1561
- description: `Leer, crear y manipular archivos Office (PDF, Word, Excel, PowerPoint) desde el workspace`,
1562
- category: "office",
1563
- version: "1.0.0",
1564
- tools: ["office_leer_pdf","office_escribir_pdf","office_leer_docx","office_escribir_docx","office_leer_xlsx","office_escribir_xlsx","office_leer_pptx","office_escribir_pptx"],
1565
- triggers: ["leer pdf","abrir pdf","extraer texto de pdf","pdf a texto","crear pdf","generar pdf","exportar a pdf","leer word","abrir docx","extraer texto de word","crear word","generar docx","documento word","leer excel","abrir xlsx","datos de excel","crear excel","generar xlsx","exportar a excel","leer powerpoint","abrir pptx","presentacion","diapositivas","crear presentacion","generar pptx","read pdf","open pdf","create pdf","read excel","create excel","read word","create word","read powerpoint","create presentation"],
1684
+ name: "task_orchestrator",
1685
+ description: `Orchestrate tasks across multiple workers with delegation, status tracking, and bus communication`,
1686
+ category: "agents",
1687
+ version: "1.1.0",
1688
+ tools: ["get_available_models","task_delegate","task_status","agent_find","agent_create","bus_publish","bus_read"],
1689
+ triggers: ["delegá esta tarea","delegate task","orquestá los workers","orchestrate workers","coordiná el equipo","coordinate team","estado de las tareas","task status","comunicá los workers","communicate workers","mensaje al bus","bus message","tarea en paralelo","parallel tasks"],
1566
1690
  body: `
1567
- # Office Document Manager Skill
1691
+ # Task Orchestrator Skill
1568
1692
 
1569
1693
  ## Cuándo se Activa
1570
1694
 
1571
- Esta skill se activa cuando el usuario necesita:
1572
- - **Leer** archivos PDF, Word (.docx), Excel (.xlsx) o PowerPoint (.pptx)
1573
- - **Generar** nuevos archivos en cualquiera de esos formatos
1574
- - **Convertir** contenido entre formatos (ej: texto → PDF, JSON → Excel)
1575
- - **Extraer** datos estructurados de documentos (tablas de Excel, slides de presentación)
1695
+ Para coordinar múltiples workers, delegar tareas, monitorear progreso, y facilitar comunicación worker-to-worker.
1576
1696
 
1577
1697
  ## Herramientas Disponibles
1578
1698
 
1579
1699
  | Tool | Qué hace | Cuándo usarla |
1580
1700
  |------|----------|---------------|
1581
- | \`office_leer_pdf\` | Extrae texto + metadata de PDF | Leer informes, contratos, libros en PDF |
1582
- | \`office_escribir_pdf\` | Genera PDF desde texto | Crear reportes, resúmenes, documentación |
1583
- | \`office_leer_docx\` | Extrae texto y tablas de Word | Leer documentos, contratos, informes Word |
1584
- | \`office_escribir_docx\` | Genera Word con estructura | Crear documentos formales con títulos/tablas |
1585
- | \`office_leer_xlsx\` | Lee hojas de Excel como JSON | Procesar datos, tablas, inventarios |
1586
- | \`office_escribir_xlsx\` | Genera Excel desde JSON | Exportar datos, crear reportes tabulares |
1587
- | \`office_leer_pptx\` | Extrae texto de cada slide | Resumir presentaciones, extraer contenido |
1588
- | \`office_escribir_pptx\` | Genera presentación PowerPoint | Crear slides desde datos o resúmenes |
1589
-
1590
- ## Workflow por Caso de Uso
1591
-
1592
- ### Leer y resumir un documento
1593
- 1. \`office_leer_pdf/docx/xlsx/pptx\` → extraer contenido
1594
- 2. Procesar y resumir el texto
1595
- 3. \`notify\` → enviar resumen al usuario
1596
-
1597
- ### Transformar datos a Excel
1598
- 1. Obtener datos (de memoria, herramienta o cálculo)
1599
- 2. Estructurar en \`hojas\` con \`datos\` como array de objetos
1600
- 3. \`office_escribir_xlsx\` → generar archivo
1601
- 4. Confirmar ruta al usuario
1602
-
1603
- ### Crear un informe PDF
1604
- 1. Compilar el contenido del informe como texto
1605
- 2. \`office_escribir_pdf\` → generar con título y márgenes
1606
- 3. Confirmar que el archivo quedó en la ruta esperada
1607
-
1608
- ### Generar una presentación
1609
- 1. Definir estructura: título + array de slides (título + puntos)
1610
- 2. \`office_escribir_pptx\` → generar .pptx
1611
- 3. Opcional: incluir notas del presentador en cada slide
1612
-
1613
- ## Parámetros Clave
1614
-
1615
- ### \`parrafos\` para DOCX
1616
- \`\`\`json
1617
- [
1618
- { "texto": "Capítulo 1", "tipo": "titulo1" },
1619
- { "texto": "Subtítulo", "tipo": "titulo2" },
1620
- { "texto": "Contenido normal", "tipo": "parrafo" },
1621
- { "texto": "Ítem de lista", "tipo": "lista" },
1622
- { "texto": "Texto importante", "tipo": "parrafo", "negrita": true }
1623
- ]
1624
- \`\`\`
1625
-
1626
- ### \`hojas\` para XLSX
1627
- \`\`\`json
1628
- [
1629
- {
1630
- "nombre": "Ventas",
1631
- "datos": [
1632
- { "Mes": "Enero", "Total": 5000 },
1633
- { "Mes": "Febrero", "Total": 6200 }
1634
- ]
1635
- }
1636
- ]
1637
- \`\`\`
1638
-
1639
- ### \`diapositivas\` para PPTX
1640
- \`\`\`json
1641
- [
1642
- {
1643
- "titulo": "¿Qué es Machine Learning?",
1644
- "puntos": ["Subcampo de IA", "Aprende de datos", "Hace predicciones"],
1645
- "notas": "Mencionar el enfoque supervisado y no supervisado"
1646
- }
1647
- ]
1648
- \`\`\`
1649
-
1650
- ## Errores a Evitar
1701
+ | \`get_available_models\` | Consulta providers y modelos activos | Al crear workers seleccionar modelo óptimo |
1702
+ | \`agent_find\` | Busca workers disponibles | Antes de delegar |
1703
+ | \`agent_create\` | Crea nuevo worker | Si no hay uno adecuado |
1704
+ | \`task_delegate\` | Asigna y EJECUTA tarea | Delegar con ejecución inmediata |
1705
+ | \`task_status\` | Verifica estado de tareas | Monitorear progreso |
1706
+ | \`bus_publish\` | Publica mensaje | Coordinación worker-to-worker |
1707
+ | \`bus_read\` | Lee mensajes del bus | Ver solicitudes de workers |
1651
1708
 
1652
- - ❌ Intentar leer un archivo que no existe (verifica con \`fs_exists\` primero)
1653
- - ❌ Sobrescribir sin confirmar cuando el archivo destino ya existe
1654
- - ❌ Usar \`contenido\` y \`puntos\` a la vez en PPTX — \`puntos\` tiene prioridad
1655
- - ❌ Pasar un array de arrays como \`datos\` de XLSX cuando se esperan objetos con claves
1656
- - ❌ Intentar leer PDF de más de 100 páginas sin especificar rango (usar \`pagina_inicio\`/\`pagina_fin\`)
1657
- `,
1658
- },
1659
- {
1660
- name: "busqueda_fts5",
1661
- description: `Core discovery skill - find any capability with a single keyword`,
1662
- category: "core",
1663
- version: "1.2.0",
1664
- tools: ["search_knowledge"],
1665
- triggers: ["cómo busco herramientas","cómo encuentro skills","how to find tools","search knowledge","discovery","buscar en la base","encontrar herramientas"],
1666
- body: `
1667
- # busqueda_fts5 — Sistema de Discovery
1709
+ ## Workflow
1668
1710
 
1669
- Arrancás con solo 4 herramientas. Todo lo demás se descubre con **search_knowledge**.
1711
+ ### Delegación
1712
+ 1. **Consultar modelos** → \`get_available_models({ capabilities })\` — si necesita crear workers
1713
+ 2. **Buscar worker** → \`agent_find({ search })\`
1714
+ 3. **Si no existe** → \`agent_create({...})\` — con providerId y modelId OBLIGATORIOS
1715
+ 4. **Delegar** → \`task_delegate({ worker_id, task_description, task_id?, project_id? })\` — **BLOQUEANTE**
1716
+ 5. **Resultado retornado** → Worker ejecuta inmediatamente y devuelve resultado
1670
1717
 
1671
- ## Regla de oro: UNA PALABRA, busca TODO
1718
+ ### Create Agent Config (providerId y modelId son OBLIGATORIOS)
1719
+ \`\`\`javascript
1720
+ // 1. Consultar modelos disponibles
1721
+ get_available_models({ capabilities: "analysis" })
1722
+ // → [{ providerId: "anthropic", modelId: "claude-sonnet-4-6", contextWindow: 200000 }, ...]
1672
1723
 
1724
+ // 2. Crear worker con modelo óptimo
1725
+ agent_create({
1726
+ name: "data_analyst",
1727
+ description: "Especialista en análisis de datos y visualización",
1728
+ system_prompt: "Sos analista de datos experto...",
1729
+ tools_json: ["web_search", "web_fetch", "save_note"],
1730
+ providerId: "anthropic", // OBLIGATORIO
1731
+ modelId: "claude-sonnet-4-6", // OBLIGATORIO
1732
+ tone: "analytical"
1733
+ })
1673
1734
  \`\`\`
1674
- search_knowledge(query="email")
1675
- \`\`\`
1676
-
1677
- Eso solo — sin type, sin frases largas — devuelve tools, skills, MCP y playbook relacionados con "email".
1678
-
1679
- **NO hagas esto:** \`search_knowledge(type="tools", query="enviar correo electrónico")\` — AND entre palabras no encuentra nada.
1680
1735
 
1681
- **SÍ hagas esto:** \`search_knowledge(query="email")\` — encuentra todo lo relacionado.
1736
+ ### Monitoreo
1737
+ 1. **Check estado** → \`task_status({ task_ids })\`
1738
+ 2. **Publicar coordinación** → \`bus_publish()\` si needed
1739
+ 3. **Leer bus** → \`bus_read()\` para respuestas
1682
1740
 
1683
- ## Cuándo especificar type
1741
+ ## Agent Bus Communication
1684
1742
 
1685
- Solo si querés filtrar resultados que ya son muchos:
1743
+ \`\`\`javascript
1744
+ // Worker notifica completado:
1745
+ bus_publish({
1746
+ event_type: "task_complete",
1747
+ to_worker_id: "next_worker",
1748
+ content: "Research done. Found 7 trends. Ready for content generation."
1749
+ })
1686
1750
 
1751
+ // Worker solicita contexto:
1752
+ bus_read() → [{ from: "writer", content: "Need research results" }]
1687
1753
  \`\`\`
1688
- search_knowledge(query="email", type="mcp") → solo herramientas externas de email
1689
- search_knowledge(query="email", type="tools") → solo herramientas nativas de email
1690
- \`\`\`
1691
-
1692
- Por defecto type="all" — no hace falta especificarlo.
1693
1754
 
1694
- ## Regla de prioridad
1695
-
1696
- **Preferí herramientas nativas sobre MCP** cuando ambas sirven.
1697
- - Nativas: más rápidas, sin red, siempre disponibles
1698
- - MCP: cuando no hay equivalente nativo
1699
-
1700
- ## Flujo de uso
1701
-
1702
- 1. Identificá la palabra clave de lo que necesitás
1703
- 2. \`search_knowledge(query="<palabra>")\` → resultados de todos los tipos
1704
- 3. Las tools encontradas se inyectan automáticamente en tu contexto
1705
- 4. Usás las tools en el siguiente paso
1755
+ ## Mejores Prácticas
1706
1756
 
1707
- ---
1757
+ - \`task_delegate\` es bloqueante — el resultado llega en el retorno de la tool
1758
+ - Consultar modelos disponibles antes de crear workers (\`get_available_models\`)
1759
+ - Asignar workers por especialidad (\`agent_find\`)
1760
+ - Usar \`bus_publish\` / \`bus_read\` para coordinación entre workers
1761
+ - Pasar \`task_id\` y \`project_id\` a \`task_delegate\` para auto-tracking de progreso
1762
+ - Seleccionar modelo según capacidad: coding → modelos grandes, chat → modelos rápidos
1708
1763
 
1709
- ## Ejemplos
1764
+ ## Errores a Evitar
1710
1765
 
1711
- \`\`\`
1712
- search_knowledge(query="pdf") tools para leer/escribir PDFs
1713
- search_knowledge(query="browser") tools de navegación web
1714
- search_knowledge(query="github") → tools MCP de GitHub si están configuradas
1715
- search_knowledge(query="calendar") → tools de Google Calendar
1716
- search_knowledge(query="canvas") → skills de visualización
1717
- search_knowledge(query="slack") → tools de Slack si están configuradas
1718
- \`\`\`
1766
+ - ❌ Usar \`delegate_task\` (no existe) — usar \`task_delegate\`
1767
+ - ❌ Usar \`find_agent\` (no existe) usar \`agent_find\`
1768
+ - ❌ Usar \`publish_to_bus\` / \`get_bus_messages\` (no existen) usar \`bus_publish\` / \`bus_read\`
1769
+ - Usar \`get_task_status\` (no existe) usar \`task_status\`
1770
+ - No consultar modelos disponibles antes de crear workers
1771
+ - No monitorear estado de tasks
1772
+ - No coordinar workers cuando hay dependencias
1719
1773
  `,
1720
1774
  },
1721
1775
  {
1722
- name: "file_writer",
1723
- description: `Create, modify, and delete files with safe edit operations and confirmation for large changes`,
1724
- category: "filesystem",
1776
+ name: "memory_manager",
1777
+ description: `Complete management of persistent memory including write, read, search, list, and delete operations`,
1778
+ category: "agents",
1725
1779
  version: "1.0.0",
1726
- tools: ["project_read","project_write","project_edit","project_exists"],
1727
- triggers: ["creá un archivo","create a file","escribí en","write to","editá este archivo","edit this file","modificá","modify","eliminá el archivo","delete file","guardá esto","save this","actualizá el archivo","update file"],
1780
+ tools: ["memory_write","memory_read","memory_list","memory_search","memory_delete"],
1781
+ triggers: ["guardá en memoria","save to memory","recordá esto","remember this","leé la memoria","read memory","qué hay en memoria","what's in memory","buscá en memoria","search memory","lista las memorias","list memories","eliminá de memoria","delete from memory","preferencias","preferences","datos persistentes","persistent data"],
1728
1782
  body: `
1729
- # File Writer Skill
1783
+ # Memory Manager Skill
1730
1784
 
1731
1785
  ## Cuándo se Activa
1732
1786
 
1733
- Esta skill se activa cuando el usuario necesita:
1734
- - Crear nuevos archivos
1735
- - Modificar contenido existente
1736
- - Eliminar archivos
1737
- - Guardar cambios
1787
+ Para guardar, recuperar, buscar, listar o eliminar información persistente entre sesiones.
1738
1788
 
1739
1789
  ## Herramientas Disponibles
1740
1790
 
1741
1791
  | Tool | Qué hace | Cuándo usarla |
1742
1792
  |------|----------|---------------|
1743
- | \`project_read\` | Lee archivo existente | Antes de editar para entender estructura |
1744
- | \`project_write\` | Crea o sobreescribe archivo | Archivos nuevos o reescritura completa |
1745
- | \`project_edit\` | Edita secciones específicas | Cambios puntuales (find/replace) |
1746
- | \`project_exists\` | Verifica existencia | Para decidir crear vs editar |
1793
+ | \`memory_write\` | Almacena con título único | Guardar preferencias, datos |
1794
+ | \`memory_read\` | Recupera por título exacto | Cuando conocés el título |
1795
+ | \`memory_list\` | Lista todos los títulos | Explorar qué hay guardado |
1796
+ | \`memory_search\` | Busca por keywords | Cuando no recordás título exacto |
1797
+ | \`memory_delete\` | Elimina entrada | Limpiar datos obsoletos |
1747
1798
 
1748
1799
  ## Workflow
1749
1800
 
1750
- ### Crear Archivo Nuevo
1751
- 1. \`project_exists({ path })\` → verificar no existe
1752
- 2. \`project_write({ path, content })\` → crear
1801
+ ### Write
1802
+ \`\`\`javascript
1803
+ memory_write({
1804
+ title: "Preferencias de Desarrollo",
1805
+ content: "TypeScript, VS Code, Prettier single quotes"
1806
+ })
1807
+ \`\`\`
1753
1808
 
1754
- ### Editar Archivo Existente
1755
- 1. \`project_exists({ path })\` → verificar existe
1756
- 2. \`project_read({ path })\` entender estructura
1757
- 3. \`project_edit({ path, old_string, new_string })\` modificar
1758
- 4. \`canvas_confirm()\` si cambios >50 líneas
1809
+ ### Read/Search
1810
+ \`\`\`javascript
1811
+ memory_read({ title: "Preferencias" }) // Título exacto
1812
+ memory_search({ query: "preferencias" }) // Fuzzy match
1813
+ \`\`\`
1759
1814
 
1760
- ### Eliminar Archivo
1761
- 1. \`project_exists({ path })\` → verificar existe
1762
- 2. \`canvas_confirm({ message: '¿Eliminar archivo?' })\` confirmar
1763
- 3. Operación de delete
1815
+ ### List
1816
+ \`\`\`javascript
1817
+ memory_list({}) // Todos los títulos
1818
+ \`\`\`
1819
+
1820
+ ### Delete
1821
+ \`\`\`javascript
1822
+ memory_delete({ title: "Datos Temporales" })
1823
+ \`\`\`
1764
1824
 
1765
1825
  ## Mejores Prácticas
1766
1826
 
1767
- - **Leer antes de editar**: Nunca modificar sin entender estructura
1768
- - **Edit vs Write**: Usar edit para cambios pequeños, write para nuevos archivos
1769
- - **Confirmar cambios grandes**: >50 líneas requiere confirmación explícita
1770
- - **Paths seguros**: Trabajar dentro del workspace por defecto
1827
+ - Títulos descriptivos y únicos
1828
+ - Agrupar datos relacionados en misma entrada
1829
+ - Confirmar antes de sobrescribir
1830
+ - No guardar datos sensibles
1771
1831
 
1772
1832
  ## Errores a Evitar
1773
1833
 
1774
- - ❌ Editar sin leer primero
1775
- - ❌ Sobreescribir sin confirmar si es cambio grande
1776
- - ❌ Eliminar sin confirmación explícita
1777
- - ❌ Usar write cuando edit es suficiente
1834
+ - ❌ Datos sensibles (passwords, API keys)
1835
+ - ❌ Títulos genéricos ("Config", "Datos")
1836
+ - ❌ Sobrescribir sin confirmar
1837
+ - ❌ Entradas gigantes (split por tema)
1778
1838
  `,
1779
1839
  },
1780
1840
  {
1781
- name: "file_read_and_summarize",
1782
- description: `Read and understand file content with automatic summarization for large files`,
1783
- category: "filesystem",
1841
+ name: "meeting_transcription",
1842
+ description: `Transcribir reuniones en tiempo real y generar informes gerenciales con decisiones, action items y próximos pasos`,
1843
+ category: "meeting",
1784
1844
  version: "1.0.0",
1785
- tools: ["project_read"],
1786
- triggers: ["leé este archivo","read this file","mostrame el contenido","show content","qué dice este archivo","resumí este archivo","summarize this file","entendé este código","understand this code"],
1845
+ tools: ["meeting_start","meeting_add_segment","meeting_stop","meeting_report","office_escribir_docx","notify","report_progress"],
1846
+ triggers: ["transcribir reunión","iniciar transcripción","meeting transcription","grabar reunión","iniciar reunión","start meeting","detener reunión","stop meeting","reporte de reunión","generar reporte reunión","informe de reunión","acta de reunión","transcripción de reunión","meeting report"],
1787
1847
  body: `
1788
- # File Read and Summarize Skill
1848
+ # Meeting Transcription Skill
1789
1849
 
1790
1850
  ## Cuándo se Activa
1791
1851
 
1792
- Esta skill se activa cuando el usuario necesita leer y entender el contenido de un archivo, especialmente cuando:
1793
- - El archivo es grande y necesita resumen
1794
- - Se requiere comprensión del contenido (no solo lectura)
1795
- - El usuario pide "qué dice", "resumí", "entendé"
1852
+ Esta skill se activa para gestión completa del ciclo de vida de una reunión: inicio, transcripción en tiempo real, detención y generación de informe gerencial.
1796
1853
 
1797
1854
  ## Herramientas Disponibles
1798
1855
 
1799
1856
  | Tool | Qué hace | Cuándo usarla |
1800
1857
  |------|----------|---------------|
1801
- | \`project_read\` | Lee contenido de archivo del workspace | Lectura de cualquier archivo |
1858
+ | \`meeting_start\` | Crea una sesión en DB devuelve session_id | Al iniciar la reunión |
1859
+ | \`meeting_add_segment\` | Transcribe un chunk de audio y lo persiste | Por cada audio recibido |
1860
+ | \`meeting_stop\` | Marca la sesión como detenida | Cuando termina la reunión |
1861
+ | \`meeting_report\` | Lee todos los segmentos y arma el transcript | Para generar el reporte |
1862
+ | \`office_escribir_docx\` | Guarda el reporte como archivo Word | Al finalizar el análisis |
1863
+ | \`notify\` | Envía mensajes en tiempo real al canal | Para mostrar transcripciones y el reporte |
1864
+ | \`report_progress\` | Muestra progreso en barra | Durante transcripción larga |
1802
1865
 
1803
- ## Workflow
1866
+ ## Workflow Completo
1804
1867
 
1805
- 1. **Verificar existencia** → \`project_exists({ path })\`
1806
- 2. **Leer contenido** → \`project_read({ path, offset, limit })\`
1807
- 3. **Sintetizar** Resumir si es grande, extraer puntos clave
1868
+ \`\`\`
1869
+ Usuario: "transcribir reunión"
1870
+ Agente pregunta título
1871
+ → meeting_start(title) → session_id: "abc123"
1872
+ → Agente: "✅ Sesión abc123 iniciada. Habla cuando quieras."
1808
1873
 
1809
- ## Mejores Prácticas
1874
+ [Usuario graba audio en la UI]
1875
+ → meeting_add_segment(session_id, audio_base64)
1876
+ → notify: "[Speaker]: Texto transcrito..."
1810
1877
 
1811
- - Para archivos >1000 líneas, usar \`offset\` y \`limit\`
1812
- - Identificar tipo de archivo por extensión y adaptar formato de resumen
1813
- - Para código: identificar funciones, clases, exports principales
1814
- - Para config: explicar settings clave en lenguaje simple
1815
- - Para texto: extraer ideas principales
1878
+ Usuario: "detener reunión"
1879
+ meeting_stop(session_id)
1880
+ Agente: "⏹️ 47 segmentos transcritos. ¿Genero el reporte?"
1816
1881
 
1817
- ## Errores a Evitar
1882
+ Usuario: "sí"
1883
+ → meeting_report(session_id) → transcript completo
1884
+ → LLM analiza → secciones estructuradas
1885
+ → office_escribir_docx → informe_reunion_abc123.docx
1886
+ → notify: [Markdown del informe completo]
1887
+ → Agente: "✅ DOCX guardado en workspace."
1888
+ \`\`\`
1818
1889
 
1819
- - Leer sin verificar existencia
1820
- - ❌ Retornar archivo completo sin resumir si es muy grande
1821
- - No identificar tipo de archivo para adaptar resumen
1890
+ ## Formato del Informe Gerencial
1891
+
1892
+ El informe generado incluye:
1893
+
1894
+ 1. **Resumen Ejecutivo** — Captura la esencia en 3-5 oraciones
1895
+ 2. **Participantes** — Detectados automáticamente del transcript
1896
+ 3. **Decisiones Tomadas** — Lista numerada de cada decisión
1897
+ 4. **Action Items** — Tabla con Tarea / Responsable / Fecha
1898
+ 5. **Próximos Pasos** — Acciones inmediatas
1899
+ 6. **Temas de Seguimiento** — Pendientes para futuras reuniones
1900
+
1901
+ ## Consideraciones
1902
+
1903
+ - El informe se entrega en dos formatos: **Markdown en chat** + **DOCX descargable**
1904
+ - El idioma del informe es siempre **español**
1905
+ - La latencia de transcripción es ~4s por chunk de 3s de audio (normal para Whisper)
1906
+ - El session_id debe conservarse durante toda la reunión
1822
1907
  `,
1823
1908
  },
1824
1909
  {
1825
- name: "file_manager",
1826
- description: `Explore project structure and locate files using glob patterns and directory listing`,
1827
- category: "filesystem",
1910
+ name: "cli_safe_exec",
1911
+ description: `Execute shell commands safely with error handling, timeouts, and output validation`,
1912
+ category: "cli",
1828
1913
  version: "1.0.0",
1829
- tools: ["fs_list","fs_glob","fs_exists"],
1830
- triggers: ["lista los archivos","list files","buscá archivos","find files","explorá el proyecto","explore project","qué archivos hay","what files exist","buscá por patrón","search by pattern","existe este archivo","file exists","dónde está","where is"],
1914
+ tools: ["exec","terminal"],
1915
+ triggers: ["ejecutá este comando","run this command","corré el comando","execute command","terminal","bash","shell","npm","yarn","bun","git","docker","comando de sistema","system command"],
1831
1916
  body: `
1832
- # File Manager Skill
1917
+ # CLI Safe Exec Skill
1833
1918
 
1834
1919
  ## Cuándo se Activa
1835
1920
 
1836
- Esta skill se activa cuando el usuario necesita:
1837
- - Explorar la estructura del proyecto
1838
- - Buscar archivos por extensión o patrón
1839
- - Verificar si existe un archivo o directorio
1840
- - Encontrar la ubicación de un archivo
1921
+ Para ejecutar comandos de shell de forma segura con manejo de errores y timeouts.
1841
1922
 
1842
1923
  ## Herramientas Disponibles
1843
1924
 
1844
1925
  | Tool | Qué hace | Cuándo usarla |
1845
1926
  |------|----------|---------------|
1846
- | \`fs_list\` | Lista directorios y archivos | Exploración inicial |
1847
- | \`fs_glob\` | Busca archivos por patrón wildcard | Búsqueda por extensión/patrón |
1848
- | \`fs_exists\` | Verifica existencia | Pre-check antes de operaciones |
1927
+ | \`exec\` | Ejecuta con validación y timeout | Comandos simples (<30s) |
1928
+ | \`terminal\` | Ejecuta con entorno completo | Comandos complejos, Git, npm |
1929
+
1930
+ ## ⚠️ ADVERTENCIA CRÍTICA
1931
+
1932
+ **NUNCA usar para tareas programadas** — usar \`cron.create\` en su lugar.
1849
1933
 
1850
1934
  ## Workflow
1851
1935
 
1852
- 1. **Explorar** → \`fs_list({ path })\` para estructura general
1853
- 2. **Buscar por patrón** → \`fs_glob({ pattern })\` para tipos específicos
1854
- 3. **Verificar** → \`fs_exists({ path })\` para confirmación
1936
+ 1. **Validar** → Comando es seguro, no destructivo
1937
+ 2. **Ejecutar** → \`exec\` o \`terminal\` con timeout apropiado
1938
+ 3. **Parsear** → Check exitCode, stdout, stderr
1939
+ 4. **Manejar error** → Si falló, analizar y sugerir fixes
1855
1940
 
1856
- ## Patrones Glob Comunes
1941
+ ## Timeouts Apropiados
1857
1942
 
1858
- | Patrón | Encuentra |
1859
- |--------|-----------|
1860
- | \`**/*.ts\` | Todos los TypeScript |
1861
- | \`**/*.test.ts\` | Solo tests |
1862
- | \`**/*.md\` | Documentación |
1863
- | \`**/package.json\` | Todos los package.json |
1864
- | \`src/**/*.tsx\` | React components en src |
1943
+ | Tipo | Timeout |
1944
+ |------|---------|
1945
+ | Listar archivos | 10s |
1946
+ | Git operations | 30s |
1947
+ | npm install | 120s |
1948
+ | npm run build | 120s |
1949
+ | npm test | 180s |
1950
+ | Docker builds | 300s |
1865
1951
 
1866
1952
  ## Errores a Evitar
1867
1953
 
1868
- - ❌ No verificar existencia antes de leer/editar
1869
- - ❌ Usar fs_list cuando se conoce el patrón (usar glob)
1870
- - ❌ Patrones muy amplios sin filtrado
1954
+ - ❌ Usar para cron (usar cron.create)
1955
+ - ❌ Sin timeout apropiado
1956
+ - ❌ Ignorar exitCode
1957
+ - ❌ Comandos destructivos sin confirmar
1871
1958
  `,
1872
1959
  },
1873
1960
  {
1874
- name: "cron_manager",
1875
- description: `Complete management of cron jobs with cron expressions. Create, list, update, pause, resume, delete, trigger, and view history. Use for reminders, automated reports, periodic checks.`,
1876
- category: "cron",
1877
- version: "2.0.0",
1878
- tools: ["cron.create","cron.list","cron.update","cron.delete","cron.pause","cron.resume","cron.trigger","cron.history"],
1879
- triggers: ["programá una tarea","schedule task","creá un cron","create cron","editá el cron","edit cron","eliminá el cron","remove cron","lista las tareas","list cron jobs","modificá el cron","modify cron","tarea recurrente","recurring task","todos los días","daily","cada semana","weekly"],
1961
+ name: "cli_pipeline",
1962
+ description: `Execute shell commands and pipe output to files for logging and further processing`,
1963
+ category: "cli",
1964
+ version: "1.0.0",
1965
+ tools: ["exec","terminal","project_write"],
1966
+ triggers: ["guardá el output","save output","pipeline","pipe to file","redireccioná el output","redirect output","log del comando","command log","ejecutá y guardá","run and save","resultado en archivo","result to file"],
1880
1967
  body: `
1881
- # Cron Manager Skill
1968
+ # CLI Pipeline Skill
1882
1969
 
1883
1970
  ## Cuándo se Activa
1884
1971
 
1885
- Para gestionar tareas programadas (cron jobs): crear, listar, actualizar, pausar, reanudar, eliminar, ejecutar y ver historial.
1972
+ Para ejecutar comandos y guardar el output en archivos para logging o procesamiento posterior.
1886
1973
 
1887
1974
  ## Herramientas Disponibles
1888
1975
 
1889
1976
  | Tool | Qué hace | Cuándo usarla |
1890
1977
  |------|----------|---------------|
1891
- | \`cron.create\` | Crear cron job | Nueva tarea |
1892
- | \`cron.list\` | Listar todos | Ver existentes |
1893
- | \`cron.update\` | Actualizar existente | Cambiar horario/instrucción |
1894
- | \`cron.pause\` | Pausar temporalmente | Sin eliminar |
1895
- | \`cron.resume\` | Reanudar pausado | Continuar ejecución |
1896
- | \`cron.delete\` | Eliminar permanentemente | Cancelar para siempre |
1897
- | \`cron.trigger\` | Ejecutar ahora | Forzar ejecución |
1898
- | \`cron.history\` | Ver historial | Ver logs de ejecuciones |
1899
-
1900
- ## Campos Principales
1901
-
1902
- | Campo | Tipo | Descripción |
1903
- |-------|------|-------------|
1904
- | \`name\` | string | Identificador corto (e.g., 'daily-report') |
1905
- | \`task\` | string | **REQUERIDO** - Instrucciones para el agente al ejecutarse |
1906
- | \`task_type\` | string | 'recurring' (repite) o 'one_shot' (una vez) |
1907
- | \`cron_expression\` | string | Expresión cron (solo para recurring) |
1908
- | \`fire_at\` | string | Datetime ISO (solo para one_shot) |
1909
- | \`channel\` | string | Canal de notificación |
1910
- | \`start_at\` | string | Inicio de ventana opcional (Croner startAt) |
1911
- | \`stop_at\` | string | Fin de ventana opcional (Croner stopAt) |
1912
- | \`dom_and_dow\` | number | 0=OR (default), 1=AND (día mes + día semana) |
1913
-
1914
- ## Cron Expression Format
1978
+ | \`exec\` | Ejecuta comando | Comandos simples |
1979
+ | \`terminal\` | Ejecuta con entorno | Comandos complejos |
1980
+ | \`project_write\` | Escribe archivo | Guardar output |
1915
1981
 
1916
- \`\`\`
1917
- * * * * *
1918
- │ │ │ │ │
1919
- │ │ │ │ └── Día semana (0-6, 0=Domingo)
1920
- │ │ │ └──── Mes (1-12)
1921
- │ │ └────── Día del mes (1-31)
1922
- │ └──────── Hora (0-23)
1923
- └────────── Minuto (0-59)
1924
- \`\`\`
1982
+ ## Workflow
1925
1983
 
1926
- ## Ejemplos Comunes
1984
+ 1. **Validar comando** → Seguro para ejecución
1985
+ 2. **Ejecutar** → Capturar stdout + stderr
1986
+ 3. **Formatear** → Agregar timestamp, comando, metadata
1987
+ 4. **Escribir** → \`project_write({ path, content })\`
1927
1988
 
1928
- | Expresión | Significado |
1929
- |-----------|-------------|
1930
- | \`0 9 * * *\` | Diario 9:00 AM |
1931
- | \`0 7 * * 1-5\` | Lun-Vie 7:00 AM |
1932
- | \`0 */2 * * *\` | Cada 2 horas |
1933
- | \`0 0 * * 0\` | Domingos medianoche |
1934
- | \`0 0 1 * *\` | Día 1 de cada mes |
1989
+ ## Formato de Log
1935
1990
 
1936
- ## Cómo Usar start_at / stop_at
1991
+ \`\`\`markdown
1992
+ # Command Log
1937
1993
 
1938
- - \`start_at\`: La tarea no ejecuta antes de esta fecha
1939
- - \`stop_at\`: La tarea no ejecuta después de esta fecha
1940
- - Formato ISO: \`'2026-04-01T00:00:00'\`
1994
+ **Command**: npm install
1995
+ **Timestamp**: 2025-03-09 14:30:00
1996
+ **Exit Code**: 0
1997
+ **Execution Time**: 45.2s
1941
1998
 
1942
- ## Cómo Usar dom_and_dow
1999
+ ---
1943
2000
 
1944
- - \`0\` (default): Se ejecuta si es el día del mes O el día de semana
1945
- - \`1\`: Se ejecuta solo si es EL MISMO día del mes Y el día de semana
2001
+ ## Output
1946
2002
 
1947
- Ejemplo: \`0 9 15 * *\` con dom_and_dow=1 significa "los 15 de cada mes QUE SEA domingo"
2003
+ [stdout content...]
2004
+ [stderr if any...]
2005
+ \`\`\`
1948
2006
 
1949
- ## Workflow para Crear
2007
+ ## Mejores Prácticas
1950
2008
 
1951
- 1. **Preguntar** ¿one_shot o recurring?
1952
- 2. **Obtener** Hora y canal de notificación
1953
- 3. **Crear** \`cron.create\` con campo \`task\` obligatorio
1954
- 4. **Confirmar** \`cron.list\` mostrar next runs
2009
+ - Filenames con timestamp para tracking
2010
+ - Incluir metadata completa (exitCode, tiempo)
2011
+ - Capturar stdout y stderr
2012
+ - Para outputs grandes, escribir incrementalmente
1955
2013
 
1956
2014
  ## Errores a Evitar
1957
2015
 
1958
- - ❌ Olvidar el campo \`task\` — es obligatorio
1959
- - ❌ Usar exec para tareas programadas
1960
- - ❌ No preguntar si es one_shot o recurring
1961
- - ❌ No mostrar próximos horarios al crear
1962
- - ❌ Llamar \`cron.update\` sin \`task_id\` — siempre hacer \`cron.list\` primero`,
2016
+ - ❌ No incluir metadata en log
2017
+ - ❌ Filenames genéricos sin timestamp
2018
+ - ❌ No capturar stderr
2019
+ `,
1963
2020
  },
1964
2021
  ];