@johpaz/hive-agents 0.0.38 → 0.0.39

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