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