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