@psnext/slingcli 2.4.20260507-3 → 2.4.20260509-1
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/LICENSE +1 -1
- package/README.md +1 -1
- package/bin/sling.js +12 -12
- package/node_modules/@aws-sdk/client-bedrock-runtime/package.json +2 -2
- package/node_modules/@aws-sdk/token-providers/package.json +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/agent-loop.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/agent.js +4 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +526 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +243 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +616 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +348 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/factory.js +9 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js +102 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js +194 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +92 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +42 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +31 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +196 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +170 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +90 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js +258 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js +30 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +16 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +97 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +26 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/proxy.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/package.json +7 -5
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/cli.js +6 -6
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/env-api-keys.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +307 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.js +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js +22 -0
- package/node_modules/@earendil-works/pi-ai/dist/images.js +14 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/index.js +4 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/models.generated.js +427 -122
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +129 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +34 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-completions.js +150 -122
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-responses-shared.js +14 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/openai-codex.js +25 -14
- package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/overflow.js +3 -0
- package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/package.json +5 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/bun/register-bedrock.js +4 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/args.js +1 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/config-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/list-models.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/session-picker.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/config.js +52 -30
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/auth-storage.js +2 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/branch-summarization.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/compaction.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.js +153 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.css +45 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.js +68 -4
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/loader.js +26 -12
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/keybindings.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/model-registry.js +3 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/model-resolver.js +2 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/package-manager.js +22 -5
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/provider-display-names.js +1 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/sdk.js +3 -3
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/bash.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/edit.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/find.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/grep.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/ls.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/read.js +3 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/render-utils.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/truncate.js +205 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/write.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/main.js +2 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/migrations.js +3 -3
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/config-selector.js +25 -3
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +4 -3
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/model-selector.js +2 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/session-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +4 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +3 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/interactive-mode.js +47 -32
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/dark.json +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/light.json +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -1
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/package-manager-cli.js +42 -39
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard.js +9 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/paths.js +16 -0
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/version-check.js +9 -2
- package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/package.json +9 -8
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/image.js +14 -7
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/markdown.js +24 -84
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/terminal-image.js +10 -4
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/tui.js +73 -4
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/utils.js +33 -7
- package/node_modules/{@mariozechner → @earendil-works}/pi-tui/package.json +3 -3
- package/node_modules/@mariozechner/clipboard/README.md +58 -0
- package/node_modules/@mariozechner/clipboard/index.d.ts +23 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-gnu/README.md +3 -0
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/http2.d.ts +4 -1
- package/node_modules/@types/node/package.json +2 -2
- package/node_modules/@types/node/stream/web.d.ts +4 -0
- package/node_modules/brace-expansion/dist/commonjs/index.js +1 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/fast-xml-builder/CHANGELOG.md +4 -0
- package/node_modules/fast-xml-builder/lib/fxb.cjs +1 -1
- package/node_modules/fast-xml-builder/lib/fxb.d.cts +91 -1
- package/node_modules/fast-xml-builder/lib/fxb.min.js +1 -1
- package/node_modules/fast-xml-builder/lib/fxb.min.js.map +1 -1
- package/node_modules/fast-xml-builder/package.json +3 -2
- package/node_modules/fast-xml-builder/src/fxb.d.ts +92 -3
- package/node_modules/fast-xml-builder/src/fxb.js +92 -31
- package/node_modules/fast-xml-builder/src/orderedJs2Xml.js +87 -33
- package/node_modules/get-east-asian-width/lookup-data.js +15 -12
- package/node_modules/get-east-asian-width/lookup.js +25 -22
- package/node_modules/get-east-asian-width/package.json +1 -1
- package/node_modules/jiti/README.md +258 -0
- package/node_modules/jiti/dist/babel.cjs +257 -0
- package/node_modules/jiti/dist/jiti.cjs +1 -0
- package/node_modules/jiti/lib/jiti.mjs +29 -0
- package/node_modules/jiti/lib/types.d.ts +420 -0
- package/node_modules/jiti/package.json +146 -0
- package/node_modules/protobufjs/dist/light/protobuf.js +5 -3
- package/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
- package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
- package/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
- package/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
- package/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
- package/node_modules/protobufjs/dist/protobuf.js +5 -3
- package/node_modules/protobufjs/dist/protobuf.js.map +1 -1
- package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
- package/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
- package/node_modules/protobufjs/package.json +1 -1
- package/node_modules/protobufjs/src/namespace.js +3 -1
- package/node_modules/semver/README.md +19 -4
- package/node_modules/semver/bin/semver.js +14 -10
- package/node_modules/semver/functions/truncate.js +48 -0
- package/node_modules/semver/index.js +2 -0
- package/node_modules/semver/internal/re.js +1 -1
- package/node_modules/semver/package.json +3 -3
- package/node_modules/semver/range.bnf +5 -4
- package/node_modules/socks/package.json +2 -2
- package/node_modules/xml-naming/README.md +189 -0
- package/node_modules/xml-naming/package.json +54 -0
- package/node_modules/xml-naming/src/index.d.ts +74 -0
- package/node_modules/xml-naming/src/index.js +270 -0
- package/package.json +6 -6
- package/sling-default-packages.json +2 -1
- package/slingshot/index.js +442 -23
- package/node_modules/@mariozechner/jiti/dist/babel.cjs +0 -246
- package/node_modules/@mariozechner/jiti/dist/jiti.cjs +0 -1
- package/node_modules/@mariozechner/jiti/package.json +0 -96
- package/node_modules/@mariozechner/pi-agent-core/dist/index.js +0 -9
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/cli.js +0 -116
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/env-api-keys.js +0 -166
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/index.js +0 -15
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/models.generated.js +0 -16568
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/amazon-bedrock.js +0 -753
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/openai-codex-responses.js +0 -909
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/openai-responses-shared.js +0 -479
- package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/utils/oauth/openai-codex.js +0 -374
- package/node_modules/@mariozechner/pi-ai/dist/api-registry.js +0 -44
- package/node_modules/@mariozechner/pi-ai/dist/bedrock-provider.js +0 -6
- package/node_modules/@mariozechner/pi-ai/dist/models.js +0 -71
- package/node_modules/@mariozechner/pi-ai/dist/oauth.js +0 -2
- package/node_modules/@mariozechner/pi-ai/dist/providers/anthropic.js +0 -951
- package/node_modules/@mariozechner/pi-ai/dist/providers/azure-openai-responses.js +0 -208
- package/node_modules/@mariozechner/pi-ai/dist/providers/cloudflare.js +0 -26
- package/node_modules/@mariozechner/pi-ai/dist/providers/faux.js +0 -368
- package/node_modules/@mariozechner/pi-ai/dist/providers/github-copilot-headers.js +0 -29
- package/node_modules/@mariozechner/pi-ai/dist/providers/google-shared.js +0 -329
- package/node_modules/@mariozechner/pi-ai/dist/providers/google-vertex.js +0 -442
- package/node_modules/@mariozechner/pi-ai/dist/providers/google.js +0 -400
- package/node_modules/@mariozechner/pi-ai/dist/providers/mistral.js +0 -535
- package/node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js +0 -908
- package/node_modules/@mariozechner/pi-ai/dist/providers/openai-responses.js +0 -220
- package/node_modules/@mariozechner/pi-ai/dist/providers/register-builtins.js +0 -243
- package/node_modules/@mariozechner/pi-ai/dist/providers/simple-options.js +0 -39
- package/node_modules/@mariozechner/pi-ai/dist/providers/transform-messages.js +0 -184
- package/node_modules/@mariozechner/pi-ai/dist/stream.js +0 -27
- package/node_modules/@mariozechner/pi-ai/dist/types.js +0 -2
- package/node_modules/@mariozechner/pi-ai/dist/utils/event-stream.js +0 -81
- package/node_modules/@mariozechner/pi-ai/dist/utils/hash.js +0 -14
- package/node_modules/@mariozechner/pi-ai/dist/utils/headers.js +0 -8
- package/node_modules/@mariozechner/pi-ai/dist/utils/json-parse.js +0 -113
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/anthropic.js +0 -335
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/github-copilot.js +0 -292
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/index.js +0 -121
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/oauth-page.js +0 -105
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/pkce.js +0 -31
- package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/types.js +0 -2
- package/node_modules/@mariozechner/pi-ai/dist/utils/overflow.js +0 -146
- package/node_modules/@mariozechner/pi-ai/dist/utils/sanitize-unicode.js +0 -26
- package/node_modules/@mariozechner/pi-ai/dist/utils/typebox-helpers.js +0 -21
- package/node_modules/@mariozechner/pi-ai/dist/utils/validation.js +0 -281
- package/node_modules/@mariozechner/pi-ai/package.json +0 -108
- package/node_modules/@mariozechner/pi-coding-agent/dist/bun/register-bedrock.js +0 -4
- package/node_modules/@mariozechner/pi-coding-agent/dist/modes/interactive/components/keybinding-hints.js +0 -22
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/agent-loop.js +0 -458
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/agent.js +0 -398
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/index.js +0 -9
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/proxy.js +0 -278
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/types.js +0 -2
- package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/package.json +0 -45
- package/node_modules/socks/.claude/settings.local.json +0 -26
- package/node_modules/std-env/LICENCE +0 -22
- package/node_modules/std-env/README.md +0 -118
- package/node_modules/std-env/dist/index.cjs +0 -1
- package/node_modules/std-env/dist/index.d.cts +0 -92
- package/node_modules/std-env/dist/index.d.mts +0 -92
- package/node_modules/std-env/dist/index.d.ts +0 -92
- package/node_modules/std-env/dist/index.mjs +0 -1
- package/node_modules/std-env/package.json +0 -46
- package/node_modules/yoctocolors/base.d.ts +0 -47
- package/node_modules/yoctocolors/base.js +0 -94
- package/node_modules/yoctocolors/index.d.ts +0 -2
- package/node_modules/yoctocolors/index.js +0 -2
- package/node_modules/yoctocolors/license +0 -9
- package/node_modules/yoctocolors/package.json +0 -69
- package/node_modules/yoctocolors/readme.md +0 -138
- /package/node_modules/{@mariozechner/pi-coding-agent/dist/core → @earendil-works/pi-agent-core/dist/harness}/compaction/utils.js +0 -0
- /package/node_modules/{@mariozechner/pi-coding-agent/dist/core/tools → @earendil-works/pi-agent-core/dist/harness/utils}/truncate.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/types.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/api-registry.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/bedrock-provider.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/models.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/oauth.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/amazon-bedrock.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/anthropic.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/azure-openai-responses.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/cloudflare.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/faux.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/github-copilot-headers.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google-shared.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google-vertex.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/mistral.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-responses.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/register-builtins.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/simple-options.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/transform-messages.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/session-resources.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/stream.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/types.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/utils/diagnostics.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/event-stream.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/hash.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/headers.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/json-parse.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/anthropic.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/github-copilot.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/index.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/oauth-page.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/pkce.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/types.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/sanitize-unicode.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/typebox-helpers.js +0 -0
- /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/validation.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/bun/cli.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/bun/restore-sandbox-env.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/file-processor.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/initial-message.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session-runtime.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session-services.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/auth-guidance.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/bash-executor.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/defaults.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/diagnostics.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/event-bus.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/exec.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/ansi-to-html.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.html +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/tool-renderer.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/vendor/highlight.min.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/vendor/marked.min.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/runner.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/types.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/wrapper.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/footer-data-provider.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/messages.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/output-guard.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/prompt-templates.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/resolve-config-value.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/resource-loader.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/session-cwd.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/session-manager.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/settings-manager.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/skills.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/slash-commands.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/source-info.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/system-prompt.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/telemetry.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/timings.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/edit-diff.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/file-mutation-queue.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/output-accumulator.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/path-utils.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/tool-definition-wrapper.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/assets/clankolas.png +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/armin.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/diff.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/print-mode.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/jsonl.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-client.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-mode.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-types.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/changelog.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/child-process.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard-image.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard-native.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/exif-orientation.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/frontmatter.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/fs-watch.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/git.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/image-convert.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/image-resize.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/mime.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/photon.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/pi-user-agent.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/shell.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/sleep.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/tools-manager.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/autocomplete.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/box.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/cancellable-loader.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/editor.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/input.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/loader.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/select-list.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/settings-list.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/spacer.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/text.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/truncated-text.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/editor-component.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/fuzzy.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/index.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/keybindings.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/keys.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/kill-ring.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/stdin-buffer.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/terminal.js +0 -0
- /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/undo-stack.js +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/LICENSE +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-cli.mjs +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-hooks.mjs +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-native.mjs +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-register.d.mts +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-register.mjs +0 -0
- /package/node_modules/{@mariozechner/jiti/lib/jiti.mjs → jiti/lib/jiti-static.mjs} +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.cjs +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.d.cts +0 -0
- /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.d.mts +0 -0
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub Copilot OAuth flow
|
|
3
|
-
*/
|
|
4
|
-
import { getModels } from "../../models.js";
|
|
5
|
-
const decode = (s) => atob(s);
|
|
6
|
-
const CLIENT_ID = decode("SXYxLmI1MDdhMDhjODdlY2ZlOTg=");
|
|
7
|
-
const COPILOT_HEADERS = {
|
|
8
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
9
|
-
"Editor-Version": "vscode/1.107.0",
|
|
10
|
-
"Editor-Plugin-Version": "copilot-chat/0.35.0",
|
|
11
|
-
"Copilot-Integration-Id": "vscode-chat",
|
|
12
|
-
};
|
|
13
|
-
const INITIAL_POLL_INTERVAL_MULTIPLIER = 1.2;
|
|
14
|
-
const SLOW_DOWN_POLL_INTERVAL_MULTIPLIER = 1.4;
|
|
15
|
-
export function normalizeDomain(input) {
|
|
16
|
-
const trimmed = input.trim();
|
|
17
|
-
if (!trimmed)
|
|
18
|
-
return null;
|
|
19
|
-
try {
|
|
20
|
-
const url = trimmed.includes("://") ? new URL(trimmed) : new URL(`https://${trimmed}`);
|
|
21
|
-
return url.hostname;
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
function getUrls(domain) {
|
|
28
|
-
return {
|
|
29
|
-
deviceCodeUrl: `https://${domain}/login/device/code`,
|
|
30
|
-
accessTokenUrl: `https://${domain}/login/oauth/access_token`,
|
|
31
|
-
copilotTokenUrl: `https://api.${domain}/copilot_internal/v2/token`,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Parse the proxy-ep from a Copilot token and convert to API base URL.
|
|
36
|
-
* Token format: tid=...;exp=...;proxy-ep=proxy.individual.githubcopilot.com;...
|
|
37
|
-
* Returns API URL like https://api.individual.githubcopilot.com
|
|
38
|
-
*/
|
|
39
|
-
function getBaseUrlFromToken(token) {
|
|
40
|
-
const match = token.match(/proxy-ep=([^;]+)/);
|
|
41
|
-
if (!match)
|
|
42
|
-
return null;
|
|
43
|
-
const proxyHost = match[1];
|
|
44
|
-
// Convert proxy.xxx to api.xxx
|
|
45
|
-
const apiHost = proxyHost.replace(/^proxy\./, "api.");
|
|
46
|
-
return `https://${apiHost}`;
|
|
47
|
-
}
|
|
48
|
-
export function getGitHubCopilotBaseUrl(token, enterpriseDomain) {
|
|
49
|
-
// If we have a token, extract the base URL from proxy-ep
|
|
50
|
-
if (token) {
|
|
51
|
-
const urlFromToken = getBaseUrlFromToken(token);
|
|
52
|
-
if (urlFromToken)
|
|
53
|
-
return urlFromToken;
|
|
54
|
-
}
|
|
55
|
-
// Fallback for enterprise or if token parsing fails
|
|
56
|
-
if (enterpriseDomain)
|
|
57
|
-
return `https://copilot-api.${enterpriseDomain}`;
|
|
58
|
-
return "https://api.individual.githubcopilot.com";
|
|
59
|
-
}
|
|
60
|
-
async function fetchJson(url, init) {
|
|
61
|
-
const response = await fetch(url, init);
|
|
62
|
-
if (!response.ok) {
|
|
63
|
-
const text = await response.text();
|
|
64
|
-
throw new Error(`${response.status} ${response.statusText}: ${text}`);
|
|
65
|
-
}
|
|
66
|
-
return response.json();
|
|
67
|
-
}
|
|
68
|
-
async function startDeviceFlow(domain) {
|
|
69
|
-
const urls = getUrls(domain);
|
|
70
|
-
const data = await fetchJson(urls.deviceCodeUrl, {
|
|
71
|
-
method: "POST",
|
|
72
|
-
headers: {
|
|
73
|
-
Accept: "application/json",
|
|
74
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
75
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
76
|
-
},
|
|
77
|
-
body: new URLSearchParams({
|
|
78
|
-
client_id: CLIENT_ID,
|
|
79
|
-
scope: "read:user",
|
|
80
|
-
}),
|
|
81
|
-
});
|
|
82
|
-
if (!data || typeof data !== "object") {
|
|
83
|
-
throw new Error("Invalid device code response");
|
|
84
|
-
}
|
|
85
|
-
const deviceCode = data.device_code;
|
|
86
|
-
const userCode = data.user_code;
|
|
87
|
-
const verificationUri = data.verification_uri;
|
|
88
|
-
const interval = data.interval;
|
|
89
|
-
const expiresIn = data.expires_in;
|
|
90
|
-
if (typeof deviceCode !== "string" ||
|
|
91
|
-
typeof userCode !== "string" ||
|
|
92
|
-
typeof verificationUri !== "string" ||
|
|
93
|
-
typeof interval !== "number" ||
|
|
94
|
-
typeof expiresIn !== "number") {
|
|
95
|
-
throw new Error("Invalid device code response fields");
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
device_code: deviceCode,
|
|
99
|
-
user_code: userCode,
|
|
100
|
-
verification_uri: verificationUri,
|
|
101
|
-
interval,
|
|
102
|
-
expires_in: expiresIn,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Sleep that can be interrupted by an AbortSignal
|
|
107
|
-
*/
|
|
108
|
-
function abortableSleep(ms, signal) {
|
|
109
|
-
return new Promise((resolve, reject) => {
|
|
110
|
-
if (signal?.aborted) {
|
|
111
|
-
reject(new Error("Login cancelled"));
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
const timeout = setTimeout(resolve, ms);
|
|
115
|
-
signal?.addEventListener("abort", () => {
|
|
116
|
-
clearTimeout(timeout);
|
|
117
|
-
reject(new Error("Login cancelled"));
|
|
118
|
-
}, { once: true });
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
async function pollForGitHubAccessToken(domain, deviceCode, intervalSeconds, expiresIn, signal) {
|
|
122
|
-
const urls = getUrls(domain);
|
|
123
|
-
const deadline = Date.now() + expiresIn * 1000;
|
|
124
|
-
let intervalMs = Math.max(1000, Math.floor(intervalSeconds * 1000));
|
|
125
|
-
let intervalMultiplier = INITIAL_POLL_INTERVAL_MULTIPLIER;
|
|
126
|
-
let slowDownResponses = 0;
|
|
127
|
-
while (Date.now() < deadline) {
|
|
128
|
-
if (signal?.aborted) {
|
|
129
|
-
throw new Error("Login cancelled");
|
|
130
|
-
}
|
|
131
|
-
const remainingMs = deadline - Date.now();
|
|
132
|
-
const waitMs = Math.min(Math.ceil(intervalMs * intervalMultiplier), remainingMs);
|
|
133
|
-
await abortableSleep(waitMs, signal);
|
|
134
|
-
const raw = await fetchJson(urls.accessTokenUrl, {
|
|
135
|
-
method: "POST",
|
|
136
|
-
headers: {
|
|
137
|
-
Accept: "application/json",
|
|
138
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
139
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
140
|
-
},
|
|
141
|
-
body: new URLSearchParams({
|
|
142
|
-
client_id: CLIENT_ID,
|
|
143
|
-
device_code: deviceCode,
|
|
144
|
-
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
145
|
-
}),
|
|
146
|
-
});
|
|
147
|
-
if (raw && typeof raw === "object" && typeof raw.access_token === "string") {
|
|
148
|
-
return raw.access_token;
|
|
149
|
-
}
|
|
150
|
-
if (raw && typeof raw === "object" && typeof raw.error === "string") {
|
|
151
|
-
const { error, error_description: description, interval } = raw;
|
|
152
|
-
if (error === "authorization_pending") {
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (error === "slow_down") {
|
|
156
|
-
slowDownResponses += 1;
|
|
157
|
-
intervalMs =
|
|
158
|
-
typeof interval === "number" && interval > 0 ? interval * 1000 : Math.max(1000, intervalMs + 5000);
|
|
159
|
-
intervalMultiplier = SLOW_DOWN_POLL_INTERVAL_MULTIPLIER;
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
const descriptionSuffix = description ? `: ${description}` : "";
|
|
163
|
-
throw new Error(`Device flow failed: ${error}${descriptionSuffix}`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (slowDownResponses > 0) {
|
|
167
|
-
throw new Error("Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.");
|
|
168
|
-
}
|
|
169
|
-
throw new Error("Device flow timed out");
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Refresh GitHub Copilot token
|
|
173
|
-
*/
|
|
174
|
-
export async function refreshGitHubCopilotToken(refreshToken, enterpriseDomain) {
|
|
175
|
-
const domain = enterpriseDomain || "github.com";
|
|
176
|
-
const urls = getUrls(domain);
|
|
177
|
-
const raw = await fetchJson(urls.copilotTokenUrl, {
|
|
178
|
-
headers: {
|
|
179
|
-
Accept: "application/json",
|
|
180
|
-
Authorization: `Bearer ${refreshToken}`,
|
|
181
|
-
...COPILOT_HEADERS,
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
if (!raw || typeof raw !== "object") {
|
|
185
|
-
throw new Error("Invalid Copilot token response");
|
|
186
|
-
}
|
|
187
|
-
const token = raw.token;
|
|
188
|
-
const expiresAt = raw.expires_at;
|
|
189
|
-
if (typeof token !== "string" || typeof expiresAt !== "number") {
|
|
190
|
-
throw new Error("Invalid Copilot token response fields");
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
refresh: refreshToken,
|
|
194
|
-
access: token,
|
|
195
|
-
expires: expiresAt * 1000 - 5 * 60 * 1000,
|
|
196
|
-
enterpriseUrl: enterpriseDomain,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Enable a model for the user's GitHub Copilot account.
|
|
201
|
-
* This is required for some models (like Claude, Grok) before they can be used.
|
|
202
|
-
*/
|
|
203
|
-
async function enableGitHubCopilotModel(token, modelId, enterpriseDomain) {
|
|
204
|
-
const baseUrl = getGitHubCopilotBaseUrl(token, enterpriseDomain);
|
|
205
|
-
const url = `${baseUrl}/models/${modelId}/policy`;
|
|
206
|
-
try {
|
|
207
|
-
const response = await fetch(url, {
|
|
208
|
-
method: "POST",
|
|
209
|
-
headers: {
|
|
210
|
-
"Content-Type": "application/json",
|
|
211
|
-
Authorization: `Bearer ${token}`,
|
|
212
|
-
...COPILOT_HEADERS,
|
|
213
|
-
"openai-intent": "chat-policy",
|
|
214
|
-
"x-interaction-type": "chat-policy",
|
|
215
|
-
},
|
|
216
|
-
body: JSON.stringify({ state: "enabled" }),
|
|
217
|
-
});
|
|
218
|
-
return response.ok;
|
|
219
|
-
}
|
|
220
|
-
catch {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Enable all known GitHub Copilot models that may require policy acceptance.
|
|
226
|
-
* Called after successful login to ensure all models are available.
|
|
227
|
-
*/
|
|
228
|
-
async function enableAllGitHubCopilotModels(token, enterpriseDomain, onProgress) {
|
|
229
|
-
const models = getModels("github-copilot");
|
|
230
|
-
await Promise.all(models.map(async (model) => {
|
|
231
|
-
const success = await enableGitHubCopilotModel(token, model.id, enterpriseDomain);
|
|
232
|
-
onProgress?.(model.id, success);
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Login with GitHub Copilot OAuth (device code flow)
|
|
237
|
-
*
|
|
238
|
-
* @param options.onAuth - Callback with URL and optional instructions (user code)
|
|
239
|
-
* @param options.onPrompt - Callback to prompt user for input
|
|
240
|
-
* @param options.onProgress - Optional progress callback
|
|
241
|
-
* @param options.signal - Optional AbortSignal for cancellation
|
|
242
|
-
*/
|
|
243
|
-
export async function loginGitHubCopilot(options) {
|
|
244
|
-
const input = await options.onPrompt({
|
|
245
|
-
message: "GitHub Enterprise URL/domain (blank for github.com)",
|
|
246
|
-
placeholder: "company.ghe.com",
|
|
247
|
-
allowEmpty: true,
|
|
248
|
-
});
|
|
249
|
-
if (options.signal?.aborted) {
|
|
250
|
-
throw new Error("Login cancelled");
|
|
251
|
-
}
|
|
252
|
-
const trimmed = input.trim();
|
|
253
|
-
const enterpriseDomain = normalizeDomain(input);
|
|
254
|
-
if (trimmed && !enterpriseDomain) {
|
|
255
|
-
throw new Error("Invalid GitHub Enterprise URL/domain");
|
|
256
|
-
}
|
|
257
|
-
const domain = enterpriseDomain || "github.com";
|
|
258
|
-
const device = await startDeviceFlow(domain);
|
|
259
|
-
options.onAuth(device.verification_uri, `Enter code: ${device.user_code}`);
|
|
260
|
-
const githubAccessToken = await pollForGitHubAccessToken(domain, device.device_code, device.interval, device.expires_in, options.signal);
|
|
261
|
-
const credentials = await refreshGitHubCopilotToken(githubAccessToken, enterpriseDomain ?? undefined);
|
|
262
|
-
// Enable all models after successful login
|
|
263
|
-
options.onProgress?.("Enabling models...");
|
|
264
|
-
await enableAllGitHubCopilotModels(credentials.access, enterpriseDomain ?? undefined);
|
|
265
|
-
return credentials;
|
|
266
|
-
}
|
|
267
|
-
export const githubCopilotOAuthProvider = {
|
|
268
|
-
id: "github-copilot",
|
|
269
|
-
name: "GitHub Copilot",
|
|
270
|
-
async login(callbacks) {
|
|
271
|
-
return loginGitHubCopilot({
|
|
272
|
-
onAuth: (url, instructions) => callbacks.onAuth({ url, instructions }),
|
|
273
|
-
onPrompt: callbacks.onPrompt,
|
|
274
|
-
onProgress: callbacks.onProgress,
|
|
275
|
-
signal: callbacks.signal,
|
|
276
|
-
});
|
|
277
|
-
},
|
|
278
|
-
async refreshToken(credentials) {
|
|
279
|
-
const creds = credentials;
|
|
280
|
-
return refreshGitHubCopilotToken(creds.refresh, creds.enterpriseUrl);
|
|
281
|
-
},
|
|
282
|
-
getApiKey(credentials) {
|
|
283
|
-
return credentials.access;
|
|
284
|
-
},
|
|
285
|
-
modifyModels(models, credentials) {
|
|
286
|
-
const creds = credentials;
|
|
287
|
-
const domain = creds.enterpriseUrl ? (normalizeDomain(creds.enterpriseUrl) ?? undefined) : undefined;
|
|
288
|
-
const baseUrl = getGitHubCopilotBaseUrl(creds.access, domain);
|
|
289
|
-
return models.map((m) => (m.provider === "github-copilot" ? { ...m, baseUrl } : m));
|
|
290
|
-
},
|
|
291
|
-
};
|
|
292
|
-
//# sourceMappingURL=github-copilot.js.map
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth credential management for AI providers.
|
|
3
|
-
*
|
|
4
|
-
* This module handles login, token refresh, and credential storage
|
|
5
|
-
* for OAuth-based providers:
|
|
6
|
-
* - Anthropic (Claude Pro/Max)
|
|
7
|
-
* - GitHub Copilot
|
|
8
|
-
*/
|
|
9
|
-
// Anthropic
|
|
10
|
-
export { anthropicOAuthProvider, loginAnthropic, refreshAnthropicToken } from "./anthropic.js";
|
|
11
|
-
// GitHub Copilot
|
|
12
|
-
export { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken, } from "./github-copilot.js";
|
|
13
|
-
// OpenAI Codex (ChatGPT OAuth)
|
|
14
|
-
export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
|
|
15
|
-
export * from "./types.js";
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// Provider Registry
|
|
18
|
-
// ============================================================================
|
|
19
|
-
import { anthropicOAuthProvider } from "./anthropic.js";
|
|
20
|
-
import { githubCopilotOAuthProvider } from "./github-copilot.js";
|
|
21
|
-
import { openaiCodexOAuthProvider } from "./openai-codex.js";
|
|
22
|
-
const BUILT_IN_OAUTH_PROVIDERS = [
|
|
23
|
-
anthropicOAuthProvider,
|
|
24
|
-
githubCopilotOAuthProvider,
|
|
25
|
-
openaiCodexOAuthProvider,
|
|
26
|
-
];
|
|
27
|
-
const oauthProviderRegistry = new Map(BUILT_IN_OAUTH_PROVIDERS.map((provider) => [provider.id, provider]));
|
|
28
|
-
/**
|
|
29
|
-
* Get an OAuth provider by ID
|
|
30
|
-
*/
|
|
31
|
-
export function getOAuthProvider(id) {
|
|
32
|
-
return oauthProviderRegistry.get(id);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Register a custom OAuth provider
|
|
36
|
-
*/
|
|
37
|
-
export function registerOAuthProvider(provider) {
|
|
38
|
-
oauthProviderRegistry.set(provider.id, provider);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Unregister an OAuth provider.
|
|
42
|
-
*
|
|
43
|
-
* If the provider is built-in, restores the built-in implementation.
|
|
44
|
-
* Custom providers are removed completely.
|
|
45
|
-
*/
|
|
46
|
-
export function unregisterOAuthProvider(id) {
|
|
47
|
-
const builtInProvider = BUILT_IN_OAUTH_PROVIDERS.find((provider) => provider.id === id);
|
|
48
|
-
if (builtInProvider) {
|
|
49
|
-
oauthProviderRegistry.set(id, builtInProvider);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
oauthProviderRegistry.delete(id);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Reset OAuth providers to built-ins.
|
|
56
|
-
*/
|
|
57
|
-
export function resetOAuthProviders() {
|
|
58
|
-
oauthProviderRegistry.clear();
|
|
59
|
-
for (const provider of BUILT_IN_OAUTH_PROVIDERS) {
|
|
60
|
-
oauthProviderRegistry.set(provider.id, provider);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Get all registered OAuth providers
|
|
65
|
-
*/
|
|
66
|
-
export function getOAuthProviders() {
|
|
67
|
-
return Array.from(oauthProviderRegistry.values());
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* @deprecated Use getOAuthProviders() which returns OAuthProviderInterface[]
|
|
71
|
-
*/
|
|
72
|
-
export function getOAuthProviderInfoList() {
|
|
73
|
-
return getOAuthProviders().map((p) => ({
|
|
74
|
-
id: p.id,
|
|
75
|
-
name: p.name,
|
|
76
|
-
available: true,
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
// ============================================================================
|
|
80
|
-
// High-level API (uses provider registry)
|
|
81
|
-
// ============================================================================
|
|
82
|
-
/**
|
|
83
|
-
* Refresh token for any OAuth provider.
|
|
84
|
-
* @deprecated Use getOAuthProvider(id).refreshToken() instead
|
|
85
|
-
*/
|
|
86
|
-
export async function refreshOAuthToken(providerId, credentials) {
|
|
87
|
-
const provider = getOAuthProvider(providerId);
|
|
88
|
-
if (!provider) {
|
|
89
|
-
throw new Error(`Unknown OAuth provider: ${providerId}`);
|
|
90
|
-
}
|
|
91
|
-
return provider.refreshToken(credentials);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Get API key for a provider from OAuth credentials.
|
|
95
|
-
* Automatically refreshes expired tokens.
|
|
96
|
-
*
|
|
97
|
-
* @returns API key string and updated credentials, or null if no credentials
|
|
98
|
-
* @throws Error if refresh fails
|
|
99
|
-
*/
|
|
100
|
-
export async function getOAuthApiKey(providerId, credentials) {
|
|
101
|
-
const provider = getOAuthProvider(providerId);
|
|
102
|
-
if (!provider) {
|
|
103
|
-
throw new Error(`Unknown OAuth provider: ${providerId}`);
|
|
104
|
-
}
|
|
105
|
-
let creds = credentials[providerId];
|
|
106
|
-
if (!creds) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
// Refresh if expired
|
|
110
|
-
if (Date.now() >= creds.expires) {
|
|
111
|
-
try {
|
|
112
|
-
creds = await provider.refreshToken(creds);
|
|
113
|
-
}
|
|
114
|
-
catch (_error) {
|
|
115
|
-
throw new Error(`Failed to refresh OAuth token for ${providerId}`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
const apiKey = provider.getApiKey(creds);
|
|
119
|
-
return { newCredentials: creds, apiKey };
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
const LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#fff" fill-rule="evenodd" d="M165.29 165.29 H517.36 V400 H400 V517.36 H282.65 V634.72 H165.29 Z M282.65 282.65 V400 H400 V282.65 Z"/><path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/></svg>`;
|
|
2
|
-
function escapeHtml(value) {
|
|
3
|
-
return value
|
|
4
|
-
.replaceAll("&", "&")
|
|
5
|
-
.replaceAll("<", "<")
|
|
6
|
-
.replaceAll(">", ">")
|
|
7
|
-
.replaceAll('"', """)
|
|
8
|
-
.replaceAll("'", "'");
|
|
9
|
-
}
|
|
10
|
-
function renderPage(options) {
|
|
11
|
-
const title = escapeHtml(options.title);
|
|
12
|
-
const heading = escapeHtml(options.heading);
|
|
13
|
-
const message = escapeHtml(options.message);
|
|
14
|
-
const details = options.details ? escapeHtml(options.details) : undefined;
|
|
15
|
-
return `<!doctype html>
|
|
16
|
-
<html lang="en">
|
|
17
|
-
<head>
|
|
18
|
-
<meta charset="utf-8" />
|
|
19
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
20
|
-
<title>${title}</title>
|
|
21
|
-
<style>
|
|
22
|
-
:root {
|
|
23
|
-
--text: #fafafa;
|
|
24
|
-
--text-dim: #a1a1aa;
|
|
25
|
-
--page-bg: #09090b;
|
|
26
|
-
--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
27
|
-
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
28
|
-
}
|
|
29
|
-
* { box-sizing: border-box; }
|
|
30
|
-
html { color-scheme: dark; }
|
|
31
|
-
body {
|
|
32
|
-
margin: 0;
|
|
33
|
-
min-height: 100vh;
|
|
34
|
-
display: flex;
|
|
35
|
-
align-items: center;
|
|
36
|
-
justify-content: center;
|
|
37
|
-
padding: 24px;
|
|
38
|
-
background: var(--page-bg);
|
|
39
|
-
color: var(--text);
|
|
40
|
-
font-family: var(--font-sans);
|
|
41
|
-
text-align: center;
|
|
42
|
-
}
|
|
43
|
-
main {
|
|
44
|
-
width: 100%;
|
|
45
|
-
max-width: 560px;
|
|
46
|
-
display: flex;
|
|
47
|
-
flex-direction: column;
|
|
48
|
-
align-items: center;
|
|
49
|
-
justify-content: center;
|
|
50
|
-
}
|
|
51
|
-
.logo {
|
|
52
|
-
width: 72px;
|
|
53
|
-
height: 72px;
|
|
54
|
-
display: block;
|
|
55
|
-
margin-bottom: 24px;
|
|
56
|
-
}
|
|
57
|
-
h1 {
|
|
58
|
-
margin: 0 0 10px;
|
|
59
|
-
font-size: 28px;
|
|
60
|
-
line-height: 1.15;
|
|
61
|
-
font-weight: 650;
|
|
62
|
-
color: var(--text);
|
|
63
|
-
}
|
|
64
|
-
p {
|
|
65
|
-
margin: 0;
|
|
66
|
-
line-height: 1.7;
|
|
67
|
-
color: var(--text-dim);
|
|
68
|
-
font-size: 15px;
|
|
69
|
-
}
|
|
70
|
-
.details {
|
|
71
|
-
margin-top: 16px;
|
|
72
|
-
font-family: var(--font-mono);
|
|
73
|
-
font-size: 13px;
|
|
74
|
-
color: var(--text-dim);
|
|
75
|
-
white-space: pre-wrap;
|
|
76
|
-
word-break: break-word;
|
|
77
|
-
}
|
|
78
|
-
</style>
|
|
79
|
-
</head>
|
|
80
|
-
<body>
|
|
81
|
-
<main>
|
|
82
|
-
<div class="logo">${LOGO_SVG}</div>
|
|
83
|
-
<h1>${heading}</h1>
|
|
84
|
-
<p>${message}</p>
|
|
85
|
-
${details ? `<div class="details">${details}</div>` : ""}
|
|
86
|
-
</main>
|
|
87
|
-
</body>
|
|
88
|
-
</html>`;
|
|
89
|
-
}
|
|
90
|
-
export function oauthSuccessHtml(message) {
|
|
91
|
-
return renderPage({
|
|
92
|
-
title: "Authentication successful",
|
|
93
|
-
heading: "Authentication successful",
|
|
94
|
-
message,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
export function oauthErrorHtml(message, details) {
|
|
98
|
-
return renderPage({
|
|
99
|
-
title: "Authentication failed",
|
|
100
|
-
heading: "Authentication failed",
|
|
101
|
-
message,
|
|
102
|
-
details,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=oauth-page.js.map
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PKCE utilities using Web Crypto API.
|
|
3
|
-
* Works in both Node.js 20+ and browsers.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Encode bytes as base64url string.
|
|
7
|
-
*/
|
|
8
|
-
function base64urlEncode(bytes) {
|
|
9
|
-
let binary = "";
|
|
10
|
-
for (const byte of bytes) {
|
|
11
|
-
binary += String.fromCharCode(byte);
|
|
12
|
-
}
|
|
13
|
-
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Generate PKCE code verifier and challenge.
|
|
17
|
-
* Uses Web Crypto API for cross-platform compatibility.
|
|
18
|
-
*/
|
|
19
|
-
export async function generatePKCE() {
|
|
20
|
-
// Generate random verifier
|
|
21
|
-
const verifierBytes = new Uint8Array(32);
|
|
22
|
-
crypto.getRandomValues(verifierBytes);
|
|
23
|
-
const verifier = base64urlEncode(verifierBytes);
|
|
24
|
-
// Compute SHA-256 challenge
|
|
25
|
-
const encoder = new TextEncoder();
|
|
26
|
-
const data = encoder.encode(verifier);
|
|
27
|
-
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
28
|
-
const challenge = base64urlEncode(new Uint8Array(hashBuffer));
|
|
29
|
-
return { verifier, challenge };
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=pkce.js.map
|