@xopcai/xopc 0.0.102 → 0.0.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/README.zh-CN.md +8 -5
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +2 -2
- package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/src/send-options.js +8 -5
- package/dist/extensions/telegram/src/send-options.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
- package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
- package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
- package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +35 -18
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +27 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -5
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/send-media.js +1 -2
- package/dist/src/agent/tools/send-media.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.d.ts +7 -0
- package/dist/src/auth/credentials.js +45 -7
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/auth/index.d.ts +1 -1
- package/dist/src/auth/index.js.map +1 -1
- package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
- package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
- package/dist/src/auth/oauth/google-antigravity.js +1 -1
- package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
- package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
- package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
- package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
- package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
- package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
- package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
- package/dist/src/auth/oauth/index.js +2 -2
- package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
- package/dist/src/auth/oauth/kimi-coding.js +1 -1
- package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/src/auth/oauth/minimax-cn.js +1 -1
- package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
- package/dist/src/auth/oauth/minimax.js +1 -1
- package/dist/src/auth/oauth/minimax.js.map +1 -1
- package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
- package/dist/src/auth/oauth/openai-codex.js +318 -1
- package/dist/src/auth/oauth/openai-codex.js.map +1 -0
- package/dist/src/auth/profiles/store.js +3 -2
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
- package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
- package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +2 -2
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +40 -52
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +192 -54
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.d.ts +1 -4
- package/dist/src/cli/commands/onboard/model.js +257 -184
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/cli/utils/oauth-login.d.ts +17 -0
- package/dist/src/cli/utils/oauth-login.js +93 -0
- package/dist/src/cli/utils/oauth-login.js.map +1 -0
- package/dist/src/cli/utils/oauth-providers.js +2 -2
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +2 -2
- package/dist/src/gateway/hono/oauth.js +2 -2
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +25 -5
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +73 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/media/store.js +3 -0
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +4 -4
- package/dist/src/providers/index.js +41 -22
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/presentation.d.ts +34 -0
- package/dist/src/providers/presentation.js +162 -0
- package/dist/src/providers/presentation.js.map +1 -0
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +21 -15
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
- package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
- package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
- package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
- package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
- package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
- package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
- package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
- /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/auth/oauth/
|
|
1
|
+
//#region src/auth/oauth/google-oauth/pkce.ts
|
|
2
2
|
/**
|
|
3
3
|
* PKCE utilities using Web Crypto API.
|
|
4
4
|
* Works in both Node.js 20+ and browsers.
|
|
@@ -13,7 +13,7 @@ function base64urlEncode(bytes) {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Generate PKCE code verifier and challenge.
|
|
16
|
-
* Uses Web Crypto API
|
|
16
|
+
* Uses Web Crypto API.
|
|
17
17
|
*/
|
|
18
18
|
async function generatePKCE() {
|
|
19
19
|
const verifierBytes = new Uint8Array(32);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","names":[],"sources":["../../../../../src/auth/oauth/google-oauth/pkce.ts"],"sourcesContent":["/**\n * PKCE utilities using Web Crypto API.\n * Works in both Node.js 20+ and browsers.\n */\n\n/**\n * Encode bytes as base64url string.\n */\nfunction base64urlEncode(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (const byte of bytes) {\n\t\tbinary += String.fromCharCode(byte);\n\t}\n\treturn btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\n/**\n * Generate PKCE code verifier and challenge.\n * Uses Web Crypto API.\n */\nexport async function generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n\t// Generate random verifier\n\tconst verifierBytes = new Uint8Array(32);\n\tcrypto.getRandomValues(verifierBytes);\n\tconst verifier = base64urlEncode(verifierBytes);\n\n\t// Compute SHA-256 challenge\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n\tconst challenge = base64urlEncode(new Uint8Array(hashBuffer));\n\n\treturn { verifier, challenge };\n}\n"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,OAA2B;CACnD,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,MAClB,WAAU,OAAO,aAAa,KAAK;AAEpC,QAAO,KAAK,OAAO,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG;;;;;;AAO9E,eAAsB,eAAiE;CAEtF,MAAM,gBAAgB,IAAI,WAAW,GAAG;AACxC,QAAO,gBAAgB,cAAc;CACrC,MAAM,WAAW,gBAAgB,cAAc;CAI/C,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAG9D,QAAO;EAAE;EAAU,WAFD,gBAAgB,IAAI,WAAW,WAAW,CAEhC;EAAE"}
|
|
@@ -3,9 +3,9 @@ import { minimaxOAuthProvider } from "./minimax.js";
|
|
|
3
3
|
import { minimaxCnOAuthProvider } from "./minimax-cn.js";
|
|
4
4
|
import { kimiCodingOAuthProvider } from "./kimi-coding.js";
|
|
5
5
|
import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken } from "./github-copilot.js";
|
|
6
|
-
import { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./
|
|
6
|
+
import { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./google-oauth/google-gemini-cli.js";
|
|
7
7
|
import "./google-gemini-cli.js";
|
|
8
|
-
import { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./
|
|
8
|
+
import { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./google-oauth/google-antigravity.js";
|
|
9
9
|
import "./google-antigravity.js";
|
|
10
10
|
import { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
|
|
11
11
|
export { anthropicOAuthProvider, getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginGitHubCopilot, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, normalizeDomain, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGitHubCopilotToken, refreshGoogleCloudToken, refreshOpenAICodexToken };
|
|
@@ -6,7 +6,7 @@ const KIMI_OAUTH_CLIENT_ID = "17e5f671-d194-4dfb-9706-5516cb48c098";
|
|
|
6
6
|
const kimiCodingOAuthProvider = {
|
|
7
7
|
id: "kimi-coding",
|
|
8
8
|
name: "Kimi For Coding (月之暗面)",
|
|
9
|
-
usesCallbackServer:
|
|
9
|
+
usesCallbackServer: false,
|
|
10
10
|
async login(callbacks) {
|
|
11
11
|
const deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {
|
|
12
12
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kimi-coding.js","names":[],"sources":["../../../../src/auth/oauth/kimi-coding.ts"],"sourcesContent":["/**\n * Kimi Coding (Moonshot AI) OAuth
|
|
1
|
+
{"version":3,"file":"kimi-coding.js","names":[],"sources":["../../../../src/auth/oauth/kimi-coding.ts"],"sourcesContent":["/**\n * Kimi Coding (Moonshot AI) OAuth device code flow.\n * @see https://auth.kimi.com\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst KIMI_OAUTH_BASE_URL = 'https://auth.kimi.com';\nconst KIMI_OAUTH_DEVICE_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/device_authorization`;\nconst KIMI_OAUTH_TOKEN_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/token`;\nconst KIMI_OAUTH_CLIENT_ID = '17e5f671-d194-4dfb-9706-5516cb48c098';\n\nexport const kimiCodingOAuthProvider: OAuthProviderInterface = {\n\tid: 'kimi-coding',\n\tname: 'Kimi For Coding (月之暗面)',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\tconst deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\tscope: 'kimi-code',\n\t\t\t}),\n\t\t});\n\n\t\tif (!deviceResponse.ok) {\n\t\t\tconst error = await deviceResponse.text();\n\t\t\tthrow new Error(`Device code request failed: ${error}`);\n\t\t}\n\n\t\tconst deviceData = (await deviceResponse.json()) as {\n\t\t\tdevice_code: string;\n\t\t\tuser_code: string;\n\t\t\tverification_uri: string;\n\t\t\tverification_uri_complete: string;\n\t\t\tinterval: number;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\tcallbacks.onAuth({\n\t\t\turl: deviceData.verification_uri_complete || deviceData.verification_uri,\n\t\t\tinstructions: `Please visit ${deviceData.verification_uri} and enter code: ${deviceData.user_code}`,\n\t\t});\n\n\t\tconst expiresAt = Date.now() + deviceData.expires_in * 1000;\n\t\tconst pollInterval = (deviceData.interval || 5) * 1000;\n\n\t\twhile (Date.now() < expiresAt) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n\t\t\tconst tokenResponse = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t\t},\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tgrant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n\t\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\t\tdevice_code: deviceData.device_code,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (tokenResponse.ok) {\n\t\t\t\tconst tokenData = (await tokenResponse.json()) as {\n\t\t\t\t\taccess_token: string;\n\t\t\t\t\trefresh_token: string;\n\t\t\t\t\texpires_in: number;\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\taccess: tokenData.access_token,\n\t\t\t\t\trefresh: tokenData.refresh_token,\n\t\t\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst errorData = (await tokenResponse.json()) as { error?: string };\n\t\t\tif (errorData.error === 'expired_token') {\n\t\t\t\tthrow new Error('Device code expired. Please try again.');\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error('Device code expired. Please try again.');\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('Kimi OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`Kimi OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = (await response.json()) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n"],"mappings":";AAOA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB,GAAG,oBAAoB;AACrD,MAAM,uBAAuB,GAAG,oBAAoB;AACpD,MAAM,uBAAuB;AAE7B,MAAa,0BAAkD;CAC9D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EACtE,MAAM,iBAAiB,MAAM,MAAM,uBAAuB;GACzD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,WAAW;IACX,OAAO;IACP,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,eAAe,IAAI;GACvB,MAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,SAAM,IAAI,MAAM,+BAA+B,QAAQ;;EAGxD,MAAM,aAAc,MAAM,eAAe,MAAM;AAS/C,YAAU,OAAO;GAChB,KAAK,WAAW,6BAA6B,WAAW;GACxD,cAAc,gBAAgB,WAAW,iBAAiB,mBAAmB,WAAW;GACxF,CAAC;EAEF,MAAM,YAAY,KAAK,KAAK,GAAG,WAAW,aAAa;EACvD,MAAM,gBAAgB,WAAW,YAAY,KAAK;AAElD,SAAO,KAAK,KAAK,GAAG,WAAW;AAC9B,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,aAAa,CAAC;GAEjE,MAAM,gBAAgB,MAAM,MAAM,sBAAsB;IACvD,QAAQ;IACR,SAAS,EACR,gBAAgB,qCAChB;IACD,MAAM,IAAI,gBAAgB;KACzB,YAAY;KACZ,WAAW;KACX,aAAa,WAAW;KACxB,CAAC;IACF,CAAC;AAEF,OAAI,cAAc,IAAI;IACrB,MAAM,YAAa,MAAM,cAAc,MAAM;AAM7C,WAAO;KACN,QAAQ,UAAU;KAClB,SAAS,UAAU;KACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;KAC7C;;AAIF,QAAI,MADqB,cAAc,MAAM,EAC/B,UAAU,gBACvB,OAAM,IAAI,MAAM,yCAAyC;;AAI3D,QAAM,IAAI,MAAM,yCAAyC;;CAG1D,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,qDAAqD;EAGtE,MAAM,WAAW,MAAM,MAAM,sBAAsB;GAClD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,8BAA8B,OAAO;;EAGtD,MAAM,UAAW,MAAM,SAAS,MAAM;AAMtC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB"}
|
|
@@ -6,7 +6,7 @@ const MINIMAX_CN_OAUTH_CLIENT_ID = "your_client_id";
|
|
|
6
6
|
const minimaxCnOAuthProvider = {
|
|
7
7
|
id: "minimax-cn",
|
|
8
8
|
name: "MiniMax 国内版",
|
|
9
|
-
usesCallbackServer:
|
|
9
|
+
usesCallbackServer: false,
|
|
10
10
|
async login(callbacks) {
|
|
11
11
|
const codeVerifier = generateCodeVerifier();
|
|
12
12
|
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimax-cn.js","names":[],"sources":["../../../../src/auth/oauth/minimax-cn.ts"],"sourcesContent":["/**\n * MiniMax CN (China region) OAuth provider\n *\n * OAuth 2.0 for the MiniMax China platform: https://platform.minimax.chat/\n *\n * Endpoints differ from the international product:\n * - International: platform.minimaxi.com\n * - China: platform.minimax.chat\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_CN_OAUTH_BASE_URL = 'https://platform.minimax.chat';\nconst MINIMAX_CN_OAUTH_AUTHORIZE_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_CN_OAUTH_TOKEN_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_CN_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxCnOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax-cn',\n\tname: 'MiniMax 国内版',\n\tusesCallbackServer:
|
|
1
|
+
{"version":3,"file":"minimax-cn.js","names":[],"sources":["../../../../src/auth/oauth/minimax-cn.ts"],"sourcesContent":["/**\n * MiniMax CN (China region) OAuth provider\n *\n * OAuth 2.0 for the MiniMax China platform: https://platform.minimax.chat/\n *\n * Endpoints differ from the international product:\n * - International: platform.minimaxi.com\n * - China: platform.minimax.chat\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_CN_OAUTH_BASE_URL = 'https://platform.minimax.chat';\nconst MINIMAX_CN_OAUTH_AUTHORIZE_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_CN_OAUTH_TOKEN_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_CN_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxCnOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax-cn',\n\tname: 'MiniMax 国内版',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax CN uses authorization code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_CN_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_CN_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: '请在浏览器中授权应用,然后输入返回的授权码。',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: '请输入授权码:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax CN OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax CN OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AAYA,MAAM,4BAA4B;AAClC,MAAM,iCAAiC,GAAG,0BAA0B;AACpE,MAAM,6BAA6B,GAAG,0BAA0B;AAChE,MAAM,6BAA6B;AAEnC,MAAa,yBAAiD;CAC7D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAEtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,+BAA+B;AACvD,UAAQ,aAAa,IAAI,aAAa,2BAA2B;AACjE,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,WACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,4BAA4B;GAC7D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,2DAA2D;EAG5E,MAAM,WAAW,MAAM,MAAM,4BAA4B;GACxD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,oCAAoC,OAAO;;EAG5D,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
|
|
@@ -6,7 +6,7 @@ const MINIMAX_OAUTH_CLIENT_ID = "your_client_id";
|
|
|
6
6
|
const minimaxOAuthProvider = {
|
|
7
7
|
id: "minimax",
|
|
8
8
|
name: "MiniMax",
|
|
9
|
-
usesCallbackServer:
|
|
9
|
+
usesCallbackServer: false,
|
|
10
10
|
async login(callbacks) {
|
|
11
11
|
const codeVerifier = generateCodeVerifier();
|
|
12
12
|
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimax.js","names":[],"sources":["../../../../src/auth/oauth/minimax.ts"],"sourcesContent":["/**\n * MiniMax OAuth Provider\n * \n * OAuth 2.0 authentication for MiniMax Platform.\n * https://platform.minimaxi.com/\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_OAUTH_BASE_URL = 'https://platform.minimaxi.com';\nconst MINIMAX_OAUTH_AUTHORIZE_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_OAUTH_TOKEN_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax',\n\tname: 'MiniMax',\n\tusesCallbackServer:
|
|
1
|
+
{"version":3,"file":"minimax.js","names":[],"sources":["../../../../src/auth/oauth/minimax.ts"],"sourcesContent":["/**\n * MiniMax OAuth Provider\n * \n * OAuth 2.0 authentication for MiniMax Platform.\n * https://platform.minimaxi.com/\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_OAUTH_BASE_URL = 'https://platform.minimaxi.com';\nconst MINIMAX_OAUTH_AUTHORIZE_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_OAUTH_TOKEN_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax',\n\tname: 'MiniMax',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax uses authorization code flow\n\t\t// First, generate a device code or authorization URL\n\t\t\n\t\t// For simplicity, we'll use a manual code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: 'Please authorize the application and enter the code shown.',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: 'Enter the authorization code:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AASA,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B,GAAG,uBAAuB;AAC9D,MAAM,0BAA0B,GAAG,uBAAuB;AAC1D,MAAM,0BAA0B;AAEhC,MAAa,uBAA+C;CAC3D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAKtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,4BAA4B;AACpD,UAAQ,aAAa,IAAI,aAAa,wBAAwB;AAC9D,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,iCACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,yBAAyB;GAC1D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,wDAAwD;EAGzE,MAAM,WAAW,MAAM,MAAM,yBAAyB;GACrD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,iCAAiC,OAAO;;EAGzD,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenAI Codex (ChatGPT) OAuth
|
|
2
|
+
* OpenAI Codex (ChatGPT) OAuth.
|
|
3
|
+
*
|
|
4
|
+
* Owns callback validation, manual prompt handling, and success/error pages.
|
|
3
5
|
*/
|
|
4
|
-
|
|
6
|
+
import type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';
|
|
7
|
+
export declare function loginOpenAICodex(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
|
|
8
|
+
export declare function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials>;
|
|
9
|
+
export declare const openaiCodexOAuthProvider: OAuthProviderInterface;
|
|
@@ -1,2 +1,319 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { generatePKCE } from "./pkce.js";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
//#region src/auth/oauth/openai-codex.ts
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI Codex (ChatGPT) OAuth.
|
|
7
|
+
*
|
|
8
|
+
* Owns callback validation, manual prompt handling, and success/error pages.
|
|
9
|
+
*/
|
|
10
|
+
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
11
|
+
const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
|
|
12
|
+
const TOKEN_URL = "https://auth.openai.com/oauth/token";
|
|
13
|
+
const CALLBACK_PORT = 1455;
|
|
14
|
+
const CALLBACK_PATH = "/auth/callback";
|
|
15
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
|
|
16
|
+
const SCOPE = "openid profile email offline_access";
|
|
17
|
+
const MANUAL_PROMPT_DELAY_MS = 15e3;
|
|
18
|
+
const TOKEN_REQUEST_TIMEOUT_MS = 3e4;
|
|
19
|
+
function xopcOAuthHtml(params) {
|
|
20
|
+
const color = params.tone === "success" ? "#2563eb" : "#dc2626";
|
|
21
|
+
const escapedTitle = escapeHtml(params.title);
|
|
22
|
+
return `<!doctype html>
|
|
23
|
+
<html lang="en">
|
|
24
|
+
<head>
|
|
25
|
+
<meta charset="utf-8" />
|
|
26
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
27
|
+
<title>${escapedTitle}</title>
|
|
28
|
+
<style>
|
|
29
|
+
:root { color-scheme: light dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
|
|
30
|
+
body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #f8fafc; color: #0f172a; }
|
|
31
|
+
@media (prefers-color-scheme: dark) { body { background: #020617; color: #e2e8f0; } .card { background: #0f172a !important; border-color: #1e293b !important; } .muted { color: #94a3b8 !important; } }
|
|
32
|
+
.card { width: min(520px, calc(100vw - 32px)); background: white; border: 1px solid #e2e8f0; border-radius: 20px; padding: 28px; box-sizing: border-box; }
|
|
33
|
+
.brand { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; font-weight: 700; }
|
|
34
|
+
.logo { width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center; color: white; background: ${color}; font-weight: 800; letter-spacing: -0.04em; }
|
|
35
|
+
h1 { font-size: 22px; margin: 0 0 10px; }
|
|
36
|
+
p { margin: 0; line-height: 1.6; }
|
|
37
|
+
.muted { color: #64748b; margin-top: 14px; font-size: 14px; }
|
|
38
|
+
</style>
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<main class="card">
|
|
42
|
+
<div class="brand"><div class="logo">x</div><div>xopc</div></div>
|
|
43
|
+
<h1>${escapedTitle}</h1>
|
|
44
|
+
<p>${escapeHtml(params.message)}</p>
|
|
45
|
+
<p class="muted">You can close this window and return to the terminal.</p>
|
|
46
|
+
</main>
|
|
47
|
+
</body>
|
|
48
|
+
</html>`;
|
|
49
|
+
}
|
|
50
|
+
function escapeHtml(value) {
|
|
51
|
+
return value.replace(/[&<>"]/g, (char) => ({
|
|
52
|
+
"&": "&",
|
|
53
|
+
"<": "<",
|
|
54
|
+
">": ">",
|
|
55
|
+
"\"": """
|
|
56
|
+
})[char] ?? char);
|
|
57
|
+
}
|
|
58
|
+
function createState() {
|
|
59
|
+
return randomBytes(16).toString("hex");
|
|
60
|
+
}
|
|
61
|
+
function waitForManualPromptDelay(signal) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
if (signal?.aborted) {
|
|
64
|
+
reject(/* @__PURE__ */ new Error("Login cancelled"));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const timeout = setTimeout(() => resolve({ type: "unavailable" }), MANUAL_PROMPT_DELAY_MS);
|
|
68
|
+
timeout.unref?.();
|
|
69
|
+
const abort = () => {
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
reject(/* @__PURE__ */ new Error("Login cancelled"));
|
|
72
|
+
};
|
|
73
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function parseOAuthAuthorizationInput(input) {
|
|
77
|
+
const trimmed = input.trim();
|
|
78
|
+
if (!trimmed) return {};
|
|
79
|
+
try {
|
|
80
|
+
const url = new URL(trimmed);
|
|
81
|
+
return {
|
|
82
|
+
code: url.searchParams.get("code") ?? void 0,
|
|
83
|
+
state: url.searchParams.get("state") ?? void 0
|
|
84
|
+
};
|
|
85
|
+
} catch {}
|
|
86
|
+
if (trimmed.includes("=")) {
|
|
87
|
+
const params = new URLSearchParams(trimmed.startsWith("?") ? trimmed.slice(1) : trimmed);
|
|
88
|
+
return {
|
|
89
|
+
code: params.get("code") ?? void 0,
|
|
90
|
+
state: params.get("state") ?? void 0
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { code: trimmed };
|
|
94
|
+
}
|
|
95
|
+
async function parsePromptedAuthorizationCode(inputPromise, state) {
|
|
96
|
+
const parsed = parseOAuthAuthorizationInput(await inputPromise);
|
|
97
|
+
if (parsed.state && parsed.state !== state) throw new Error("State mismatch. Paste the redirect URL from the most recent xopc OAuth login.");
|
|
98
|
+
if (!parsed.code) throw new Error("Missing authorization code");
|
|
99
|
+
return parsed.code;
|
|
100
|
+
}
|
|
101
|
+
async function createAuthorizationFlow() {
|
|
102
|
+
const { verifier, challenge } = await generatePKCE();
|
|
103
|
+
const state = createState();
|
|
104
|
+
const url = new URL(AUTHORIZE_URL);
|
|
105
|
+
url.searchParams.set("response_type", "code");
|
|
106
|
+
url.searchParams.set("client_id", CLIENT_ID);
|
|
107
|
+
url.searchParams.set("redirect_uri", REDIRECT_URI);
|
|
108
|
+
url.searchParams.set("scope", SCOPE);
|
|
109
|
+
url.searchParams.set("code_challenge", challenge);
|
|
110
|
+
url.searchParams.set("code_challenge_method", "S256");
|
|
111
|
+
url.searchParams.set("state", state);
|
|
112
|
+
url.searchParams.set("id_token_add_organizations", "true");
|
|
113
|
+
url.searchParams.set("codex_cli_simplified_flow", "true");
|
|
114
|
+
url.searchParams.set("originator", "xopc");
|
|
115
|
+
return {
|
|
116
|
+
verifier,
|
|
117
|
+
state,
|
|
118
|
+
url: url.toString()
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function startLocalOAuthServer(state) {
|
|
122
|
+
let settleWait;
|
|
123
|
+
const waitForCodePromise = new Promise((resolve) => {
|
|
124
|
+
let settled = false;
|
|
125
|
+
settleWait = (value) => {
|
|
126
|
+
if (settled) return;
|
|
127
|
+
settled = true;
|
|
128
|
+
resolve(value);
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
const server = http.createServer((req, res) => {
|
|
132
|
+
try {
|
|
133
|
+
const url = new URL(req.url || "", "http://localhost");
|
|
134
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
135
|
+
if (url.pathname !== CALLBACK_PATH) {
|
|
136
|
+
res.statusCode = 404;
|
|
137
|
+
res.end(xopcOAuthHtml({
|
|
138
|
+
title: "Callback route not found",
|
|
139
|
+
message: "This xopc OAuth callback URL is not valid.",
|
|
140
|
+
tone: "error"
|
|
141
|
+
}));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const code = url.searchParams.get("code");
|
|
145
|
+
if (!code) {
|
|
146
|
+
res.statusCode = 400;
|
|
147
|
+
res.end(xopcOAuthHtml({
|
|
148
|
+
title: "Authentication failed",
|
|
149
|
+
message: "OpenAI did not return an authorization code.",
|
|
150
|
+
tone: "error"
|
|
151
|
+
}));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (url.searchParams.get("state") !== state) {
|
|
155
|
+
res.statusCode = 400;
|
|
156
|
+
res.end(xopcOAuthHtml({
|
|
157
|
+
title: "Authentication needs manual confirmation",
|
|
158
|
+
message: "This callback belongs to a different xopc OAuth attempt. Copy the full URL from the address bar and paste it in the terminal prompt for the latest login.",
|
|
159
|
+
tone: "error"
|
|
160
|
+
}));
|
|
161
|
+
settleWait?.({ type: "unavailable" });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
res.statusCode = 200;
|
|
165
|
+
res.end(xopcOAuthHtml({
|
|
166
|
+
title: "OpenAI authentication complete",
|
|
167
|
+
message: "xopc received the authorization callback successfully.",
|
|
168
|
+
tone: "success"
|
|
169
|
+
}));
|
|
170
|
+
settleWait?.({
|
|
171
|
+
type: "code",
|
|
172
|
+
code
|
|
173
|
+
});
|
|
174
|
+
} catch {
|
|
175
|
+
res.statusCode = 500;
|
|
176
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
177
|
+
res.end(xopcOAuthHtml({
|
|
178
|
+
title: "Authentication failed",
|
|
179
|
+
message: "xopc could not process the OAuth callback.",
|
|
180
|
+
tone: "error"
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return new Promise((resolve) => {
|
|
185
|
+
server.listen(CALLBACK_PORT, () => {
|
|
186
|
+
resolve({
|
|
187
|
+
available: true,
|
|
188
|
+
close: () => server.close(),
|
|
189
|
+
cancelWait: () => settleWait?.({ type: "unavailable" }),
|
|
190
|
+
waitForCode: () => waitForCodePromise
|
|
191
|
+
});
|
|
192
|
+
}).on("error", () => {
|
|
193
|
+
resolve({
|
|
194
|
+
available: false,
|
|
195
|
+
close: () => {},
|
|
196
|
+
cancelWait: () => settleWait?.({ type: "unavailable" }),
|
|
197
|
+
waitForCode: async () => ({ type: "unavailable" })
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async function postTokenForm(body, signal) {
|
|
203
|
+
const response = await fetch(TOKEN_URL, {
|
|
204
|
+
method: "POST",
|
|
205
|
+
headers: {
|
|
206
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
207
|
+
Accept: "application/json"
|
|
208
|
+
},
|
|
209
|
+
body,
|
|
210
|
+
signal: signal ?? AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
|
|
211
|
+
});
|
|
212
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
213
|
+
const text = await response.text();
|
|
214
|
+
if (!response.ok) throw new Error(`OpenAI Codex token request failed (${response.status}): ${text || response.statusText}`);
|
|
215
|
+
if (!contentType.toLowerCase().includes("application/json")) throw new Error(`OpenAI Codex token response was not JSON: ${contentType || "missing content-type"}`);
|
|
216
|
+
return JSON.parse(text);
|
|
217
|
+
}
|
|
218
|
+
async function exchangeAuthorizationCode(code, verifier, signal) {
|
|
219
|
+
return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
|
|
220
|
+
grant_type: "authorization_code",
|
|
221
|
+
client_id: CLIENT_ID,
|
|
222
|
+
code,
|
|
223
|
+
code_verifier: verifier,
|
|
224
|
+
redirect_uri: REDIRECT_URI
|
|
225
|
+
}), signal));
|
|
226
|
+
}
|
|
227
|
+
async function refreshAccessToken(refreshToken) {
|
|
228
|
+
return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
|
|
229
|
+
grant_type: "refresh_token",
|
|
230
|
+
client_id: CLIENT_ID,
|
|
231
|
+
refresh_token: refreshToken
|
|
232
|
+
})));
|
|
233
|
+
}
|
|
234
|
+
function normalizeTokenResponse(json) {
|
|
235
|
+
if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
|
|
236
|
+
const missing = [
|
|
237
|
+
!json.access_token ? "access_token" : "",
|
|
238
|
+
!json.refresh_token ? "refresh_token" : "",
|
|
239
|
+
typeof json.expires_in !== "number" ? "expires_in" : ""
|
|
240
|
+
].filter(Boolean).join(", ");
|
|
241
|
+
throw new Error(`OpenAI Codex token response missing fields: ${missing}`);
|
|
242
|
+
}
|
|
243
|
+
const accountId = getAccountId(json.access_token);
|
|
244
|
+
if (!accountId) throw new Error("Failed to extract accountId from token");
|
|
245
|
+
return {
|
|
246
|
+
access: json.access_token,
|
|
247
|
+
refresh: json.refresh_token,
|
|
248
|
+
expires: Date.now() + json.expires_in * 1e3,
|
|
249
|
+
accountId
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function getAccountId(accessToken) {
|
|
253
|
+
const [, payload] = accessToken.split(".");
|
|
254
|
+
if (!payload) return null;
|
|
255
|
+
try {
|
|
256
|
+
const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
|
|
257
|
+
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
|
|
258
|
+
const json = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
|
|
259
|
+
const authClaim = json["https://api.openai.com/auth"];
|
|
260
|
+
if (authClaim && typeof authClaim === "object") {
|
|
261
|
+
const accountId = authClaim.chatgpt_account_id;
|
|
262
|
+
if (typeof accountId === "string" && accountId.length > 0) return accountId;
|
|
263
|
+
}
|
|
264
|
+
return typeof json.sub === "string" && json.sub.length > 0 ? json.sub : null;
|
|
265
|
+
} catch {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function loginOpenAICodex(callbacks) {
|
|
270
|
+
const { verifier, state, url } = await createAuthorizationFlow();
|
|
271
|
+
const server = await startLocalOAuthServer(state);
|
|
272
|
+
try {
|
|
273
|
+
callbacks.onAuth({
|
|
274
|
+
url,
|
|
275
|
+
instructions: server.available ? "A browser window should open. Complete login to finish. If it does not complete automatically, paste the final redirect URL in the terminal." : "Open this URL and paste the final redirect URL in the terminal. xopc could not bind localhost:1455 for the automatic callback."
|
|
276
|
+
});
|
|
277
|
+
let code;
|
|
278
|
+
if (server.available) {
|
|
279
|
+
const callback = await Promise.race([server.waitForCode(), waitForManualPromptDelay(callbacks.signal)]);
|
|
280
|
+
if (callback.type === "code") code = callback.code;
|
|
281
|
+
}
|
|
282
|
+
if (!code) {
|
|
283
|
+
const manualCode = parsePromptedAuthorizationCode(callbacks.onManualCodeInput ? callbacks.onManualCodeInput() : callbacks.onPrompt({ message: "Paste the authorization code (or full redirect URL):" }), state).then((value) => {
|
|
284
|
+
server.cancelWait();
|
|
285
|
+
return {
|
|
286
|
+
type: "code",
|
|
287
|
+
code: value
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
const callback = await Promise.race([server.waitForCode(), manualCode]);
|
|
291
|
+
if (callback.type === "code") code = callback.code;
|
|
292
|
+
}
|
|
293
|
+
if (!code) throw new Error("Missing authorization code");
|
|
294
|
+
return await exchangeAuthorizationCode(code, verifier, callbacks.signal);
|
|
295
|
+
} finally {
|
|
296
|
+
server.close();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async function refreshOpenAICodexToken(refreshToken) {
|
|
300
|
+
return refreshAccessToken(refreshToken);
|
|
301
|
+
}
|
|
302
|
+
const openaiCodexOAuthProvider = {
|
|
303
|
+
id: "openai-codex",
|
|
304
|
+
name: "OpenAI Codex",
|
|
305
|
+
usesCallbackServer: true,
|
|
306
|
+
async login(callbacks) {
|
|
307
|
+
return loginOpenAICodex(callbacks);
|
|
308
|
+
},
|
|
309
|
+
async refreshToken(credentials) {
|
|
310
|
+
return refreshOpenAICodexToken(credentials.refresh);
|
|
311
|
+
},
|
|
312
|
+
getApiKey(credentials) {
|
|
313
|
+
return credentials.access;
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
//#endregion
|
|
2
317
|
export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken };
|
|
318
|
+
|
|
319
|
+
//# sourceMappingURL=openai-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-codex.js","names":[],"sources":["../../../../src/auth/oauth/openai-codex.ts"],"sourcesContent":["/**\n * OpenAI Codex (ChatGPT) OAuth.\n *\n * Owns callback validation, manual prompt handling, and success/error pages.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport http from 'node:http';\n\nimport { generatePKCE } from './pkce.js';\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst AUTHORIZE_URL = 'https://auth.openai.com/oauth/authorize';\nconst TOKEN_URL = 'https://auth.openai.com/oauth/token';\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = '/auth/callback';\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst SCOPE = 'openid profile email offline_access';\nconst MANUAL_PROMPT_DELAY_MS = 15_000;\nconst TOKEN_REQUEST_TIMEOUT_MS = 30_000;\n\ntype TokenResponseJson = {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n};\n\ntype CallbackResult =\n | { type: 'code'; code: string }\n | { type: 'unavailable' };\n\ntype LocalOAuthServer = {\n close: () => void;\n cancelWait: () => void;\n waitForCode: () => Promise<CallbackResult>;\n available: boolean;\n};\n\nfunction xopcOAuthHtml(params: { title: string; message: string; tone: 'success' | 'error' }): string {\n const color = params.tone === 'success' ? '#2563eb' : '#dc2626';\n const escapedTitle = escapeHtml(params.title);\n const escapedMessage = escapeHtml(params.message);\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapedTitle}</title>\n <style>\n :root { color-scheme: light dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #f8fafc; color: #0f172a; }\n @media (prefers-color-scheme: dark) { body { background: #020617; color: #e2e8f0; } .card { background: #0f172a !important; border-color: #1e293b !important; } .muted { color: #94a3b8 !important; } }\n .card { width: min(520px, calc(100vw - 32px)); background: white; border: 1px solid #e2e8f0; border-radius: 20px; padding: 28px; box-sizing: border-box; }\n .brand { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; font-weight: 700; }\n .logo { width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center; color: white; background: ${color}; font-weight: 800; letter-spacing: -0.04em; }\n h1 { font-size: 22px; margin: 0 0 10px; }\n p { margin: 0; line-height: 1.6; }\n .muted { color: #64748b; margin-top: 14px; font-size: 14px; }\n </style>\n</head>\n<body>\n <main class=\"card\">\n <div class=\"brand\"><div class=\"logo\">x</div><div>xopc</div></div>\n <h1>${escapedTitle}</h1>\n <p>${escapedMessage}</p>\n <p class=\"muted\">You can close this window and return to the terminal.</p>\n </main>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"]/g, (char) => ({ '&': '&', '<': '<', '>': '>', '\"': '"' })[char] ?? char);\n}\n\nfunction createState(): string {\n return randomBytes(16).toString('hex');\n}\n\nfunction waitForManualPromptDelay(signal?: AbortSignal): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Login cancelled'));\n return;\n }\n const timeout = setTimeout(() => resolve({ type: 'unavailable' }), MANUAL_PROMPT_DELAY_MS);\n timeout.unref?.();\n const abort = () => {\n clearTimeout(timeout);\n reject(new Error('Login cancelled'));\n };\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\nfunction parseOAuthAuthorizationInput(input: string): { code?: string; state?: string } {\n const trimmed = input.trim();\n if (!trimmed) return {};\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n };\n } catch {\n // Continue: raw code or query-string paste.\n }\n\n if (trimmed.includes('=')) {\n const params = new URLSearchParams(trimmed.startsWith('?') ? trimmed.slice(1) : trimmed);\n return {\n code: params.get('code') ?? undefined,\n state: params.get('state') ?? undefined,\n };\n }\n\n return { code: trimmed };\n}\n\nasync function parsePromptedAuthorizationCode(inputPromise: Promise<string>, state: string): Promise<string> {\n const input = await inputPromise;\n const parsed = parseOAuthAuthorizationInput(input);\n if (parsed.state && parsed.state !== state) {\n throw new Error('State mismatch. Paste the redirect URL from the most recent xopc OAuth login.');\n }\n if (!parsed.code) {\n throw new Error('Missing authorization code');\n }\n return parsed.code;\n}\n\nasync function createAuthorizationFlow(): Promise<{ verifier: string; state: string; url: string }> {\n const { verifier, challenge } = await generatePKCE();\n const state = createState();\n const url = new URL(AUTHORIZE_URL);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('client_id', CLIENT_ID);\n url.searchParams.set('redirect_uri', REDIRECT_URI);\n url.searchParams.set('scope', SCOPE);\n url.searchParams.set('code_challenge', challenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', state);\n url.searchParams.set('id_token_add_organizations', 'true');\n url.searchParams.set('codex_cli_simplified_flow', 'true');\n url.searchParams.set('originator', 'xopc');\n return { verifier, state, url: url.toString() };\n}\n\nasync function startLocalOAuthServer(state: string): Promise<LocalOAuthServer> {\n let settleWait: ((value: CallbackResult) => void) | undefined;\n const waitForCodePromise = new Promise<CallbackResult>((resolve) => {\n let settled = false;\n settleWait = (value) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n });\n\n const server = http.createServer((req, res) => {\n try {\n const url = new URL(req.url || '', 'http://localhost');\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n if (url.pathname !== CALLBACK_PATH) {\n res.statusCode = 404;\n res.end(xopcOAuthHtml({ title: 'Callback route not found', message: 'This xopc OAuth callback URL is not valid.', tone: 'error' }));\n return;\n }\n\n const code = url.searchParams.get('code');\n if (!code) {\n res.statusCode = 400;\n res.end(xopcOAuthHtml({ title: 'Authentication failed', message: 'OpenAI did not return an authorization code.', tone: 'error' }));\n return;\n }\n\n if (url.searchParams.get('state') !== state) {\n res.statusCode = 400;\n res.end(\n xopcOAuthHtml({\n title: 'Authentication needs manual confirmation',\n message: 'This callback belongs to a different xopc OAuth attempt. Copy the full URL from the address bar and paste it in the terminal prompt for the latest login.',\n tone: 'error',\n }),\n );\n settleWait?.({ type: 'unavailable' });\n return;\n }\n\n res.statusCode = 200;\n res.end(xopcOAuthHtml({ title: 'OpenAI authentication complete', message: 'xopc received the authorization callback successfully.', tone: 'success' }));\n settleWait?.({ type: 'code', code });\n } catch {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(xopcOAuthHtml({ title: 'Authentication failed', message: 'xopc could not process the OAuth callback.', tone: 'error' }));\n }\n });\n\n return new Promise((resolve) => {\n server\n .listen(CALLBACK_PORT, () => {\n resolve({\n available: true,\n close: () => server.close(),\n cancelWait: () => settleWait?.({ type: 'unavailable' }),\n waitForCode: () => waitForCodePromise,\n });\n })\n .on('error', () => {\n resolve({\n available: false,\n close: () => {},\n cancelWait: () => settleWait?.({ type: 'unavailable' }),\n waitForCode: async () => ({ type: 'unavailable' }),\n });\n });\n });\n}\n\nasync function postTokenForm(body: URLSearchParams, signal?: AbortSignal): Promise<TokenResponseJson> {\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body,\n signal: signal ?? AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS),\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n const text = await response.text();\n if (!response.ok) {\n throw new Error(`OpenAI Codex token request failed (${response.status}): ${text || response.statusText}`);\n }\n if (!contentType.toLowerCase().includes('application/json')) {\n throw new Error(`OpenAI Codex token response was not JSON: ${contentType || 'missing content-type'}`);\n }\n return JSON.parse(text) as TokenResponseJson;\n}\n\nasync function exchangeAuthorizationCode(code: string, verifier: string, signal?: AbortSignal): Promise<OAuthCredentials> {\n const json = await postTokenForm(\n new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n signal,\n );\n return normalizeTokenResponse(json);\n}\n\nasync function refreshAccessToken(refreshToken: string): Promise<OAuthCredentials> {\n const json = await postTokenForm(\n new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n );\n return normalizeTokenResponse(json);\n}\n\nfunction normalizeTokenResponse(json: TokenResponseJson): OAuthCredentials {\n if (!json.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n const missing = [\n !json.access_token ? 'access_token' : '',\n !json.refresh_token ? 'refresh_token' : '',\n typeof json.expires_in !== 'number' ? 'expires_in' : '',\n ].filter(Boolean).join(', ');\n throw new Error(`OpenAI Codex token response missing fields: ${missing}`);\n }\n const accountId = getAccountId(json.access_token);\n if (!accountId) {\n throw new Error('Failed to extract accountId from token');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n };\n}\n\nfunction getAccountId(accessToken: string): string | null {\n const [, payload] = accessToken.split('.');\n if (!payload) return null;\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const json = JSON.parse(Buffer.from(padded, 'base64').toString('utf8')) as Record<string, unknown>;\n const authClaim = json['https://api.openai.com/auth'];\n if (authClaim && typeof authClaim === 'object') {\n const accountId = (authClaim as Record<string, unknown>).chatgpt_account_id;\n if (typeof accountId === 'string' && accountId.length > 0) return accountId;\n }\n return typeof json.sub === 'string' && json.sub.length > 0 ? json.sub : null;\n } catch {\n return null;\n }\n}\n\nexport async function loginOpenAICodex(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, state, url } = await createAuthorizationFlow();\n const server = await startLocalOAuthServer(state);\n\n try {\n callbacks.onAuth({\n url,\n instructions: server.available\n ? 'A browser window should open. Complete login to finish. If it does not complete automatically, paste the final redirect URL in the terminal.'\n : 'Open this URL and paste the final redirect URL in the terminal. xopc could not bind localhost:1455 for the automatic callback.',\n });\n\n let code: string | undefined;\n if (server.available) {\n const callback = await Promise.race([server.waitForCode(), waitForManualPromptDelay(callbacks.signal)]);\n if (callback.type === 'code') {\n code = callback.code;\n }\n }\n\n if (!code) {\n const manualInput = callbacks.onManualCodeInput\n ? callbacks.onManualCodeInput()\n : callbacks.onPrompt({ message: 'Paste the authorization code (or full redirect URL):' });\n const manualCode = parsePromptedAuthorizationCode(manualInput, state).then((value) => {\n server.cancelWait();\n return { type: 'code' as const, code: value };\n });\n const callback = await Promise.race([server.waitForCode(), manualCode]);\n if (callback.type === 'code') {\n code = callback.code;\n }\n }\n\n if (!code) {\n throw new Error('Missing authorization code');\n }\n\n return await exchangeAuthorizationCode(code, verifier, callbacks.signal);\n } finally {\n server.close();\n }\n}\n\nexport async function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials> {\n return refreshAccessToken(refreshToken);\n}\n\nexport const openaiCodexOAuthProvider: OAuthProviderInterface = {\n id: 'openai-codex',\n name: 'OpenAI Codex',\n usesCallbackServer: true,\n\n async login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n return loginOpenAICodex(callbacks);\n },\n\n async refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n return refreshOpenAICodexToken(credentials.refresh);\n },\n\n getApiKey(credentials: OAuthCredentials): string {\n return credentials.access;\n },\n};\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
+
import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
|
|
2
3
|
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
3
4
|
import path from "node:path";
|
|
4
|
-
import { homedir } from "os";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
6
6
|
/**
|
|
7
7
|
* Auth Profile Store
|
|
@@ -10,11 +10,12 @@ import { homedir } from "os";
|
|
|
10
10
|
* Handles loading and saving auth credentials.
|
|
11
11
|
*/
|
|
12
12
|
init_write_file_atomic();
|
|
13
|
+
init_paths();
|
|
13
14
|
const AUTH_STORE_VERSION = 1;
|
|
14
15
|
const AUTH_STORE_FILENAME = "auth-profiles.json";
|
|
15
16
|
/** Get the auth profiles file path */
|
|
16
17
|
function resolveAuthStorePath(dataDir) {
|
|
17
|
-
const dir = dataDir ??
|
|
18
|
+
const dir = dataDir ?? resolveCredentialsDir();
|
|
18
19
|
return path.join(dir, AUTH_STORE_FILENAME);
|
|
19
20
|
}
|
|
20
21
|
/** Ensure auth store file exists */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":[],"sources":["../../../../src/auth/profiles/store.ts"],"sourcesContent":["/**\n * Auth Profile Store\n * \n * Persistent storage for auth profiles.\n * Handles loading and saving auth credentials.\n */\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport {
|
|
1
|
+
{"version":3,"file":"store.js","names":[],"sources":["../../../../src/auth/profiles/store.ts"],"sourcesContent":["/**\n * Auth Profile Store\n * \n * Persistent storage for auth profiles.\n * Handles loading and saving auth credentials.\n */\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport { resolveCredentialsDir } from '../../config/paths.js';\nimport type { AuthProfileCredential, AuthProfileStore, ProfileUsageStats } from './types.js';\n\nconst AUTH_STORE_VERSION = 1;\nconst AUTH_STORE_FILENAME = 'auth-profiles.json';\n\n/** Get the auth profiles file path */\nexport function resolveAuthStorePath(dataDir?: string): string {\n\tconst dir = dataDir ?? resolveCredentialsDir();\n\treturn path.join(dir, AUTH_STORE_FILENAME);\n}\n\n/** Ensure auth store file exists */\nexport function ensureAuthStoreFile(authPath: string): void {\n\tconst dir = path.dirname(authPath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\tif (!existsSync(authPath)) {\n\t\twriteTextAtomicSync(\n\t\t\tauthPath,\n\t\t\tJSON.stringify({ version: AUTH_STORE_VERSION, profiles: {} }, null, 2),\n\t\t);\n\t\tchmodSync(authPath, 0o600);\n\t}\n}\n\nfunction loadJsonFile(filePath: string): unknown {\n\tif (!existsSync(filePath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction saveJsonFile(filePath: string, data: unknown): void {\n\tconst dir = path.dirname(filePath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\twriteTextAtomicSync(filePath, JSON.stringify(data, null, 2));\n\tchmodSync(filePath, 0o600);\n}\n\nfunction coerceAuthStore(raw: unknown): AuthProfileStore | null {\n\tif (!raw || typeof raw !== 'object') {\n\t\treturn null;\n\t}\n\tconst record = raw as Record<string, unknown>;\n\tif (!record.profiles || typeof record.profiles !== 'object') {\n\t\treturn null;\n\t}\n\tconst profiles = record.profiles as Record<string, unknown>;\n\tconst normalized: Record<string, AuthProfileCredential> = {};\n\tfor (const [key, value] of Object.entries(profiles)) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\t\tconst typed = value as Partial<AuthProfileCredential>;\n\t\tif (typed.type !== 'api_key' && typed.type !== 'oauth' && typed.type !== 'token') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!typed.provider) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized[key] = typed as AuthProfileCredential;\n\t}\n\tconst order =\n\t\trecord.order && typeof record.order === 'object'\n\t\t\t? Object.entries(record.order as Record<string, unknown>).reduce(\n\t\t\t\t(acc, [provider, value]) => {\n\t\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tconst list = value\n\t\t\t\t\t\t.map((entry) => (typeof entry === 'string' ? entry.trim() : ''))\n\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\tif (list.length === 0) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tacc[provider] = list;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string[]>,\n\t\t\t)\n\t\t\t: undefined;\n\treturn {\n\t\tversion: Number(record.version ?? AUTH_STORE_VERSION),\n\t\tprofiles: normalized,\n\t\torder,\n\t\tlastGood:\n\t\t\trecord.lastGood && typeof record.lastGood === 'object'\n\t\t\t\t? (record.lastGood as Record<string, string>)\n\t\t\t\t: undefined,\n\t\tusageStats:\n\t\t\trecord.usageStats && typeof record.usageStats === 'object'\n\t\t\t\t? (record.usageStats as Record<string, ProfileUsageStats>)\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction mergeRecord<T>(\n\tbase?: Record<string, T>,\n\toverride?: Record<string, T>,\n): Record<string, T> | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\tif (!base) {\n\t\treturn { ...override };\n\t}\n\tif (!override) {\n\t\treturn { ...base };\n\t}\n\treturn { ...base, ...override };\n}\n\nfunction _mergeAuthProfileStores(\n\tbase: AuthProfileStore,\n\toverride: AuthProfileStore,\n): AuthProfileStore {\n\tif (\n\t\tObject.keys(override.profiles).length === 0 &&\n\t\t!override.order &&\n\t\t!override.lastGood &&\n\t\t!override.usageStats\n\t) {\n\t\treturn base;\n\t}\n\treturn {\n\t\tversion: Math.max(base.version, override.version ?? base.version),\n\t\tprofiles: { ...base.profiles, ...override.profiles },\n\t\torder: mergeRecord(base.order, override.order),\n\t\tlastGood: mergeRecord(base.lastGood, override.lastGood),\n\t\tusageStats: mergeRecord(base.usageStats, override.usageStats),\n\t};\n}\n\n/** Load auth profile store from disk */\nexport function loadAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst raw = loadJsonFile(authPath);\n\tconst asStore = coerceAuthStore(raw);\n\tif (asStore) {\n\t\treturn asStore;\n\t}\n\n\treturn { version: AUTH_STORE_VERSION, profiles: {} };\n}\n\n/** Ensure auth profile store exists */\nexport function ensureAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tensureAuthStoreFile(authPath);\n\treturn loadAuthProfileStore(dataDir);\n}\n\n/** Save auth profile store to disk */\nexport function saveAuthProfileStore(store: AuthProfileStore, dataDir?: string): void {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst payload = {\n\t\tversion: AUTH_STORE_VERSION,\n\t\tprofiles: store.profiles,\n\t\torder: store.order ?? undefined,\n\t\tlastGood: store.lastGood ?? undefined,\n\t\tusageStats: store.usageStats ?? undefined,\n\t} satisfies AuthProfileStore;\n\tsaveJsonFile(authPath, payload);\n}\n"],"mappings":";;;;;;;;;;;wBASuE;YACT;AAG9D,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;;AAG5B,SAAgB,qBAAqB,SAA0B;CAC9D,MAAM,MAAM,WAAW,uBAAuB;AAC9C,QAAO,KAAK,KAAK,KAAK,oBAAoB;;;AAI3C,SAAgB,oBAAoB,UAAwB;CAC3D,MAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,KAAI,CAAC,WAAW,IAAI,CACnB,WAAU,KAAK;EAAE,WAAW;EAAM,MAAM;EAAO,CAAC;AAEjD,KAAI,CAAC,WAAW,SAAS,EAAE;AAC1B,sBACC,UACA,KAAK,UAAU;GAAE,SAAS;GAAoB,UAAU,EAAE;GAAE,EAAE,MAAM,EAAE,CACtE;AACD,YAAU,UAAU,IAAM;;;AAI5B,SAAS,aAAa,UAA2B;AAChD,KAAI,CAAC,WAAW,SAAS,CACxB,QAAO;AAER,KAAI;EACH,MAAM,UAAU,aAAa,UAAU,QAAQ;AAC/C,SAAO,KAAK,MAAM,QAAQ;SACnB;AACP,SAAO;;;AAIT,SAAS,aAAa,UAAkB,MAAqB;CAC5D,MAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,KAAI,CAAC,WAAW,IAAI,CACnB,WAAU,KAAK;EAAE,WAAW;EAAM,MAAM;EAAO,CAAC;AAEjD,qBAAoB,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAC5D,WAAU,UAAU,IAAM;;AAG3B,SAAS,gBAAgB,KAAuC;AAC/D,KAAI,CAAC,OAAO,OAAO,QAAQ,SAC1B,QAAO;CAER,MAAM,SAAS;AACf,KAAI,CAAC,OAAO,YAAY,OAAO,OAAO,aAAa,SAClD,QAAO;CAER,MAAM,WAAW,OAAO;CACxB,MAAM,aAAoD,EAAE;AAC5D,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,SAC9B;EAED,MAAM,QAAQ;AACd,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW,MAAM,SAAS,QACxE;AAED,MAAI,CAAC,MAAM,SACV;AAED,aAAW,OAAO;;CAEnB,MAAM,QACL,OAAO,SAAS,OAAO,OAAO,UAAU,WACrC,OAAO,QAAQ,OAAO,MAAiC,CAAC,QACxD,KAAK,CAAC,UAAU,WAAW;AAC3B,MAAI,CAAC,MAAM,QAAQ,MAAM,CACxB,QAAO;EAER,MAAM,OAAO,MACX,KAAK,UAAW,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG,GAAI,CAC/D,OAAO,QAAQ;AACjB,MAAI,KAAK,WAAW,EACnB,QAAO;AAER,MAAI,YAAY;AAChB,SAAO;IAER,EAAE,CACF,GACC,KAAA;AACJ,QAAO;EACN,SAAS,OAAO,OAAO,WAAW,mBAAmB;EACrD,UAAU;EACV;EACA,UACC,OAAO,YAAY,OAAO,OAAO,aAAa,WAC1C,OAAO,WACR,KAAA;EACJ,YACC,OAAO,cAAc,OAAO,OAAO,eAAe,WAC9C,OAAO,aACR,KAAA;EACJ;;;AAyCF,SAAgB,qBAAqB,SAAoC;CAGxE,MAAM,UAAU,gBADJ,aADK,qBAAqB,QACL,CACE,CAAC;AACpC,KAAI,QACH,QAAO;AAGR,QAAO;EAAE,SAAS;EAAoB,UAAU,EAAE;EAAE;;;AAIrD,SAAgB,uBAAuB,SAAoC;AAE1E,qBADiB,qBAAqB,QACV,CAAC;AAC7B,QAAO,qBAAqB,QAAQ;;;AAIrC,SAAgB,qBAAqB,OAAyB,SAAwB;AASrF,cARiB,qBAAqB,QAQjB,EAAE;EANtB,SAAS;EACT,UAAU,MAAM;EAChB,OAAO,MAAM,SAAS,KAAA;EACtB,UAAU,MAAM,YAAY,KAAA;EAC5B,YAAY,MAAM,cAAc,KAAA;EAEH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
2
1
|
import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
|
|
3
2
|
import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
|
|
4
3
|
import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
|
|
4
|
+
import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
5
5
|
//#region src/browser/actions/extension-registry-bridge.ts
|
|
6
6
|
/**
|
|
7
7
|
* Runs browser registry actions against the Chrome Extension bridge (no Playwright page).
|