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