@xopcai/xopc 0.0.102 → 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 +8 -5
- package/README.zh-CN.md +8 -5
- 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 +2 -2
- package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +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/src/send-options.js +8 -5
- package/dist/extensions/telegram/src/send-options.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-Uv4kOmDE.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-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.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-drJUxxKP.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-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-DjlllCF3.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-C3_sEFfD.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-DOFy0FNt.js +2 -0
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.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-g57BRfEd.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/attachment-pipeline.js +2 -2
- package/dist/src/agent/inbound/attachment-pipeline.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/send-media.js +1 -2
- package/dist/src/agent/tools/send-media.js.map +1 -1
- 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.d.ts +7 -0
- package/dist/src/auth/credentials.js +45 -7
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/index.js.map +1 -1
- package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
- package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
- package/dist/src/auth/oauth/google-antigravity.js +1 -1
- package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
- package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
- package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
- package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
- package/dist/src/auth/oauth/index.js +2 -2
- package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
- package/dist/src/auth/oauth/kimi-coding.js +1 -1
- package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/src/auth/oauth/minimax-cn.js +1 -1
- package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
- package/dist/src/auth/oauth/minimax.js +1 -1
- package/dist/src/auth/oauth/minimax.js.map +1 -1
- package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
- package/dist/src/auth/oauth/openai-codex.js +318 -1
- package/dist/src/auth/oauth/openai-codex.js.map +1 -0
- package/dist/src/auth/profiles/store.js +3 -2
- package/dist/src/auth/profiles/store.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/attachments/attachment-classifiers.d.ts +1 -0
- package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
- package/dist/src/channels/attachments/attachment-classifiers.js.map +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/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.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 +2 -2
- 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 +40 -52
- package/dist/src/cli/commands/auth.js.map +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 +192 -54
- 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.d.ts +1 -4
- package/dist/src/cli/commands/onboard/model.js +257 -184
- 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/cli/utils/oauth-login.d.ts +17 -0
- package/dist/src/cli/utils/oauth-login.js +93 -0
- package/dist/src/cli/utils/oauth-login.js.map +1 -0
- package/dist/src/cli/utils/oauth-providers.js +2 -2
- 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/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/oauth-async.js +2 -2
- package/dist/src/gateway/hono/oauth.js +2 -2
- 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/models.js +25 -5
- package/dist/src/gateway/hono/routes/models.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/mcp/channel-bridge.js +1 -1
- package/dist/src/media/store.js +3 -0
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/service.js.map +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 +4 -4
- package/dist/src/providers/index.js +41 -22
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/presentation.d.ts +34 -0
- package/dist/src/providers/presentation.js +162 -0
- package/dist/src/providers/presentation.js.map +1 -0
- 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-DQ0mQxIA.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
- package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
- package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
- package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
- package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.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/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/pkce.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
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-config-service.js","names":[],"sources":["../../../../src/agent/session/session-config-service.ts"],"sourcesContent":["/**\n * SessionConfigService — owns the \"write side\" of per-session agent settings\n * (model override, thinking level, reasoning level, working directory).\n *\n * Previously these lived as four sibling methods on `AgentService`:\n * - `patchSessionAgentConfig` (96 lines of validation + persistence)\n * - `applyCronJobWorkingDirectory` (cron-specific working dir update)\n * - `clearCronSessionWorkingDirectoryOverride` (private helper)\n * - `clearSessionModelOverride` (private helper)\n *\n * Extracted so `AgentService` no longer mixes \"session bag\" concerns with\n * \"session config write\" concerns, and so future additions to the patch API\n * (e.g. new per-session overrides) only touch this file.\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { normalizeWorkingDirectoryInput } from '../../session/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n} from '../transcript/thinking-types.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SessionConfigService');\n\nexport interface SessionConfigServiceOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n /** Effective config snapshot accessor. */\n getConfig: () => Config | undefined;\n}\n\nexport interface PatchSessionAgentConfigInput {\n thinkingLevel?: string;\n model?: string | null;\n reasoningLevel?: string;\n workingDirectory?: string;\n}\n\nexport interface PatchSessionAgentConfigResult {\n ok: boolean;\n error?: string;\n}\n\nexport class SessionConfigService {\n private readonly opts: SessionConfigServiceOptions;\n\n constructor(opts: SessionConfigServiceOptions) {\n this.opts = opts;\n }\n\n /**\n * Apply a partial patch (model / thinking / reasoning / working directory) to\n * a session's persisted config. Returns `{ ok: false, error }` on the first\n * invalid field — earlier fields that succeeded are NOT rolled back, matching\n * the previous behaviour.\n */\n async patch(\n sessionKey: string,\n partial: PatchSessionAgentConfigInput,\n ): Promise<PatchSessionAgentConfigResult> {\n if (partial.model !== undefined) {\n if (partial.model === null || partial.model === '') {\n await this.clearModelOverride(sessionKey);\n } else {\n const ok = await this.opts.modelManager.switchModelForSession(sessionKey, partial.model);\n if (!ok) {\n return { ok: false, error: 'Invalid model' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: partial.model });\n this.opts.agentManager.setModelForSession(sessionKey, partial.model);\n }\n }\n\n if (partial.thinkingLevel !== undefined) {\n const normalized = normalizeThinkLevel(partial.thinkingLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid thinking level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { thinkingLevel: normalized });\n this.opts.agentManager.setThinkingLevel(sessionKey, normalized as ThinkingLevel);\n }\n\n if (partial.reasoningLevel !== undefined) {\n const normalized = normalizeReasoningLevel(partial.reasoningLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid reasoning level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { reasoningLevel: normalized });\n }\n\n if (partial.workingDirectory !== undefined) {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n return { ok: false, error: 'Config not loaded' };\n }\n const result = await this.patchWorkingDirectory(sessionKey, partial.workingDirectory);\n if (!result.ok) return result;\n }\n\n return { ok: true };\n }\n\n /**\n * Sync persisted session working directory for an isolated cron run. Runs\n * may change when the job is edited; an empty/missing input clears the\n * override so the session uses the effective agent default.\n */\n async applyCronJobWorkingDirectory(\n sessionKey: string,\n workingDirectory: string | undefined,\n ): Promise<void> {\n const raw = workingDirectory?.trim();\n if (raw) {\n const wdNorm = normalizeWorkingDirectoryInput(raw);\n if (wdNorm.ok === false) {\n log.warn(\n { sessionKey, error: wdNorm.error },\n 'Cron job working directory invalid; using agent default',\n );\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n return;\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, { workingDirectoryOverride: wdNorm.path });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n return;\n }\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n }\n\n /**\n * Clear the session's model override (back to agent default). Used both by\n * {@link patch} and by `AgentService.resetSessionModelToAgentDefault`.\n */\n async clearModelOverride(sessionKey: string): Promise<void> {\n this.opts.modelManager.clearSessionModelOverride(sessionKey);\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: undefined });\n const agent = this.opts.agentManager.getAgent(sessionKey);\n if (agent) {\n await this.opts.modelManager.applyModelForSession(agent, sessionKey);\n }\n }\n\n // ── Internal helpers ───────────────────────────────────────────────────\n\n private async clearCronWorkingDirectoryOverride(sessionKey: string): Promise<void> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n if (existing?.workingDirectoryOverride) {\n const { workingDirectoryOverride: _removed, ...rest } = existing;\n await this.opts.sessionConfigStore.set(sessionKey, rest);\n }\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);\n }\n\n /**\n * Apply the workingDirectory branch of `patch`. Returns the next-step result\n * (`ok: true` to keep going, `ok: false, error` to short-circuit the patch).\n *\n * Working directory has the strictest semantics: once a session has any\n * messages, it cannot move to a different directory — only re-setting the\n * same path is idempotent.\n */\n private async patchWorkingDirectory(\n sessionKey: string,\n workingDirectory: string,\n ): Promise<PatchSessionAgentConfigResult> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n const existingRaw = existing?.workingDirectoryOverride?.trim();\n const incoming = workingDirectory.trim();\n\n const priorMessages = await this.opts.sessionStore.load(sessionKey);\n\n if (priorMessages.length > 0) {\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n if (!existingRaw) {\n return {\n ok: false,\n error: 'Working directory can only be set before the first message in this conversation',\n };\n }\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n const next = normalizeWorkingDirectoryInput(incoming);\n if (prev.ok && next.ok && prev.path === next.path) {\n // idempotent\n return { ok: true };\n }\n return { ok: false, error: 'Working directory is already set for this session' };\n }\n\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n const wdNorm = normalizeWorkingDirectoryInput(incoming);\n switch (wdNorm.ok) {\n case true: {\n if (existingRaw) {\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n if (prev.ok && prev.path === wdNorm.path) {\n return { ok: true };\n }\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, {\n workingDirectoryOverride: wdNorm.path,\n });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n this.opts.agentManager.removeAgent(sessionKey);\n return { ok: true };\n }\n case false:\n return { ok: false, error: wdNorm.error };\n default:\n return { ok: false, error: 'Invalid working directory' };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;aA2BqD;AAErD,MAAM,MAAM,aAAa,uBAAuB;AAuBhD,IAAa,uBAAb,MAAkC;CAChC;CAEA,YAAY,MAAmC;AAC7C,OAAK,OAAO;;;;;;;;CASd,MAAM,MACJ,YACA,SACwC;AACxC,MAAI,QAAQ,UAAU,KAAA,EACpB,KAAI,QAAQ,UAAU,QAAQ,QAAQ,UAAU,GAC9C,OAAM,KAAK,mBAAmB,WAAW;OACpC;AAEL,OAAI,CAAC,MADY,KAAK,KAAK,aAAa,sBAAsB,YAAY,QAAQ,MAAM,CAEtF,QAAO;IAAE,IAAI;IAAO,OAAO;IAAiB;AAE9C,SAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE,eAAe,QAAQ,OAAO,CAAC;AACvF,QAAK,KAAK,aAAa,mBAAmB,YAAY,QAAQ,MAAM;;AAIxE,MAAI,QAAQ,kBAAkB,KAAA,GAAW;GACvC,MAAM,aAAa,oBAAoB,QAAQ,cAAc;AAC7D,OAAI,CAAC,WACH,QAAO;IAAE,IAAI;IAAO,OAAO;IAA0B;AAEvD,SAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE,eAAe,YAAY,CAAC;AACpF,QAAK,KAAK,aAAa,iBAAiB,YAAY,WAA4B;;AAGlF,MAAI,QAAQ,mBAAmB,KAAA,GAAW;GACxC,MAAM,aAAa,wBAAwB,QAAQ,eAAe;AAClE,OAAI,CAAC,WACH,QAAO;IAAE,IAAI;IAAO,OAAO;IAA2B;AAExD,SAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE,gBAAgB,YAAY,CAAC;;AAGvF,MAAI,QAAQ,qBAAqB,KAAA,GAAW;AAE1C,OAAI,CADQ,KAAK,KAAK,WACd,CACN,QAAO;IAAE,IAAI;IAAO,OAAO;IAAqB;GAElD,MAAM,SAAS,MAAM,KAAK,sBAAsB,YAAY,QAAQ,iBAAiB;AACrF,OAAI,CAAC,OAAO,GAAI,QAAO;;AAGzB,SAAO,EAAE,IAAI,MAAM;;;;;;;CAQrB,MAAM,6BACJ,YACA,kBACe;EACf,MAAM,MAAM,kBAAkB,MAAM;AACpC,MAAI,KAAK;GACP,MAAM,SAAS,+BAA+B,IAAI;AAClD,OAAI,OAAO,OAAO,OAAO;AACvB,QAAI,KACF;KAAE;KAAY,OAAO,OAAO;KAAO,EACnC,0DACD;AACD,UAAM,KAAK,kCAAkC,WAAW;AACxD;;AAEF,SAAM,MAAM,OAAO,MAAM,EAAE,WAAW,MAAM,CAAC;AAC7C,SAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE,0BAA0B,OAAO,MAAM,CAAC;AAChG,QAAK,KAAK,aAAa,4BAA4B,YAAY,OAAO,KAAK;AAC3E;;AAEF,QAAM,KAAK,kCAAkC,WAAW;;;;;;CAO1D,MAAM,mBAAmB,YAAmC;AAC1D,OAAK,KAAK,aAAa,0BAA0B,WAAW;AAC5D,QAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE,eAAe,KAAA,GAAW,CAAC;EACnF,MAAM,QAAQ,KAAK,KAAK,aAAa,SAAS,WAAW;AACzD,MAAI,MACF,OAAM,KAAK,KAAK,aAAa,qBAAqB,OAAO,WAAW;;CAMxE,MAAc,kCAAkC,YAAmC;EACjF,MAAM,WAAW,MAAM,KAAK,KAAK,mBAAmB,IAAI,WAAW;AACnE,MAAI,UAAU,0BAA0B;GACtC,MAAM,EAAE,0BAA0B,UAAU,GAAG,SAAS;AACxD,SAAM,KAAK,KAAK,mBAAmB,IAAI,YAAY,KAAK;;AAE1D,OAAK,KAAK,aAAa,4BAA4B,YAAY,KAAK;;;;;;;;;;CAWtE,MAAc,sBACZ,YACA,kBACwC;EAExC,MAAM,eAAc,MADG,KAAK,KAAK,mBAAmB,IAAI,WAAW,GACrC,0BAA0B,MAAM;EAC9D,MAAM,WAAW,iBAAiB,MAAM;AAIxC,OAAI,MAFwB,KAAK,KAAK,aAAa,KAAK,WAAW,EAEjD,SAAS,GAAG;AAC5B,OAAI,CAAC,SACH,QAAO;IAAE,IAAI;IAAO,OAAO;IAA6B;AAE1D,OAAI,CAAC,YACH,QAAO;IACL,IAAI;IACJ,OAAO;IACR;GAEH,MAAM,OAAO,+BAA+B,YAAY;GACxD,MAAM,OAAO,+BAA+B,SAAS;AACrD,OAAI,KAAK,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,KAE3C,QAAO,EAAE,IAAI,MAAM;AAErB,UAAO;IAAE,IAAI;IAAO,OAAO;IAAqD;;AAGlF,MAAI,CAAC,SACH,QAAO;GAAE,IAAI;GAAO,OAAO;GAA6B;EAE1D,MAAM,SAAS,+BAA+B,SAAS;AACvD,UAAQ,OAAO,IAAf;GACE,KAAK;AACH,QAAI,aAAa;KACf,MAAM,OAAO,+BAA+B,YAAY;AACxD,SAAI,KAAK,MAAM,KAAK,SAAS,OAAO,KAClC,QAAO,EAAE,IAAI,MAAM;;AAGvB,UAAM,MAAM,OAAO,MAAM,EAAE,WAAW,MAAM,CAAC;AAC7C,UAAM,KAAK,KAAK,mBAAmB,OAAO,YAAY,EACpD,0BAA0B,OAAO,MAClC,CAAC;AACF,SAAK,KAAK,aAAa,4BAA4B,YAAY,OAAO,KAAK;AAC3E,SAAK,KAAK,aAAa,YAAY,WAAW;AAC9C,WAAO,EAAE,IAAI,MAAM;GAErB,KAAK,MACH,QAAO;IAAE,IAAI;IAAO,OAAO,OAAO;IAAO;GAC3C,QACE,QAAO;IAAE,IAAI;IAAO,OAAO;IAA6B"}
|
|
1
|
+
{"version":3,"file":"session-config-service.js","names":[],"sources":["../../../../src/agent/session/session-config-service.ts"],"sourcesContent":["/**\n * SessionConfigService — owns the \"write side\" of per-session agent settings\n * (model override, thinking level, reasoning level, working directory).\n *\n * Previously these lived as four sibling methods on `AgentService`:\n * - `patchSessionAgentConfig` (96 lines of validation + persistence)\n * - `applyCronJobWorkingDirectory` (cron-specific working dir update)\n * - `clearCronSessionWorkingDirectoryOverride` (private helper)\n * - `clearSessionModelOverride` (private helper)\n *\n * Extracted so `AgentService` no longer mixes \"session bag\" concerns with\n * \"session config write\" concerns, and so future additions to the patch API\n * (e.g. new per-session overrides) only touch this file.\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { normalizeWorkingDirectoryInput } from '../../session/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n normalizeVerboseLevel,\n} from '../transcript/thinking-types.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SessionConfigService');\n\nexport interface SessionConfigServiceOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n /** Effective config snapshot accessor. */\n getConfig: () => Config | undefined;\n}\n\nexport interface PatchSessionAgentConfigInput {\n thinkingLevel?: string;\n model?: string | null;\n reasoningLevel?: string;\n verboseLevel?: string;\n workingDirectory?: string;\n}\n\nexport interface PatchSessionAgentConfigResult {\n ok: boolean;\n error?: string;\n}\n\nexport class SessionConfigService {\n private readonly opts: SessionConfigServiceOptions;\n\n constructor(opts: SessionConfigServiceOptions) {\n this.opts = opts;\n }\n\n /**\n * Apply a partial patch (model / thinking / reasoning / working directory) to\n * a session's persisted config. Returns `{ ok: false, error }` on the first\n * invalid field — earlier fields that succeeded are NOT rolled back, matching\n * the previous behaviour.\n */\n async patch(\n sessionKey: string,\n partial: PatchSessionAgentConfigInput,\n ): Promise<PatchSessionAgentConfigResult> {\n if (partial.model !== undefined) {\n if (partial.model === null || partial.model === '') {\n await this.clearModelOverride(sessionKey);\n } else {\n const ok = await this.opts.modelManager.switchModelForSession(sessionKey, partial.model);\n if (!ok) {\n return { ok: false, error: 'Invalid model' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: partial.model });\n this.opts.agentManager.setModelForSession(sessionKey, partial.model);\n }\n }\n\n if (partial.thinkingLevel !== undefined) {\n const normalized = normalizeThinkLevel(partial.thinkingLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid thinking level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { thinkingLevel: normalized });\n this.opts.agentManager.setThinkingLevel(sessionKey, normalized as ThinkingLevel);\n }\n\n if (partial.reasoningLevel !== undefined) {\n const normalized = normalizeReasoningLevel(partial.reasoningLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid reasoning level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { reasoningLevel: normalized });\n }\n\n if (partial.verboseLevel !== undefined) {\n const normalized = normalizeVerboseLevel(partial.verboseLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid verbose level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { verboseLevel: normalized });\n }\n\n if (partial.workingDirectory !== undefined) {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n return { ok: false, error: 'Config not loaded' };\n }\n const result = await this.patchWorkingDirectory(sessionKey, partial.workingDirectory);\n if (!result.ok) return result;\n }\n\n return { ok: true };\n }\n\n /**\n * Sync persisted session working directory for an isolated cron run. Runs\n * may change when the job is edited; an empty/missing input clears the\n * override so the session uses the effective agent default.\n */\n async applyCronJobWorkingDirectory(\n sessionKey: string,\n workingDirectory: string | undefined,\n ): Promise<void> {\n const raw = workingDirectory?.trim();\n if (raw) {\n const wdNorm = normalizeWorkingDirectoryInput(raw);\n if (wdNorm.ok === false) {\n log.warn(\n { sessionKey, error: wdNorm.error },\n 'Cron job working directory invalid; using agent default',\n );\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n return;\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, { workingDirectoryOverride: wdNorm.path });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n return;\n }\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n }\n\n /**\n * Clear the session's model override (back to agent default). Used both by\n * {@link patch} and by `AgentService.resetSessionModelToAgentDefault`.\n */\n async clearModelOverride(sessionKey: string): Promise<void> {\n this.opts.modelManager.clearSessionModelOverride(sessionKey);\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: undefined });\n const agent = this.opts.agentManager.getAgent(sessionKey);\n if (agent) {\n await this.opts.modelManager.applyModelForSession(agent, sessionKey);\n }\n }\n\n // ── Internal helpers ───────────────────────────────────────────────────\n\n private async clearCronWorkingDirectoryOverride(sessionKey: string): Promise<void> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n if (existing?.workingDirectoryOverride) {\n const { workingDirectoryOverride: _removed, ...rest } = existing;\n await this.opts.sessionConfigStore.set(sessionKey, rest);\n }\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);\n }\n\n /**\n * Apply the workingDirectory branch of `patch`. Returns the next-step result\n * (`ok: true` to keep going, `ok: false, error` to short-circuit the patch).\n *\n * Working directory has the strictest semantics: once a session has any\n * messages, it cannot move to a different directory — only re-setting the\n * same path is idempotent.\n */\n private async patchWorkingDirectory(\n sessionKey: string,\n workingDirectory: string,\n ): Promise<PatchSessionAgentConfigResult> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n const existingRaw = existing?.workingDirectoryOverride?.trim();\n const incoming = workingDirectory.trim();\n\n const priorMessages = await this.opts.sessionStore.load(sessionKey);\n\n if (priorMessages.length > 0) {\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n if (!existingRaw) {\n return {\n ok: false,\n error: 'Working directory can only be set before the first message in this conversation',\n };\n }\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n const next = normalizeWorkingDirectoryInput(incoming);\n if (prev.ok && next.ok && prev.path === next.path) {\n // idempotent\n return { ok: true };\n }\n return { ok: false, error: 'Working directory is already set for this session' };\n }\n\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n const wdNorm = normalizeWorkingDirectoryInput(incoming);\n switch (wdNorm.ok) {\n case true: {\n if (existingRaw) {\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n if (prev.ok && prev.path === wdNorm.path) {\n return { ok: true };\n }\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, {\n workingDirectoryOverride: wdNorm.path,\n });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n this.opts.agentManager.removeAgent(sessionKey);\n return { ok: true };\n }\n case false:\n return { ok: false, error: wdNorm.error };\n default:\n return { ok: false, error: 'Invalid working directory' };\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ import type { SessionStore } from '../../session/store.js';
|
|
|
20
20
|
import type { CompactionResult } from '../memory/compaction.js';
|
|
21
21
|
import type { ModelManager } from '../models/index.js';
|
|
22
22
|
import type { AgentInstanceGateway } from '../agent-instance-gateway.js';
|
|
23
|
-
import type { ReasoningLevel } from '../transcript/thinking-types.js';
|
|
23
|
+
import type { ReasoningLevel, VerboseLevel } from '../transcript/thinking-types.js';
|
|
24
24
|
import type { SessionHydrator } from './session-hydrator.js';
|
|
25
25
|
export interface SessionInspectorOptions {
|
|
26
26
|
sessionStore: SessionStore;
|
|
@@ -45,6 +45,7 @@ export interface SessionAgentConfigView {
|
|
|
45
45
|
thinkingLevel: ThinkingLevel;
|
|
46
46
|
model: string;
|
|
47
47
|
reasoningLevel: ReasoningLevel;
|
|
48
|
+
verboseLevel: VerboseLevel;
|
|
48
49
|
effectiveWorkspacePath: string;
|
|
49
50
|
workingDirectoryLocked: boolean;
|
|
50
51
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
4
|
+
import { resolveVerboseLevel } from "../../session/config-store.js";
|
|
4
5
|
import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
|
|
5
6
|
import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
|
|
6
7
|
import "../../session/index.js";
|
|
@@ -104,10 +105,13 @@ var SessionInspector = class {
|
|
|
104
105
|
const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);
|
|
105
106
|
const defReason = cfg.agents?.defaults?.reasoningDefault ?? "stream";
|
|
106
107
|
const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);
|
|
108
|
+
const defVerbose = cfg.agents?.defaults?.verboseDefault ?? "full";
|
|
109
|
+
const verboseLevel = await resolveVerboseLevel(this.opts.sessionConfigStore, sessionKey, defVerbose);
|
|
107
110
|
return {
|
|
108
111
|
thinkingLevel: level,
|
|
109
112
|
model: this.opts.modelManager.getModelForSession(sessionKey),
|
|
110
113
|
reasoningLevel,
|
|
114
|
+
verboseLevel,
|
|
111
115
|
effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),
|
|
112
116
|
workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim())
|
|
113
117
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-inspector.js","names":[],"sources":["../../../../src/agent/session/session-inspector.ts"],"sourcesContent":["/**\n * SessionInspector — read-only / introspection-oriented operations on a session.\n *\n * Owns the five methods previously scattered across `AgentService` that all\n * compute a \"summary view\" of one session:\n * - `compact` (manual user-triggered compaction)\n * - `btwQuery` (one-shot LLM answer with transcript as background)\n * - `report` (Markdown / JSON `/context` summary)\n * - `agentConfig` (resolved thinking + model + workspace for the Web UI)\n * - `contextUsage` (rough token budget vs estimated transcript)\n *\n * The shared helper `computeStats` keeps the three callsites that need\n * `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport {\n effectiveWorkspacePathForSession,\n resolveEffectiveReasoningLevel,\n resolveEffectiveThinkingLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { CompactionResult } from '../memory/compaction.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport { runBtwQuery } from '../service/btw-query.js';\nimport { formatSessionContextReport } from '../service/session-context-report.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SessionHydrator } from './session-hydrator.js';\n\nconst log = createLogger('SessionInspector');\n\nexport interface SessionInspectorOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n sessionHydrator: SessionHydrator;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n /**\n * Nominal context window the session is budgeted against. Currently derived\n * from `agents.defaults.maxTokens * 4`, defaulting to 128k.\n */\n getContextWindow: () => number;\n}\n\nexport interface SessionContextUsage {\n estimatedTokens: number;\n contextWindow: number;\n usagePercent: number | null;\n}\n\nexport interface SessionAgentConfigView {\n thinkingLevel: ThinkingLevel;\n model: string;\n reasoningLevel: ReasoningLevel;\n effectiveWorkspacePath: string;\n workingDirectoryLocked: boolean;\n}\n\nexport class SessionInspector {\n private readonly opts: SessionInspectorOptions;\n\n constructor(opts: SessionInspectorOptions) {\n this.opts = opts;\n }\n\n /**\n * Manual compaction triggered by a user / API. Always forces a compaction\n * pass (`force: true` by default) and evicts the in-memory agent so the\n * next turn reloads from the compacted transcript.\n */\n async compact(\n sessionKey: string,\n options?: { instructions?: string; force?: boolean },\n ): Promise<CompactionResult> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const result = await this.opts.sessionStore.compact(\n sessionKey,\n messages,\n contextWindow,\n options?.instructions,\n options?.force ?? true,\n );\n if (result.compacted) {\n this.opts.agentManager.removeAgent(sessionKey);\n }\n log.info({ sessionKey, result }, 'Manual compaction complete');\n return result;\n }\n\n /** One-shot LLM answer for `/btw`: transcript as background, not persisted. */\n btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n return runBtwQuery({\n sessionKey,\n question,\n sessionStore: this.opts.sessionStore,\n modelForSession: this.opts.modelManager.getModelForSession(sessionKey),\n log,\n });\n }\n\n /** Cheap stats used by both the report and other callers. */\n stats(sessionKey: string, messages: AgentMessage[]): {\n windowStats: ReturnType<SessionStore['getWindowStats']>;\n compactionStats: ReturnType<SessionStore['getCompactionStats']>;\n tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;\n } {\n return {\n windowStats: this.opts.sessionStore.getWindowStats(messages),\n compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),\n tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages),\n };\n }\n\n /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */\n async contextUsage(sessionKey: string): Promise<SessionContextUsage> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const usagePercent =\n contextWindow > 0 ? Math.min(100, Math.round((estimatedTokens / contextWindow) * 100)) : null;\n return { estimatedTokens, contextWindow, usagePercent };\n }\n\n /** Markdown or JSON summary for `/context`. */\n async report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to render report');\n }\n const messages = await this.opts.sessionStore.load(sessionKey);\n const cw = this.opts.getContextWindow();\n const computed = this.stats(sessionKey, messages);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, sc);\n const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const defaults = cfg.agents?.defaults;\n const compaction = defaults?.compaction;\n const tools = defaults?.tools;\n\n const toolsSummary =\n tools && typeof tools === 'object'\n ? Object.entries(tools as Record<string, unknown>)\n .filter(([, v]) => v === true)\n .map(([k]) => k)\n .slice(0, 16)\n .join(', ') || '(none explicitly true)'\n : '(see agents.defaults.tools in config)';\n\n return formatSessionContextReport({\n sessionKey,\n mode,\n model,\n workspacePath: workspace,\n agentId: profile.agentId,\n messageCount: messages.length,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault: defaults?.thinkingDefault,\n reasoningDefault: defaults?.reasoningDefault,\n verboseDefault: defaults?.verboseDefault,\n compaction,\n toolsFlagsSummary: toolsSummary,\n windowStats: computed.windowStats,\n compactionRunStats: computed.compactionStats,\n });\n }\n\n /** Resolved thinking / model / workspace for the Web UI. */\n async agentConfig(sessionKey: string): Promise<SessionAgentConfigView> {\n await this.opts.sessionHydrator.model(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to resolve agent config');\n }\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n\n // Ensure model display matches the effective agent profile even before an Agent instance exists.\n // Otherwise `ModelManager.getModelForSession()` falls back to the global default until the first turn creates the agent.\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const profileModelRef = profile.primaryModelRef?.trim();\n if (profileModelRef) {\n this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef);\n }\n\n const defThink = cfg.agents?.defaults?.thinkingDefault ?? 'medium';\n const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);\n const defReason = (cfg.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n return {\n thinkingLevel: level,\n model,\n reasoningLevel,\n effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),\n workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim()),\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-inspector.js","names":[],"sources":["../../../../src/agent/session/session-inspector.ts"],"sourcesContent":["/**\n * SessionInspector — read-only / introspection-oriented operations on a session.\n *\n * Owns the five methods previously scattered across `AgentService` that all\n * compute a \"summary view\" of one session:\n * - `compact` (manual user-triggered compaction)\n * - `btwQuery` (one-shot LLM answer with transcript as background)\n * - `report` (Markdown / JSON `/context` summary)\n * - `agentConfig` (resolved thinking + model + workspace for the Web UI)\n * - `contextUsage` (rough token budget vs estimated transcript)\n *\n * The shared helper `computeStats` keeps the three callsites that need\n * `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport {\n effectiveWorkspacePathForSession,\n resolveEffectiveReasoningLevel,\n resolveEffectiveThinkingLevel,\n resolveVerboseLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { CompactionResult } from '../memory/compaction.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport { runBtwQuery } from '../service/btw-query.js';\nimport { formatSessionContextReport } from '../service/session-context-report.js';\nimport type { ReasoningLevel, VerboseLevel } from '../transcript/thinking-types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SessionHydrator } from './session-hydrator.js';\n\nconst log = createLogger('SessionInspector');\n\nexport interface SessionInspectorOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n sessionHydrator: SessionHydrator;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n /**\n * Nominal context window the session is budgeted against. Currently derived\n * from `agents.defaults.maxTokens * 4`, defaulting to 128k.\n */\n getContextWindow: () => number;\n}\n\nexport interface SessionContextUsage {\n estimatedTokens: number;\n contextWindow: number;\n usagePercent: number | null;\n}\n\nexport interface SessionAgentConfigView {\n thinkingLevel: ThinkingLevel;\n model: string;\n reasoningLevel: ReasoningLevel;\n verboseLevel: VerboseLevel;\n effectiveWorkspacePath: string;\n workingDirectoryLocked: boolean;\n}\n\nexport class SessionInspector {\n private readonly opts: SessionInspectorOptions;\n\n constructor(opts: SessionInspectorOptions) {\n this.opts = opts;\n }\n\n /**\n * Manual compaction triggered by a user / API. Always forces a compaction\n * pass (`force: true` by default) and evicts the in-memory agent so the\n * next turn reloads from the compacted transcript.\n */\n async compact(\n sessionKey: string,\n options?: { instructions?: string; force?: boolean },\n ): Promise<CompactionResult> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const result = await this.opts.sessionStore.compact(\n sessionKey,\n messages,\n contextWindow,\n options?.instructions,\n options?.force ?? true,\n );\n if (result.compacted) {\n this.opts.agentManager.removeAgent(sessionKey);\n }\n log.info({ sessionKey, result }, 'Manual compaction complete');\n return result;\n }\n\n /** One-shot LLM answer for `/btw`: transcript as background, not persisted. */\n btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n return runBtwQuery({\n sessionKey,\n question,\n sessionStore: this.opts.sessionStore,\n modelForSession: this.opts.modelManager.getModelForSession(sessionKey),\n log,\n });\n }\n\n /** Cheap stats used by both the report and other callers. */\n stats(sessionKey: string, messages: AgentMessage[]): {\n windowStats: ReturnType<SessionStore['getWindowStats']>;\n compactionStats: ReturnType<SessionStore['getCompactionStats']>;\n tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;\n } {\n return {\n windowStats: this.opts.sessionStore.getWindowStats(messages),\n compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),\n tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages),\n };\n }\n\n /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */\n async contextUsage(sessionKey: string): Promise<SessionContextUsage> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const usagePercent =\n contextWindow > 0 ? Math.min(100, Math.round((estimatedTokens / contextWindow) * 100)) : null;\n return { estimatedTokens, contextWindow, usagePercent };\n }\n\n /** Markdown or JSON summary for `/context`. */\n async report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to render report');\n }\n const messages = await this.opts.sessionStore.load(sessionKey);\n const cw = this.opts.getContextWindow();\n const computed = this.stats(sessionKey, messages);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, sc);\n const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const defaults = cfg.agents?.defaults;\n const compaction = defaults?.compaction;\n const tools = defaults?.tools;\n\n const toolsSummary =\n tools && typeof tools === 'object'\n ? Object.entries(tools as Record<string, unknown>)\n .filter(([, v]) => v === true)\n .map(([k]) => k)\n .slice(0, 16)\n .join(', ') || '(none explicitly true)'\n : '(see agents.defaults.tools in config)';\n\n return formatSessionContextReport({\n sessionKey,\n mode,\n model,\n workspacePath: workspace,\n agentId: profile.agentId,\n messageCount: messages.length,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault: defaults?.thinkingDefault,\n reasoningDefault: defaults?.reasoningDefault,\n verboseDefault: defaults?.verboseDefault,\n compaction,\n toolsFlagsSummary: toolsSummary,\n windowStats: computed.windowStats,\n compactionRunStats: computed.compactionStats,\n });\n }\n\n /** Resolved thinking / model / workspace for the Web UI. */\n async agentConfig(sessionKey: string): Promise<SessionAgentConfigView> {\n await this.opts.sessionHydrator.model(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to resolve agent config');\n }\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n\n // Ensure model display matches the effective agent profile even before an Agent instance exists.\n // Otherwise `ModelManager.getModelForSession()` falls back to the global default until the first turn creates the agent.\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const profileModelRef = profile.primaryModelRef?.trim();\n if (profileModelRef) {\n this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef);\n }\n\n const defThink = cfg.agents?.defaults?.thinkingDefault ?? 'medium';\n const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);\n const defReason = (cfg.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);\n const defVerbose = (cfg.agents?.defaults?.verboseDefault ?? 'full') as VerboseLevel;\n const verboseLevel = await resolveVerboseLevel(this.opts.sessionConfigStore, sessionKey, defVerbose);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n return {\n thinkingLevel: level,\n model,\n reasoningLevel,\n verboseLevel,\n effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),\n workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim()),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { __toCommonJS } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
3
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../../utils/logger.js";
|
|
5
|
-
import {
|
|
4
|
+
import { hasBinary } from "./installer.js";
|
|
6
5
|
import { join } from "path";
|
|
7
6
|
import { existsSync, readFileSync } from "fs";
|
|
8
7
|
//#region src/agent/skills/config.ts
|
|
@@ -148,7 +147,6 @@ function isSkillEnabled(skill, skillsConfig) {
|
|
|
148
147
|
if (resolveSkillConfig(skill, skillsConfig).enabled === false) return false;
|
|
149
148
|
const requires = skill.metadata.xopc?.requires || skill.metadata.requires;
|
|
150
149
|
if (requires?.bins) {
|
|
151
|
-
const { hasBinary } = (init_installer(), __toCommonJS(installer_exports));
|
|
152
150
|
for (const bin of requires.bins) if (!hasBinary(bin)) {
|
|
153
151
|
log.debug({
|
|
154
152
|
skill: skill.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../../../src/agent/skills/config.ts"],"sourcesContent":["/**\n * Skill Configuration Manager\n * \n * Handles skill-specific configuration and environment variables.\n *\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport type { SkillConfig, SkillsConfig, Skill } from './types.js';\n\nconst log = createLogger('SkillConfig');\n\n/**\n * Resolve skill configuration from multiple sources\n * \n * Priority (highest to lowest):\n * 1. Environment variable overrides (XOPC_SKILL_<NAME>_<KEY>)\n * 2. Config file entries\n * 3. Skill defaults\n */\nexport function resolveSkillConfig(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): SkillConfig {\n const config: SkillConfig = {};\n\n // Start with config file entries\n const entryConfig = skillsConfig?.entries?.[skill.name];\n if (entryConfig) {\n config.enabled = entryConfig.enabled;\n config.apiKey = entryConfig.apiKey;\n config.env = entryConfig.env ? { ...entryConfig.env } : undefined;\n config.config = entryConfig.config ? { ...entryConfig.config } : undefined;\n }\n\n // Apply environment variable overrides\n const envPrefix = `XOPC_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;\n \n // Check for enabled override\n const enabledEnv = process.env[`${envPrefix}_ENABLED`];\n if (enabledEnv !== undefined) {\n config.enabled = enabledEnv.toLowerCase() === 'true' || enabledEnv === '1';\n }\n\n // Check for API key override\n const apiKeyEnv = process.env[`${envPrefix}_API_KEY`];\n if (apiKeyEnv) {\n config.apiKey = apiKeyEnv;\n }\n\n // Check for environment variable overrides\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(`${envPrefix}_ENV_`)) {\n const envKey = key.slice(`${envPrefix}_ENV_`.length);\n if (!config.env) {\n config.env = {};\n }\n config.env[envKey] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Apply environment variable overrides to a skill's environment\n */\nexport function applySkillEnvOverrides(\n skill: Skill,\n baseEnv: Record<string, string> = {},\n skillConfig?: SkillConfig\n): Record<string, string> {\n const env: Record<string, string> = { ...baseEnv };\n\n // Apply config env\n if (skillConfig?.env) {\n for (const [key, value] of Object.entries(skillConfig.env)) {\n env[key] = value;\n }\n }\n\n // Apply environment variable overrides\n const envPrefix = `XOPC_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(`${envPrefix}_ENV_`)) {\n const envKey = key.slice(`${envPrefix}_ENV_`.length);\n env[envKey] = value;\n }\n }\n\n return env;\n}\n\n/**\n * Get the effective environment for a skill\n */\nexport function getSkillEnvironment(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): Record<string, string> {\n const config = resolveSkillConfig(skill, skillsConfig);\n return applySkillEnvOverrides(skill, process.env as Record<string, string>, config);\n}\n\n/**\n * Skill configuration file manager\n */\nexport interface SkillConfigFile {\n /** Path to the config file */\n configPath: string;\n /** Load configuration */\n load: () => SkillsConfig;\n /** Save configuration */\n save: (config: SkillsConfig) => void;\n /** Get skill-specific config */\n getSkillConfig: (skillName: string) => SkillConfig | undefined;\n /** Update skill configuration */\n updateSkillConfig: (skillName: string, config: Partial<SkillConfig>) => void;\n /** Enable/disable a skill */\n setSkillEnabled: (skillName: string, enabled: boolean) => void;\n /** Set skill API key */\n setSkillApiKey: (skillName: string, apiKey: string) => void;\n}\n\n/**\n * Create a skill configuration file manager\n */\nexport function createSkillConfigManager(configDir: string): SkillConfigFile {\n const configPath = join(configDir, 'skills.json');\n\n function loadConfig(): SkillsConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ error: err, errorMessage: em, path: configPath }, `Skills config load failed, using defaults: ${em}`);\n return {};\n }\n }\n\n function saveConfig(config: SkillsConfig): void {\n try {\n writeTextAtomicSync(configPath, JSON.stringify(config, null, 2));\n log.info('Saved skills config');\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ error: err, errorMessage: em, path: configPath }, `Failed to save skills config: ${em}`);\n }\n }\n\n return {\n configPath,\n\n load: loadConfig,\n\n save: saveConfig,\n\n getSkillConfig: (skillName: string) => {\n const config = loadConfig();\n return config.entries?.[skillName];\n },\n\n updateSkillConfig: (skillName: string, updates: Partial<SkillConfig>) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n ...updates,\n };\n\n saveConfig(config);\n },\n\n setSkillEnabled: (skillName: string, enabled: boolean) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n enabled,\n };\n\n saveConfig(config);\n log.info({ skillName, enabled }, 'Updated skill enabled state');\n },\n\n setSkillApiKey: (skillName: string, apiKey: string) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n apiKey,\n };\n\n saveConfig(config);\n log.info({ skillName }, 'Updated skill API key');\n },\n };\n}\n\n/**\n * Check if a skill is enabled\n */\nexport function isSkillEnabled(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): boolean {\n const config = resolveSkillConfig(skill, skillsConfig);\n \n // Explicitly disabled\n if (config.enabled === false) {\n return false;\n }\n\n // Check if skill has requirements that are not met\n const requires = skill.metadata.xopc?.requires || skill.metadata.requires;\n if (requires?.bins) {\n const { hasBinary } = require('./installer.js');\n for (const bin of requires.bins) {\n if (!hasBinary(bin)) {\n log.debug({ skill: skill.name, bin }, 'Skill requirement not met');\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Validate skill configuration\n */\nexport function validateSkillConfig(config: SkillsConfig): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (config.toolGating !== undefined && typeof config.toolGating !== 'boolean') {\n errors.push('toolGating must be a boolean');\n }\n\n if (\n config.agentWritePolicy !== undefined &&\n config.agentWritePolicy !== 'global' &&\n config.agentWritePolicy !== 'workspace' &&\n config.agentWritePolicy !== 'both'\n ) {\n errors.push('agentWritePolicy must be \"global\", \"workspace\", or \"both\"');\n }\n\n // Validate limits\n const limits = config.limits;\n if (limits) {\n if (limits.maxCandidatesPerRoot !== undefined && limits.maxCandidatesPerRoot < 1) {\n errors.push('limits.maxCandidatesPerRoot must be at least 1');\n }\n if (limits.maxSkillsLoadedPerSource !== undefined && limits.maxSkillsLoadedPerSource < 1) {\n errors.push('limits.maxSkillsLoadedPerSource must be at least 1');\n }\n if (limits.maxSkillsInPrompt !== undefined && limits.maxSkillsInPrompt < 1) {\n errors.push('limits.maxSkillsInPrompt must be at least 1');\n }\n }\n\n // Validate entries\n if (config.entries) {\n for (const [skillName, skillConfig] of Object.entries(config.entries)) {\n if (skillConfig.apiKey && typeof skillConfig.apiKey !== 'string') {\n errors.push(`entries.${skillName}.apiKey must be a string`);\n }\n if (skillConfig.env && typeof skillConfig.env !== 'object') {\n errors.push(`entries.${skillName}.env must be an object`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../../src/agent/skills/config.ts"],"sourcesContent":["/**\n * Skill Configuration Manager\n * \n * Handles skill-specific configuration and environment variables.\n *\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport { hasBinary } from './installer.js';\nimport type { SkillConfig, SkillsConfig, Skill } from './types.js';\n\nconst log = createLogger('SkillConfig');\n\n/**\n * Resolve skill configuration from multiple sources\n * \n * Priority (highest to lowest):\n * 1. Environment variable overrides (XOPC_SKILL_<NAME>_<KEY>)\n * 2. Config file entries\n * 3. Skill defaults\n */\nexport function resolveSkillConfig(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): SkillConfig {\n const config: SkillConfig = {};\n\n // Start with config file entries\n const entryConfig = skillsConfig?.entries?.[skill.name];\n if (entryConfig) {\n config.enabled = entryConfig.enabled;\n config.apiKey = entryConfig.apiKey;\n config.env = entryConfig.env ? { ...entryConfig.env } : undefined;\n config.config = entryConfig.config ? { ...entryConfig.config } : undefined;\n }\n\n // Apply environment variable overrides\n const envPrefix = `XOPC_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;\n \n // Check for enabled override\n const enabledEnv = process.env[`${envPrefix}_ENABLED`];\n if (enabledEnv !== undefined) {\n config.enabled = enabledEnv.toLowerCase() === 'true' || enabledEnv === '1';\n }\n\n // Check for API key override\n const apiKeyEnv = process.env[`${envPrefix}_API_KEY`];\n if (apiKeyEnv) {\n config.apiKey = apiKeyEnv;\n }\n\n // Check for environment variable overrides\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(`${envPrefix}_ENV_`)) {\n const envKey = key.slice(`${envPrefix}_ENV_`.length);\n if (!config.env) {\n config.env = {};\n }\n config.env[envKey] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Apply environment variable overrides to a skill's environment\n */\nexport function applySkillEnvOverrides(\n skill: Skill,\n baseEnv: Record<string, string> = {},\n skillConfig?: SkillConfig\n): Record<string, string> {\n const env: Record<string, string> = { ...baseEnv };\n\n // Apply config env\n if (skillConfig?.env) {\n for (const [key, value] of Object.entries(skillConfig.env)) {\n env[key] = value;\n }\n }\n\n // Apply environment variable overrides\n const envPrefix = `XOPC_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;\n for (const [key, value] of Object.entries(process.env)) {\n if (key.startsWith(`${envPrefix}_ENV_`)) {\n const envKey = key.slice(`${envPrefix}_ENV_`.length);\n env[envKey] = value;\n }\n }\n\n return env;\n}\n\n/**\n * Get the effective environment for a skill\n */\nexport function getSkillEnvironment(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): Record<string, string> {\n const config = resolveSkillConfig(skill, skillsConfig);\n return applySkillEnvOverrides(skill, process.env as Record<string, string>, config);\n}\n\n/**\n * Skill configuration file manager\n */\nexport interface SkillConfigFile {\n /** Path to the config file */\n configPath: string;\n /** Load configuration */\n load: () => SkillsConfig;\n /** Save configuration */\n save: (config: SkillsConfig) => void;\n /** Get skill-specific config */\n getSkillConfig: (skillName: string) => SkillConfig | undefined;\n /** Update skill configuration */\n updateSkillConfig: (skillName: string, config: Partial<SkillConfig>) => void;\n /** Enable/disable a skill */\n setSkillEnabled: (skillName: string, enabled: boolean) => void;\n /** Set skill API key */\n setSkillApiKey: (skillName: string, apiKey: string) => void;\n}\n\n/**\n * Create a skill configuration file manager\n */\nexport function createSkillConfigManager(configDir: string): SkillConfigFile {\n const configPath = join(configDir, 'skills.json');\n\n function loadConfig(): SkillsConfig {\n if (!existsSync(configPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ error: err, errorMessage: em, path: configPath }, `Skills config load failed, using defaults: ${em}`);\n return {};\n }\n }\n\n function saveConfig(config: SkillsConfig): void {\n try {\n writeTextAtomicSync(configPath, JSON.stringify(config, null, 2));\n log.info('Saved skills config');\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ error: err, errorMessage: em, path: configPath }, `Failed to save skills config: ${em}`);\n }\n }\n\n return {\n configPath,\n\n load: loadConfig,\n\n save: saveConfig,\n\n getSkillConfig: (skillName: string) => {\n const config = loadConfig();\n return config.entries?.[skillName];\n },\n\n updateSkillConfig: (skillName: string, updates: Partial<SkillConfig>) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n ...updates,\n };\n\n saveConfig(config);\n },\n\n setSkillEnabled: (skillName: string, enabled: boolean) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n enabled,\n };\n\n saveConfig(config);\n log.info({ skillName, enabled }, 'Updated skill enabled state');\n },\n\n setSkillApiKey: (skillName: string, apiKey: string) => {\n const config = loadConfig();\n \n if (!config.entries) {\n config.entries = {};\n }\n\n const existing = config.entries[skillName] || {};\n config.entries[skillName] = {\n ...existing,\n apiKey,\n };\n\n saveConfig(config);\n log.info({ skillName }, 'Updated skill API key');\n },\n };\n}\n\n/**\n * Check if a skill is enabled\n */\nexport function isSkillEnabled(\n skill: Skill,\n skillsConfig?: SkillsConfig\n): boolean {\n const config = resolveSkillConfig(skill, skillsConfig);\n \n // Explicitly disabled\n if (config.enabled === false) {\n return false;\n }\n\n // Check if skill has requirements that are not met\n const requires = skill.metadata.xopc?.requires || skill.metadata.requires;\n if (requires?.bins) {\n for (const bin of requires.bins) {\n if (!hasBinary(bin)) {\n log.debug({ skill: skill.name, bin }, 'Skill requirement not met');\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Validate skill configuration\n */\nexport function validateSkillConfig(config: SkillsConfig): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (config.toolGating !== undefined && typeof config.toolGating !== 'boolean') {\n errors.push('toolGating must be a boolean');\n }\n\n if (\n config.agentWritePolicy !== undefined &&\n config.agentWritePolicy !== 'global' &&\n config.agentWritePolicy !== 'workspace' &&\n config.agentWritePolicy !== 'both'\n ) {\n errors.push('agentWritePolicy must be \"global\", \"workspace\", or \"both\"');\n }\n\n // Validate limits\n const limits = config.limits;\n if (limits) {\n if (limits.maxCandidatesPerRoot !== undefined && limits.maxCandidatesPerRoot < 1) {\n errors.push('limits.maxCandidatesPerRoot must be at least 1');\n }\n if (limits.maxSkillsLoadedPerSource !== undefined && limits.maxSkillsLoadedPerSource < 1) {\n errors.push('limits.maxSkillsLoadedPerSource must be at least 1');\n }\n if (limits.maxSkillsInPrompt !== undefined && limits.maxSkillsInPrompt < 1) {\n errors.push('limits.maxSkillsInPrompt must be at least 1');\n }\n }\n\n // Validate entries\n if (config.entries) {\n for (const [skillName, skillConfig] of Object.entries(config.entries)) {\n if (skillConfig.apiKey && typeof skillConfig.apiKey !== 'string') {\n errors.push(`entries.${skillName}.apiKey must be a string`);\n }\n if (skillConfig.env && typeof skillConfig.env !== 'object') {\n errors.push(`entries.${skillName}.env must be an object`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import type { Skill } from './types.js';
|
|
5
5
|
import type { SkillsConfig } from './types.js';
|
|
6
6
|
export interface FormatSkillsForPromptOptions {
|
|
7
|
+
/** Explicit skill names visible in this context. Omitted means all enabled skills; empty means no visible skills. */
|
|
7
8
|
skillAllowlist?: string[];
|
|
8
9
|
/** When set (including empty array), applies tool gating from skill frontmatter. */
|
|
9
10
|
registeredToolNames?: string[];
|
|
@@ -6,10 +6,11 @@ import { skillVisibleForRegisteredTools } from "./skill-tool-gating.js";
|
|
|
6
6
|
*/
|
|
7
7
|
function selectSkillsVisibleInPrompt(skills, skillsConfig, options) {
|
|
8
8
|
let list = skills;
|
|
9
|
-
if (options?.skillAllowlist
|
|
9
|
+
if (options?.skillAllowlist !== void 0) {
|
|
10
|
+
if (options.skillAllowlist.length === 0) return [];
|
|
10
11
|
const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));
|
|
11
12
|
list = list.filter((s) => allow.has(s.name.toLowerCase()));
|
|
12
|
-
}
|
|
13
|
+
}
|
|
13
14
|
list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));
|
|
14
15
|
if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== void 0) {
|
|
15
16
|
const at = new Set(options.registeredToolNames);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist
|
|
1
|
+
{"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n /** Explicit skill names visible in this context. Omitted means all enabled skills; empty means no visible skills. */\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist !== undefined) {\n if (options.skillAllowlist.length === 0) {\n return [];\n }\n const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));\n list = list.filter((s) => allow.has(s.name.toLowerCase()));\n }\n\n list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));\n\n if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== undefined) {\n const at = new Set(options.registeredToolNames);\n list = list.filter((s) => skillVisibleForRegisteredTools(s, at));\n }\n\n return list;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction formatSkillXmlMetadataOnly(skill: Skill): string {\n const emoji = skill.metadata.emoji || '';\n const emojiStr = emoji ? `${emoji} ` : '';\n\n return [\n ' <skill>',\n ` <name>${escapeXml(skill.name)}</name>`,\n ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,\n ' </skill>',\n ].join('\\n');\n}\n\nexport function formatSkillsForPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): string {\n const visibleSkills = selectSkillsVisibleInPrompt(skills, skillsConfig, options);\n if (visibleSkills.length === 0) return '';\n\n const lines = [\n '\\n\\n<available_skills>',\n 'Skills are folders of instructions, scripts, and resources.',\n 'Use skills_list to browse; use skill_view(name) for SKILL.md or skill_view(name, path) for references/, templates/, scripts/, or assets/.',\n '',\n ];\n\n for (const skill of visibleSkills) {\n lines.push(formatSkillXmlMetadataOnly(skill));\n }\n\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;AAgBA,SAAgB,4BACd,QACA,cACA,SACS;CACT,IAAI,OAAO;AAEX,KAAI,SAAS,mBAAmB,KAAA,GAAW;AACzC,MAAI,QAAQ,eAAe,WAAW,EACpC,QAAO,EAAE;EAEX,MAAM,QAAQ,IAAI,IAAI,QAAQ,eAAe,KAAK,MAAM,EAAE,aAAa,CAAC,CAAC;AACzE,SAAO,KAAK,QAAQ,MAAM,MAAM,IAAI,EAAE,KAAK,aAAa,CAAC,CAAC;;AAG5D,QAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CAAC;AAEvF,KAAI,cAAc,eAAe,SAAS,SAAS,wBAAwB,KAAA,GAAW;EACpF,MAAM,KAAK,IAAI,IAAI,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,QAAQ,MAAM,+BAA+B,GAAG,GAAG,CAAC;;AAGlE,QAAO;;AAGT,SAAS,UAAU,KAAqB;AACtC,QAAO,IACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS;;AAG5B,SAAS,2BAA2B,OAAsB;CACxD,MAAM,QAAQ,MAAM,SAAS,SAAS;CACtC,MAAM,WAAW,QAAQ,GAAG,MAAM,KAAK;AAEvC,QAAO;EACL;EACA,aAAa,UAAU,MAAM,KAAK,CAAC;EACnC,oBAAoB,WAAW,UAAU,MAAM,YAAY,CAAC;EAC5D;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,sBACd,QACA,cACA,SACQ;CACR,MAAM,gBAAgB,4BAA4B,QAAQ,cAAc,QAAQ;AAChF,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACD;AAED,MAAK,MAAM,SAAS,cAClB,OAAM,KAAK,2BAA2B,MAAM,CAAC;AAG/C,OAAM,KAAK,sBAAsB;AACjC,QAAO,MAAM,KAAK,KAAK"}
|
|
@@ -7,8 +7,8 @@ import { computeSkillTreeHashSync } from "./hub-hash.js";
|
|
|
7
7
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
8
8
|
import { basename, join, normalize, resolve, sep } from "node:path";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
|
-
import { fileURLToPath } from "node:url";
|
|
11
10
|
import { execFileSync } from "node:child_process";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
12
|
import { fetch } from "undici";
|
|
13
13
|
//#region src/agent/skills/hub-pull.ts
|
|
14
14
|
/**
|
|
@@ -3,20 +3,19 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { resolveStateDir } from "../../config/paths-state.js";
|
|
4
4
|
import { init_paths } from "../../config/paths.js";
|
|
5
5
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
6
|
-
import { findInstallSpec, getDefaultInstallerPreferences, hasBinary,
|
|
6
|
+
import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, installSkill } from "./installer.js";
|
|
7
7
|
import { applySkillEnvOverrides, createSkillConfigManager, getSkillEnvironment, isSkillEnabled, resolveSkillConfig, validateSkillConfig } from "./config.js";
|
|
8
|
+
import { collectSkillInstallWarnings, formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
8
9
|
import { parseSkillToolConditions } from "./skill-tool-gating.js";
|
|
9
10
|
import { parseRequiredEnvVarNames } from "./required-env-vars.js";
|
|
10
|
-
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
11
|
-
import { collectSkillInstallWarnings, formatScanSummary, scanSkillDirectory } from "./scanner.js";
|
|
12
11
|
import { formatSkillsForPrompt } from "./format-skills-prompt.js";
|
|
12
|
+
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
13
13
|
import { SkillTestFramework, SkillTestRunner, formatTestResults, formatTestResultsJson, formatTestResultsTap } from "./test-framework.js";
|
|
14
14
|
import { basename, dirname, join, relative, sep } from "path";
|
|
15
15
|
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
16
16
|
//#region src/agent/skills/index.ts
|
|
17
17
|
init_paths();
|
|
18
18
|
init_logger();
|
|
19
|
-
init_installer();
|
|
20
19
|
const log = createLogger("SkillLoader");
|
|
21
20
|
const IGNORE_FILES = [
|
|
22
21
|
".gitignore",
|
|
@@ -98,13 +97,27 @@ function discoverSkills(dir, source) {
|
|
|
98
97
|
scan(dir, loadIgnoreRules(dir, dir));
|
|
99
98
|
return skills;
|
|
100
99
|
}
|
|
100
|
+
function deriveDescriptionFromMarkdown(content) {
|
|
101
|
+
let fallbackHeading = "";
|
|
102
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
103
|
+
const line = rawLine.trim();
|
|
104
|
+
if (!line) continue;
|
|
105
|
+
const heading = line.match(/^#{1,6}\s+(.+)$/);
|
|
106
|
+
if (heading) {
|
|
107
|
+
fallbackHeading ||= heading[1]?.trim() ?? "";
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
return line.replace(/\[([^\]]+)\]\([^)]*\)/g, "$1").replace(/[*_`~]/g, "").trim() || void 0;
|
|
111
|
+
}
|
|
112
|
+
return fallbackHeading || void 0;
|
|
113
|
+
}
|
|
101
114
|
function loadSkillFromFile(filePath, source, rootDir) {
|
|
102
115
|
try {
|
|
103
116
|
const { frontmatter, content } = parseFrontmatter(readFileSync(filePath, "utf-8"));
|
|
104
117
|
const skillDir = dirname(filePath);
|
|
105
118
|
const parentDirName = basename(skillDir);
|
|
106
119
|
const name = frontmatter.name || parentDirName;
|
|
107
|
-
const description = frontmatter.description;
|
|
120
|
+
const description = frontmatter.description?.trim() || deriveDescriptionFromMarkdown(content);
|
|
108
121
|
if (!description?.trim()) return null;
|
|
109
122
|
let category;
|
|
110
123
|
if (rootDir) {
|
|
@@ -112,6 +125,8 @@ function loadSkillFromFile(filePath, source, rootDir) {
|
|
|
112
125
|
if (segments.length > 1) category = segments[0];
|
|
113
126
|
}
|
|
114
127
|
const metadata = parseSkillMetadata(frontmatter);
|
|
128
|
+
metadata.name ||= name;
|
|
129
|
+
metadata.description ||= description.trim();
|
|
115
130
|
const toolConditions = parseSkillToolConditions(frontmatter);
|
|
116
131
|
const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);
|
|
117
132
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type { Skill, SkillDiagnostic, LoadSkillsResult, SkillConfig, SkillsConfig } from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source, dir);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global', rootDir?: string): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description = frontmatter.description as string | undefined;\n if (!description?.trim()) return null;\n\n // Derive category from directory path: skills/creative/algorithmic-art → 'creative'\n // Only assign a category when the skill is nested at least two levels below rootDir.\n let category: string | undefined;\n if (rootDir) {\n const relDir = toPosixPath(relative(rootDir, skillDir));\n const segments = relDir.split('/');\n if (segments.length > 1) {\n category = segments[0];\n }\n }\n\n const metadata = parseSkillMetadata(frontmatter);\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n category,\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// `SkillManager` + sibling types removed from this barrel — `skill-manager.ts`\n// imports `createSkillLoader` from THIS file, so re-exporting it back here\n// formed a circular cycle. External callers should import directly from\n// `./skill-manager.js`.\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// `watcher.ts` re-exports removed — it imports `SkillLoader` from THIS file, so\n// re-exporting back here formed a circular cycle. External callers should\n// import directly from `./watcher.js`.\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type { Skill, SkillDiagnostic, LoadSkillsResult, SkillConfig, SkillsConfig } from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source, dir);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction deriveDescriptionFromMarkdown(content: string): string | undefined {\n let fallbackHeading = '';\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n\n const heading = line.match(/^#{1,6}\\s+(.+)$/);\n if (heading) {\n fallbackHeading ||= heading[1]?.trim() ?? '';\n continue;\n }\n\n return line\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n .replace(/[*_`~]/g, '')\n .trim() || undefined;\n }\n\n return fallbackHeading || undefined;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global', rootDir?: string): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description =\n (frontmatter.description as string | undefined)?.trim() || deriveDescriptionFromMarkdown(content);\n if (!description?.trim()) return null;\n\n // Derive category from directory path: skills/creative/algorithmic-art → 'creative'\n // Only assign a category when the skill is nested at least two levels below rootDir.\n let category: string | undefined;\n if (rootDir) {\n const relDir = toPosixPath(relative(rootDir, skillDir));\n const segments = relDir.split('/');\n if (segments.length > 1) {\n category = segments[0];\n }\n }\n\n const metadata = parseSkillMetadata(frontmatter);\n metadata.name ||= name;\n metadata.description ||= description.trim();\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n category,\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// `SkillManager` + sibling types removed from this barrel — `skill-manager.ts`\n// imports `createSkillLoader` from THIS file, so re-exporting it back here\n// formed a circular cycle. External callers should import directly from\n// `./skill-manager.js`.\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// `watcher.ts` re-exports removed — it imports `SkillLoader` from THIS file, so\n// re-exporting back here formed a circular cycle. External callers should\n// import directly from `./watcher.js`.\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { __esmMin, __exportAll, __require } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { existsSync } from "fs";
|
|
3
|
+
import { delimiter, join } from "path";
|
|
4
|
+
import { accessSync, constants, existsSync } from "fs";
|
|
6
5
|
import { promisify } from "util";
|
|
7
6
|
import { exec } from "child_process";
|
|
8
7
|
//#region src/agent/skills/installer.ts
|
|
@@ -12,29 +11,24 @@ import { exec } from "child_process";
|
|
|
12
11
|
* Handles installation of skill dependencies via various package managers.
|
|
13
12
|
*
|
|
14
13
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
hasBinary: () => hasBinary,
|
|
19
|
-
installSkill: () => installSkill,
|
|
20
|
-
resolveBrewExecutable: () => resolveBrewExecutable
|
|
21
|
-
});
|
|
14
|
+
init_logger();
|
|
15
|
+
const execAsync = promisify(exec);
|
|
16
|
+
const log = createLogger("SkillInstaller");
|
|
22
17
|
/**
|
|
23
18
|
* Check if a binary exists
|
|
24
19
|
*/
|
|
25
20
|
function hasBinary(name) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
if (!name || name.includes("/") || name.includes("\\")) return false;
|
|
22
|
+
const pathEntries = (process.env.PATH || "").split(delimiter).filter(Boolean);
|
|
23
|
+
const extensions = process.platform === "win32" ? (process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean) : [""];
|
|
24
|
+
for (const dir of pathEntries) for (const ext of extensions) {
|
|
25
|
+
const candidate = join(dir, `${name}${ext}`);
|
|
30
26
|
try {
|
|
31
|
-
|
|
32
|
-
execSync(`which ${name}`, { stdio: "ignore" });
|
|
27
|
+
accessSync(candidate, constants.X_OK);
|
|
33
28
|
return true;
|
|
34
|
-
} catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
29
|
+
} catch {}
|
|
37
30
|
}
|
|
31
|
+
return false;
|
|
38
32
|
}
|
|
39
33
|
/**
|
|
40
34
|
* Resolve brew executable path
|
|
@@ -347,14 +341,7 @@ function getDefaultInstallerPreferences() {
|
|
|
347
341
|
nodeManager: "pnpm"
|
|
348
342
|
};
|
|
349
343
|
}
|
|
350
|
-
var execAsync, log;
|
|
351
|
-
var init_installer = __esmMin((() => {
|
|
352
|
-
init_logger();
|
|
353
|
-
execAsync = promisify(exec);
|
|
354
|
-
log = createLogger("SkillInstaller");
|
|
355
|
-
}));
|
|
356
344
|
//#endregion
|
|
357
|
-
|
|
358
|
-
export { findInstallSpec, getDefaultInstallerPreferences, hasBinary, init_installer, installSkill, installer_exports, resolveBrewExecutable };
|
|
345
|
+
export { findInstallSpec, getDefaultInstallerPreferences, hasBinary, installSkill, resolveBrewExecutable };
|
|
359
346
|
|
|
360
347
|
//# sourceMappingURL=installer.js.map
|