@xopcai/xopc 0.0.103 → 0.0.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/README.zh-CN.md +7 -4
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
- package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +35 -18
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +27 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -5
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.js +10 -5
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +7 -4
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +8 -5
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +73 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -1
- package/dist/src/providers/index.js +18 -7
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +21 -15
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
- package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
- package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
- package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
- package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { resolveStateDir } from "../config/paths-state.js";
|
|
2
|
+
import { init_paths } from "../config/paths.js";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import lockfile from "proper-lockfile";
|
|
7
|
+
//#region src/project-trust/trust-store.ts
|
|
8
|
+
init_paths();
|
|
9
|
+
const TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [
|
|
10
|
+
"settings.json",
|
|
11
|
+
"extensions",
|
|
12
|
+
"skills",
|
|
13
|
+
"prompts",
|
|
14
|
+
"themes",
|
|
15
|
+
"SYSTEM.md",
|
|
16
|
+
"APPEND_SYSTEM.md",
|
|
17
|
+
"workspace.json"
|
|
18
|
+
];
|
|
19
|
+
function canonicalizePath(path) {
|
|
20
|
+
const resolved = resolve(path);
|
|
21
|
+
try {
|
|
22
|
+
return realpathSync.native(resolved);
|
|
23
|
+
} catch {
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function normalizeCwd(cwd) {
|
|
28
|
+
return canonicalizePath(cwd);
|
|
29
|
+
}
|
|
30
|
+
function readTrustFile(path) {
|
|
31
|
+
if (!existsSync(path)) return {};
|
|
32
|
+
let parsed;
|
|
33
|
+
try {
|
|
34
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
35
|
+
} catch (err) {
|
|
36
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
37
|
+
throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);
|
|
38
|
+
}
|
|
39
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) throw new Error(`Invalid project trust store ${path}: expected an object`);
|
|
40
|
+
const data = {};
|
|
41
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
42
|
+
if (value !== true && value !== false && value !== null) throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);
|
|
43
|
+
data[normalizeCwd(key)] = value;
|
|
44
|
+
}
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
function writeTrustFile(path, data) {
|
|
48
|
+
const sorted = {};
|
|
49
|
+
for (const key of Object.keys(data).sort()) {
|
|
50
|
+
const value = data[key];
|
|
51
|
+
if (value === true || value === false || value === null) sorted[key] = value;
|
|
52
|
+
}
|
|
53
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
54
|
+
writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\n`, "utf8");
|
|
55
|
+
}
|
|
56
|
+
function acquireTrustLockSync(path) {
|
|
57
|
+
const trustDir = dirname(path);
|
|
58
|
+
mkdirSync(trustDir, { recursive: true });
|
|
59
|
+
const maxAttempts = 10;
|
|
60
|
+
const delayMs = 20;
|
|
61
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) try {
|
|
62
|
+
return lockfile.lockSync(trustDir, {
|
|
63
|
+
realpath: false,
|
|
64
|
+
lockfilePath: `${path}.lock`
|
|
65
|
+
});
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if ((typeof err === "object" && err !== null && "code" in err ? String(err.code) : void 0) !== "ELOCKED" || attempt === maxAttempts) throw err;
|
|
68
|
+
const startedAt = Date.now();
|
|
69
|
+
while (Date.now() - startedAt < delayMs);
|
|
70
|
+
}
|
|
71
|
+
throw new Error("Failed to acquire project trust store lock");
|
|
72
|
+
}
|
|
73
|
+
function withTrustFileLock(path, fn) {
|
|
74
|
+
const release = acquireTrustLockSync(path);
|
|
75
|
+
try {
|
|
76
|
+
return fn();
|
|
77
|
+
} finally {
|
|
78
|
+
release();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function findNearestTrustEntry(data, cwd) {
|
|
82
|
+
let currentDir = normalizeCwd(cwd);
|
|
83
|
+
while (true) {
|
|
84
|
+
const value = data[currentDir];
|
|
85
|
+
if (value === true || value === false) return {
|
|
86
|
+
path: currentDir,
|
|
87
|
+
decision: value
|
|
88
|
+
};
|
|
89
|
+
const parentDir = dirname(currentDir);
|
|
90
|
+
if (parentDir === currentDir) return null;
|
|
91
|
+
currentDir = parentDir;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function resolveProjectTrustStorePath() {
|
|
95
|
+
return join(resolveStateDir(), "trust.json");
|
|
96
|
+
}
|
|
97
|
+
function getProjectTrustParentPath(cwd) {
|
|
98
|
+
const trustPath = normalizeCwd(cwd);
|
|
99
|
+
const parentDir = dirname(trustPath);
|
|
100
|
+
return parentDir === trustPath ? void 0 : parentDir;
|
|
101
|
+
}
|
|
102
|
+
function getProjectTrustOptions(cwd, options = {}) {
|
|
103
|
+
const trustPath = normalizeCwd(cwd);
|
|
104
|
+
const trustOptions = [{
|
|
105
|
+
label: "Trust",
|
|
106
|
+
trusted: true,
|
|
107
|
+
updates: [{
|
|
108
|
+
path: trustPath,
|
|
109
|
+
decision: true
|
|
110
|
+
}],
|
|
111
|
+
savedPath: trustPath
|
|
112
|
+
}];
|
|
113
|
+
const parentPath = getProjectTrustParentPath(cwd);
|
|
114
|
+
if (parentPath) trustOptions.push({
|
|
115
|
+
label: `Trust parent folder (${parentPath})`,
|
|
116
|
+
trusted: true,
|
|
117
|
+
updates: [{
|
|
118
|
+
path: parentPath,
|
|
119
|
+
decision: true
|
|
120
|
+
}, {
|
|
121
|
+
path: trustPath,
|
|
122
|
+
decision: null
|
|
123
|
+
}],
|
|
124
|
+
savedPath: parentPath
|
|
125
|
+
});
|
|
126
|
+
if (options.includeSessionOnly) trustOptions.push({
|
|
127
|
+
label: "Trust (this session only)",
|
|
128
|
+
trusted: true,
|
|
129
|
+
updates: []
|
|
130
|
+
});
|
|
131
|
+
trustOptions.push({
|
|
132
|
+
label: "Do not trust",
|
|
133
|
+
trusted: false,
|
|
134
|
+
updates: [{
|
|
135
|
+
path: trustPath,
|
|
136
|
+
decision: false
|
|
137
|
+
}],
|
|
138
|
+
savedPath: trustPath
|
|
139
|
+
});
|
|
140
|
+
if (options.includeSessionOnly) trustOptions.push({
|
|
141
|
+
label: "Do not trust (this session only)",
|
|
142
|
+
trusted: false,
|
|
143
|
+
updates: []
|
|
144
|
+
});
|
|
145
|
+
return trustOptions;
|
|
146
|
+
}
|
|
147
|
+
function hasTrustRequiringProjectResources(cwd) {
|
|
148
|
+
const userAgentsSkillsDir = join(canonicalizePath(process.env.HOME || homedir()), ".agents", "skills");
|
|
149
|
+
let currentDir = canonicalizePath(cwd);
|
|
150
|
+
const xopcProjectDir = join(currentDir, ".xopc");
|
|
151
|
+
if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) return true;
|
|
152
|
+
while (true) {
|
|
153
|
+
const agentsSkillsDir = join(currentDir, ".agents", "skills");
|
|
154
|
+
if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) return true;
|
|
155
|
+
const parentDir = dirname(currentDir);
|
|
156
|
+
if (parentDir === currentDir) return false;
|
|
157
|
+
currentDir = parentDir;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
var ProjectTrustStore = class {
|
|
161
|
+
constructor(trustPath = resolveProjectTrustStorePath()) {
|
|
162
|
+
this.trustPath = trustPath;
|
|
163
|
+
}
|
|
164
|
+
getPath() {
|
|
165
|
+
return this.trustPath;
|
|
166
|
+
}
|
|
167
|
+
get(cwd) {
|
|
168
|
+
return this.getEntry(cwd)?.decision ?? null;
|
|
169
|
+
}
|
|
170
|
+
getEntry(cwd) {
|
|
171
|
+
return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));
|
|
172
|
+
}
|
|
173
|
+
set(cwd, decision) {
|
|
174
|
+
this.setMany([{
|
|
175
|
+
path: cwd,
|
|
176
|
+
decision
|
|
177
|
+
}]);
|
|
178
|
+
}
|
|
179
|
+
setMany(decisions) {
|
|
180
|
+
withTrustFileLock(this.trustPath, () => {
|
|
181
|
+
const data = readTrustFile(this.trustPath);
|
|
182
|
+
for (const { path, decision } of decisions) {
|
|
183
|
+
const key = normalizeCwd(path);
|
|
184
|
+
if (decision === null) delete data[key];
|
|
185
|
+
else data[key] = decision;
|
|
186
|
+
}
|
|
187
|
+
writeTrustFile(this.trustPath, data);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
//#endregion
|
|
192
|
+
export { ProjectTrustStore, getProjectTrustOptions, getProjectTrustParentPath, hasTrustRequiringProjectResources, resolveProjectTrustStorePath };
|
|
193
|
+
|
|
194
|
+
//# sourceMappingURL=trust-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-store.js","names":["resolvePath"],"sources":["../../../src/project-trust/trust-store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve as resolvePath } from 'node:path';\n\nimport lockfile from 'proper-lockfile';\n\nimport { resolveStateDir } from '../config/paths.js';\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n path: string;\n decision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n path: string;\n decision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n label: string;\n trusted: boolean;\n updates: ProjectTrustUpdate[];\n savedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [\n 'settings.json',\n 'extensions',\n 'skills',\n 'prompts',\n 'themes',\n 'SYSTEM.md',\n 'APPEND_SYSTEM.md',\n 'workspace.json',\n] as const;\n\nfunction canonicalizePath(path: string): string {\n const resolved = resolvePath(path);\n try {\n return realpathSync.native(resolved);\n } catch {\n return resolved;\n }\n}\n\nfunction normalizeCwd(cwd: string): string {\n return canonicalizePath(cwd);\n}\n\nfunction readTrustFile(path: string): TrustFile {\n if (!existsSync(path)) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Invalid project trust store ${path}: expected an object`);\n }\n\n const data: TrustFile = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== true && value !== false && value !== null) {\n throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n }\n data[normalizeCwd(key)] = value;\n }\n return data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n const sorted: TrustFile = {};\n for (const key of Object.keys(data).sort()) {\n const value = data[key];\n if (value === true || value === false || value === null) {\n sorted[key] = value;\n }\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, 'utf8');\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n const trustDir = dirname(path);\n mkdirSync(trustDir, { recursive: true });\n const maxAttempts = 10;\n const delayMs = 20;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n } catch (err) {\n const code =\n typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : undefined;\n if (code !== 'ELOCKED' || attempt === maxAttempts) {\n throw err;\n }\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n // Synchronous callers need a tiny bounded wait while another TUI updates trust.json.\n }\n }\n }\n\n throw new Error('Failed to acquire project trust store lock');\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n const release = acquireTrustLockSync(path);\n try {\n return fn();\n } finally {\n release();\n }\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n let currentDir = normalizeCwd(cwd);\n while (true) {\n const value = data[currentDir];\n if (value === true || value === false) {\n return { path: currentDir, decision: value };\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return null;\n currentDir = parentDir;\n }\n}\n\nexport function resolveProjectTrustStorePath(): string {\n return join(resolveStateDir(), 'trust.json');\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n const trustPath = normalizeCwd(cwd);\n const parentDir = dirname(trustPath);\n return parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(\n cwd: string,\n options: { includeSessionOnly?: boolean } = {},\n): ProjectTrustOption[] {\n const trustPath = normalizeCwd(cwd);\n const trustOptions: ProjectTrustOption[] = [\n { label: 'Trust', trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n ];\n const parentPath = getProjectTrustParentPath(cwd);\n if (parentPath) {\n trustOptions.push({\n label: `Trust parent folder (${parentPath})`,\n trusted: true,\n updates: [\n { path: parentPath, decision: true },\n { path: trustPath, decision: null },\n ],\n savedPath: parentPath,\n });\n }\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Trust (this session only)', trusted: true, updates: [] });\n }\n trustOptions.push({\n label: 'Do not trust',\n trusted: false,\n updates: [{ path: trustPath, decision: false }],\n savedPath: trustPath,\n });\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Do not trust (this session only)', trusted: false, updates: [] });\n }\n return trustOptions;\n}\n\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n const homeDir = canonicalizePath(process.env.HOME || homedir());\n const userAgentsSkillsDir = join(homeDir, '.agents', 'skills');\n let currentDir = canonicalizePath(cwd);\n\n const xopcProjectDir = join(currentDir, '.xopc');\n if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) {\n return true;\n }\n\n while (true) {\n const agentsSkillsDir = join(currentDir, '.agents', 'skills');\n if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n return true;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return false;\n currentDir = parentDir;\n }\n}\n\nexport class ProjectTrustStore {\n constructor(private readonly trustPath: string = resolveProjectTrustStorePath()) {}\n\n getPath(): string {\n return this.trustPath;\n }\n\n get(cwd: string): ProjectTrustDecision {\n return this.getEntry(cwd)?.decision ?? null;\n }\n\n getEntry(cwd: string): ProjectTrustStoreEntry | null {\n return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));\n }\n\n set(cwd: string, decision: ProjectTrustDecision): void {\n this.setMany([{ path: cwd, decision }]);\n }\n\n setMany(decisions: ProjectTrustUpdate[]): void {\n withTrustFileLock(this.trustPath, () => {\n const data = readTrustFile(this.trustPath);\n for (const { path, decision } of decisions) {\n const key = normalizeCwd(path);\n if (decision === null) {\n delete data[key];\n } else {\n data[key] = decision;\n }\n }\n writeTrustFile(this.trustPath, data);\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ export declare function providerSupportsApiKey(provider: string): boolean;
|
|
|
60
60
|
/**
|
|
61
61
|
* Get a default model reference.
|
|
62
62
|
* Priority:
|
|
63
|
-
* 1. Explicitly configured model in agents.defaults.
|
|
63
|
+
* 1. Explicitly configured model in agents.defaults.models.chat (if set and available)
|
|
64
64
|
* 2. Default fallback: openai/gpt-5.5
|
|
65
65
|
*/
|
|
66
66
|
export declare function getDefaultModel(config?: Config | null | undefined): Promise<string>;
|
|
@@ -216,8 +216,19 @@ async function getAvailableModels() {
|
|
|
216
216
|
const allModels = getAllModels();
|
|
217
217
|
const pluginRegistry = getProviderRegistry();
|
|
218
218
|
const available = [];
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
const configuredByProvider = /* @__PURE__ */ new Map();
|
|
220
|
+
for (const model of allModels) {
|
|
221
|
+
if (pluginRegistry.has(model.provider)) {
|
|
222
|
+
available.push(model);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
let configured = configuredByProvider.get(model.provider);
|
|
226
|
+
if (configured === void 0) {
|
|
227
|
+
configured = await isProviderConfigured(model.provider);
|
|
228
|
+
configuredByProvider.set(model.provider, configured);
|
|
229
|
+
}
|
|
230
|
+
if (configured) available.push(model);
|
|
231
|
+
}
|
|
221
232
|
return available;
|
|
222
233
|
}
|
|
223
234
|
function getSortedProviders() {
|
|
@@ -251,13 +262,13 @@ function providerSupportsApiKey(provider) {
|
|
|
251
262
|
/**
|
|
252
263
|
* Get a default model reference.
|
|
253
264
|
* Priority:
|
|
254
|
-
* 1. Explicitly configured model in agents.defaults.
|
|
265
|
+
* 1. Explicitly configured model in agents.defaults.models.chat (if set and available)
|
|
255
266
|
* 2. Default fallback: openai/gpt-5.5
|
|
256
267
|
*/
|
|
257
268
|
async function getDefaultModel(config) {
|
|
258
|
-
const defaultModel = config?.agents?.defaults?.
|
|
269
|
+
const defaultModel = config?.agents?.defaults?.models?.chat;
|
|
259
270
|
if (defaultModel) {
|
|
260
|
-
const modelRef =
|
|
271
|
+
const modelRef = defaultModel.primary;
|
|
261
272
|
if (modelRef) {
|
|
262
273
|
const configured = (await getAvailableModels()).find((m) => `${m.provider}/${m.id}` === modelRef || m.id === modelRef);
|
|
263
274
|
if (configured) return `${configured.provider}/${configured.id}`;
|
|
@@ -275,9 +286,9 @@ async function getDefaultModel(config) {
|
|
|
275
286
|
* full catalog.
|
|
276
287
|
*/
|
|
277
288
|
function getDefaultModelSync(config) {
|
|
278
|
-
const defaultModel = config?.agents?.defaults?.
|
|
289
|
+
const defaultModel = config?.agents?.defaults?.models?.chat;
|
|
279
290
|
if (defaultModel) {
|
|
280
|
-
const modelRef =
|
|
291
|
+
const modelRef = defaultModel.primary;
|
|
281
292
|
if (modelRef) return modelRef;
|
|
282
293
|
}
|
|
283
294
|
return DEFAULT_FALLBACK_MODEL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getPiAiModel","getPiAiProviders","getPiAiModels"],"sources":["../../../src/providers/index.ts"],"sourcesContent":["/**\n * Model provider module - integrates built-in models with custom models from models.json\n */\n\nimport {\n\tgetModel as getPiAiModel,\n\tgetModels as getPiAiModels,\n\tgetProviders as getPiAiProviders,\n\ttype Model,\n\ttype Api,\n} from '@earendil-works/pi-ai';\nimport type { Config } from '../config/schema.js';\nimport { getModelRegistry } from './model-registry.js';\nimport { CredentialResolver, resolveApiKey, hasCredentials } from '../auth/credentials.js';\nimport { hasProviderAuthOnDiskSync } from '../auth/sync-provider-auth.js';\nimport { getApiKeyFromEnv } from './env-keys.js';\nimport { getProviderRegistry } from './plugin-registry.js';\nimport type { ProviderModelDefinition } from '../extensions/types/providers.js';\n\nexport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from './env-keys.js';\n\n/** Sentinel base URL: model is served by an extension {@link ProviderPluginRegistry} provider. */\nexport const EXTENSION_PROVIDER_BASE_URL = 'extension://provider-plugin';\nconst OPENAI_CODEX_CANONICAL_BASE_URL = 'https://chatgpt.com/backend-api/codex';\n\nfunction normalizeProviderModel(model: Model<Api>): Model<Api> {\n\tif (model.provider === 'openai-codex' && model.api === 'openai-codex-responses') {\n\t\treturn { ...model, baseUrl: OPENAI_CODEX_CANONICAL_BASE_URL } as Model<Api>;\n\t}\n\treturn model;\n}\n\n/** Map a plugin registry model to the pi-ai {@link Model} shape. */\nexport function pluginModelToModel(providerId: string, definition: ProviderModelDefinition): Model<Api> {\n\treturn {\n\t\tprovider: providerId,\n\t\tid: definition.id,\n\t\tname: definition.name,\n\t\tapi: 'openai-completions' as Api,\n\t\tbaseUrl: EXTENSION_PROVIDER_BASE_URL,\n\t\treasoning: false,\n\t\tinput: definition.supportsImages ? (['text', 'image'] as ('text' | 'image')[]) : (['text'] as ('text' | 'image')[]),\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxOutputTokens ?? 4096,\n\t\tcost: {\n\t\t\tinput: definition.pricing?.input ?? 0,\n\t\t\toutput: definition.pricing?.output ?? 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t},\n\t} as Model<Api>;\n}\n\n/**\n * Get API key synchronously: checks registry (models.json) first, then environment variables.\n * Use this for Agent's getApiKey callback which must be synchronous.\n */\nexport function getApiKeySync(provider: string): string | undefined {\n const pluginRegistry = getProviderRegistry();\n if (pluginRegistry.has(provider)) return 'extension-managed';\n\n const registry = getModelRegistry();\n const registryKey = registry.getApiKey(provider);\n if (registryKey) {\n return registryKey;\n }\n return getApiKeyFromEnv(provider);\n}\n\n/**\n * Resolve model reference. Supports:\n * - \"provider/modelId\" format\n * - \"modelId\" auto-detection via pi-ai or custom models\n * @throws if model not found\n */\nexport function resolveModel(ref: string): Model<Api> {\n\t// First try ModelRegistry (includes custom models)\n\tconst registry = getModelRegistry();\n\tconst customModel = registry.resolve(ref);\n\tif (customModel) {\n\t\treturn customModel;\n\t}\n\n\tif (ref.includes('/')) {\n\t\tconst [provider, modelId] = ref.split('/');\n\t\tconst piAiModel = getPiAiModel(provider as any, modelId as any);\n\t\tif (piAiModel) return normalizeProviderModel(piAiModel as Model<Api>);\n\n\t\tconst pluginRegistry = getProviderRegistry();\n\t\tconst plugin = pluginRegistry.get(provider);\n\t\tif (plugin) {\n\t\t\tconst pluginModel = plugin.models.find(m => m.id === modelId);\n\t\t\tif (pluginModel) return pluginModelToModel(provider, pluginModel);\n\t\t}\n\t\tthrow new Error(`Model not found: ${ref}`);\n\t}\n\n\tfor (const provider of getPiAiProviders()) {\n\t\ttry {\n\t\t\tconst models = getPiAiModels(provider);\n\t\t\tconst found = models.find(m => m.id === ref);\n\t\t\tif (found) return normalizeProviderModel(found as Model<Api>);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tconst pluginRegistry = getProviderRegistry();\n\tfor (const plugin of pluginRegistry.listAll()) {\n\t\tconst found = plugin.models.find(m => m.id === ref);\n\t\tif (found) return pluginModelToModel(plugin.id, found);\n\t}\n\n\tthrow new Error(`Model not found: ${ref}. Use format: provider/model-id`);\n}\n\nexport function getModelsByProvider(provider: string): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst fromRegistry = registry.getAll().filter(m => m.provider === provider).map(normalizeProviderModel);\n\tconst plugin = getProviderRegistry().get(provider);\n\tif (!plugin) return fromRegistry;\n\tconst pluginModels = plugin.models.map(m => pluginModelToModel(provider, m));\n\treturn [...fromRegistry, ...pluginModels];\n}\n\nexport function getAllProviders(): string[] {\n\tconst registry = getModelRegistry();\n\tconst providers = new Set<string>();\n\n\t// Add built-in providers\n\tfor (const p of getPiAiProviders()) {\n\t\tproviders.add(p);\n\t}\n\n\t// Add custom providers from registry\n\tfor (const m of registry.getAll()) {\n\t\tproviders.add(m.provider);\n\t}\n\n\tfor (const plugin of getProviderRegistry().listAll()) {\n\t\tproviders.add(plugin.id);\n\t}\n\n\treturn Array.from(providers);\n}\n\nexport async function getApiKey(provider: string): Promise<string | undefined> {\n\tif (getProviderRegistry().has(provider)) return 'extension-managed';\n\n\t// Use new credential resolver first (checks: agent private > global > oauth > env)\n\tconst credentialKey = await resolveApiKey(provider);\n\tif (credentialKey) {\n\t\treturn credentialKey;\n\t}\n\n\t// Check registry for custom providers (from models.json)\n\tconst registry = getModelRegistry();\n\tconst registryKey = registry.getApiKey(provider);\n\tif (registryKey) {\n\t\treturn registryKey;\n\t}\n\n\t// Fallback to environment variables\n\treturn getApiKeyFromEnv(provider);\n}\n\n/**\n * Synchronous version for use in non-async contexts\n * Only checks environment variables and registry, not credential system\n */\nexport function isProviderConfiguredSync(provider: string): boolean {\n\tif (getProviderRegistry().has(provider)) return true;\n\n\t// Check registry for custom providers\n\tconst registry = getModelRegistry();\n\tif (registry.getApiKey(provider)) {\n\t\treturn true;\n\t}\n\t// Check environment variables\n\tif (getApiKeyFromEnv(provider)) {\n\t\treturn true;\n\t}\n\t// Gateway UI / CLI store keys in auth-profiles.json (async CredentialResolver); sync path for fallback list\n\treturn hasProviderAuthOnDiskSync(provider);\n}\n\nexport async function isProviderConfigured(provider: string): Promise<boolean> {\n if (getProviderRegistry().has(provider)) return true;\n\n // Check registry first for custom providers (from models.json)\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return true;\n }\n return await hasCredentials(provider);\n}\n\n/** Where runtime {@link getApiKey} resolves the key from (no secret values). */\nexport type ProviderActiveKeySource = 'none' | 'agent' | 'gateway' | 'oauth' | 'env' | 'models_json' | 'extension';\n\nexport type ProviderAuthMode = ProviderActiveKeySource;\nexport type ProviderAuthStatus = 'connected' | 'expired' | 'not_connected';\n\nexport interface ProviderAuthState {\n authMode: ProviderAuthMode;\n authStatus: ProviderAuthStatus;\n expiresAt?: number;\n}\n\nexport async function getProviderActiveKeySource(provider: string): Promise<ProviderActiveKeySource> {\n const authState = await getProviderAuthState(provider);\n return authState.authMode;\n}\n\nexport async function getProviderAuthState(provider: string): Promise<ProviderAuthState> {\n if (getProviderRegistry().has(provider)) {\n return { authMode: 'extension', authStatus: 'connected' };\n }\n\n const resolver = new CredentialResolver();\n const fromCredentials = await resolver.resolveApiKeySource(provider);\n if (fromCredentials === 'agent') return { authMode: 'agent', authStatus: 'connected' };\n if (fromCredentials === 'global') return { authMode: 'gateway', authStatus: 'connected' };\n if (fromCredentials === 'oauth') {\n const token = await resolver.loadOAuthTokenRecord(provider);\n const expired = Boolean(token?.expiresAt && token.expiresAt < Date.now());\n return {\n authMode: 'oauth',\n authStatus: expired ? 'expired' : 'connected',\n ...(token?.expiresAt ? { expiresAt: token.expiresAt } : {}),\n };\n }\n if (fromCredentials === 'env') return { authMode: 'env', authStatus: 'connected' };\n\n const expiredOAuthToken = await resolver.loadOAuthTokenRecord(provider);\n if (expiredOAuthToken?.expiresAt && expiredOAuthToken.expiresAt < Date.now()) {\n return {\n authMode: 'oauth',\n authStatus: 'expired',\n expiresAt: expiredOAuthToken.expiresAt,\n };\n }\n\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return { authMode: 'models_json', authStatus: 'connected' };\n }\n\n return { authMode: 'none', authStatus: 'not_connected' };\n}\n\nexport async function getConfiguredProviders(): Promise<string[]> {\n\tconst allProviders = getAllProviders();\n\tconst configured: string[] = [];\n\tfor (const p of allProviders) {\n\t\tif (await isProviderConfigured(p)) {\n\t\t\tconfigured.push(p);\n\t\t}\n\t}\n\treturn configured;\n}\n\nexport function getAllModels(): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst registryModels = registry.getAll().map(normalizeProviderModel);\n\tconst pluginProviders = getProviderRegistry().listAll();\n\tif (pluginProviders.length === 0) return registryModels;\n\n\tconst existingIds = new Set(registryModels.map(m => `${m.provider}/${m.id}`));\n\tconst merged: Model<Api>[] = [...registryModels];\n\tfor (const plugin of pluginProviders) {\n\t\tfor (const model of plugin.models) {\n\t\t\tconst compositeId = `${plugin.id}/${model.id}`;\n\t\t\tif (!existingIds.has(compositeId)) {\n\t\t\t\tmerged.push(pluginModelToModel(plugin.id, model));\n\t\t\t\texistingIds.add(compositeId);\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport async function getAvailableModels(): Promise<readonly Model<Api>[]> {\n\tconst allModels = getAllModels();\n\tconst pluginRegistry = getProviderRegistry();\n\tconst available: Model<Api>[] = [];\n\n\tfor (const model of allModels) {\n\t\tif (pluginRegistry.has(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t} else if (await isProviderConfigured(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t}\n\t}\n\treturn available;\n}\n\nexport type { Model, Api } from '@earendil-works/pi-ai';\n\nexport type ProviderCategory = 'common' | 'specialty' | 'oauth' | 'enterprise' | 'extension';\n\nexport interface ProviderMeta {\n name: string;\n category: ProviderCategory;\n supportsOAuth?: boolean;\n supportsApiKey?: boolean;\n}\n\nexport const PROVIDER_META: Record<string, ProviderMeta> = {\n 'openai': { name: 'OpenAI', category: 'common', supportsApiKey: true },\n 'anthropic': { name: 'Anthropic', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'deepseek': { name: 'DeepSeek', category: 'common', supportsApiKey: true },\n 'google': { name: 'Google AI', category: 'common', supportsApiKey: true },\n 'groq': { name: 'Groq', category: 'common', supportsApiKey: true },\n 'minimax': { name: 'MiniMax', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'minimax-cn': { name: 'MiniMax CN', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'kimi-coding': { name: 'Kimi For Coding', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'xai': { name: 'xAI', category: 'specialty', supportsApiKey: true },\n 'mistral': { name: 'Mistral AI', category: 'specialty', supportsApiKey: true },\n 'cerebras': { name: 'Cerebras', category: 'specialty', supportsApiKey: true },\n 'openrouter': { name: 'OpenRouter', category: 'specialty', supportsApiKey: true },\n 'huggingface': { name: 'Hugging Face', category: 'specialty', supportsApiKey: true },\n moonshotai: { name: 'Moonshot AI (Kimi · International)', category: 'common', supportsApiKey: true },\n 'moonshotai-cn': { name: 'Moonshot AI (Kimi · China)', category: 'common', supportsApiKey: true },\n fireworks: { name: 'Fireworks AI', category: 'specialty', supportsApiKey: true },\n together: { name: 'Together AI', category: 'specialty', supportsApiKey: true },\n 'cloudflare-workers-ai': { name: 'Cloudflare Workers AI', category: 'enterprise', supportsApiKey: true },\n 'cloudflare-ai-gateway': { name: 'Cloudflare AI Gateway', category: 'enterprise', supportsApiKey: true },\n xiaomi: { name: 'Xiaomi Mimo', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-cn': { name: 'Xiaomi Token Plan (CN)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-ams': { name: 'Xiaomi Token Plan (AMS)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-sgp': { name: 'Xiaomi Token Plan (SGP)', category: 'specialty', supportsApiKey: true },\n 'opencode': { name: 'OpenCode', category: 'specialty', supportsApiKey: true },\n 'opencode-go': { name: 'OpenCode Go', category: 'specialty', supportsApiKey: true },\n /** DashScope (Alibaba) — image, speech, STT; not an LLM KnownProvider. */\n 'dashscope': { name: 'DashScope (Alibaba)', category: 'specialty', supportsApiKey: true },\n /** International GLM (api.z.ai). Auth: API key (ZAI_API_KEY); no published OAuth for this HTTP API. */\n 'zai': { name: 'Zhipu GLM (International · z.ai)', category: 'common', supportsApiKey: true },\n 'amazon-bedrock': { name: 'Amazon Bedrock', category: 'enterprise', supportsApiKey: true },\n 'azure-openai-responses': { name: 'Azure OpenAI', category: 'enterprise', supportsApiKey: true },\n 'google-vertex': { name: 'Google Vertex AI', category: 'enterprise', supportsApiKey: true },\n 'vercel-ai-gateway': { name: 'Vercel AI Gateway', category: 'enterprise', supportsApiKey: true },\n 'github-copilot': { name: 'GitHub Copilot (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'openai-codex': { name: 'OpenAI Codex (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-gemini-cli': { name: 'Google Gemini CLI (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-antigravity': { name: 'Google Antigravity (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n};\n\nexport function getSortedProviders(): string[] {\n const all = getAllProviders();\n const catOrder: Record<ProviderCategory, number> = { common: 0, specialty: 1, enterprise: 2, oauth: 3, extension: 4 };\n const pluginRegistry = getProviderRegistry();\n\n return [...all].sort((a, b) => {\n const catA = pluginRegistry.has(a) ? 'extension' : (PROVIDER_META[a]?.category ?? 'specialty');\n const catB = pluginRegistry.has(b) ? 'extension' : (PROVIDER_META[b]?.category ?? 'specialty');\n if (catOrder[catA] !== catOrder[catB]) {\n return catOrder[catA] - catOrder[catB];\n }\n return a.localeCompare(b);\n });\n}\n\nexport function getProviderDisplayName(provider: string): string {\n const plugin = getProviderRegistry().get(provider);\n if (plugin) return plugin.name;\n return PROVIDER_META[provider]?.name || provider;\n}\n\nexport function providerSupportsOAuth(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsOAuth ?? false;\n}\n\nexport function providerSupportsApiKey(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsApiKey ?? true;\n}\n\n// ============================================\n// Dynamic Default Model Resolution\n// ============================================\n\n/** Preferred default model when no explicit model is configured. */\nconst DEFAULT_FALLBACK_MODEL = 'openai/gpt-5.5';\n\n/**\n * Get a default model reference.\n * Priority:\n * 1. Explicitly configured model in agents.defaults.model (if set and available)\n * 2. Default fallback: openai/gpt-5.5\n */\nexport async function getDefaultModel(config?: Config | null | undefined): Promise<string> {\n const defaultModel = config?.agents?.defaults?.model;\n if (defaultModel) {\n const modelRef = typeof defaultModel === 'string' ? defaultModel : defaultModel.primary;\n if (modelRef) {\n const availableModels = await getAvailableModels();\n const configured = availableModels.find(m => \n `${m.provider}/${m.id}` === modelRef ||\n m.id === modelRef\n );\n if (configured) {\n return `${configured.provider}/${configured.id}`;\n }\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n/**\n * Synchronous default model resolution for constructors and sync code paths.\n * Uses catalog/registry only (no async credential checks).\n *\n * When no model is explicitly configured, returns the preferred default\n * (`openai/gpt-5.5`) rather than picking an arbitrary first model from the\n * full catalog.\n */\nexport function getDefaultModelSync(config?: Config | null | undefined): string {\n const defaultModel = config?.agents?.defaults?.model;\n if (defaultModel) {\n const modelRef = typeof defaultModel === 'string' ? defaultModel : defaultModel.primary;\n if (modelRef) {\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n// Re-export ModelRegistry for advanced use cases\nexport { ModelRegistry, getModelRegistry, resetModelRegistry, prewarmModelRegistry } from './model-registry.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["getPiAiModel","getPiAiProviders","getPiAiModels"],"sources":["../../../src/providers/index.ts"],"sourcesContent":["/**\n * Model provider module - integrates built-in models with custom models from models.json\n */\n\nimport {\n\tgetModel as getPiAiModel,\n\tgetModels as getPiAiModels,\n\tgetProviders as getPiAiProviders,\n\ttype Model,\n\ttype Api,\n} from '@earendil-works/pi-ai';\nimport type { Config } from '../config/schema.js';\nimport { getModelRegistry } from './model-registry.js';\nimport { CredentialResolver, resolveApiKey, hasCredentials } from '../auth/credentials.js';\nimport { hasProviderAuthOnDiskSync } from '../auth/sync-provider-auth.js';\nimport { getApiKeyFromEnv } from './env-keys.js';\nimport { getProviderRegistry } from './plugin-registry.js';\nimport type { ProviderModelDefinition } from '../extensions/types/providers.js';\n\nexport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from './env-keys.js';\n\n/** Sentinel base URL: model is served by an extension {@link ProviderPluginRegistry} provider. */\nexport const EXTENSION_PROVIDER_BASE_URL = 'extension://provider-plugin';\nconst OPENAI_CODEX_CANONICAL_BASE_URL = 'https://chatgpt.com/backend-api/codex';\n\nfunction normalizeProviderModel(model: Model<Api>): Model<Api> {\n\tif (model.provider === 'openai-codex' && model.api === 'openai-codex-responses') {\n\t\treturn { ...model, baseUrl: OPENAI_CODEX_CANONICAL_BASE_URL } as Model<Api>;\n\t}\n\treturn model;\n}\n\n/** Map a plugin registry model to the pi-ai {@link Model} shape. */\nexport function pluginModelToModel(providerId: string, definition: ProviderModelDefinition): Model<Api> {\n\treturn {\n\t\tprovider: providerId,\n\t\tid: definition.id,\n\t\tname: definition.name,\n\t\tapi: 'openai-completions' as Api,\n\t\tbaseUrl: EXTENSION_PROVIDER_BASE_URL,\n\t\treasoning: false,\n\t\tinput: definition.supportsImages ? (['text', 'image'] as ('text' | 'image')[]) : (['text'] as ('text' | 'image')[]),\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxOutputTokens ?? 4096,\n\t\tcost: {\n\t\t\tinput: definition.pricing?.input ?? 0,\n\t\t\toutput: definition.pricing?.output ?? 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t},\n\t} as Model<Api>;\n}\n\n/**\n * Get API key synchronously: checks registry (models.json) first, then environment variables.\n * Use this for Agent's getApiKey callback which must be synchronous.\n */\nexport function getApiKeySync(provider: string): string | undefined {\n const pluginRegistry = getProviderRegistry();\n if (pluginRegistry.has(provider)) return 'extension-managed';\n\n const registry = getModelRegistry();\n const registryKey = registry.getApiKey(provider);\n if (registryKey) {\n return registryKey;\n }\n return getApiKeyFromEnv(provider);\n}\n\n/**\n * Resolve model reference. Supports:\n * - \"provider/modelId\" format\n * - \"modelId\" auto-detection via pi-ai or custom models\n * @throws if model not found\n */\nexport function resolveModel(ref: string): Model<Api> {\n\t// First try ModelRegistry (includes custom models)\n\tconst registry = getModelRegistry();\n\tconst customModel = registry.resolve(ref);\n\tif (customModel) {\n\t\treturn customModel;\n\t}\n\n\tif (ref.includes('/')) {\n\t\tconst [provider, modelId] = ref.split('/');\n\t\tconst piAiModel = getPiAiModel(provider as any, modelId as any);\n\t\tif (piAiModel) return normalizeProviderModel(piAiModel as Model<Api>);\n\n\t\tconst pluginRegistry = getProviderRegistry();\n\t\tconst plugin = pluginRegistry.get(provider);\n\t\tif (plugin) {\n\t\t\tconst pluginModel = plugin.models.find(m => m.id === modelId);\n\t\t\tif (pluginModel) return pluginModelToModel(provider, pluginModel);\n\t\t}\n\t\tthrow new Error(`Model not found: ${ref}`);\n\t}\n\n\tfor (const provider of getPiAiProviders()) {\n\t\ttry {\n\t\t\tconst models = getPiAiModels(provider);\n\t\t\tconst found = models.find(m => m.id === ref);\n\t\t\tif (found) return normalizeProviderModel(found as Model<Api>);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tconst pluginRegistry = getProviderRegistry();\n\tfor (const plugin of pluginRegistry.listAll()) {\n\t\tconst found = plugin.models.find(m => m.id === ref);\n\t\tif (found) return pluginModelToModel(plugin.id, found);\n\t}\n\n\tthrow new Error(`Model not found: ${ref}. Use format: provider/model-id`);\n}\n\nexport function getModelsByProvider(provider: string): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst fromRegistry = registry.getAll().filter(m => m.provider === provider).map(normalizeProviderModel);\n\tconst plugin = getProviderRegistry().get(provider);\n\tif (!plugin) return fromRegistry;\n\tconst pluginModels = plugin.models.map(m => pluginModelToModel(provider, m));\n\treturn [...fromRegistry, ...pluginModels];\n}\n\nexport function getAllProviders(): string[] {\n\tconst registry = getModelRegistry();\n\tconst providers = new Set<string>();\n\n\t// Add built-in providers\n\tfor (const p of getPiAiProviders()) {\n\t\tproviders.add(p);\n\t}\n\n\t// Add custom providers from registry\n\tfor (const m of registry.getAll()) {\n\t\tproviders.add(m.provider);\n\t}\n\n\tfor (const plugin of getProviderRegistry().listAll()) {\n\t\tproviders.add(plugin.id);\n\t}\n\n\treturn Array.from(providers);\n}\n\nexport async function getApiKey(provider: string): Promise<string | undefined> {\n\tif (getProviderRegistry().has(provider)) return 'extension-managed';\n\n\t// Use new credential resolver first (checks: agent private > global > oauth > env)\n\tconst credentialKey = await resolveApiKey(provider);\n\tif (credentialKey) {\n\t\treturn credentialKey;\n\t}\n\n\t// Check registry for custom providers (from models.json)\n\tconst registry = getModelRegistry();\n\tconst registryKey = registry.getApiKey(provider);\n\tif (registryKey) {\n\t\treturn registryKey;\n\t}\n\n\t// Fallback to environment variables\n\treturn getApiKeyFromEnv(provider);\n}\n\n/**\n * Synchronous version for use in non-async contexts\n * Only checks environment variables and registry, not credential system\n */\nexport function isProviderConfiguredSync(provider: string): boolean {\n\tif (getProviderRegistry().has(provider)) return true;\n\n\t// Check registry for custom providers\n\tconst registry = getModelRegistry();\n\tif (registry.getApiKey(provider)) {\n\t\treturn true;\n\t}\n\t// Check environment variables\n\tif (getApiKeyFromEnv(provider)) {\n\t\treturn true;\n\t}\n\t// Gateway UI / CLI store keys in auth-profiles.json (async CredentialResolver); sync path for fallback list\n\treturn hasProviderAuthOnDiskSync(provider);\n}\n\nexport async function isProviderConfigured(provider: string): Promise<boolean> {\n if (getProviderRegistry().has(provider)) return true;\n\n // Check registry first for custom providers (from models.json)\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return true;\n }\n return await hasCredentials(provider);\n}\n\n/** Where runtime {@link getApiKey} resolves the key from (no secret values). */\nexport type ProviderActiveKeySource = 'none' | 'agent' | 'gateway' | 'oauth' | 'env' | 'models_json' | 'extension';\n\nexport type ProviderAuthMode = ProviderActiveKeySource;\nexport type ProviderAuthStatus = 'connected' | 'expired' | 'not_connected';\n\nexport interface ProviderAuthState {\n authMode: ProviderAuthMode;\n authStatus: ProviderAuthStatus;\n expiresAt?: number;\n}\n\nexport async function getProviderActiveKeySource(provider: string): Promise<ProviderActiveKeySource> {\n const authState = await getProviderAuthState(provider);\n return authState.authMode;\n}\n\nexport async function getProviderAuthState(provider: string): Promise<ProviderAuthState> {\n if (getProviderRegistry().has(provider)) {\n return { authMode: 'extension', authStatus: 'connected' };\n }\n\n const resolver = new CredentialResolver();\n const fromCredentials = await resolver.resolveApiKeySource(provider);\n if (fromCredentials === 'agent') return { authMode: 'agent', authStatus: 'connected' };\n if (fromCredentials === 'global') return { authMode: 'gateway', authStatus: 'connected' };\n if (fromCredentials === 'oauth') {\n const token = await resolver.loadOAuthTokenRecord(provider);\n const expired = Boolean(token?.expiresAt && token.expiresAt < Date.now());\n return {\n authMode: 'oauth',\n authStatus: expired ? 'expired' : 'connected',\n ...(token?.expiresAt ? { expiresAt: token.expiresAt } : {}),\n };\n }\n if (fromCredentials === 'env') return { authMode: 'env', authStatus: 'connected' };\n\n const expiredOAuthToken = await resolver.loadOAuthTokenRecord(provider);\n if (expiredOAuthToken?.expiresAt && expiredOAuthToken.expiresAt < Date.now()) {\n return {\n authMode: 'oauth',\n authStatus: 'expired',\n expiresAt: expiredOAuthToken.expiresAt,\n };\n }\n\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return { authMode: 'models_json', authStatus: 'connected' };\n }\n\n return { authMode: 'none', authStatus: 'not_connected' };\n}\n\nexport async function getConfiguredProviders(): Promise<string[]> {\n\tconst allProviders = getAllProviders();\n\tconst configured: string[] = [];\n\tfor (const p of allProviders) {\n\t\tif (await isProviderConfigured(p)) {\n\t\t\tconfigured.push(p);\n\t\t}\n\t}\n\treturn configured;\n}\n\nexport function getAllModels(): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst registryModels = registry.getAll().map(normalizeProviderModel);\n\tconst pluginProviders = getProviderRegistry().listAll();\n\tif (pluginProviders.length === 0) return registryModels;\n\n\tconst existingIds = new Set(registryModels.map(m => `${m.provider}/${m.id}`));\n\tconst merged: Model<Api>[] = [...registryModels];\n\tfor (const plugin of pluginProviders) {\n\t\tfor (const model of plugin.models) {\n\t\t\tconst compositeId = `${plugin.id}/${model.id}`;\n\t\t\tif (!existingIds.has(compositeId)) {\n\t\t\t\tmerged.push(pluginModelToModel(plugin.id, model));\n\t\t\t\texistingIds.add(compositeId);\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport async function getAvailableModels(): Promise<readonly Model<Api>[]> {\n\tconst allModels = getAllModels();\n\tconst pluginRegistry = getProviderRegistry();\n\tconst available: Model<Api>[] = [];\n\tconst configuredByProvider = new Map<string, boolean>();\n\n\tfor (const model of allModels) {\n\t\tif (pluginRegistry.has(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t\tcontinue;\n\t\t}\n\t\tlet configured = configuredByProvider.get(model.provider);\n\t\tif (configured === undefined) {\n\t\t\tconfigured = await isProviderConfigured(model.provider);\n\t\t\tconfiguredByProvider.set(model.provider, configured);\n\t\t}\n\t\tif (configured) {\n\t\t\tavailable.push(model);\n\t\t}\n\t}\n\treturn available;\n}\n\nexport type { Model, Api } from '@earendil-works/pi-ai';\n\nexport type ProviderCategory = 'common' | 'specialty' | 'oauth' | 'enterprise' | 'extension';\n\nexport interface ProviderMeta {\n name: string;\n category: ProviderCategory;\n supportsOAuth?: boolean;\n supportsApiKey?: boolean;\n}\n\nexport const PROVIDER_META: Record<string, ProviderMeta> = {\n 'openai': { name: 'OpenAI', category: 'common', supportsApiKey: true },\n 'anthropic': { name: 'Anthropic', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'deepseek': { name: 'DeepSeek', category: 'common', supportsApiKey: true },\n 'google': { name: 'Google AI', category: 'common', supportsApiKey: true },\n 'groq': { name: 'Groq', category: 'common', supportsApiKey: true },\n 'minimax': { name: 'MiniMax', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'minimax-cn': { name: 'MiniMax CN', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'kimi-coding': { name: 'Kimi For Coding', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'xai': { name: 'xAI', category: 'specialty', supportsApiKey: true },\n 'mistral': { name: 'Mistral AI', category: 'specialty', supportsApiKey: true },\n 'cerebras': { name: 'Cerebras', category: 'specialty', supportsApiKey: true },\n 'openrouter': { name: 'OpenRouter', category: 'specialty', supportsApiKey: true },\n 'huggingface': { name: 'Hugging Face', category: 'specialty', supportsApiKey: true },\n moonshotai: { name: 'Moonshot AI (Kimi · International)', category: 'common', supportsApiKey: true },\n 'moonshotai-cn': { name: 'Moonshot AI (Kimi · China)', category: 'common', supportsApiKey: true },\n fireworks: { name: 'Fireworks AI', category: 'specialty', supportsApiKey: true },\n together: { name: 'Together AI', category: 'specialty', supportsApiKey: true },\n 'cloudflare-workers-ai': { name: 'Cloudflare Workers AI', category: 'enterprise', supportsApiKey: true },\n 'cloudflare-ai-gateway': { name: 'Cloudflare AI Gateway', category: 'enterprise', supportsApiKey: true },\n xiaomi: { name: 'Xiaomi Mimo', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-cn': { name: 'Xiaomi Token Plan (CN)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-ams': { name: 'Xiaomi Token Plan (AMS)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-sgp': { name: 'Xiaomi Token Plan (SGP)', category: 'specialty', supportsApiKey: true },\n 'opencode': { name: 'OpenCode', category: 'specialty', supportsApiKey: true },\n 'opencode-go': { name: 'OpenCode Go', category: 'specialty', supportsApiKey: true },\n /** DashScope (Alibaba) — image, speech, STT; not an LLM KnownProvider. */\n 'dashscope': { name: 'DashScope (Alibaba)', category: 'specialty', supportsApiKey: true },\n /** International GLM (api.z.ai). Auth: API key (ZAI_API_KEY); no published OAuth for this HTTP API. */\n 'zai': { name: 'Zhipu GLM (International · z.ai)', category: 'common', supportsApiKey: true },\n 'amazon-bedrock': { name: 'Amazon Bedrock', category: 'enterprise', supportsApiKey: true },\n 'azure-openai-responses': { name: 'Azure OpenAI', category: 'enterprise', supportsApiKey: true },\n 'google-vertex': { name: 'Google Vertex AI', category: 'enterprise', supportsApiKey: true },\n 'vercel-ai-gateway': { name: 'Vercel AI Gateway', category: 'enterprise', supportsApiKey: true },\n 'github-copilot': { name: 'GitHub Copilot (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'openai-codex': { name: 'OpenAI Codex (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-gemini-cli': { name: 'Google Gemini CLI (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-antigravity': { name: 'Google Antigravity (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n};\n\nexport function getSortedProviders(): string[] {\n const all = getAllProviders();\n const catOrder: Record<ProviderCategory, number> = { common: 0, specialty: 1, enterprise: 2, oauth: 3, extension: 4 };\n const pluginRegistry = getProviderRegistry();\n\n return [...all].sort((a, b) => {\n const catA = pluginRegistry.has(a) ? 'extension' : (PROVIDER_META[a]?.category ?? 'specialty');\n const catB = pluginRegistry.has(b) ? 'extension' : (PROVIDER_META[b]?.category ?? 'specialty');\n if (catOrder[catA] !== catOrder[catB]) {\n return catOrder[catA] - catOrder[catB];\n }\n return a.localeCompare(b);\n });\n}\n\nexport function getProviderDisplayName(provider: string): string {\n const plugin = getProviderRegistry().get(provider);\n if (plugin) return plugin.name;\n return PROVIDER_META[provider]?.name || provider;\n}\n\nexport function providerSupportsOAuth(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsOAuth ?? false;\n}\n\nexport function providerSupportsApiKey(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsApiKey ?? true;\n}\n\n// ============================================\n// Dynamic Default Model Resolution\n// ============================================\n\n/** Preferred default model when no explicit model is configured. */\nconst DEFAULT_FALLBACK_MODEL = 'openai/gpt-5.5';\n\n/**\n * Get a default model reference.\n * Priority:\n * 1. Explicitly configured model in agents.defaults.models.chat (if set and available)\n * 2. Default fallback: openai/gpt-5.5\n */\nexport async function getDefaultModel(config?: Config | null | undefined): Promise<string> {\n const defaultModel = config?.agents?.defaults?.models?.chat;\n if (defaultModel) {\n const modelRef = defaultModel.primary;\n if (modelRef) {\n const availableModels = await getAvailableModels();\n const configured = availableModels.find(m => \n `${m.provider}/${m.id}` === modelRef ||\n m.id === modelRef\n );\n if (configured) {\n return `${configured.provider}/${configured.id}`;\n }\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n/**\n * Synchronous default model resolution for constructors and sync code paths.\n * Uses catalog/registry only (no async credential checks).\n *\n * When no model is explicitly configured, returns the preferred default\n * (`openai/gpt-5.5`) rather than picking an arbitrary first model from the\n * full catalog.\n */\nexport function getDefaultModelSync(config?: Config | null | undefined): string {\n const defaultModel = config?.agents?.defaults?.models?.chat;\n if (defaultModel) {\n const modelRef = defaultModel.primary;\n if (modelRef) {\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n// Re-export ModelRegistry for advanced use cases\nexport { ModelRegistry, getModelRegistry, resetModelRegistry, prewarmModelRegistry } from './model-registry.js';\n"],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Combines binding rules, identity links, and config to pick an agent and session keys.
|
|
5
5
|
*/
|
|
6
|
-
import type { LocalizedText } from '../config/localized-text.js';
|
|
7
6
|
import type { BindingRule, RouteInput, RouteResult } from './bindings.js';
|
|
8
7
|
/**
|
|
9
8
|
* Route context type (alias for RouteInput)
|
|
@@ -53,8 +52,6 @@ export interface AgentConfig {
|
|
|
53
52
|
/** Registered agents */
|
|
54
53
|
list?: Array<{
|
|
55
54
|
id: string;
|
|
56
|
-
name?: LocalizedText;
|
|
57
|
-
description?: LocalizedText;
|
|
58
55
|
enabled?: boolean;
|
|
59
56
|
[key: string]: unknown;
|
|
60
57
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { LocalizedText } from '../config/localized-text.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport {\n buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n} from './agent-session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n scope?: 'per-sender' | 'global';\n mainKey?: string;\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n resetTriggers?: string[];\n idleMinutes?: number;\n reset?: {\n mode?: 'daily' | 'idle';\n atHour?: number;\n idleMinutes?: number;\n };\n resetByType?: {\n direct?: SessionConfig['reset'];\n group?: SessionConfig['reset'];\n thread?: SessionConfig['reset'];\n };\n resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n name?: LocalizedText;\n description?: LocalizedText;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null,\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n dmScope: peerKind === 'dm' || peerKind === 'direct' ? 'per-account-channel-peer' : undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'main';\n\n let sessionKey: string;\n let mainSessionKey: string;\n\n const identityLinks = config.session?.identityLinks;\n const mainKey = undefined;\n\n if (peerKind === 'dm' || peerKind === 'direct') {\n mainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });\n\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: 'direct',\n peerId,\n identityLinks,\n dmScope,\n });\n } else {\n const mappedKind = peerKind === 'group' || peerKind === 'channel' ? peerKind : peerKind;\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId,\n identityLinks,\n });\n mainSessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId: 'main',\n identityLinks,\n });\n }\n\n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport {\n buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n} from './agent-session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n scope?: 'per-sender' | 'global';\n mainKey?: string;\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n resetTriggers?: string[];\n idleMinutes?: number;\n reset?: {\n mode?: 'daily' | 'idle';\n atHour?: number;\n idleMinutes?: number;\n };\n resetByType?: {\n direct?: SessionConfig['reset'];\n group?: SessionConfig['reset'];\n thread?: SessionConfig['reset'];\n };\n resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null,\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n dmScope: peerKind === 'dm' || peerKind === 'direct' ? 'per-account-channel-peer' : undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'main';\n\n let sessionKey: string;\n let mainSessionKey: string;\n\n const identityLinks = config.session?.identityLinks;\n const mainKey = undefined;\n\n if (peerKind === 'dm' || peerKind === 'direct') {\n mainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });\n\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: 'direct',\n peerId,\n identityLinks,\n dmScope,\n });\n } else {\n const mappedKind = peerKind === 'group' || peerKind === 'channel' ? peerKind : peerKind;\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId,\n identityLinks,\n });\n mainSessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId: 'main',\n identityLinks,\n });\n }\n\n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
|
|
@@ -12,11 +12,13 @@ export declare function resolveInitialTuiAgentId(params: {
|
|
|
12
12
|
initialSessionInput?: string;
|
|
13
13
|
cwd?: string;
|
|
14
14
|
}): string;
|
|
15
|
+
export declare function createDefaultTuiSessionKeySuffix(): string;
|
|
15
16
|
/** Resolve TUI startup session key from CLI options and config. */
|
|
16
17
|
export declare function resolveTuiStartupSessionKey(params: {
|
|
17
18
|
cfg: Config;
|
|
18
19
|
sessionOption?: string;
|
|
19
20
|
cwd?: string;
|
|
21
|
+
createSessionKeySuffix?: () => string;
|
|
20
22
|
}): {
|
|
21
23
|
sessionKey: string;
|
|
22
24
|
agentId: string;
|
|
@@ -2,6 +2,7 @@ import { init_agent_scope, resolveAgentIdByWorkspacePath, resolveDefaultAgentId
|
|
|
2
2
|
import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
|
|
3
3
|
import { parseAgentSessionKey } from "./session-key-utils.js";
|
|
4
4
|
import { buildAgentMainSessionKey, init_agent_session_key, normalizeAgentId, normalizeMainKey } from "./agent-session-key.js";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
5
6
|
//#region src/routing/resolve-tui-session-key.ts
|
|
6
7
|
init_agent_scope();
|
|
7
8
|
init_agent_session_key();
|
|
@@ -26,19 +27,23 @@ function resolveInitialTuiAgentId(params) {
|
|
|
26
27
|
if (inferredFromWorkspace) return inferredFromWorkspace;
|
|
27
28
|
return normalizeAgentId(params.fallbackAgentId);
|
|
28
29
|
}
|
|
30
|
+
function createDefaultTuiSessionKeySuffix() {
|
|
31
|
+
return `tui-${randomUUID()}`;
|
|
32
|
+
}
|
|
29
33
|
/** Resolve TUI startup session key from CLI options and config. */
|
|
30
34
|
function resolveTuiStartupSessionKey(params) {
|
|
31
35
|
const sessionScope = params.cfg.session?.scope ?? "per-sender";
|
|
32
36
|
const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);
|
|
37
|
+
const sessionOption = (params.sessionOption ?? "").trim();
|
|
33
38
|
const agentId = resolveInitialTuiAgentId({
|
|
34
39
|
cfg: params.cfg,
|
|
35
40
|
fallbackAgentId: resolveDefaultAgentId(params.cfg),
|
|
36
|
-
initialSessionInput:
|
|
41
|
+
initialSessionInput: sessionOption,
|
|
37
42
|
cwd: params.cwd ?? process.cwd()
|
|
38
43
|
});
|
|
39
44
|
return {
|
|
40
45
|
sessionKey: resolveTuiSessionKey({
|
|
41
|
-
raw: params.
|
|
46
|
+
raw: sessionOption || (params.createSessionKeySuffix ?? createDefaultTuiSessionKeySuffix)(),
|
|
42
47
|
sessionScope,
|
|
43
48
|
currentAgentId: agentId,
|
|
44
49
|
sessionMainKey
|
|
@@ -49,6 +54,6 @@ function resolveTuiStartupSessionKey(params) {
|
|
|
49
54
|
};
|
|
50
55
|
}
|
|
51
56
|
//#endregion
|
|
52
|
-
export { resolveInitialTuiAgentId, resolveTuiSessionKey, resolveTuiStartupSessionKey };
|
|
57
|
+
export { createDefaultTuiSessionKeySuffix, resolveInitialTuiAgentId, resolveTuiSessionKey, resolveTuiStartupSessionKey };
|
|
53
58
|
|
|
54
59
|
//# sourceMappingURL=resolve-tui-session-key.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-tui-session-key.js","names":[],"sources":["../../../src/routing/resolve-tui-session-key.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport {\n resolveAgentIdByWorkspacePath,\n resolveDefaultAgentId,\n} from '../agent/agent-scope.js';\nimport {\n buildAgentMainSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n parseAgentSessionKey,\n} from './agent-session-key.js';\nimport { normalizeLowercaseStringOrEmpty } from '../utils/string-coerce.js';\n\nexport type SessionScope = 'per-sender' | 'global';\n\nexport function resolveTuiSessionKey(params: {\n raw?: string;\n sessionScope: SessionScope;\n currentAgentId: string;\n sessionMainKey: string;\n}): string {\n const trimmed = (params.raw ?? '').trim();\n if (!trimmed) {\n if (params.sessionScope === 'global') {\n return 'global';\n }\n return buildAgentMainSessionKey({\n agentId: params.currentAgentId,\n mainKey: params.sessionMainKey,\n });\n }\n if (trimmed === 'global' || trimmed === 'unknown') {\n return trimmed;\n }\n if (trimmed.startsWith('agent:')) {\n return normalizeLowercaseStringOrEmpty(trimmed);\n }\n return `agent:${params.currentAgentId}:${normalizeLowercaseStringOrEmpty(trimmed)}`;\n}\n\nexport function resolveInitialTuiAgentId(params: {\n cfg: Config;\n fallbackAgentId: string;\n initialSessionInput?: string;\n cwd?: string;\n}): string {\n const parsed = parseAgentSessionKey((params.initialSessionInput ?? '').trim());\n if (parsed?.agentId) {\n return normalizeAgentId(parsed.agentId);\n }\n\n const inferredFromWorkspace = resolveAgentIdByWorkspacePath(\n params.cfg,\n params.cwd ?? process.cwd(),\n );\n if (inferredFromWorkspace) {\n return inferredFromWorkspace;\n }\n\n return normalizeAgentId(params.fallbackAgentId);\n}\n\n/** Resolve TUI startup session key from CLI options and config. */\nexport function resolveTuiStartupSessionKey(params: {\n cfg: Config;\n sessionOption?: string;\n cwd?: string;\n}): { sessionKey: string; agentId: string; sessionScope: SessionScope; sessionMainKey: string } {\n const sessionScope = (params.cfg.session?.scope ?? 'per-sender') as SessionScope;\n const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);\n const agentId = resolveInitialTuiAgentId({\n cfg: params.cfg,\n fallbackAgentId: resolveDefaultAgentId(params.cfg),\n initialSessionInput:
|
|
1
|
+
{"version":3,"file":"resolve-tui-session-key.js","names":[],"sources":["../../../src/routing/resolve-tui-session-key.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { Config } from '../config/schema.js';\nimport {\n resolveAgentIdByWorkspacePath,\n resolveDefaultAgentId,\n} from '../agent/agent-scope.js';\nimport {\n buildAgentMainSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n parseAgentSessionKey,\n} from './agent-session-key.js';\nimport { normalizeLowercaseStringOrEmpty } from '../utils/string-coerce.js';\n\nexport type SessionScope = 'per-sender' | 'global';\n\nexport function resolveTuiSessionKey(params: {\n raw?: string;\n sessionScope: SessionScope;\n currentAgentId: string;\n sessionMainKey: string;\n}): string {\n const trimmed = (params.raw ?? '').trim();\n if (!trimmed) {\n if (params.sessionScope === 'global') {\n return 'global';\n }\n return buildAgentMainSessionKey({\n agentId: params.currentAgentId,\n mainKey: params.sessionMainKey,\n });\n }\n if (trimmed === 'global' || trimmed === 'unknown') {\n return trimmed;\n }\n if (trimmed.startsWith('agent:')) {\n return normalizeLowercaseStringOrEmpty(trimmed);\n }\n return `agent:${params.currentAgentId}:${normalizeLowercaseStringOrEmpty(trimmed)}`;\n}\n\nexport function resolveInitialTuiAgentId(params: {\n cfg: Config;\n fallbackAgentId: string;\n initialSessionInput?: string;\n cwd?: string;\n}): string {\n const parsed = parseAgentSessionKey((params.initialSessionInput ?? '').trim());\n if (parsed?.agentId) {\n return normalizeAgentId(parsed.agentId);\n }\n\n const inferredFromWorkspace = resolveAgentIdByWorkspacePath(\n params.cfg,\n params.cwd ?? process.cwd(),\n );\n if (inferredFromWorkspace) {\n return inferredFromWorkspace;\n }\n\n return normalizeAgentId(params.fallbackAgentId);\n}\n\nexport function createDefaultTuiSessionKeySuffix(): string {\n return `tui-${randomUUID()}`;\n}\n\n/** Resolve TUI startup session key from CLI options and config. */\nexport function resolveTuiStartupSessionKey(params: {\n cfg: Config;\n sessionOption?: string;\n cwd?: string;\n createSessionKeySuffix?: () => string;\n}): { sessionKey: string; agentId: string; sessionScope: SessionScope; sessionMainKey: string } {\n const sessionScope = (params.cfg.session?.scope ?? 'per-sender') as SessionScope;\n const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);\n const sessionOption = (params.sessionOption ?? '').trim();\n const agentId = resolveInitialTuiAgentId({\n cfg: params.cfg,\n fallbackAgentId: resolveDefaultAgentId(params.cfg),\n initialSessionInput: sessionOption,\n cwd: params.cwd ?? process.cwd(),\n });\n const sessionKey = resolveTuiSessionKey({\n raw: sessionOption || (params.createSessionKeySuffix ?? createDefaultTuiSessionKeySuffix)(),\n sessionScope,\n currentAgentId: agentId,\n sessionMainKey,\n });\n return { sessionKey, agentId, sessionScope, sessionMainKey };\n}\n"],"mappings":";;;;;;kBAMiC;wBAMD;oBAC4C;AAI5E,SAAgB,qBAAqB,QAK1B;CACT,MAAM,WAAW,OAAO,OAAO,IAAI,MAAM;AACzC,KAAI,CAAC,SAAS;AACZ,MAAI,OAAO,iBAAiB,SAC1B,QAAO;AAET,SAAO,yBAAyB;GAC9B,SAAS,OAAO;GAChB,SAAS,OAAO;GACjB,CAAC;;AAEJ,KAAI,YAAY,YAAY,YAAY,UACtC,QAAO;AAET,KAAI,QAAQ,WAAW,SAAS,CAC9B,QAAO,gCAAgC,QAAQ;AAEjD,QAAO,SAAS,OAAO,eAAe,GAAG,gCAAgC,QAAQ;;AAGnF,SAAgB,yBAAyB,QAK9B;CACT,MAAM,SAAS,sBAAsB,OAAO,uBAAuB,IAAI,MAAM,CAAC;AAC9E,KAAI,QAAQ,QACV,QAAO,iBAAiB,OAAO,QAAQ;CAGzC,MAAM,wBAAwB,8BAC5B,OAAO,KACP,OAAO,OAAO,QAAQ,KAAK,CAC5B;AACD,KAAI,sBACF,QAAO;AAGT,QAAO,iBAAiB,OAAO,gBAAgB;;AAGjD,SAAgB,mCAA2C;AACzD,QAAO,OAAO,YAAY;;;AAI5B,SAAgB,4BAA4B,QAKoD;CAC9F,MAAM,eAAgB,OAAO,IAAI,SAAS,SAAS;CACnD,MAAM,iBAAiB,iBAAiB,OAAO,IAAI,SAAS,QAAQ;CACpE,MAAM,iBAAiB,OAAO,iBAAiB,IAAI,MAAM;CACzD,MAAM,UAAU,yBAAyB;EACvC,KAAK,OAAO;EACZ,iBAAiB,sBAAsB,OAAO,IAAI;EAClD,qBAAqB;EACrB,KAAK,OAAO,OAAO,QAAQ,KAAK;EACjC,CAAC;AAOF,QAAO;EAAE,YANU,qBAAqB;GACtC,KAAK,kBAAkB,OAAO,0BAA0B,mCAAmC;GAC3F;GACA,gBAAgB;GAChB;GACD,CACkB;EAAE;EAAS;EAAc;EAAgB"}
|
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
import type { Message } from './types.js';
|
|
2
|
+
import type { TranscriptStoredRow } from './session-context-for-llm.js';
|
|
2
3
|
/** Transcript row for TUI and HTTP clients (flattened from persisted session messages). */
|
|
3
4
|
export interface ClientHistoryMessage {
|
|
5
|
+
id?: string;
|
|
4
6
|
role: 'user' | 'assistant' | 'system';
|
|
5
7
|
content: string;
|
|
8
|
+
rawContent?: string | unknown[];
|
|
6
9
|
timestamp?: number;
|
|
10
|
+
kind?: 'message' | 'compaction' | 'context' | 'bash' | 'custom' | 'branch';
|
|
11
|
+
tokensBefore?: number;
|
|
12
|
+
tokensAfter?: number;
|
|
13
|
+
bash?: {
|
|
14
|
+
command: string;
|
|
15
|
+
output?: string;
|
|
16
|
+
exitCode?: number | null;
|
|
17
|
+
signal?: string | null;
|
|
18
|
+
excludeFromContext?: boolean;
|
|
19
|
+
truncated?: boolean;
|
|
20
|
+
fullOutputPath?: string;
|
|
21
|
+
};
|
|
22
|
+
custom?: {
|
|
23
|
+
customType: string;
|
|
24
|
+
details?: unknown;
|
|
25
|
+
state?: boolean;
|
|
26
|
+
display?: boolean;
|
|
27
|
+
};
|
|
28
|
+
branch?: {
|
|
29
|
+
summary: string;
|
|
30
|
+
fromId?: string;
|
|
31
|
+
};
|
|
7
32
|
toolCalls?: Array<{
|
|
8
33
|
name: string;
|
|
9
34
|
args?: unknown;
|
|
@@ -19,3 +44,10 @@ export declare function flattenMessageContent(content: string | unknown[]): stri
|
|
|
19
44
|
export declare function messagesToClientHistory(messages: Message[], opts?: {
|
|
20
45
|
limit?: number;
|
|
21
46
|
}): ClientHistoryMessage[];
|
|
47
|
+
/**
|
|
48
|
+
* Maps persisted transcript rows into linear chat history, preserving non-LLM
|
|
49
|
+
* audit rows that the TUI can render as dedicated components.
|
|
50
|
+
*/
|
|
51
|
+
export declare function transcriptRowsToClientHistory(rows: TranscriptStoredRow[], opts?: {
|
|
52
|
+
limit?: number;
|
|
53
|
+
}): ClientHistoryMessage[];
|