@xopcai/xopc 0.0.103 → 0.0.104
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 +7 -4
- package/README.zh-CN.md +7 -4
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
- package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +35 -18
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +27 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -5
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.js +10 -5
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +7 -4
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +8 -5
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +73 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -1
- package/dist/src/providers/index.js +18 -7
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +21 -15
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
- package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
- package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
- package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
- package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { parseRequiredEnvVarNames } from "./required-env-vars.js";
|
|
4
|
-
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
5
|
-
import { join, resolve, sep } from "path";
|
|
6
|
-
import { existsSync, readFileSync, realpathSync } from "fs";
|
|
1
|
+
import { resolve, sep } from "path";
|
|
2
|
+
import { existsSync, realpathSync } from "fs";
|
|
7
3
|
//#region src/agent/skills/skill-view-path.ts
|
|
8
4
|
/**
|
|
9
5
|
* Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.
|
|
10
|
-
* Also provides localized SKILL.md resolution for multi-language display.
|
|
11
6
|
*/
|
|
12
7
|
const ALLOWED_TOP = new Set([
|
|
13
8
|
"references",
|
|
@@ -71,65 +66,7 @@ function resolveSkillReadablePath(skill, subPath) {
|
|
|
71
66
|
};
|
|
72
67
|
}
|
|
73
68
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Resolve a localized SKILL.md for display (e.g. SKILL-zh.md, SKILL-en.md).
|
|
76
|
-
* Falls back to the base SKILL.md content if no localized file exists.
|
|
77
|
-
*
|
|
78
|
-
* This is the **display** path — execution always reads the base SKILL.md.
|
|
79
|
-
*/
|
|
80
|
-
function resolveLocalizedSkillMarkdown(skill, lang) {
|
|
81
|
-
if (!lang) return null;
|
|
82
|
-
const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();
|
|
83
|
-
if (!normalizedLang || normalizedLang === "en") return null;
|
|
84
|
-
const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);
|
|
85
|
-
if (!existsSync(localizedPath)) return null;
|
|
86
|
-
try {
|
|
87
|
-
const { frontmatter, content } = parseFrontmatter(readFileSync(localizedPath, "utf-8"));
|
|
88
|
-
const fm = frontmatter;
|
|
89
|
-
const name = typeof fm.name === "string" && fm.name.trim() || skill.name;
|
|
90
|
-
const description = (typeof fm.description === "string" ? fm.description.trim() : "") || skill.description;
|
|
91
|
-
const metadata = parseSkillMetadata(fm);
|
|
92
|
-
if (!metadata.name.trim()) metadata.name = name;
|
|
93
|
-
if (!metadata.description.trim()) metadata.description = description;
|
|
94
|
-
const toolConditions = parseSkillToolConditions(fm);
|
|
95
|
-
const requiredEnvVarNames = parseRequiredEnvVarNames(fm);
|
|
96
|
-
return {
|
|
97
|
-
name,
|
|
98
|
-
description,
|
|
99
|
-
bodyMarkdown: content.trim(),
|
|
100
|
-
disableModelInvocation: skill.disableModelInvocation,
|
|
101
|
-
metadata,
|
|
102
|
-
toolConditions,
|
|
103
|
-
requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : void 0
|
|
104
|
-
};
|
|
105
|
-
} catch {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Lightweight localized name/description lookup (frontmatter only) for list views.
|
|
111
|
-
* Reuses the same SKILL-{lang}.md resolution as {@link resolveLocalizedSkillMarkdown}.
|
|
112
|
-
*/
|
|
113
|
-
function resolveLocalizedSkillMeta(skill, lang) {
|
|
114
|
-
const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();
|
|
115
|
-
if (!normalizedLang || normalizedLang === "en") return null;
|
|
116
|
-
const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);
|
|
117
|
-
if (!existsSync(localizedPath)) return null;
|
|
118
|
-
try {
|
|
119
|
-
const { frontmatter } = parseFrontmatter(readFileSync(localizedPath, "utf-8"));
|
|
120
|
-
const fm = frontmatter;
|
|
121
|
-
const name = typeof fm.name === "string" && fm.name.trim() ? fm.name.trim() : void 0;
|
|
122
|
-
const description = typeof fm.description === "string" && fm.description.trim() ? fm.description.trim() : void 0;
|
|
123
|
-
if (!name && !description) return null;
|
|
124
|
-
return {
|
|
125
|
-
name: name ?? skill.name,
|
|
126
|
-
description: description ?? skill.description
|
|
127
|
-
};
|
|
128
|
-
} catch {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
69
|
//#endregion
|
|
133
|
-
export {
|
|
70
|
+
export { resolveSkillReadablePath };
|
|
134
71
|
|
|
135
72
|
//# sourceMappingURL=skill-view-path.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-view-path.js","names":[],"sources":["../../../../src/agent/skills/skill-view-path.ts"],"sourcesContent":["/**\n * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.\n
|
|
1
|
+
{"version":3,"file":"skill-view-path.js","names":[],"sources":["../../../../src/agent/skills/skill-view-path.ts"],"sourcesContent":["/**\n * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.\n */\n\nimport { existsSync, realpathSync } from 'fs';\nimport { resolve, sep } from 'path';\n\nimport type { Skill } from './types.js';\n\nconst ALLOWED_TOP = new Set(['references', 'templates', 'scripts', 'assets']);\n\nexport type ResolveSkillFileResult =\n | { ok: true; absolutePath: string }\n | { ok: false; error: string };\n\nfunction isSkillMdSegment(p: string): boolean {\n const s = p.trim();\n return s === 'SKILL.md' || s.toLowerCase() === 'skill.md';\n}\n\nfunction isInsideDir(dirReal: string, fileReal: string): boolean {\n const prefix = dirReal.endsWith(sep) ? dirReal : dirReal + sep;\n return fileReal === dirReal || fileReal.startsWith(prefix);\n}\n\n/**\n * Resolve a readable file path for {@link skill}. Empty or SKILL.md → main SKILL.md file.\n * Other paths must live under references/, templates/, scripts/, or assets/.\n */\nexport function resolveSkillReadablePath(\n skill: Skill,\n subPath: string | undefined,\n): ResolveSkillFileResult {\n const base = skill.baseDir;\n const trimmed = subPath?.trim() ?? '';\n\n let target: string;\n if (!trimmed || trimmed === '.' || isSkillMdSegment(trimmed)) {\n target = skill.filePath;\n } else {\n const norm = trimmed.replace(/\\\\/g, '/');\n if (norm.includes('..')) {\n return { ok: false, error: 'Invalid path: path traversal is not allowed.' };\n }\n if (norm.startsWith('/') || /^[A-Za-z]:/.test(norm)) {\n return {\n ok: false,\n error: 'Invalid path: use a path relative to the skill directory.',\n };\n }\n const first = norm.split('/').filter(Boolean)[0] ?? '';\n if (!ALLOWED_TOP.has(first)) {\n return {\n ok: false,\n error: `Invalid path: must be under references/, templates/, scripts/, or assets/ (or omit path for SKILL.md).`,\n };\n }\n target = resolve(base, norm);\n }\n\n try {\n const baseReal = realpathSync(base);\n if (!existsSync(target)) {\n return { ok: false, error: `File not found: ${trimmed || 'SKILL.md'}` };\n }\n const targetReal = realpathSync(target);\n if (!isInsideDir(baseReal, targetReal)) {\n return { ok: false, error: 'Resolved path escapes the skill directory.' };\n }\n return { ok: true, absolutePath: targetReal };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n}\n"],"mappings":";;;;;;AASA,MAAM,cAAc,IAAI,IAAI;CAAC;CAAc;CAAa;CAAW;CAAS,CAAC;AAM7E,SAAS,iBAAiB,GAAoB;CAC5C,MAAM,IAAI,EAAE,MAAM;AAClB,QAAO,MAAM,cAAc,EAAE,aAAa,KAAK;;AAGjD,SAAS,YAAY,SAAiB,UAA2B;CAC/D,MAAM,SAAS,QAAQ,SAAS,IAAI,GAAG,UAAU,UAAU;AAC3D,QAAO,aAAa,WAAW,SAAS,WAAW,OAAO;;;;;;AAO5D,SAAgB,yBACd,OACA,SACwB;CACxB,MAAM,OAAO,MAAM;CACnB,MAAM,UAAU,SAAS,MAAM,IAAI;CAEnC,IAAI;AACJ,KAAI,CAAC,WAAW,YAAY,OAAO,iBAAiB,QAAQ,CAC1D,UAAS,MAAM;MACV;EACL,MAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AACxC,MAAI,KAAK,SAAS,KAAK,CACrB,QAAO;GAAE,IAAI;GAAO,OAAO;GAAgD;AAE7E,MAAI,KAAK,WAAW,IAAI,IAAI,aAAa,KAAK,KAAK,CACjD,QAAO;GACL,IAAI;GACJ,OAAO;GACR;EAEH,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM;AACpD,MAAI,CAAC,YAAY,IAAI,MAAM,CACzB,QAAO;GACL,IAAI;GACJ,OAAO;GACR;AAEH,WAAS,QAAQ,MAAM,KAAK;;AAG9B,KAAI;EACF,MAAM,WAAW,aAAa,KAAK;AACnC,MAAI,CAAC,WAAW,OAAO,CACrB,QAAO;GAAE,IAAI;GAAO,OAAO,mBAAmB,WAAW;GAAc;EAEzE,MAAM,aAAa,aAAa,OAAO;AACvC,MAAI,CAAC,YAAY,UAAU,WAAW,CACpC,QAAO;GAAE,IAAI;GAAO,OAAO;GAA8C;AAE3E,SAAO;GAAE,IAAI;GAAM,cAAc;GAAY;UACtC,GAAG;AACV,SAAO;GAAE,IAAI;GAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;GAAE"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
4
|
-
import { hasBinary
|
|
5
|
-
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
4
|
+
import { hasBinary } from "./installer.js";
|
|
6
5
|
import { scanSkillDirectory } from "./scanner.js";
|
|
6
|
+
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
7
7
|
import { basename, join, relative } from "path";
|
|
8
8
|
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
9
9
|
//#region src/agent/skills/test-framework.ts
|
|
@@ -14,7 +14,6 @@ import { existsSync, readFileSync, readdirSync } from "fs";
|
|
|
14
14
|
* Validates SKILL.md format, dependencies, security, and examples.
|
|
15
15
|
*/
|
|
16
16
|
init_logger();
|
|
17
|
-
init_installer();
|
|
18
17
|
const log = createLogger("SkillTestFramework");
|
|
19
18
|
var SkillTestFramework = class {
|
|
20
19
|
options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-framework.js","names":[],"sources":["../../../../src/agent/skills/test-framework.ts"],"sourcesContent":["/**\n * Skill Test Framework\n * \n * Comprehensive testing framework for skills.\n * Validates SKILL.md format, dependencies, security, and examples.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join, relative } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { scanSkillDirectory } from './scanner.js';\nimport { hasBinary } from './installer.js';\nimport type { SkillMetadata, SkillInstallSpec } from './types.js';\n\nconst log = createLogger('SkillTestFramework');\n\n// ============================================================================\n// Test Result Types\n// ============================================================================\n\nexport type TestStatus = 'pass' | 'fail' | 'warn' | 'skip';\n\nexport interface TestResult {\n name: string;\n status: TestStatus;\n message?: string;\n details?: string[];\n duration?: number;\n}\n\nexport interface SkillTestReport {\n skillName: string;\n skillPath: string;\n timestamp: number;\n results: TestResult[];\n summary: {\n total: number;\n passed: number;\n failed: number;\n warnings: number;\n skipped: number;\n };\n passed: boolean;\n}\n\nexport interface TestOptions {\n /** Skip security tests */\n skipSecurity?: boolean;\n /** Skip dependency tests */\n skipDeps?: boolean;\n /** Skip example tests */\n skipExamples?: boolean;\n /** Strict mode - fail on warnings */\n strict?: boolean;\n /** Timeout for example tests (ms) */\n exampleTimeout?: number;\n /** Working directory for example tests */\n cwd?: string;\n}\n\n// ============================================================================\n// Test Framework Core\n// ============================================================================\n\nexport class SkillTestFramework {\n private options: TestOptions;\n\n constructor(options: TestOptions = {}) {\n this.options = {\n skipSecurity: false,\n skipDeps: false,\n skipExamples: false,\n strict: false,\n exampleTimeout: 10000,\n cwd: process.cwd(),\n ...options,\n };\n }\n\n /**\n * Run all tests for a skill\n */\n async testSkill(skillDir: string): Promise<SkillTestReport> {\n const results: TestResult[] = [];\n\n log.info({ skillDir }, 'Testing skill');\n\n // Validate skill directory\n if (!existsSync(skillDir)) {\n return this.createFailureReport(skillDir, 'Skill directory not found');\n }\n\n const skillMdPath = join(skillDir, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return this.createFailureReport(skillDir, 'SKILL.md not found');\n }\n\n // Parse SKILL.md\n const parseResult = this.testSkillMdFormat(skillMdPath);\n results.push(parseResult);\n\n if (parseResult.status === 'fail') {\n return this.createReport(skillDir, results);\n }\n\n const { frontmatter } = parseFrontmatter(readFileSync(skillMdPath, 'utf-8'));\n const metadata = parseSkillMetadata(frontmatter);\n\n // Run dependency tests\n if (!this.options.skipDeps) {\n const depsResult = await this.testDependencies(metadata);\n results.push(depsResult);\n }\n\n // Run security tests\n if (!this.options.skipSecurity) {\n const securityResult = await this.testSecurity(skillDir);\n results.push(securityResult);\n }\n\n // Run metadata tests\n const metadataResult = this.testMetadata(metadata, skillDir);\n results.push(metadataResult);\n\n // Run example tests\n if (!this.options.skipExamples) {\n const content = readFileSync(skillMdPath, 'utf-8');\n const examplesResult = await this.testExamples(content, skillDir);\n results.push(examplesResult);\n }\n\n return this.createReport(skillDir, results);\n }\n\n /**\n * Test SKILL.md format\n */\n testSkillMdFormat(filePath: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check for frontmatter\n if (!content.startsWith('---')) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing YAML frontmatter',\n duration: Date.now() - startTime,\n };\n }\n\n const { frontmatter } = parseFrontmatter(content);\n\n // Required fields\n const requiredFields = ['name', 'description'];\n for (const field of requiredFields) {\n if (!frontmatter[field]) {\n details.push(`Missing required field: ${field}`);\n }\n }\n\n if (details.length > 0) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing required frontmatter fields',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // Validate field types\n if (typeof frontmatter.name !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"name\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n if (typeof frontmatter.description !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"description\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n // Check for content after frontmatter\n const { content: bodyContent } = parseFrontmatter(content);\n if (!bodyContent || bodyContent.length < 10) {\n return {\n name: 'SKILL.md format',\n status: 'warn',\n message: 'SKILL.md body is too short',\n details: ['Consider adding more detailed documentation'],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'SKILL.md format',\n status: 'pass',\n message: 'Valid SKILL.md format',\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Failed to parse SKILL.md',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test dependencies\n */\n async testDependencies(metadata: SkillMetadata): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n let hasFailures = false;\n\n const requires = metadata.xopc?.requires;\n\n if (!requires) {\n return {\n name: 'Dependencies',\n status: 'skip',\n message: 'No dependencies declared',\n duration: Date.now() - startTime,\n };\n }\n\n // Check required binaries\n if (requires.bins) {\n for (const bin of requires.bins) {\n const available = hasBinary(bin);\n if (!available) {\n details.push(`Missing required binary: ${bin}`);\n hasFailures = true;\n } else {\n details.push(`Found binary: ${bin}`);\n }\n }\n }\n\n // Check anyBins (OR condition)\n if (requires.anyBins) {\n const hasAny = requires.anyBins.some(bin => hasBinary(bin));\n if (!hasAny) {\n details.push(`Missing binaries (need one of): ${requires.anyBins.join(', ')}`);\n hasFailures = true;\n } else {\n details.push(`Found at least one binary from: ${requires.anyBins.join(', ')}`);\n }\n }\n\n // Check install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Available installers: ${installSpecs.map(s => s.kind).join(', ')}`);\n \n // Validate install specs\n for (const spec of installSpecs) {\n const installCheck = this.validateInstallSpec(spec);\n if (installCheck.status === 'fail') {\n details.push(installCheck.message);\n hasWarnings = true;\n }\n }\n }\n\n return {\n name: 'Dependencies',\n status: hasFailures ? 'fail' : hasWarnings ? 'warn' : 'pass',\n message: hasFailures ? 'Missing dependencies' : hasWarnings ? 'Dependency warnings' : 'All dependencies satisfied',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test security\n */\n async testSecurity(skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n const summary = await scanSkillDirectory(skillDir);\n\n const details: string[] = [\n `Critical: ${summary.critical}`,\n `Warnings: ${summary.warn}`,\n `Info: ${summary.info}`,\n ];\n\n if (summary.critical > 0) {\n return {\n name: 'Security',\n status: 'fail',\n message: 'Critical security issues found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'critical')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n if (summary.warn > 0) {\n return {\n name: 'Security',\n status: 'warn',\n message: 'Security warnings found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'warning')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'Security',\n status: 'pass',\n message: 'No security issues',\n details,\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'Security',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Security scan failed',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test metadata\n */\n testMetadata(metadata: SkillMetadata, _skillDir: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n\n // Check for emoji\n const emoji = metadata.xopc?.emoji;\n if (emoji) {\n details.push(`Emoji: ${emoji}`);\n } else {\n details.push('No emoji defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for homepage\n if (metadata.homepage) {\n details.push(`Homepage: ${metadata.homepage}`);\n } else {\n details.push('No homepage defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for OS restrictions\n const os = metadata.xopc?.os;\n if (os) {\n details.push(`Supported OS: ${os.join(', ')}`);\n }\n\n // Check for install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Installers: ${installSpecs.length} defined`);\n }\n\n return {\n name: 'Metadata',\n status: hasWarnings ? 'warn' : 'pass',\n message: hasWarnings ? 'Metadata could be improved' : 'Complete metadata',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test code examples\n */\n async testExamples(content: string, _skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasFailures = false;\n\n // Extract code blocks\n const codeBlocks = this.extractCodeBlocks(content);\n \n if (codeBlocks.length === 0) {\n return {\n name: 'Examples',\n status: 'warn',\n message: 'No code examples found',\n details: ['Consider adding usage examples'],\n duration: Date.now() - startTime,\n };\n }\n\n details.push(`Found ${codeBlocks.length} code block(s)`);\n\n // Test shell command examples (basic validation)\n const shellCommands = codeBlocks.filter(block => {\n const lang = block.language?.toLowerCase();\n return lang === 'bash' || lang === 'sh' || lang === 'shell';\n });\n\n if (shellCommands.length > 0) {\n details.push(`Shell examples: ${shellCommands.length}`);\n \n // Validate command syntax (basic check)\n for (const cmd of shellCommands) {\n const syntaxCheck = this.validateShellSyntax(cmd.code);\n if (!syntaxCheck.valid) {\n details.push(`Invalid syntax: ${syntaxCheck.error}`);\n hasFailures = true;\n }\n }\n }\n\n return {\n name: 'Examples',\n status: hasFailures ? 'fail' : 'pass',\n message: hasFailures ? 'Invalid examples found' : 'Examples validated',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private validateInstallSpec(spec: SkillInstallSpec): TestResult {\n switch (spec.kind) {\n case 'brew':\n if (!spec.formula) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Brew installer missing \"formula\" field',\n };\n }\n break;\n case 'pnpm':\n case 'npm':\n case 'yarn':\n case 'bun':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Node installer missing \"package\" field',\n };\n }\n break;\n case 'go':\n if (!spec.module) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Go installer missing \"module\" field',\n };\n }\n break;\n case 'uv':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'UV installer missing \"package\" field',\n };\n }\n break;\n }\n return { name: 'Install spec', status: 'pass' };\n }\n\n private extractCodeBlocks(content: string): Array<{ language: string; code: string }> {\n const blocks: Array<{ language: string; code: string }> = [];\n const regex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push({\n language: match[1] || 'text',\n code: match[2].trim(),\n });\n }\n\n return blocks;\n }\n\n private validateShellSyntax(code: string): { valid: boolean; error?: string } {\n // Basic validation - check for common syntax errors\n const lines = code.split('\\n').filter(line => line.trim() && !line.trim().startsWith('#'));\n \n for (const line of lines) {\n // Check for unclosed quotes\n const singleQuotes = (line.match(/'/g) || []).length;\n const doubleQuotes = (line.match(/\"/g) || []).length;\n \n if (singleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed single quote' };\n }\n if (doubleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed double quote' };\n }\n \n // Check for unclosed parentheses/brackets\n const openParens = (line.match(/\\(/g) || []).length;\n const closeParens = (line.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n return { valid: false, error: 'Mismatched parentheses' };\n }\n }\n\n return { valid: true };\n }\n\n private createReport(skillDir: string, results: TestResult[]): SkillTestReport {\n const summary = {\n total: results.length,\n passed: results.filter(r => r.status === 'pass').length,\n failed: results.filter(r => r.status === 'fail').length,\n warnings: results.filter(r => r.status === 'warn').length,\n skipped: results.filter(r => r.status === 'skip').length,\n };\n\n const passed = summary.failed === 0 && (this.options.strict ? summary.warnings === 0 : true);\n\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results,\n summary,\n passed,\n };\n }\n\n private createFailureReport(skillDir: string, message: string): SkillTestReport {\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results: [{\n name: 'Validation',\n status: 'fail',\n message,\n }],\n summary: {\n total: 1,\n passed: 0,\n failed: 1,\n warnings: 0,\n skipped: 0,\n },\n passed: false,\n };\n }\n}\n\n// ============================================================================\n// Test Runner\n// ============================================================================\n\nexport interface TestRunnerOptions extends TestOptions {\n /** Skills directory to test */\n skillsDir: string;\n /** Output format */\n format?: 'text' | 'json' | 'tap';\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport class SkillTestRunner {\n private options: TestRunnerOptions;\n private framework: SkillTestFramework;\n\n constructor(options: TestRunnerOptions) {\n this.options = options;\n this.framework = new SkillTestFramework(options);\n }\n\n async run(): Promise<{ reports: SkillTestReport[]; passed: boolean }> {\n const reports: SkillTestReport[] = [];\n const skillsDir = this.options.skillsDir;\n\n log.info({ skillsDir }, 'Running skill tests');\n\n // Find all skill directories\n const skillDirs = this.findSkillDirectories(skillsDir);\n\n for (const skillDir of skillDirs) {\n const report = await this.framework.testSkill(skillDir);\n reports.push(report);\n }\n\n const allPassed = reports.every(r => r.passed);\n\n return { reports, passed: allPassed };\n }\n\n private findSkillDirectories(skillsDir: string): string[] {\n const dirs: string[] = [];\n\n try {\n const entries = readdirSync(skillsDir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const skillDir = join(skillsDir, entry.name);\n const skillMdPath = join(skillDir, 'SKILL.md');\n \n if (existsSync(skillMdPath)) {\n dirs.push(skillDir);\n }\n }\n }\n } catch (err) {\n log.warn({ error: err }, 'Failed to scan skills directory');\n }\n\n return dirs;\n }\n}\n\n/**\n * Format test results as text\n */\nexport function formatTestResults(reports: SkillTestReport[], verbose = false): string {\n const lines: string[] = [];\n \n for (const report of reports) {\n const icon = report.passed ? '✅' : '❌';\n lines.push(`\\n${icon} ${report.skillName}`);\n lines.push('─'.repeat(50));\n\n for (const result of report.results) {\n const statusIcon = result.status === 'pass' ? '✓' : result.status === 'fail' ? '✗' : result.status === 'warn' ? '⚠' : '○';\n lines.push(` ${statusIcon} ${result.name}: ${result.message || ''}`);\n \n if (verbose && result.details) {\n for (const detail of result.details) {\n lines.push(` ${detail}`);\n }\n }\n }\n\n lines.push(` Summary: ${report.summary.passed}/${report.summary.total} passed`);\n if (report.summary.failed > 0) {\n lines.push(` Failed: ${report.summary.failed}`);\n }\n if (report.summary.warnings > 0) {\n lines.push(` Warnings: ${report.summary.warnings}`);\n }\n }\n\n const totalTests = reports.reduce((sum, r) => sum + r.summary.total, 0);\n const totalPassed = reports.reduce((sum, r) => sum + r.summary.passed, 0);\n const totalFailed = reports.reduce((sum, r) => sum + r.summary.failed, 0);\n const totalWarnings = reports.reduce((sum, r) => sum + r.summary.warnings, 0);\n\n lines.push('\\n' + '='.repeat(50));\n lines.push(`Total: ${totalTests} tests, ${totalPassed} passed, ${totalFailed} failed, ${totalWarnings} warnings`);\n \n const allPassed = reports.every(r => r.passed);\n lines.push(`Result: ${allPassed ? '✅ PASSED' : '❌ FAILED'}`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format test results as JSON\n */\nexport function formatTestResultsJson(reports: SkillTestReport[]): string {\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n totalSkills: reports.length,\n passedSkills: reports.filter(r => r.passed).length,\n reports,\n }, null, 2);\n}\n\n/**\n * Format test results as TAP (Test Anything Protocol)\n */\nexport function formatTestResultsTap(reports: SkillTestReport[]): string {\n const lines: string[] = [];\n let testNum = 1;\n\n lines.push(`TAP version 13`);\n lines.push(`1..${reports.reduce((sum, r) => sum + r.results.length, 0)}`);\n\n for (const report of reports) {\n for (const result of report.results) {\n const status = result.status === 'pass' ? 'ok' : 'not ok';\n const testId = testNum++;\n lines.push(`${status} ${testId} - ${report.skillName}: ${result.name}`);\n \n if (result.status === 'fail' && result.message) {\n lines.push(` ---`);\n lines.push(` message: ${result.message}`);\n lines.push(` ...`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-framework.js","names":[],"sources":["../../../../src/agent/skills/test-framework.ts"],"sourcesContent":["/**\n * Skill Test Framework\n * \n * Comprehensive testing framework for skills.\n * Validates SKILL.md format, dependencies, security, and examples.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join, relative } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { scanSkillDirectory } from './scanner.js';\nimport { hasBinary } from './installer.js';\nimport type { SkillMetadata, SkillInstallSpec } from './types.js';\n\nconst log = createLogger('SkillTestFramework');\n\n// ============================================================================\n// Test Result Types\n// ============================================================================\n\nexport type TestStatus = 'pass' | 'fail' | 'warn' | 'skip';\n\nexport interface TestResult {\n name: string;\n status: TestStatus;\n message?: string;\n details?: string[];\n duration?: number;\n}\n\nexport interface SkillTestReport {\n skillName: string;\n skillPath: string;\n timestamp: number;\n results: TestResult[];\n summary: {\n total: number;\n passed: number;\n failed: number;\n warnings: number;\n skipped: number;\n };\n passed: boolean;\n}\n\nexport interface TestOptions {\n /** Skip security tests */\n skipSecurity?: boolean;\n /** Skip dependency tests */\n skipDeps?: boolean;\n /** Skip example tests */\n skipExamples?: boolean;\n /** Strict mode - fail on warnings */\n strict?: boolean;\n /** Timeout for example tests (ms) */\n exampleTimeout?: number;\n /** Working directory for example tests */\n cwd?: string;\n}\n\n// ============================================================================\n// Test Framework Core\n// ============================================================================\n\nexport class SkillTestFramework {\n private options: TestOptions;\n\n constructor(options: TestOptions = {}) {\n this.options = {\n skipSecurity: false,\n skipDeps: false,\n skipExamples: false,\n strict: false,\n exampleTimeout: 10000,\n cwd: process.cwd(),\n ...options,\n };\n }\n\n /**\n * Run all tests for a skill\n */\n async testSkill(skillDir: string): Promise<SkillTestReport> {\n const results: TestResult[] = [];\n\n log.info({ skillDir }, 'Testing skill');\n\n // Validate skill directory\n if (!existsSync(skillDir)) {\n return this.createFailureReport(skillDir, 'Skill directory not found');\n }\n\n const skillMdPath = join(skillDir, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return this.createFailureReport(skillDir, 'SKILL.md not found');\n }\n\n // Parse SKILL.md\n const parseResult = this.testSkillMdFormat(skillMdPath);\n results.push(parseResult);\n\n if (parseResult.status === 'fail') {\n return this.createReport(skillDir, results);\n }\n\n const { frontmatter } = parseFrontmatter(readFileSync(skillMdPath, 'utf-8'));\n const metadata = parseSkillMetadata(frontmatter);\n\n // Run dependency tests\n if (!this.options.skipDeps) {\n const depsResult = await this.testDependencies(metadata);\n results.push(depsResult);\n }\n\n // Run security tests\n if (!this.options.skipSecurity) {\n const securityResult = await this.testSecurity(skillDir);\n results.push(securityResult);\n }\n\n // Run metadata tests\n const metadataResult = this.testMetadata(metadata, skillDir);\n results.push(metadataResult);\n\n // Run example tests\n if (!this.options.skipExamples) {\n const content = readFileSync(skillMdPath, 'utf-8');\n const examplesResult = await this.testExamples(content, skillDir);\n results.push(examplesResult);\n }\n\n return this.createReport(skillDir, results);\n }\n\n /**\n * Test SKILL.md format\n */\n testSkillMdFormat(filePath: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check for frontmatter\n if (!content.startsWith('---')) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing YAML frontmatter',\n duration: Date.now() - startTime,\n };\n }\n\n const { frontmatter } = parseFrontmatter(content);\n\n // Required fields\n const requiredFields = ['name', 'description'];\n for (const field of requiredFields) {\n if (!frontmatter[field]) {\n details.push(`Missing required field: ${field}`);\n }\n }\n\n if (details.length > 0) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing required frontmatter fields',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // Validate field types\n if (typeof frontmatter.name !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"name\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n if (typeof frontmatter.description !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"description\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n // Check for content after frontmatter\n const { content: bodyContent } = parseFrontmatter(content);\n if (!bodyContent || bodyContent.length < 10) {\n return {\n name: 'SKILL.md format',\n status: 'warn',\n message: 'SKILL.md body is too short',\n details: ['Consider adding more detailed documentation'],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'SKILL.md format',\n status: 'pass',\n message: 'Valid SKILL.md format',\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Failed to parse SKILL.md',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test dependencies\n */\n async testDependencies(metadata: SkillMetadata): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n let hasFailures = false;\n\n const requires = metadata.xopc?.requires;\n\n if (!requires) {\n return {\n name: 'Dependencies',\n status: 'skip',\n message: 'No dependencies declared',\n duration: Date.now() - startTime,\n };\n }\n\n // Check required binaries\n if (requires.bins) {\n for (const bin of requires.bins) {\n const available = hasBinary(bin);\n if (!available) {\n details.push(`Missing required binary: ${bin}`);\n hasFailures = true;\n } else {\n details.push(`Found binary: ${bin}`);\n }\n }\n }\n\n // Check anyBins (OR condition)\n if (requires.anyBins) {\n const hasAny = requires.anyBins.some(bin => hasBinary(bin));\n if (!hasAny) {\n details.push(`Missing binaries (need one of): ${requires.anyBins.join(', ')}`);\n hasFailures = true;\n } else {\n details.push(`Found at least one binary from: ${requires.anyBins.join(', ')}`);\n }\n }\n\n // Check install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Available installers: ${installSpecs.map(s => s.kind).join(', ')}`);\n \n // Validate install specs\n for (const spec of installSpecs) {\n const installCheck = this.validateInstallSpec(spec);\n if (installCheck.status === 'fail') {\n details.push(installCheck.message);\n hasWarnings = true;\n }\n }\n }\n\n return {\n name: 'Dependencies',\n status: hasFailures ? 'fail' : hasWarnings ? 'warn' : 'pass',\n message: hasFailures ? 'Missing dependencies' : hasWarnings ? 'Dependency warnings' : 'All dependencies satisfied',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test security\n */\n async testSecurity(skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n const summary = await scanSkillDirectory(skillDir);\n\n const details: string[] = [\n `Critical: ${summary.critical}`,\n `Warnings: ${summary.warn}`,\n `Info: ${summary.info}`,\n ];\n\n if (summary.critical > 0) {\n return {\n name: 'Security',\n status: 'fail',\n message: 'Critical security issues found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'critical')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n if (summary.warn > 0) {\n return {\n name: 'Security',\n status: 'warn',\n message: 'Security warnings found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'warning')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'Security',\n status: 'pass',\n message: 'No security issues',\n details,\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'Security',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Security scan failed',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test metadata\n */\n testMetadata(metadata: SkillMetadata, _skillDir: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n\n // Check for emoji\n const emoji = metadata.xopc?.emoji;\n if (emoji) {\n details.push(`Emoji: ${emoji}`);\n } else {\n details.push('No emoji defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for homepage\n if (metadata.homepage) {\n details.push(`Homepage: ${metadata.homepage}`);\n } else {\n details.push('No homepage defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for OS restrictions\n const os = metadata.xopc?.os;\n if (os) {\n details.push(`Supported OS: ${os.join(', ')}`);\n }\n\n // Check for install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Installers: ${installSpecs.length} defined`);\n }\n\n return {\n name: 'Metadata',\n status: hasWarnings ? 'warn' : 'pass',\n message: hasWarnings ? 'Metadata could be improved' : 'Complete metadata',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test code examples\n */\n async testExamples(content: string, _skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasFailures = false;\n\n // Extract code blocks\n const codeBlocks = this.extractCodeBlocks(content);\n \n if (codeBlocks.length === 0) {\n return {\n name: 'Examples',\n status: 'warn',\n message: 'No code examples found',\n details: ['Consider adding usage examples'],\n duration: Date.now() - startTime,\n };\n }\n\n details.push(`Found ${codeBlocks.length} code block(s)`);\n\n // Test shell command examples (basic validation)\n const shellCommands = codeBlocks.filter(block => {\n const lang = block.language?.toLowerCase();\n return lang === 'bash' || lang === 'sh' || lang === 'shell';\n });\n\n if (shellCommands.length > 0) {\n details.push(`Shell examples: ${shellCommands.length}`);\n \n // Validate command syntax (basic check)\n for (const cmd of shellCommands) {\n const syntaxCheck = this.validateShellSyntax(cmd.code);\n if (!syntaxCheck.valid) {\n details.push(`Invalid syntax: ${syntaxCheck.error}`);\n hasFailures = true;\n }\n }\n }\n\n return {\n name: 'Examples',\n status: hasFailures ? 'fail' : 'pass',\n message: hasFailures ? 'Invalid examples found' : 'Examples validated',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private validateInstallSpec(spec: SkillInstallSpec): TestResult {\n switch (spec.kind) {\n case 'brew':\n if (!spec.formula) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Brew installer missing \"formula\" field',\n };\n }\n break;\n case 'pnpm':\n case 'npm':\n case 'yarn':\n case 'bun':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Node installer missing \"package\" field',\n };\n }\n break;\n case 'go':\n if (!spec.module) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Go installer missing \"module\" field',\n };\n }\n break;\n case 'uv':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'UV installer missing \"package\" field',\n };\n }\n break;\n }\n return { name: 'Install spec', status: 'pass' };\n }\n\n private extractCodeBlocks(content: string): Array<{ language: string; code: string }> {\n const blocks: Array<{ language: string; code: string }> = [];\n const regex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push({\n language: match[1] || 'text',\n code: match[2].trim(),\n });\n }\n\n return blocks;\n }\n\n private validateShellSyntax(code: string): { valid: boolean; error?: string } {\n // Basic validation - check for common syntax errors\n const lines = code.split('\\n').filter(line => line.trim() && !line.trim().startsWith('#'));\n \n for (const line of lines) {\n // Check for unclosed quotes\n const singleQuotes = (line.match(/'/g) || []).length;\n const doubleQuotes = (line.match(/\"/g) || []).length;\n \n if (singleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed single quote' };\n }\n if (doubleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed double quote' };\n }\n \n // Check for unclosed parentheses/brackets\n const openParens = (line.match(/\\(/g) || []).length;\n const closeParens = (line.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n return { valid: false, error: 'Mismatched parentheses' };\n }\n }\n\n return { valid: true };\n }\n\n private createReport(skillDir: string, results: TestResult[]): SkillTestReport {\n const summary = {\n total: results.length,\n passed: results.filter(r => r.status === 'pass').length,\n failed: results.filter(r => r.status === 'fail').length,\n warnings: results.filter(r => r.status === 'warn').length,\n skipped: results.filter(r => r.status === 'skip').length,\n };\n\n const passed = summary.failed === 0 && (this.options.strict ? summary.warnings === 0 : true);\n\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results,\n summary,\n passed,\n };\n }\n\n private createFailureReport(skillDir: string, message: string): SkillTestReport {\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results: [{\n name: 'Validation',\n status: 'fail',\n message,\n }],\n summary: {\n total: 1,\n passed: 0,\n failed: 1,\n warnings: 0,\n skipped: 0,\n },\n passed: false,\n };\n }\n}\n\n// ============================================================================\n// Test Runner\n// ============================================================================\n\nexport interface TestRunnerOptions extends TestOptions {\n /** Skills directory to test */\n skillsDir: string;\n /** Output format */\n format?: 'text' | 'json' | 'tap';\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport class SkillTestRunner {\n private options: TestRunnerOptions;\n private framework: SkillTestFramework;\n\n constructor(options: TestRunnerOptions) {\n this.options = options;\n this.framework = new SkillTestFramework(options);\n }\n\n async run(): Promise<{ reports: SkillTestReport[]; passed: boolean }> {\n const reports: SkillTestReport[] = [];\n const skillsDir = this.options.skillsDir;\n\n log.info({ skillsDir }, 'Running skill tests');\n\n // Find all skill directories\n const skillDirs = this.findSkillDirectories(skillsDir);\n\n for (const skillDir of skillDirs) {\n const report = await this.framework.testSkill(skillDir);\n reports.push(report);\n }\n\n const allPassed = reports.every(r => r.passed);\n\n return { reports, passed: allPassed };\n }\n\n private findSkillDirectories(skillsDir: string): string[] {\n const dirs: string[] = [];\n\n try {\n const entries = readdirSync(skillsDir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const skillDir = join(skillsDir, entry.name);\n const skillMdPath = join(skillDir, 'SKILL.md');\n \n if (existsSync(skillMdPath)) {\n dirs.push(skillDir);\n }\n }\n }\n } catch (err) {\n log.warn({ error: err }, 'Failed to scan skills directory');\n }\n\n return dirs;\n }\n}\n\n/**\n * Format test results as text\n */\nexport function formatTestResults(reports: SkillTestReport[], verbose = false): string {\n const lines: string[] = [];\n \n for (const report of reports) {\n const icon = report.passed ? '✅' : '❌';\n lines.push(`\\n${icon} ${report.skillName}`);\n lines.push('─'.repeat(50));\n\n for (const result of report.results) {\n const statusIcon = result.status === 'pass' ? '✓' : result.status === 'fail' ? '✗' : result.status === 'warn' ? '⚠' : '○';\n lines.push(` ${statusIcon} ${result.name}: ${result.message || ''}`);\n \n if (verbose && result.details) {\n for (const detail of result.details) {\n lines.push(` ${detail}`);\n }\n }\n }\n\n lines.push(` Summary: ${report.summary.passed}/${report.summary.total} passed`);\n if (report.summary.failed > 0) {\n lines.push(` Failed: ${report.summary.failed}`);\n }\n if (report.summary.warnings > 0) {\n lines.push(` Warnings: ${report.summary.warnings}`);\n }\n }\n\n const totalTests = reports.reduce((sum, r) => sum + r.summary.total, 0);\n const totalPassed = reports.reduce((sum, r) => sum + r.summary.passed, 0);\n const totalFailed = reports.reduce((sum, r) => sum + r.summary.failed, 0);\n const totalWarnings = reports.reduce((sum, r) => sum + r.summary.warnings, 0);\n\n lines.push('\\n' + '='.repeat(50));\n lines.push(`Total: ${totalTests} tests, ${totalPassed} passed, ${totalFailed} failed, ${totalWarnings} warnings`);\n \n const allPassed = reports.every(r => r.passed);\n lines.push(`Result: ${allPassed ? '✅ PASSED' : '❌ FAILED'}`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format test results as JSON\n */\nexport function formatTestResultsJson(reports: SkillTestReport[]): string {\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n totalSkills: reports.length,\n passedSkills: reports.filter(r => r.passed).length,\n reports,\n }, null, 2);\n}\n\n/**\n * Format test results as TAP (Test Anything Protocol)\n */\nexport function formatTestResultsTap(reports: SkillTestReport[]): string {\n const lines: string[] = [];\n let testNum = 1;\n\n lines.push(`TAP version 13`);\n lines.push(`1..${reports.reduce((sum, r) => sum + r.results.length, 0)}`);\n\n for (const report of reports) {\n for (const result of report.results) {\n const status = result.status === 'pass' ? 'ok' : 'not ok';\n const testId = testNum++;\n lines.push(`${status} ${testId} - ${report.skillName}: ${result.name}`);\n \n if (result.status === 'fail' && result.message) {\n lines.push(` ---`);\n lines.push(` message: ${result.message}`);\n lines.push(` ...`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
function applyReasoningVisibilityToSseEvent(event, reasoningLevel) {
|
|
6
6
|
if (reasoningLevel !== "off") return event;
|
|
7
7
|
if (event.type === "thinking") return null;
|
|
8
|
+
if (event.type === "message_update" && event.assistantMessageEvent?.type === "thinking_delta") return null;
|
|
8
9
|
if (event.type === "progress" && event.stage === "thinking") return null;
|
|
9
10
|
return event;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-visibility-sse.js","names":[],"sources":["../../../../src/agent/streaming/reasoning-visibility-sse.ts"],"sourcesContent":["/**\n * Outbound SSE visibility for session `reasoningLevel`.\n * Single choke point: call from the queue push path so agent subscribe stays free of policy branches.\n *\n * Note: Does not alter persisted messages or agent state; history/UI may still strip thinking separately.\n */\n\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\n\nexport type SseStreamEvent = { type: string; [key: string]: unknown };\n\n/**\n * @returns `null` to drop the event; unchanged `event` otherwise.\n */\nexport function applyReasoningVisibilityToSseEvent(\n event: SseStreamEvent,\n reasoningLevel: ReasoningLevel,\n): SseStreamEvent | null {\n if (reasoningLevel !== 'off') {\n return event;\n }\n if (event.type === 'thinking') {\n return null;\n }\n if (event.type === 'progress' && event.stage === 'thinking') {\n return null;\n }\n return event;\n}\n"],"mappings":";;;;AAcA,SAAgB,mCACd,OACA,gBACuB;AACvB,KAAI,mBAAmB,MACrB,QAAO;AAET,KAAI,MAAM,SAAS,WACjB,QAAO;AAET,KAAI,MAAM,SAAS,cAAc,MAAM,UAAU,WAC/C,QAAO;AAET,QAAO"}
|
|
1
|
+
{"version":3,"file":"reasoning-visibility-sse.js","names":[],"sources":["../../../../src/agent/streaming/reasoning-visibility-sse.ts"],"sourcesContent":["/**\n * Outbound SSE visibility for session `reasoningLevel`.\n * Single choke point: call from the queue push path so agent subscribe stays free of policy branches.\n *\n * Note: Does not alter persisted messages or agent state; history/UI may still strip thinking separately.\n */\n\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\n\nexport type SseStreamEvent = { type: string; [key: string]: unknown };\n\n/**\n * @returns `null` to drop the event; unchanged `event` otherwise.\n */\nexport function applyReasoningVisibilityToSseEvent(\n event: SseStreamEvent,\n reasoningLevel: ReasoningLevel,\n): SseStreamEvent | null {\n if (reasoningLevel !== 'off') {\n return event;\n }\n if (event.type === 'thinking') {\n return null;\n }\n if (\n event.type === 'message_update' &&\n (event.assistantMessageEvent as { type?: unknown } | undefined)?.type === 'thinking_delta'\n ) {\n return null;\n }\n if (event.type === 'progress' && event.stage === 'thinking') {\n return null;\n }\n return event;\n}\n"],"mappings":";;;;AAcA,SAAgB,mCACd,OACA,gBACuB;AACvB,KAAI,mBAAmB,MACrB,QAAO;AAET,KAAI,MAAM,SAAS,WACjB,QAAO;AAET,KACE,MAAM,SAAS,oBACd,MAAM,uBAA0D,SAAS,iBAE1E,QAAO;AAET,KAAI,MAAM,SAAS,cAAc,MAAM,UAAU,WAC/C,QAAO;AAET,QAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const browserUseManual = "# Browser Tool Manual\n\n## Overview\n\n`browser_use` is XOPC's unified browser tool. It supports four modes:\n\n| Mode | Purpose |\n|------|---------|\n| `command` | Run a single browser action |\n| `pipeline` | Run a multi-step YAML flow |\n| `inspect` | Read current page state |\n| `close` | Close the browser session |\n\n## When to use\n\n- Open pages, click controls, fill forms\n- Capture screenshots or page content\n- Run multi-step automation flows\n- Extract data from pages\n\n## Command mode\n\n### Basic shape\n\n```json\n{\n \"mode\": \"command\",\n \"command\": \"<action>\",\n \"args\": { ... }\n}\n```\n\n### Available commands\n\n| Command | Description | Key arguments |\n|---------|-------------|---------------|\n| `open` / `navigate` | Open a URL | `url`, `wait_until` |\n| `state` / `snapshot` | ARIA snapshot of the page | `selector`, `maxLength` |\n| `click` | Click an element | `selector` / `text` / `role` |\n| `type` / `input` | Type text | `selector` / `label`, `text`, `pressEnter` |\n| `scroll` | Scroll the page | `direction`, `amount` |\n| `screenshot` | Screenshot | `selector`, `full_page`, `path` |\n| `back` | Go back | `waitFor` |\n| `keys` / `press` | Keyboard input | `key` |\n| `console` / `eval` | Run JavaScript | `javascript` |\n| `images` | Collect images on the page | `selector`, `maxImages` |\n| `wait` | Wait for element/time | `selector` / `text` / `ms`, `timeout_ms` |\n| `dialog` | Handle dialogs | `action` (accept/dismiss) |\n| `close` | Close the current page | \u2014 |\n\n### Element targeting\n\nPrefer, in order:\n\n1. **ARIA role**: most stable, e.g. `\"role\": \"button:Submit\"`\n2. **Visible text**, e.g. `\"text\": \"Sign In\"`\n3. **CSS selector**, e.g. `\"selector\": \"#login-btn\"`\n\nGuidelines:\n\n- Use `inspect` or `state` first to get a snapshot\n- Pick locators from ARIA info in the snapshot\n- Avoid dynamic class names when possible\n\n## Inspect mode\n\nBefore acting, understand the current page:\n\n```json\n{ \"mode\": \"inspect\" }\n```\n\nReturns: current URL, title, ARIA snapshot.\n\n**Best practice**: after each navigation, inspect, then choose the next step.\n\n## Pipeline mode\n\nFor multi-step, reusable flows. Uses a brocli-style YAML DSL.\n\n### Run from file\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"path\": \"./browser-flow.yaml\",\n \"args\": { \"url\": \"https://example.com\" }\n }\n}\n```\n\n### Run inline YAML\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"name: quick-check\\npipeline:\\n - navigate:\\n url: https://example.com\\n - screenshot:\\n full_page: true\",\n \"dryRun\": false\n }\n}\n```\n\n### YAML layout\n\n```yaml\nname: pipeline-name\ndescription: What this flow does\nargs:\n url:\n type: string\n required: true\n query:\n type: string\n default: \"hello\"\npipeline:\n - navigate:\n url: ${{ args.url }}\n wait_until: domcontentloaded\n - wait:\n selector: input[name=\"q\"]\n - type:\n selector: input[name=\"q\"]\n text: ${{ args.query }}\n - press:\n key: Enter\n - wait:\n selector: body\n timeout_ms: 10000\n - screenshot:\n path: ./artifacts/result.png\n full_page: true\n - output:\n value:\n screenshot: ./artifacts/result.png\non_error:\n - screenshot:\n path: ./artifacts/error.png\n full_page: true\n```\n\n### Authoring rules\n\n1. One action per step\n2. Use `${{ args.xxx }}` for parameters\n3. Use `${{ data }}` or `${{ data | json }}` for the previous step's result\n4. Use `on_error` to collect diagnostics after failure\n\n### Validate without running\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"...\",\n \"dryRun\": true\n }\n}\n```\n\n## Recovery when something fails\n\n1. `inspect` to see current state\n2. Confirm the URL (redirects may have changed it)\n3. Use the snapshot to see if the page finished loading\n4. `screenshot` for visual debugging\n5. `wait` for elements, then retry\n\n## Safety\n\n- Do not put API keys or tokens in URLs\n- Do not target private IPs / localhost unless configuration allows it\n- Cloud metadata endpoints are always blocked\n- For destructive actions (submit forms, delete data), confirm intent with the user first\n";
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
description: Use browser_use for web navigation, page inspection, UI interaction, screenshots, network capture, and reusable browser pipelines. Load this skill before complex browser tasks.
|
|
4
|
-
metadata:
|
|
5
|
-
xopc:
|
|
6
|
-
requires_tools:
|
|
7
|
-
- browser_use
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Browser Skill
|
|
1
|
+
//#region src/agent/tool-manuals/browser.ts
|
|
2
|
+
const browserUseManual = `# Browser Tool Manual
|
|
11
3
|
|
|
12
4
|
## Overview
|
|
13
5
|
|
|
14
|
-
|
|
6
|
+
\`browser_use\` is XOPC's unified browser tool. It supports four modes:
|
|
15
7
|
|
|
16
8
|
| Mode | Purpose |
|
|
17
9
|
|------|---------|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
10
|
+
| \`command\` | Run a single browser action |
|
|
11
|
+
| \`pipeline\` | Run a multi-step YAML flow |
|
|
12
|
+
| \`inspect\` | Read current page state |
|
|
13
|
+
| \`close\` | Close the browser session |
|
|
22
14
|
|
|
23
15
|
## When to use
|
|
24
16
|
|
|
@@ -31,43 +23,43 @@ metadata:
|
|
|
31
23
|
|
|
32
24
|
### Basic shape
|
|
33
25
|
|
|
34
|
-
|
|
26
|
+
\`\`\`json
|
|
35
27
|
{
|
|
36
28
|
"mode": "command",
|
|
37
29
|
"command": "<action>",
|
|
38
30
|
"args": { ... }
|
|
39
31
|
}
|
|
40
|
-
|
|
32
|
+
\`\`\`
|
|
41
33
|
|
|
42
34
|
### Available commands
|
|
43
35
|
|
|
44
36
|
| Command | Description | Key arguments |
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
37
|
+
|---------|-------------|---------------|
|
|
38
|
+
| \`open\` / \`navigate\` | Open a URL | \`url\`, \`wait_until\` |
|
|
39
|
+
| \`state\` / \`snapshot\` | ARIA snapshot of the page | \`selector\`, \`maxLength\` |
|
|
40
|
+
| \`click\` | Click an element | \`selector\` / \`text\` / \`role\` |
|
|
41
|
+
| \`type\` / \`input\` | Type text | \`selector\` / \`label\`, \`text\`, \`pressEnter\` |
|
|
42
|
+
| \`scroll\` | Scroll the page | \`direction\`, \`amount\` |
|
|
43
|
+
| \`screenshot\` | Screenshot | \`selector\`, \`full_page\`, \`path\` |
|
|
44
|
+
| \`back\` | Go back | \`waitFor\` |
|
|
45
|
+
| \`keys\` / \`press\` | Keyboard input | \`key\` |
|
|
46
|
+
| \`console\` / \`eval\` | Run JavaScript | \`javascript\` |
|
|
47
|
+
| \`images\` | Collect images on the page | \`selector\`, \`maxImages\` |
|
|
48
|
+
| \`wait\` | Wait for element/time | \`selector\` / \`text\` / \`ms\`, \`timeout_ms\` |
|
|
49
|
+
| \`dialog\` | Handle dialogs | \`action\` (accept/dismiss) |
|
|
50
|
+
| \`close\` | Close the current page | — |
|
|
59
51
|
|
|
60
52
|
### Element targeting
|
|
61
53
|
|
|
62
54
|
Prefer, in order:
|
|
63
55
|
|
|
64
|
-
1. **ARIA role**: most stable, e.g.
|
|
65
|
-
2. **Visible text**, e.g.
|
|
66
|
-
3. **CSS selector**, e.g.
|
|
56
|
+
1. **ARIA role**: most stable, e.g. \`"role": "button:Submit"\`
|
|
57
|
+
2. **Visible text**, e.g. \`"text": "Sign In"\`
|
|
58
|
+
3. **CSS selector**, e.g. \`"selector": "#login-btn"\`
|
|
67
59
|
|
|
68
60
|
Guidelines:
|
|
69
61
|
|
|
70
|
-
- Use
|
|
62
|
+
- Use \`inspect\` or \`state\` first to get a snapshot
|
|
71
63
|
- Pick locators from ARIA info in the snapshot
|
|
72
64
|
- Avoid dynamic class names when possible
|
|
73
65
|
|
|
@@ -75,9 +67,9 @@ Guidelines:
|
|
|
75
67
|
|
|
76
68
|
Before acting, understand the current page:
|
|
77
69
|
|
|
78
|
-
|
|
70
|
+
\`\`\`json
|
|
79
71
|
{ "mode": "inspect" }
|
|
80
|
-
|
|
72
|
+
\`\`\`
|
|
81
73
|
|
|
82
74
|
Returns: current URL, title, ARIA snapshot.
|
|
83
75
|
|
|
@@ -89,7 +81,7 @@ For multi-step, reusable flows. Uses a brocli-style YAML DSL.
|
|
|
89
81
|
|
|
90
82
|
### Run from file
|
|
91
83
|
|
|
92
|
-
|
|
84
|
+
\`\`\`json
|
|
93
85
|
{
|
|
94
86
|
"mode": "pipeline",
|
|
95
87
|
"pipeline": {
|
|
@@ -97,23 +89,23 @@ For multi-step, reusable flows. Uses a brocli-style YAML DSL.
|
|
|
97
89
|
"args": { "url": "https://example.com" }
|
|
98
90
|
}
|
|
99
91
|
}
|
|
100
|
-
|
|
92
|
+
\`\`\`
|
|
101
93
|
|
|
102
94
|
### Run inline YAML
|
|
103
95
|
|
|
104
|
-
|
|
96
|
+
\`\`\`json
|
|
105
97
|
{
|
|
106
98
|
"mode": "pipeline",
|
|
107
99
|
"pipeline": {
|
|
108
|
-
"yaml": "name: quick-check
|
|
100
|
+
"yaml": "name: quick-check\\npipeline:\\n - navigate:\\n url: https://example.com\\n - screenshot:\\n full_page: true",
|
|
109
101
|
"dryRun": false
|
|
110
102
|
}
|
|
111
103
|
}
|
|
112
|
-
|
|
104
|
+
\`\`\`
|
|
113
105
|
|
|
114
106
|
### YAML layout
|
|
115
107
|
|
|
116
|
-
|
|
108
|
+
\`\`\`yaml
|
|
117
109
|
name: pipeline-name
|
|
118
110
|
description: What this flow does
|
|
119
111
|
args:
|
|
@@ -125,13 +117,13 @@ args:
|
|
|
125
117
|
default: "hello"
|
|
126
118
|
pipeline:
|
|
127
119
|
- navigate:
|
|
128
|
-
url:
|
|
120
|
+
url: \${{ args.url }}
|
|
129
121
|
wait_until: domcontentloaded
|
|
130
122
|
- wait:
|
|
131
123
|
selector: input[name="q"]
|
|
132
124
|
- type:
|
|
133
125
|
selector: input[name="q"]
|
|
134
|
-
text:
|
|
126
|
+
text: \${{ args.query }}
|
|
135
127
|
- press:
|
|
136
128
|
key: Enter
|
|
137
129
|
- wait:
|
|
@@ -147,18 +139,18 @@ on_error:
|
|
|
147
139
|
- screenshot:
|
|
148
140
|
path: ./artifacts/error.png
|
|
149
141
|
full_page: true
|
|
150
|
-
|
|
142
|
+
\`\`\`
|
|
151
143
|
|
|
152
144
|
### Authoring rules
|
|
153
145
|
|
|
154
146
|
1. One action per step
|
|
155
|
-
2. Use
|
|
156
|
-
3. Use
|
|
157
|
-
4. Use
|
|
147
|
+
2. Use \`\${{ args.xxx }}\` for parameters
|
|
148
|
+
3. Use \`\${{ data }}\` or \`\${{ data | json }}\` for the previous step's result
|
|
149
|
+
4. Use \`on_error\` to collect diagnostics after failure
|
|
158
150
|
|
|
159
151
|
### Validate without running
|
|
160
152
|
|
|
161
|
-
|
|
153
|
+
\`\`\`json
|
|
162
154
|
{
|
|
163
155
|
"mode": "pipeline",
|
|
164
156
|
"pipeline": {
|
|
@@ -166,15 +158,15 @@ on_error:
|
|
|
166
158
|
"dryRun": true
|
|
167
159
|
}
|
|
168
160
|
}
|
|
169
|
-
|
|
161
|
+
\`\`\`
|
|
170
162
|
|
|
171
163
|
## Recovery when something fails
|
|
172
164
|
|
|
173
|
-
1.
|
|
165
|
+
1. \`inspect\` to see current state
|
|
174
166
|
2. Confirm the URL (redirects may have changed it)
|
|
175
167
|
3. Use the snapshot to see if the page finished loading
|
|
176
|
-
4.
|
|
177
|
-
5.
|
|
168
|
+
4. \`screenshot\` for visual debugging
|
|
169
|
+
5. \`wait\` for elements, then retry
|
|
178
170
|
|
|
179
171
|
## Safety
|
|
180
172
|
|
|
@@ -182,3 +174,8 @@ on_error:
|
|
|
182
174
|
- Do not target private IPs / localhost unless configuration allows it
|
|
183
175
|
- Cloud metadata endpoints are always blocked
|
|
184
176
|
- For destructive actions (submit forms, delete data), confirm intent with the user first
|
|
177
|
+
`;
|
|
178
|
+
//#endregion
|
|
179
|
+
export { browserUseManual };
|
|
180
|
+
|
|
181
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../../../../src/agent/tool-manuals/browser.ts"],"sourcesContent":["export const browserUseManual = `# Browser Tool Manual\n\n## Overview\n\n\\`browser_use\\` is XOPC's unified browser tool. It supports four modes:\n\n| Mode | Purpose |\n|------|---------|\n| \\`command\\` | Run a single browser action |\n| \\`pipeline\\` | Run a multi-step YAML flow |\n| \\`inspect\\` | Read current page state |\n| \\`close\\` | Close the browser session |\n\n## When to use\n\n- Open pages, click controls, fill forms\n- Capture screenshots or page content\n- Run multi-step automation flows\n- Extract data from pages\n\n## Command mode\n\n### Basic shape\n\n\\`\\`\\`json\n{\n \"mode\": \"command\",\n \"command\": \"<action>\",\n \"args\": { ... }\n}\n\\`\\`\\`\n\n### Available commands\n\n| Command | Description | Key arguments |\n|---------|-------------|---------------|\n| \\`open\\` / \\`navigate\\` | Open a URL | \\`url\\`, \\`wait_until\\` |\n| \\`state\\` / \\`snapshot\\` | ARIA snapshot of the page | \\`selector\\`, \\`maxLength\\` |\n| \\`click\\` | Click an element | \\`selector\\` / \\`text\\` / \\`role\\` |\n| \\`type\\` / \\`input\\` | Type text | \\`selector\\` / \\`label\\`, \\`text\\`, \\`pressEnter\\` |\n| \\`scroll\\` | Scroll the page | \\`direction\\`, \\`amount\\` |\n| \\`screenshot\\` | Screenshot | \\`selector\\`, \\`full_page\\`, \\`path\\` |\n| \\`back\\` | Go back | \\`waitFor\\` |\n| \\`keys\\` / \\`press\\` | Keyboard input | \\`key\\` |\n| \\`console\\` / \\`eval\\` | Run JavaScript | \\`javascript\\` |\n| \\`images\\` | Collect images on the page | \\`selector\\`, \\`maxImages\\` |\n| \\`wait\\` | Wait for element/time | \\`selector\\` / \\`text\\` / \\`ms\\`, \\`timeout_ms\\` |\n| \\`dialog\\` | Handle dialogs | \\`action\\` (accept/dismiss) |\n| \\`close\\` | Close the current page | — |\n\n### Element targeting\n\nPrefer, in order:\n\n1. **ARIA role**: most stable, e.g. \\`\"role\": \"button:Submit\"\\`\n2. **Visible text**, e.g. \\`\"text\": \"Sign In\"\\`\n3. **CSS selector**, e.g. \\`\"selector\": \"#login-btn\"\\`\n\nGuidelines:\n\n- Use \\`inspect\\` or \\`state\\` first to get a snapshot\n- Pick locators from ARIA info in the snapshot\n- Avoid dynamic class names when possible\n\n## Inspect mode\n\nBefore acting, understand the current page:\n\n\\`\\`\\`json\n{ \"mode\": \"inspect\" }\n\\`\\`\\`\n\nReturns: current URL, title, ARIA snapshot.\n\n**Best practice**: after each navigation, inspect, then choose the next step.\n\n## Pipeline mode\n\nFor multi-step, reusable flows. Uses a brocli-style YAML DSL.\n\n### Run from file\n\n\\`\\`\\`json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"path\": \"./browser-flow.yaml\",\n \"args\": { \"url\": \"https://example.com\" }\n }\n}\n\\`\\`\\`\n\n### Run inline YAML\n\n\\`\\`\\`json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"name: quick-check\\\\npipeline:\\\\n - navigate:\\\\n url: https://example.com\\\\n - screenshot:\\\\n full_page: true\",\n \"dryRun\": false\n }\n}\n\\`\\`\\`\n\n### YAML layout\n\n\\`\\`\\`yaml\nname: pipeline-name\ndescription: What this flow does\nargs:\n url:\n type: string\n required: true\n query:\n type: string\n default: \"hello\"\npipeline:\n - navigate:\n url: \\${{ args.url }}\n wait_until: domcontentloaded\n - wait:\n selector: input[name=\"q\"]\n - type:\n selector: input[name=\"q\"]\n text: \\${{ args.query }}\n - press:\n key: Enter\n - wait:\n selector: body\n timeout_ms: 10000\n - screenshot:\n path: ./artifacts/result.png\n full_page: true\n - output:\n value:\n screenshot: ./artifacts/result.png\non_error:\n - screenshot:\n path: ./artifacts/error.png\n full_page: true\n\\`\\`\\`\n\n### Authoring rules\n\n1. One action per step\n2. Use \\`\\${{ args.xxx }}\\` for parameters\n3. Use \\`\\${{ data }}\\` or \\`\\${{ data | json }}\\` for the previous step's result\n4. Use \\`on_error\\` to collect diagnostics after failure\n\n### Validate without running\n\n\\`\\`\\`json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"...\",\n \"dryRun\": true\n }\n}\n\\`\\`\\`\n\n## Recovery when something fails\n\n1. \\`inspect\\` to see current state\n2. Confirm the URL (redirects may have changed it)\n3. Use the snapshot to see if the page finished loading\n4. \\`screenshot\\` for visual debugging\n5. \\`wait\\` for elements, then retry\n\n## Safety\n\n- Do not put API keys or tokens in URLs\n- Do not target private IPs / localhost unless configuration allows it\n- Cloud metadata endpoints are always blocked\n- For destructive actions (submit forms, delete data), confirm intent with the user first\n`;\n"],"mappings":";AAAA,MAAa,mBAAmB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ToolManual {
|
|
2
|
+
toolName: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
content: string;
|
|
6
|
+
}
|
|
7
|
+
export type ToolManualSummary = Omit<ToolManual, 'content'>;
|
|
8
|
+
export declare function getToolManual(toolName: string): ToolManual | null;
|
|
9
|
+
export declare function hasToolManual(toolName: string): boolean;
|
|
10
|
+
export declare function listToolManuals(): ToolManualSummary[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { browserUseManual } from "./browser.js";
|
|
2
|
+
//#region src/agent/tool-manuals/index.ts
|
|
3
|
+
const TOOL_MANUALS = { browser_use: {
|
|
4
|
+
toolName: "browser_use",
|
|
5
|
+
title: "Browser Tool Manual",
|
|
6
|
+
description: "Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.",
|
|
7
|
+
content: browserUseManual
|
|
8
|
+
} };
|
|
9
|
+
function normalizeToolName(toolName) {
|
|
10
|
+
return toolName.trim().toLowerCase();
|
|
11
|
+
}
|
|
12
|
+
function getToolManual(toolName) {
|
|
13
|
+
return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;
|
|
14
|
+
}
|
|
15
|
+
function hasToolManual(toolName) {
|
|
16
|
+
return getToolManual(toolName) !== null;
|
|
17
|
+
}
|
|
18
|
+
function listToolManuals() {
|
|
19
|
+
return Object.values(TOOL_MANUALS).map(({ toolName, title, description }) => ({
|
|
20
|
+
toolName,
|
|
21
|
+
title,
|
|
22
|
+
description
|
|
23
|
+
})).sort((a, b) => a.toolName.localeCompare(b.toolName));
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { getToolManual, hasToolManual, listToolManuals };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":";;AAWA,MAAM,eAA2C,EAC/C,aAAa;CACX,UAAU;CACV,OAAO;CACP,aAAa;CACb,SAAS;CACV,EACF;AAED,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAgB,cAAc,UAAqC;AACjE,QAAO,aAAa,kBAAkB,SAAS,KAAK;;AAGtD,SAAgB,cAAc,UAA2B;AACvD,QAAO,cAAc,SAAS,KAAK;;AAGrC,SAAgB,kBAAuC;AACrD,QAAO,OAAO,OAAO,aAAa,CAC/B,KAAK,EAAE,UAAU,OAAO,mBAAmB;EAAE;EAAU;EAAO;EAAa,EAAE,CAC7E,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC"}
|
|
@@ -85,7 +85,7 @@ function createBrowserUseTool(deps) {
|
|
|
85
85
|
return {
|
|
86
86
|
name: "browser_use",
|
|
87
87
|
label: "🌐 Browser",
|
|
88
|
-
description: "Use a persistent browser for web navigation, page inspection, interaction, screenshots, network capture, and scripted browser pipelines. For non-trivial browser tasks, load the
|
|
88
|
+
description: "Use a persistent browser for web navigation, page inspection, interaction, screenshots, network capture, and scripted browser pipelines. For non-trivial browser tasks, load the built-in manual first with tool_manual({ tool: \"browser_use\" }).",
|
|
89
89
|
parameters: BrowserUseSchema,
|
|
90
90
|
async execute(_toolCallId, params, signal, _onUpdate) {
|
|
91
91
|
const { mode, command, args: cmdArgs, pipeline: pipelineParams, options: _options } = params;
|