@johpaz/hive-agents 0.0.35 → 0.0.36
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 +64 -39
- package/dist/hive.js +3127 -3104
- package/dist/ui/assets/{AgentCreateForm-B4eK7efF.js → AgentCreateForm-tJZv9FZC.js} +1 -1
- package/dist/ui/assets/{AgentDetailPage-BD2uoJWk.js → AgentDetailPage-Du-mRcAX.js} +1 -1
- package/dist/ui/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/assets/{AgentsPage-4JUZXvkA.js → AgentsPage-YvSgWRiw.js} +6 -6
- package/dist/ui/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/assets/{ChannelsPage-BUn7-nhV.js → ChannelsPage-BdBXWHjj.js} +1 -1
- package/dist/ui/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/assets/{LoginPage-C8j_urUD.js → LoginPage-CAmSI9Vy.js} +1 -1
- package/dist/ui/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/assets/{NotFound-Drh-sJPN.js → NotFound-BMeQSGcG.js} +1 -1
- package/dist/ui/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/assets/{RecoverPage-DNb1Pr8h.js → RecoverPage-DpW3l-yv.js} +1 -1
- package/dist/ui/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/assets/{WebChatPage-R-YOwA4F.js → WebChatPage-CVRcKept.js} +2 -2
- package/dist/ui/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/assets/{alert-U8FsgWi7.js → alert-C-NE-P3s.js} +1 -1
- package/dist/ui/assets/{alert-dialog-CRdMkkmk.js → alert-dialog-C5mzbHdP.js} +1 -1
- package/dist/ui/assets/{badge-Cli1jnH5.js → badge-ChpACfWO.js} +1 -1
- package/dist/ui/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/assets/{dialog-DQ3s-LuO.js → dialog-QnZ0ad8O.js} +1 -1
- package/dist/ui/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/assets/{es-DcMjrpbA.js → es-NQNoaWDx.js} +1 -1
- package/dist/ui/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/assets/{label-0BvGVXvZ.js → label-D2H1IR_J.js} +1 -1
- package/dist/ui/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/assets/{slider-D47dOrRa.js → slider-CsiUDxc3.js} +1 -1
- package/dist/ui/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/assets/{table-DhowbNxQ.js → table-CSc8ubon.js} +1 -1
- package/dist/ui/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/assets/{vendor-radix-JY4ncZrD.js → vendor-radix-cw1bQaVC.js} +4 -4
- package/dist/ui/assets/{vendor-react-CscwQerf.js → vendor-react-D4s9E-zj.js} +1 -1
- package/dist/ui/dist/assets/AgentCreateForm-tJZv9FZC.js +1 -0
- package/dist/ui/dist/assets/AgentDetailPage-Du-mRcAX.js +1 -0
- package/dist/ui/dist/assets/AgentNewPage-DIFYd_Ys.js +1 -0
- package/dist/ui/dist/assets/AgentsPage-YvSgWRiw.js +10 -0
- package/dist/ui/dist/assets/CanvasPage-DtMwGvxf.js +33 -0
- package/dist/ui/dist/assets/ChannelsPage-BdBXWHjj.js +8 -0
- package/dist/ui/dist/assets/DashboardPage-ghl1ZguH.js +6 -0
- package/dist/ui/dist/assets/LoginPage-CAmSI9Vy.js +1 -0
- package/dist/ui/dist/assets/LogsPage-DAPBHkwK.js +1 -0
- package/dist/ui/dist/assets/MeetingPage-WjjGOqqU.js +1 -0
- package/dist/ui/dist/assets/NotFound-BMeQSGcG.js +1 -0
- package/dist/ui/dist/assets/ProvidersPage-Ct6HsAi1.js +1 -0
- package/dist/ui/dist/assets/RecoverPage-DpW3l-yv.js +1 -0
- package/dist/ui/dist/assets/SettingsPage-DBJ7_E6C.js +9 -0
- package/dist/ui/dist/assets/SetupPage-DKmLVUaj.js +1 -0
- package/dist/ui/dist/assets/WebChatPage-CVRcKept.js +16 -0
- package/dist/ui/dist/assets/accordion-C5d5Rm5z.js +1 -0
- package/dist/ui/dist/assets/activity-c3pNngT_.js +1 -0
- package/dist/ui/dist/assets/alert-C-NE-P3s.js +1 -0
- package/dist/ui/dist/assets/alert-dialog-C5mzbHdP.js +1 -0
- package/dist/ui/dist/assets/arrow-left-CBcbX5EZ.js +1 -0
- package/dist/ui/dist/assets/badge-ChpACfWO.js +1 -0
- package/dist/ui/dist/assets/calendar-B-KZ9RQO.js +1 -0
- package/dist/ui/dist/assets/card-CNf6BS2e.js +1 -0
- package/dist/ui/dist/assets/chevron-left-D4U-5A27.js +1 -0
- package/dist/ui/dist/assets/chevron-right-CR4Skrf3.js +1 -0
- package/dist/ui/dist/assets/chevron-up-BYhk0K2J.js +1 -0
- package/dist/ui/dist/assets/circle-alert-CyHDwUj8.js +1 -0
- package/dist/ui/dist/assets/circle-check-Bb54Ebmu.js +1 -0
- package/dist/ui/dist/assets/cpu-Cdgc_B1K.js +1 -0
- package/dist/ui/dist/assets/dialog-QnZ0ad8O.js +1 -0
- package/dist/ui/dist/assets/download-C3ifGMjJ.js +1 -0
- package/dist/ui/dist/assets/dropdown-menu-BK-CO3Od.js +1 -0
- package/dist/ui/dist/assets/es-NQNoaWDx.js +1 -0
- package/dist/ui/dist/assets/external-link-BvxYeTP1.js +1 -0
- package/dist/ui/dist/assets/eye-DqNTU_GD.js +1 -0
- package/dist/ui/dist/assets/file-text-BT_9S9SM.js +1 -0
- package/dist/ui/dist/assets/folder-open-BhH8y9ac.js +1 -0
- package/dist/ui/dist/assets/format-GVHeOyWI.js +1 -0
- package/dist/ui/dist/assets/gateway-url-COCbW0IR.js +1 -0
- package/dist/ui/dist/assets/gauge-D_TMa4i9.js +1 -0
- package/dist/ui/dist/assets/globe-DeCQTCDJ.js +1 -0
- package/dist/ui/dist/assets/hexagon-DsGOUl-H.js +1 -0
- package/dist/ui/dist/assets/history-BSG-Ypqf.js +1 -0
- package/dist/ui/dist/assets/index-B2fCYtTS.css +2 -0
- package/dist/ui/dist/assets/index-DMCjjdqf.js +116 -0
- package/dist/ui/dist/assets/info-NwLoa2Mj.js +1 -0
- package/dist/ui/dist/assets/key-3EP0dhkT.js +1 -0
- package/dist/ui/dist/assets/label-D2H1IR_J.js +1 -0
- package/dist/ui/dist/assets/loader-circle-CZNax6kS.js +1 -0
- package/dist/ui/dist/assets/lock-Ei1_J-Nq.js +1 -0
- package/dist/ui/dist/assets/pause-BUqah9Bi.js +1 -0
- package/dist/ui/dist/assets/play-NcZ4swwL.js +1 -0
- package/dist/ui/dist/assets/plus-CX1xyhp5.js +1 -0
- package/dist/ui/dist/assets/progress-BherYzY6.js +1 -0
- package/dist/ui/dist/assets/refresh-cw-DaYdjQFk.js +1 -0
- package/dist/ui/dist/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- package/dist/ui/dist/assets/save-CUdYyHNy.js +1 -0
- package/dist/ui/dist/assets/scroll-area-DkeyX32e.js +1 -0
- package/dist/ui/dist/assets/send-B0H5SEIE.js +1 -0
- package/dist/ui/dist/assets/settings-Ds4SqD8s.js +1 -0
- package/dist/ui/dist/assets/slider-CsiUDxc3.js +14 -0
- package/dist/ui/dist/assets/sparkles-yUEb-7oH.js +1 -0
- package/dist/ui/dist/assets/square-BD81nFtN.js +1 -0
- package/dist/ui/dist/assets/switch-BDwN8RYV.js +1 -0
- package/dist/ui/dist/assets/table-CSc8ubon.js +1 -0
- package/dist/ui/dist/assets/terminal-DN38Q456.js +1 -0
- package/dist/ui/dist/assets/textarea-CXgXWKrT.js +1 -0
- package/dist/ui/dist/assets/trash-2-CNjMkoq6.js +1 -0
- package/dist/ui/dist/assets/triangle-alert-C9Y8Ub4X.js +1 -0
- package/dist/ui/dist/assets/useProviders-C6_QHsEi.js +1 -0
- package/dist/ui/dist/assets/utils-3pnRFmFe.js +1 -0
- package/dist/ui/dist/assets/vendor-charts-Bu2lyBKP.js +65 -0
- package/dist/ui/dist/assets/vendor-query-DsWPbQdG.js +1 -0
- package/dist/ui/dist/assets/vendor-radix-cw1bQaVC.js +63 -0
- package/dist/ui/dist/assets/vendor-react-D4s9E-zj.js +1 -0
- package/dist/ui/dist/assets/vendor-router-C9pIYwbJ.js +3 -0
- package/dist/ui/dist/assets/volume-2-CeSXNDv4.js +1 -0
- package/dist/ui/dist/assets/zap-hlXjpSeA.js +1 -0
- package/dist/ui/dist/favicon.ico +0 -0
- package/dist/ui/dist/index.html +40 -0
- package/dist/ui/dist/placeholder.svg +1 -0
- package/dist/ui/index.html +6 -6
- package/package.json +137 -13
- package/packages/cli/src/adapters/binary.ts +461 -0
- package/packages/cli/src/adapters/bun-global.ts +378 -0
- package/packages/cli/src/adapters/config.ts +314 -0
- package/packages/cli/src/adapters/docker.ts +308 -0
- package/packages/cli/src/adapters/factory.ts +168 -0
- package/packages/cli/src/adapters/index.ts +80 -0
- package/packages/cli/src/adapters/types.ts +218 -0
- package/packages/cli/src/commands/agent-run.ts +168 -0
- package/packages/cli/src/commands/agents.ts +398 -0
- package/packages/cli/src/commands/chat.ts +142 -0
- package/packages/cli/src/commands/config.ts +49 -0
- package/packages/cli/src/commands/cron.ts +487 -0
- package/packages/cli/src/commands/dev.ts +58 -0
- package/packages/cli/src/commands/doctor.ts +320 -0
- package/packages/cli/src/commands/gateway.ts +719 -0
- package/packages/cli/src/commands/logs.ts +57 -0
- package/packages/cli/src/commands/mcp.ts +175 -0
- package/packages/cli/src/commands/message.ts +77 -0
- package/packages/cli/src/commands/migrate.ts +90 -0
- package/packages/cli/src/commands/onboard.ts +1656 -0
- package/packages/cli/src/commands/security.ts +144 -0
- package/packages/cli/src/commands/service.ts +50 -0
- package/packages/cli/src/commands/sessions.ts +116 -0
- package/packages/cli/src/commands/skills.ts +215 -0
- package/packages/cli/src/commands/update.ts +203 -0
- package/packages/cli/src/index.ts +210 -0
- package/packages/cli/src/ui-bundle.generated.ts +3 -0
- package/packages/cli/src/utils/token.ts +6 -0
- package/packages/core/src/agent/agent-loop.ts +691 -0
- package/packages/core/src/agent/compaction.ts +240 -0
- package/packages/core/src/agent/context-compiler.ts +467 -0
- package/packages/core/src/agent/context-guard.ts +91 -0
- package/packages/core/src/agent/conversation-store.ts +244 -0
- package/packages/core/src/agent/curator.ts +158 -0
- package/packages/core/src/agent/hooks.ts +166 -0
- package/packages/core/src/agent/llm-client.ts +167 -0
- package/packages/core/src/agent/llm-providers/anthropic.ts +212 -0
- package/packages/core/src/agent/llm-providers/deepseek.ts +8 -0
- package/packages/core/src/agent/llm-providers/gemini.ts +215 -0
- package/packages/core/src/agent/llm-providers/groq.ts +5 -0
- package/packages/core/src/agent/llm-providers/interface.ts +195 -0
- package/packages/core/src/agent/llm-providers/kimi.ts +8 -0
- package/packages/core/src/agent/llm-providers/local-llama.ts +37 -0
- package/packages/core/src/agent/llm-providers/mistral.ts +5 -0
- package/packages/core/src/agent/llm-providers/nvidia.ts +5 -0
- package/packages/core/src/agent/llm-providers/ollama.ts +175 -0
- package/packages/core/src/agent/llm-providers/openai-compat-base.ts +379 -0
- package/packages/core/src/agent/llm-providers/openai.ts +5 -0
- package/packages/core/src/agent/llm-providers/openrouter.ts +5 -0
- package/packages/core/src/agent/llm-providers/qwen.ts +5 -0
- package/packages/core/src/agent/native-tools.ts +31 -0
- package/packages/core/src/agent/playbook-selector.ts +147 -0
- package/packages/core/src/agent/prompt-builder.ts +169 -0
- package/packages/core/src/agent/providers/index.ts +204 -0
- package/packages/core/src/agent/providers.ts +1 -0
- package/packages/core/src/agent/reflector.ts +200 -0
- package/packages/core/src/agent/service.ts +267 -0
- package/packages/core/src/agent/skill-selector.ts +479 -0
- package/packages/core/src/agent/stuck-loop.ts +133 -0
- package/packages/core/src/agent/tool-selector.ts +569 -0
- package/packages/core/src/agent/tracer.ts +100 -0
- package/packages/core/src/auth/auth.ts +108 -0
- package/packages/core/src/auth/index.ts +1 -0
- package/packages/core/src/canvas/a2ui-tools.ts +255 -0
- package/packages/core/src/canvas/canvas-manager.ts +390 -0
- package/packages/core/src/canvas/canvas-tools.ts +448 -0
- package/packages/core/src/canvas/emitter.ts +149 -0
- package/packages/core/src/canvas/index.ts +3 -0
- package/packages/core/src/channels/base.ts +154 -0
- package/packages/core/src/channels/discord.ts +273 -0
- package/packages/core/src/channels/index.ts +7 -0
- package/packages/core/src/channels/manager.ts +450 -0
- package/packages/core/src/channels/slack.ts +323 -0
- package/packages/core/src/channels/telegram.ts +612 -0
- package/packages/core/src/channels/webchat.ts +139 -0
- package/packages/core/src/channels/whatsapp.ts +548 -0
- package/packages/core/src/config/index.ts +12 -0
- package/packages/core/src/config/loader.ts +569 -0
- package/packages/core/src/events/agent-bus.ts +460 -0
- package/packages/core/src/events/event-bus.ts +169 -0
- package/packages/core/src/gateway/channel-notify.ts +64 -0
- package/packages/core/src/gateway/helpers/cors.ts +32 -0
- package/packages/core/src/gateway/helpers/index.ts +4 -0
- package/packages/core/src/gateway/helpers/narration.ts +57 -0
- package/packages/core/src/gateway/helpers/path.ts +13 -0
- package/packages/core/src/gateway/helpers/redact.ts +61 -0
- package/packages/core/src/gateway/index.ts +5 -0
- package/packages/core/src/gateway/initializer.ts +363 -0
- package/packages/core/src/gateway/lane-queue.ts +169 -0
- package/packages/core/src/gateway/llm-local/client.ts +94 -0
- package/packages/core/src/gateway/llm-local/detector.ts +321 -0
- package/packages/core/src/gateway/llm-local/downloader.ts +216 -0
- package/packages/core/src/gateway/llm-local/index.ts +34 -0
- package/packages/core/src/gateway/llm-local/manager.ts +186 -0
- package/packages/core/src/gateway/llm-local/models.ts +149 -0
- package/packages/core/src/gateway/llm-local/server.ts +179 -0
- package/packages/core/src/gateway/resolver.ts +108 -0
- package/packages/core/src/gateway/router.ts +124 -0
- package/packages/core/src/gateway/routes/agents.ts +210 -0
- package/packages/core/src/gateway/routes/auth.ts +244 -0
- package/packages/core/src/gateway/routes/channels.ts +484 -0
- package/packages/core/src/gateway/routes/chat.ts +241 -0
- package/packages/core/src/gateway/routes/config.ts +12 -0
- package/packages/core/src/gateway/routes/cron-api.ts +544 -0
- package/packages/core/src/gateway/routes/ethics.ts +46 -0
- package/packages/core/src/gateway/routes/llm-local.ts +271 -0
- package/packages/core/src/gateway/routes/mcp.ts +319 -0
- package/packages/core/src/gateway/routes/meeting.ts +232 -0
- package/packages/core/src/gateway/routes/models.ts +163 -0
- package/packages/core/src/gateway/routes/multimodal.ts +93 -0
- package/packages/core/src/gateway/routes/providers.ts +220 -0
- package/packages/core/src/gateway/routes/setup.ts +441 -0
- package/packages/core/src/gateway/routes/skills.ts +115 -0
- package/packages/core/src/gateway/routes/system.ts +469 -0
- package/packages/core/src/gateway/routes/tasks.ts +44 -0
- package/packages/core/src/gateway/routes/tools.ts +59 -0
- package/packages/core/src/gateway/routes/tts-local.ts +388 -0
- package/packages/core/src/gateway/routes/users.ts +122 -0
- package/packages/core/src/gateway/routes/voice.ts +189 -0
- package/packages/core/src/gateway/routes/workspace.ts +281 -0
- package/packages/core/src/gateway/server.ts +2744 -0
- package/packages/core/src/gateway/session.ts +95 -0
- package/packages/core/src/gateway/slash-commands.ts +207 -0
- package/packages/core/src/gateway/tts/README.md +94 -0
- package/packages/core/src/gateway/tts/package.json +25 -0
- package/packages/core/src/gateway/tts/src/client.ts +59 -0
- package/packages/core/src/gateway/tts/src/detect.ts +42 -0
- package/packages/core/src/gateway/tts/src/index.ts +15 -0
- package/packages/core/src/gateway/tts/src/install.ts +129 -0
- package/packages/core/src/gateway/tts/src/models.ts +50 -0
- package/packages/core/src/gateway/tts/src/server.ts +252 -0
- package/packages/core/src/gateway/tts/voices/.gitkeep +0 -0
- package/packages/core/src/heartbeat/index.ts +157 -0
- package/packages/core/src/index.ts +56 -0
- package/packages/core/src/mcp/hot-reload.ts +148 -0
- package/packages/core/src/mcp/singleton.ts +21 -0
- package/packages/core/src/mcp/tool-sync.ts +176 -0
- package/packages/core/src/multimodal/index.ts +2 -0
- package/packages/core/src/multimodal/types.ts +28 -0
- package/packages/core/src/multimodal/vision-service.ts +283 -0
- package/packages/core/src/plugins/api.ts +128 -0
- package/packages/core/src/plugins/index.ts +2 -0
- package/packages/core/src/plugins/loader.ts +365 -0
- package/packages/core/src/resilience/circuit-breaker.ts +225 -0
- package/packages/core/src/scheduler/CronScheduler.ts +699 -0
- package/packages/core/src/scheduler/dag/AgentExecutor.ts +53 -0
- package/packages/core/src/scheduler/dag/DAGScheduler.ts +250 -0
- package/packages/core/src/scheduler/dag/EventBridge.ts +122 -0
- package/packages/core/src/scheduler/dag/TaskGraph.ts +192 -0
- package/packages/core/src/scheduler/dag/TaskNode.ts +97 -0
- package/packages/core/src/scheduler/dag/TaskResult.ts +22 -0
- package/packages/core/src/scheduler/dag/errors.ts +37 -0
- package/packages/core/src/scheduler/dag/index.ts +26 -0
- package/packages/core/src/scheduler/dag/presets/ResearchPreset.ts +97 -0
- package/packages/core/src/scheduler/dag/strategies/ParallelStrategy.ts +21 -0
- package/packages/core/src/scheduler/dag/strategies/PriorityStrategy.ts +46 -0
- package/packages/core/src/scheduler/index.ts +22 -0
- package/packages/core/src/scheduler/integration.ts +237 -0
- package/packages/core/src/scheduler/types.ts +164 -0
- package/packages/core/src/security/google-chat.ts +269 -0
- package/packages/core/src/security/index.ts +192 -0
- package/packages/core/src/security/pairing.ts +250 -0
- package/packages/core/src/security/rate-limit.ts +270 -0
- package/packages/core/src/security/signal.ts +321 -0
- package/packages/core/src/state/store.ts +312 -0
- package/packages/core/src/storage/crypto.ts +197 -0
- package/packages/core/src/storage/migrate.ts +147 -0
- package/packages/core/src/storage/onboarding.ts +1506 -0
- package/packages/core/src/storage/schema.ts +666 -0
- package/packages/core/src/storage/seed.ts +628 -0
- package/packages/core/src/storage/sqlite.ts +407 -0
- package/packages/core/src/storage/usage.ts +374 -0
- package/packages/core/src/tool-runtime/index.ts +476 -0
- package/packages/core/src/tool-runtime/tool-worker.ts +125 -0
- package/packages/core/src/tools/agents/get-available-models.ts +118 -0
- package/packages/core/src/tools/agents/index.ts +610 -0
- package/packages/core/src/tools/canvas/index.ts +420 -0
- package/packages/core/src/tools/cli/index.ts +142 -0
- package/packages/core/src/tools/core/index.ts +478 -0
- package/packages/core/src/tools/cron/index.ts +635 -0
- package/packages/core/src/tools/filesystem/fs-delete.ts +78 -0
- package/packages/core/src/tools/filesystem/fs-edit.ts +106 -0
- package/packages/core/src/tools/filesystem/fs-exists.ts +63 -0
- package/packages/core/src/tools/filesystem/fs-glob.ts +108 -0
- package/packages/core/src/tools/filesystem/fs-list.ts +129 -0
- package/packages/core/src/tools/filesystem/fs-read.ts +72 -0
- package/packages/core/src/tools/filesystem/fs-write.ts +67 -0
- package/packages/core/src/tools/filesystem/index.ts +34 -0
- package/packages/core/src/tools/filesystem/workspace-guard.ts +62 -0
- package/packages/core/src/tools/index.ts +197 -0
- package/packages/core/src/tools/meeting/index.ts +363 -0
- package/packages/core/src/tools/office/index.ts +47 -0
- package/packages/core/src/tools/office/office-escribir-docx.ts +192 -0
- package/packages/core/src/tools/office/office-escribir-pdf.ts +172 -0
- package/packages/core/src/tools/office/office-escribir-pptx.ts +174 -0
- package/packages/core/src/tools/office/office-escribir-xlsx.ts +116 -0
- package/packages/core/src/tools/office/office-leer-docx.ts +93 -0
- package/packages/core/src/tools/office/office-leer-pdf.ts +114 -0
- package/packages/core/src/tools/office/office-leer-pptx.ts +136 -0
- package/packages/core/src/tools/office/office-leer-xlsx.ts +124 -0
- package/packages/core/src/tools/types.ts +39 -0
- package/packages/core/src/tools/voice/index.ts +104 -0
- package/packages/core/src/tools/web/browser-click.ts +78 -0
- package/packages/core/src/tools/web/browser-extract.ts +139 -0
- package/packages/core/src/tools/web/browser-navigate.ts +106 -0
- package/packages/core/src/tools/web/browser-screenshot.ts +87 -0
- package/packages/core/src/tools/web/browser-script.ts +88 -0
- package/packages/core/src/tools/web/browser-service.ts +554 -0
- package/packages/core/src/tools/web/browser-type.ts +101 -0
- package/packages/core/src/tools/web/browser-wait.ts +136 -0
- package/packages/core/src/tools/web/index.ts +41 -0
- package/packages/core/src/tools/web/web-fetch.ts +78 -0
- package/packages/core/src/tools/web/web-search.ts +123 -0
- package/packages/core/src/utils/benchmark.ts +80 -0
- package/packages/core/src/utils/crypto.ts +73 -0
- package/packages/core/src/utils/date.ts +42 -0
- package/packages/core/src/utils/index.ts +5 -0
- package/packages/core/src/utils/logger.ts +389 -0
- package/packages/core/src/utils/retry.ts +70 -0
- package/packages/core/src/utils/toon.ts +253 -0
- package/packages/core/src/voice/index.ts +643 -0
- package/packages/mcp/src/config.ts +13 -0
- package/packages/mcp/src/index.ts +1 -0
- package/packages/mcp/src/logger.ts +47 -0
- package/packages/mcp/src/manager.ts +439 -0
- package/packages/mcp/src/transports/index.ts +67 -0
- package/packages/mcp/src/transports/sse.ts +238 -0
- package/packages/mcp/src/transports/websocket.ts +159 -0
- package/packages/skills/src/bundled/agents/agent_spawner/SKILL.md +167 -0
- package/packages/skills/src/bundled/agents/code_delegator/SKILL.md +156 -0
- package/packages/skills/src/bundled/agents/memory_manager/SKILL.md +143 -0
- package/packages/skills/src/bundled/agents/research_and_remember/SKILL.md +139 -0
- package/packages/skills/src/bundled/agents/task_orchestrator/SKILL.md +198 -0
- package/packages/skills/src/bundled/canvas/a2ui_dashboard/SKILL.md +176 -0
- package/packages/skills/src/bundled/canvas/a2ui_form/SKILL.md +202 -0
- package/packages/skills/src/bundled/canvas/a2ui_interactive/SKILL.md +206 -0
- package/packages/skills/src/bundled/canvas/canvas_dashboard/SKILL.md +146 -0
- package/packages/skills/src/bundled/canvas/canvas_interact/SKILL.md +148 -0
- package/packages/skills/src/bundled/canvas/canvas_report/SKILL.md +146 -0
- package/packages/skills/src/bundled/cli/cli_pipeline/SKILL.md +136 -0
- package/packages/skills/src/bundled/cli/cli_safe_exec/SKILL.md +125 -0
- package/packages/skills/src/bundled/cron_manager/SKILL.md +188 -0
- package/packages/skills/src/bundled/cron_reminder/SKILL.md +112 -0
- package/packages/skills/src/bundled/filesystem/file_manager/SKILL.md +118 -0
- package/packages/skills/src/bundled/filesystem/file_read_and_summarize/SKILL.md +108 -0
- package/packages/skills/src/bundled/filesystem/file_writer/SKILL.md +135 -0
- package/packages/skills/src/bundled/meeting/meeting_transcription/SKILL.md +213 -0
- package/packages/skills/src/bundled/office/office_document_manager/SKILL.md +262 -0
- package/packages/skills/src/bundled/search_knowledge/busqueda_fts5/SKILL.md +74 -0
- package/packages/skills/src/bundled/voice/voice_assistant/SKILL.md +174 -0
- package/packages/skills/src/bundled/voice/voice_input/SKILL.md +146 -0
- package/packages/skills/src/bundled/voice/voice_output/SKILL.md +151 -0
- package/packages/skills/src/bundled/web/browser_automate/SKILL.md +120 -0
- package/packages/skills/src/bundled/web/browser_scrape/SKILL.md +109 -0
- package/packages/skills/src/bundled/web/web_monitor/SKILL.md +127 -0
- package/packages/skills/src/bundled/web/web_research/SKILL.md +119 -0
- package/packages/skills/src/bundled-data.generated.ts +1964 -0
- package/packages/skills/src/index.ts +1 -0
- package/packages/skills/src/loader.ts +388 -0
- package/dist/ui/assets/AgentNewPage-GB-tVN50.js +0 -1
- package/dist/ui/assets/BridgePage-DDcDILKu.js +0 -1
- package/dist/ui/assets/CanvasPage-oOk2sGOD.js +0 -33
- package/dist/ui/assets/DashboardPage-DV_2qWYJ.js +0 -6
- package/dist/ui/assets/LogsPage-DayYjh01.js +0 -1
- package/dist/ui/assets/MeetingPage-C01uPuqj.js +0 -1
- package/dist/ui/assets/ProjectsPage-B8_am_Ib.js +0 -1
- package/dist/ui/assets/ProvidersPage-DBzi66e4.js +0 -1
- package/dist/ui/assets/SettingsPage-CFA_Tknl.js +0 -9
- package/dist/ui/assets/SetupPage-BrUWbhvT.js +0 -1
- package/dist/ui/assets/accordion-DdAEfIXR.js +0 -1
- package/dist/ui/assets/chevron-down-DIosfU_U.js +0 -1
- package/dist/ui/assets/chevron-up-CI-W21Fy.js +0 -1
- package/dist/ui/assets/circle-S0-ouLz-.js +0 -1
- package/dist/ui/assets/circle-minus-CE0iJrl8.js +0 -1
- package/dist/ui/assets/circle-x-jUJ5zZvQ.js +0 -1
- package/dist/ui/assets/dropdown-menu-C2CXM1VE.js +0 -1
- package/dist/ui/assets/index-BN0875JH.css +0 -2
- package/dist/ui/assets/index-CH6sBa3Q.js +0 -116
- package/dist/ui/assets/pencil-5VdSj-h5.js +0 -1
- package/dist/ui/assets/progress-JN30I5fF.js +0 -1
- package/dist/ui/assets/scroll-area-BQQPitM8.js +0 -1
- package/dist/ui/assets/search-ChPgnVKj.js +0 -1
- package/dist/ui/assets/switch-C7W2-KEx.js +0 -1
- package/dist/ui/assets/terminal-C-R5Fckz.js +0 -1
- package/dist/ui/assets/useProviders-TBnWn-Hq.js +0 -1
- /package/dist/ui/assets/{card-DFKnZ6ky.js → card-CNf6BS2e.js} +0 -0
- /package/dist/ui/assets/{circle-alert-KuAm2FWh.js → circle-alert-CyHDwUj8.js} +0 -0
- /package/dist/ui/assets/{circle-check-6Ard1-2z.js → circle-check-Bb54Ebmu.js} +0 -0
- /package/dist/ui/assets/{cpu-KDy6-FAI.js → cpu-Cdgc_B1K.js} +0 -0
- /package/dist/ui/assets/{download-Cjbk4Rek.js → download-C3ifGMjJ.js} +0 -0
- /package/dist/ui/assets/{external-link-HtrFM63g.js → external-link-BvxYeTP1.js} +0 -0
- /package/dist/ui/assets/{eye-D1dB40_o.js → eye-DqNTU_GD.js} +0 -0
- /package/dist/ui/assets/{file-text-CE58EfH0.js → file-text-BT_9S9SM.js} +0 -0
- /package/dist/ui/assets/{folder-open-DIPKeiI_.js → folder-open-BhH8y9ac.js} +0 -0
- /package/dist/ui/assets/{format-BwdV8bB5.js → format-GVHeOyWI.js} +0 -0
- /package/dist/ui/assets/{gateway-url-D5uj6Nxg.js → gateway-url-COCbW0IR.js} +0 -0
- /package/dist/ui/assets/{gauge-DmQmJHEg.js → gauge-D_TMa4i9.js} +0 -0
- /package/dist/ui/assets/{globe-_hUGxQF4.js → globe-DeCQTCDJ.js} +0 -0
- /package/dist/ui/assets/{hexagon-BaNGQlQj.js → hexagon-DsGOUl-H.js} +0 -0
- /package/dist/ui/assets/{history-BfZVGlZa.js → history-BSG-Ypqf.js} +0 -0
- /package/dist/ui/assets/{info-CBZ5-AlC.js → info-NwLoa2Mj.js} +0 -0
- /package/dist/ui/assets/{key-Bv5DdTPh.js → key-3EP0dhkT.js} +0 -0
- /package/dist/ui/assets/{loader-circle-C4hhXLgp.js → loader-circle-CZNax6kS.js} +0 -0
- /package/dist/ui/assets/{lock-CkZYexqw.js → lock-Ei1_J-Nq.js} +0 -0
- /package/dist/ui/assets/{pause-Bpy1_s7y.js → pause-BUqah9Bi.js} +0 -0
- /package/dist/ui/assets/{play-Cj4osqJZ.js → play-NcZ4swwL.js} +0 -0
- /package/dist/ui/assets/{plus-BQhgZN3A.js → plus-CX1xyhp5.js} +0 -0
- /package/dist/ui/assets/{refresh-cw-BfREHVQM.js → refresh-cw-DaYdjQFk.js} +0 -0
- /package/dist/ui/assets/{save-FFTD4dMp.js → save-CUdYyHNy.js} +0 -0
- /package/dist/ui/assets/{settings-BdHKUL92.js → settings-Ds4SqD8s.js} +0 -0
- /package/dist/ui/assets/{sparkles-r4uJbJAl.js → sparkles-yUEb-7oH.js} +0 -0
- /package/dist/ui/assets/{square-G7Hyufqm.js → square-BD81nFtN.js} +0 -0
- /package/dist/ui/assets/{textarea-5kyuD04X.js → textarea-CXgXWKrT.js} +0 -0
- /package/dist/ui/assets/{trash-2-DXVBRWfh.js → trash-2-CNjMkoq6.js} +0 -0
- /package/dist/ui/assets/{triangle-alert-Bu5seg9O.js → triangle-alert-C9Y8Ub4X.js} +0 -0
- /package/dist/ui/assets/{vendor-router-CCECILJ0.js → vendor-router-C9pIYwbJ.js} +0 -0
- /package/dist/ui/assets/{volume-2-s9DuS696.js → volume-2-CeSXNDv4.js} +0 -0
- /package/dist/ui/assets/{zap-BPHZzXKV.js → zap-hlXjpSeA.js} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracer — ACE Generator output.
|
|
3
|
+
*
|
|
4
|
+
* Records every agent execution to the `traces` table.
|
|
5
|
+
* Fire-and-forget (non-blocking). Also updates playbook helpful/harmful counts
|
|
6
|
+
* based on execution outcome.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { logger } from "../utils/logger"
|
|
10
|
+
|
|
11
|
+
const log = logger.child("tracer")
|
|
12
|
+
|
|
13
|
+
export interface TraceInput {
|
|
14
|
+
threadId: string
|
|
15
|
+
agentId: string
|
|
16
|
+
agentName: string
|
|
17
|
+
toolUsed?: string | null
|
|
18
|
+
inputSummary: string
|
|
19
|
+
outputSummary: string
|
|
20
|
+
success: boolean
|
|
21
|
+
errorMessage?: string | null
|
|
22
|
+
durationMs?: number
|
|
23
|
+
tokensUsed?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Save a trace record. Non-blocking — errors are swallowed so they never
|
|
28
|
+
* affect the main agent loop.
|
|
29
|
+
*/
|
|
30
|
+
export function saveTrace(trace: TraceInput): void {
|
|
31
|
+
// Run asynchronously so it never blocks the caller
|
|
32
|
+
Promise.resolve().then(async () => {
|
|
33
|
+
try {
|
|
34
|
+
const { getDb } = await import("../storage/sqlite")
|
|
35
|
+
const db = getDb()
|
|
36
|
+
|
|
37
|
+
db.query(`
|
|
38
|
+
INSERT INTO traces
|
|
39
|
+
(thread_id, agent_id, agent_name, tool_used, input_summary,
|
|
40
|
+
output_summary, success, error_message, duration_ms, tokens_used)
|
|
41
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
42
|
+
`).run(
|
|
43
|
+
trace.threadId,
|
|
44
|
+
trace.agentId,
|
|
45
|
+
trace.agentName,
|
|
46
|
+
trace.toolUsed ?? null,
|
|
47
|
+
trace.inputSummary.substring(0, 500),
|
|
48
|
+
trace.outputSummary.substring(0, 500),
|
|
49
|
+
trace.success ? 1 : 0,
|
|
50
|
+
trace.errorMessage ?? null,
|
|
51
|
+
trace.durationMs ?? null,
|
|
52
|
+
trace.tokensUsed ?? null,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
// Trigger reflector check in background
|
|
56
|
+
checkReflectorTrigger().catch(() => { /* ignore */ })
|
|
57
|
+
} catch (err) {
|
|
58
|
+
log.warn("[tracer] Failed to save trace:", err)
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ─── Reflector trigger ────────────────────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
const REFLECTOR_TRACE_THRESHOLD = 20 // run reflector after N new traces
|
|
66
|
+
|
|
67
|
+
let _tracesSinceLastReflection = 0
|
|
68
|
+
|
|
69
|
+
async function checkReflectorTrigger(): Promise<void> {
|
|
70
|
+
_tracesSinceLastReflection++
|
|
71
|
+
if (_tracesSinceLastReflection < REFLECTOR_TRACE_THRESHOLD) return
|
|
72
|
+
_tracesSinceLastReflection = 0
|
|
73
|
+
|
|
74
|
+
// Lazy import to avoid circular deps
|
|
75
|
+
const { runReflector } = await import("./reflector")
|
|
76
|
+
runReflector().catch((err) => {
|
|
77
|
+
log.warn("[tracer] Reflector run failed:", err)
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ─── Usage recording ──────────────────────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
export function recordLLMUsage(opts: {
|
|
84
|
+
provider: string
|
|
85
|
+
model: string
|
|
86
|
+
inputTokens: number
|
|
87
|
+
outputTokens: number
|
|
88
|
+
}): void {
|
|
89
|
+
Promise.resolve().then(async () => {
|
|
90
|
+
try {
|
|
91
|
+
const { recordUsage } = await import("../storage/usage")
|
|
92
|
+
recordUsage({
|
|
93
|
+
provider: opts.provider,
|
|
94
|
+
model: opts.model,
|
|
95
|
+
inputTokens: opts.inputTokens,
|
|
96
|
+
outputTokens: opts.outputTokens,
|
|
97
|
+
})
|
|
98
|
+
} catch { /* ignore */ }
|
|
99
|
+
})
|
|
100
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import jwt from "jsonwebtoken";
|
|
2
|
+
import { hashString } from "../utils/crypto.ts";
|
|
3
|
+
import { getDb } from "../storage/sqlite.ts";
|
|
4
|
+
|
|
5
|
+
const JWT_SECRET = process.env.JWT_SECRET || "hive-default-jwt-secret-change-in-production";
|
|
6
|
+
const ACCESS_TOKEN_EXPIRY = "15m";
|
|
7
|
+
const REFRESH_TOKEN_EXPIRY = "7d";
|
|
8
|
+
const REFRESH_TOKEN_EXPIRY_SECONDS = 7 * 24 * 60 * 60;
|
|
9
|
+
|
|
10
|
+
interface AuthTokens {
|
|
11
|
+
accessToken: string;
|
|
12
|
+
refreshToken: string;
|
|
13
|
+
expiresIn: number;
|
|
14
|
+
tokenType: "Bearer";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface JwtPayload {
|
|
18
|
+
userId: string;
|
|
19
|
+
type: "access" | "refresh";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function generateTokens(userId: string): Promise<AuthTokens> {
|
|
23
|
+
const accessToken = jwt.sign({ userId, type: "access" } satisfies JwtPayload, JWT_SECRET, {
|
|
24
|
+
expiresIn: ACCESS_TOKEN_EXPIRY,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const refreshToken = jwt.sign({ userId, type: "refresh" } satisfies JwtPayload, JWT_SECRET, {
|
|
28
|
+
expiresIn: REFRESH_TOKEN_EXPIRY,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const refreshTokenHash = hashString(refreshToken);
|
|
32
|
+
const expiresAt = Math.floor(Date.now() / 1000) + REFRESH_TOKEN_EXPIRY_SECONDS;
|
|
33
|
+
|
|
34
|
+
const db = getDb();
|
|
35
|
+
db.run(
|
|
36
|
+
`INSERT INTO refresh_tokens (user_id, token_hash, expires_at, revoked)
|
|
37
|
+
VALUES (?, ?, ?, 0)`,
|
|
38
|
+
[userId, refreshTokenHash, expiresAt]
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
accessToken,
|
|
43
|
+
refreshToken,
|
|
44
|
+
expiresIn: 15 * 60,
|
|
45
|
+
tokenType: "Bearer",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function refreshAccessToken(refreshToken: string): Promise<AuthTokens> {
|
|
50
|
+
let payload: JwtPayload;
|
|
51
|
+
try {
|
|
52
|
+
payload = jwt.verify(refreshToken, JWT_SECRET) as JwtPayload;
|
|
53
|
+
} catch {
|
|
54
|
+
throw new Error("Invalid or expired refresh token");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (payload.type !== "refresh") {
|
|
58
|
+
throw new Error("Invalid token type");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const refreshTokenHash = hashString(refreshToken);
|
|
62
|
+
const db = getDb();
|
|
63
|
+
const tokenRow = db
|
|
64
|
+
.query(
|
|
65
|
+
`SELECT user_id, expires_at, revoked FROM refresh_tokens WHERE token_hash = ?`
|
|
66
|
+
)
|
|
67
|
+
.get(refreshTokenHash) as { user_id: string; expires_at: number; revoked: number } | undefined;
|
|
68
|
+
|
|
69
|
+
if (!tokenRow) {
|
|
70
|
+
throw new Error("Refresh token not found");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (tokenRow.revoked === 1) {
|
|
74
|
+
throw new Error("Refresh token has been revoked");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (tokenRow.expires_at < Math.floor(Date.now() / 1000)) {
|
|
78
|
+
db.run(`DELETE FROM refresh_tokens WHERE token_hash = ?`, [refreshTokenHash]);
|
|
79
|
+
throw new Error("Refresh token has expired");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
db.run(`DELETE FROM refresh_tokens WHERE token_hash = ?`, [refreshTokenHash]);
|
|
83
|
+
|
|
84
|
+
return generateTokens(payload.userId);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function validateAccessToken(token: string): Promise<{ userId: string } | null> {
|
|
88
|
+
try {
|
|
89
|
+
const payload = jwt.verify(token, JWT_SECRET) as JwtPayload;
|
|
90
|
+
if (payload.type !== "access") {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return { userId: payload.userId };
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export async function revokeRefreshToken(refreshToken: string): Promise<void> {
|
|
100
|
+
const refreshTokenHash = hashString(refreshToken);
|
|
101
|
+
const db = getDb();
|
|
102
|
+
db.run(`UPDATE refresh_tokens SET revoked = 1 WHERE token_hash = ?`, [refreshTokenHash]);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function revokeAllUserTokens(userId: string): Promise<void> {
|
|
106
|
+
const db = getDb();
|
|
107
|
+
db.run(`UPDATE refresh_tokens SET revoked = 1 WHERE user_id = ?`, [userId]);
|
|
108
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./auth.ts";
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import type { Tool } from "../agent/native-tools.ts";
|
|
2
|
+
import type { Config } from "../config/loader.ts";
|
|
3
|
+
import { canvasManager } from "./canvas-manager.ts";
|
|
4
|
+
import { logger } from "../utils/logger.ts";
|
|
5
|
+
|
|
6
|
+
export function createA2UISurfaceTool(_config: Config): Tool {
|
|
7
|
+
const log = logger.child("a2ui-surface");
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
name: "a2ui_create_surface",
|
|
11
|
+
description: "Create an A2UI v0.9 surface on the user's canvas for rendering rich interactive UIs",
|
|
12
|
+
parameters: {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
sessionId: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Session ID to render to (auto-resolved from user context if omitted)",
|
|
18
|
+
},
|
|
19
|
+
surfaceId: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "Unique identifier for the UI surface (e.g. 'booking_form', 'user_profile'). Must be unique within the session.",
|
|
22
|
+
},
|
|
23
|
+
catalogId: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Catalog ID for the component set. Use 'https://a2ui.org/specification/v0_9/basic_catalog.json' for the standard catalog.",
|
|
26
|
+
},
|
|
27
|
+
theme: {
|
|
28
|
+
type: "object",
|
|
29
|
+
description: "Theme configuration for the surface",
|
|
30
|
+
properties: {
|
|
31
|
+
primaryColor: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "Primary color in hex format (e.g. '#3B82F6')",
|
|
34
|
+
},
|
|
35
|
+
iconUrl: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "URL for an icon/logo image",
|
|
38
|
+
},
|
|
39
|
+
agentDisplayName: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Display name for the agent that created this surface",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
sendDataModel: {
|
|
46
|
+
type: "boolean",
|
|
47
|
+
description: "If true, the client will send the full data model with every action. Default: false.",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
required: ["surfaceId", "catalogId"],
|
|
51
|
+
},
|
|
52
|
+
execute: async (params: Record<string, unknown>, config?: any) => {
|
|
53
|
+
const userId = config?.configurable?.user_id;
|
|
54
|
+
const rawSessionId = params.sessionId as string;
|
|
55
|
+
const sessionId = rawSessionId
|
|
56
|
+
? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
|
|
57
|
+
: (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
|
|
58
|
+
|
|
59
|
+
if (!canvasManager.isSessionConnected(sessionId)) {
|
|
60
|
+
const connected = canvasManager.getConnectedSessions();
|
|
61
|
+
log.warn(`No canvas sessions connected. Rendering to ${sessionId} anyway. Available: ${connected.join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
await canvasManager.sendA2UIMessage(sessionId, "a2ui:createSurface", {
|
|
65
|
+
surfaceId: params.surfaceId as string,
|
|
66
|
+
catalogId: params.catalogId as string,
|
|
67
|
+
theme: params.theme as Record<string, unknown> ?? {},
|
|
68
|
+
sendDataModel: params.sendDataModel as boolean ?? false,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
log.info(`Created A2UI surface '${params.surfaceId}' on session ${sessionId}`);
|
|
72
|
+
return JSON.stringify({
|
|
73
|
+
status: "created",
|
|
74
|
+
surfaceId: params.surfaceId,
|
|
75
|
+
sessionId,
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function createA2UIUpdateComponentsTool(_config: Config): Tool {
|
|
82
|
+
const log = logger.child("a2ui-components");
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
name: "a2ui_update_components",
|
|
86
|
+
description: `Send A2UI v0.9 components to an existing surface. Components are a FLAT list with ID references (adjacency list).
|
|
87
|
+
|
|
88
|
+
CHILDREN (spec oficial A2UI v0.9):
|
|
89
|
+
Static: "children": ["id1", "id2"] ← array crudo, formato oficial
|
|
90
|
+
Template: "children": {"path": "/items", "componentId": "item_tmpl"} ← formato oficial
|
|
91
|
+
Single child (Card/Modal): "child": "child_id"
|
|
92
|
+
|
|
93
|
+
COMPONENT PROPS (nombres oficiales del spec):
|
|
94
|
+
Text: text (string|{path}), variant ("h1"|"h2"|"h3"|"h4"|"h5"|"body"|"caption"|"code")
|
|
95
|
+
Button: child (id del texto), variant ("default"|"primary"|"borderless"), action (required)
|
|
96
|
+
TextField: label, value: {path:"/..."}, variant ("shortText"|"longText"|"number"|"obscured"), validationRegexp, action
|
|
97
|
+
- action fires on blur or Enter key
|
|
98
|
+
ChoicePicker: options [{label, value}], value: {path:"/..."}, variant ("mutuallyExclusive"|"multipleSelection"), displayStyle ("checkbox"|"chips"), filterable, action
|
|
99
|
+
- value es DynamicStringList; two-way binding con value; action fires inmediatamente
|
|
100
|
+
Slider: label, value: {path:"/..."}, min, max, step, action (fires on release)
|
|
101
|
+
CheckBox: label, value: {path:"/..."} (DynamicBoolean, two-way binding)
|
|
102
|
+
DateTimeInput: value: {path:"/..."}, enableDate, enableTime, min, max, label
|
|
103
|
+
Tabs: tabs: [{title: "string plano", child: "id"}] ← title es string, NO {literalString:...}
|
|
104
|
+
Modal: trigger (id del botón), content (id del dialog)
|
|
105
|
+
Card: child (único hijo), weight
|
|
106
|
+
Row: children, justify ("start"|"center"|"end"|"spaceBetween"|"spaceAround"|"spaceEvenly"), align ("start"|"center"|"end"|"stretch"), weight
|
|
107
|
+
Column: children, justify, align, weight
|
|
108
|
+
List: children (con template path), direction ("vertical"|"horizontal"), align, weight
|
|
109
|
+
Image: url, description, fit ("contain"|"cover"|"fill"|"none"|"scaleDown"), variant ("icon"|"avatar"|"smallFeature"|"mediumFeature"|"largeFeature"|"header")
|
|
110
|
+
Divider: axis ("horizontal"|"vertical")
|
|
111
|
+
|
|
112
|
+
ACTION FORMAT (oficial: con wrapper event):
|
|
113
|
+
{event: {name: "action_name", context: {key: {path: "/data/key"}}}}
|
|
114
|
+
|
|
115
|
+
DATA BINDING: "prop": "literal" | {path: "/json/pointer"} | {call: "fn", args: {...}}
|
|
116
|
+
|
|
117
|
+
Root component: usar id="root" explícito.`,
|
|
118
|
+
parameters: {
|
|
119
|
+
type: "object",
|
|
120
|
+
properties: {
|
|
121
|
+
sessionId: {
|
|
122
|
+
type: "string",
|
|
123
|
+
description: "Session ID to render to",
|
|
124
|
+
},
|
|
125
|
+
surfaceId: {
|
|
126
|
+
type: "string",
|
|
127
|
+
description: "The surface ID to update",
|
|
128
|
+
},
|
|
129
|
+
components: {
|
|
130
|
+
type: "array",
|
|
131
|
+
description: "Flat list of A2UI component definitions.",
|
|
132
|
+
items: {
|
|
133
|
+
type: "object",
|
|
134
|
+
properties: {
|
|
135
|
+
id: { type: "string", description: "Unique component ID within the surface" },
|
|
136
|
+
component: { type: "string", description: "Component type: Text, Button, Row, Column, Card, List, Divider, Image, Icon, Video, AudioPlayer, TextField, CheckBox, ChoicePicker, Slider, DateTimeInput, Tabs, Modal" },
|
|
137
|
+
weight: { type: "number", description: "Flex weight for proportional sizing inside Row/Column" },
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
required: ["surfaceId", "components"],
|
|
143
|
+
},
|
|
144
|
+
execute: async (params: Record<string, unknown>, config?: any) => {
|
|
145
|
+
const userId = config?.configurable?.user_id;
|
|
146
|
+
const rawSessionId = params.sessionId as string;
|
|
147
|
+
const sessionId = rawSessionId
|
|
148
|
+
? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
|
|
149
|
+
: (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
|
|
150
|
+
|
|
151
|
+
await canvasManager.sendA2UIMessage(sessionId, "a2ui:updateComponents", {
|
|
152
|
+
surfaceId: params.surfaceId as string,
|
|
153
|
+
components: params.components,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
log.info(`Updated A2UI components on surface '${params.surfaceId}' (${(params.components as any[]).length} components)`);
|
|
157
|
+
return JSON.stringify({
|
|
158
|
+
status: "updated",
|
|
159
|
+
surfaceId: params.surfaceId,
|
|
160
|
+
componentCount: (params.components as any[]).length,
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function createA2UIUpdateDataModelTool(_config: Config): Tool {
|
|
167
|
+
const log = logger.child("a2ui-data");
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
name: "a2ui_update_data_model",
|
|
171
|
+
description: "Update the data model for an A2UI v0.9 surface. The data model provides dynamic values that components can bind to via paths (e.g. '/user/name').",
|
|
172
|
+
parameters: {
|
|
173
|
+
type: "object",
|
|
174
|
+
properties: {
|
|
175
|
+
sessionId: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "Session ID to render to",
|
|
178
|
+
},
|
|
179
|
+
surfaceId: {
|
|
180
|
+
type: "string",
|
|
181
|
+
description: "The surface ID whose data model to update",
|
|
182
|
+
},
|
|
183
|
+
path: {
|
|
184
|
+
type: "string",
|
|
185
|
+
description: "JSON Pointer path to update (e.g. '/user/name'). If omitted, replaces the entire data model.",
|
|
186
|
+
},
|
|
187
|
+
value: {
|
|
188
|
+
type: "object",
|
|
189
|
+
description: "The new value for the specified path. Can be any JSON value.",
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
required: ["surfaceId"],
|
|
193
|
+
},
|
|
194
|
+
execute: async (params: Record<string, unknown>, config?: any) => {
|
|
195
|
+
const userId = config?.configurable?.user_id;
|
|
196
|
+
const rawSessionId = params.sessionId as string;
|
|
197
|
+
const sessionId = rawSessionId
|
|
198
|
+
? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
|
|
199
|
+
: (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
|
|
200
|
+
|
|
201
|
+
await canvasManager.sendA2UIMessage(sessionId, "a2ui:updateDataModel", {
|
|
202
|
+
surfaceId: params.surfaceId as string,
|
|
203
|
+
path: params.path as string | undefined,
|
|
204
|
+
value: params.value,
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
log.info(`Updated A2UI data model on surface '${params.surfaceId}' (path: ${params.path ?? "/"})`);
|
|
208
|
+
return JSON.stringify({
|
|
209
|
+
status: "updated",
|
|
210
|
+
surfaceId: params.surfaceId,
|
|
211
|
+
path: params.path ?? "/",
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function createA2UIDeleteSurfaceTool(_config: Config): Tool {
|
|
218
|
+
const log = logger.child("a2ui-delete");
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
name: "a2ui_delete_surface",
|
|
222
|
+
description: "Delete an A2UI v0.9 surface and remove it from the user's canvas",
|
|
223
|
+
parameters: {
|
|
224
|
+
type: "object",
|
|
225
|
+
properties: {
|
|
226
|
+
sessionId: {
|
|
227
|
+
type: "string",
|
|
228
|
+
description: "Session ID",
|
|
229
|
+
},
|
|
230
|
+
surfaceId: {
|
|
231
|
+
type: "string",
|
|
232
|
+
description: "The surface ID to delete",
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
required: ["surfaceId"],
|
|
236
|
+
},
|
|
237
|
+
execute: async (params: Record<string, unknown>, config?: any) => {
|
|
238
|
+
const userId = config?.configurable?.user_id;
|
|
239
|
+
const rawSessionId = params.sessionId as string;
|
|
240
|
+
const sessionId = rawSessionId
|
|
241
|
+
? (rawSessionId.startsWith("canvas:") ? rawSessionId : `canvas:${rawSessionId}`)
|
|
242
|
+
: (userId ? `canvas:${userId}` : (() => { throw new Error("No session or user ID provided"); })());
|
|
243
|
+
|
|
244
|
+
await canvasManager.sendA2UIMessage(sessionId, "a2ui:deleteSurface", {
|
|
245
|
+
surfaceId: params.surfaceId as string,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
log.info(`Deleted A2UI surface '${params.surfaceId}'`);
|
|
249
|
+
return JSON.stringify({
|
|
250
|
+
status: "deleted",
|
|
251
|
+
surfaceId: params.surfaceId,
|
|
252
|
+
});
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|