gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6
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/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/loop.js +71 -8
- package/dist/resources/extensions/gsd/auto/phases.js +179 -99
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
- package/dist/resources/extensions/gsd/auto.js +95 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +61 -32
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
- package/src/resources/extensions/gsd/auto/loop.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +258 -159
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
- package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
- package/src/resources/extensions/gsd/auto.ts +132 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +71 -39
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { buildAnthropicClientOptions, usesAnthropicBearerAuth, resolveAnthropicBaseUrl } from "./anthropic.js";
|
|
4
|
+
function anthropicModel(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
id: "claude-sonnet-4",
|
|
7
|
+
name: "Claude Sonnet 4",
|
|
8
|
+
api: "anthropic-messages",
|
|
9
|
+
provider: "anthropic",
|
|
10
|
+
baseUrl: "https://api.anthropic.com",
|
|
11
|
+
reasoning: true,
|
|
12
|
+
input: ["text"],
|
|
13
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
14
|
+
contextWindow: 200000,
|
|
15
|
+
maxTokens: 8192,
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
8
19
|
test("usesAnthropicBearerAuth covers Bearer-only Anthropic-compatible providers (#3783)", () => {
|
|
9
20
|
assert.equal(usesAnthropicBearerAuth("alibaba-coding-plan"), true);
|
|
10
21
|
assert.equal(usesAnthropicBearerAuth("minimax"), true);
|
|
@@ -12,10 +23,9 @@ test("usesAnthropicBearerAuth covers Bearer-only Anthropic-compatible providers
|
|
|
12
23
|
assert.equal(usesAnthropicBearerAuth("anthropic"), false);
|
|
13
24
|
});
|
|
14
25
|
test("createClient routes Bearer-auth providers through authToken (#3783)", () => {
|
|
15
|
-
const
|
|
16
|
-
assert.
|
|
17
|
-
assert.
|
|
18
|
-
assert.ok(source.includes("authToken: usesBearerAuth ? apiKey : undefined"), "Bearer-auth providers should send authToken instead");
|
|
26
|
+
const options = buildAnthropicClientOptions(anthropicModel({ provider: "minimax" }), "bearer-token", false);
|
|
27
|
+
assert.equal(options.apiKey, null, "Bearer-auth providers should skip x-api-key auth");
|
|
28
|
+
assert.equal(options.authToken, "bearer-token", "Bearer-auth providers should send authToken instead");
|
|
19
29
|
});
|
|
20
30
|
// Minimal model stub — only the field resolveAnthropicBaseUrl cares about.
|
|
21
31
|
const stubModel = { baseUrl: "https://api.anthropic.com" };
|
|
@@ -53,9 +63,21 @@ test("resolveAnthropicBaseUrl ignores whitespace-only ANTHROPIC_BASE_URL (#4140)
|
|
|
53
63
|
assert.equal(resolveAnthropicBaseUrl(stubModel), "https://api.anthropic.com");
|
|
54
64
|
});
|
|
55
65
|
test("createClient uses resolveAnthropicBaseUrl for all auth paths (#4140)", () => {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
const saved = process.env.ANTHROPIC_BASE_URL;
|
|
67
|
+
try {
|
|
68
|
+
process.env.ANTHROPIC_BASE_URL = "https://proxy.example.com";
|
|
69
|
+
const apiKeyOptions = buildAnthropicClientOptions(anthropicModel(), "api-key", false);
|
|
70
|
+
const bearerOptions = buildAnthropicClientOptions(anthropicModel({ provider: "minimax" }), "bearer-token", false);
|
|
71
|
+
const copilotOptions = buildAnthropicClientOptions(anthropicModel({ provider: "github-copilot", baseUrl: "https://api.githubcopilot.com" }), "copilot-token", false);
|
|
72
|
+
assert.equal(apiKeyOptions.baseURL, "https://proxy.example.com");
|
|
73
|
+
assert.equal(bearerOptions.baseURL, "https://proxy.example.com");
|
|
74
|
+
assert.equal(copilotOptions.baseURL, "https://proxy.example.com");
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
if (saved === undefined)
|
|
78
|
+
delete process.env.ANTHROPIC_BASE_URL;
|
|
79
|
+
else
|
|
80
|
+
process.env.ANTHROPIC_BASE_URL = saved;
|
|
81
|
+
}
|
|
60
82
|
});
|
|
61
83
|
//# sourceMappingURL=anthropic-auth.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-auth.test.js","sourceRoot":"","sources":["../../src/providers/anthropic-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-auth.test.js","sourceRoot":"","sources":["../../src/providers/anthropic-auth.test.ts"],"names":[],"mappings":"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","sourcesContent":["import test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport type { Model } from \"../types.js\";\n\nimport { buildAnthropicClientOptions, usesAnthropicBearerAuth, resolveAnthropicBaseUrl } from \"./anthropic.js\";\n\nfunction anthropicModel(overrides: Partial<Model<\"anthropic-messages\">> = {}): Model<\"anthropic-messages\"> {\n\treturn {\n\t\tid: \"claude-sonnet-4\",\n\t\tname: \"Claude Sonnet 4\",\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"anthropic\",\n\t\tbaseUrl: \"https://api.anthropic.com\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 8192,\n\t\t...overrides,\n\t};\n}\n\ntest(\"usesAnthropicBearerAuth covers Bearer-only Anthropic-compatible providers (#3783)\", () => {\n\tassert.equal(usesAnthropicBearerAuth(\"alibaba-coding-plan\"), true);\n\tassert.equal(usesAnthropicBearerAuth(\"minimax\"), true);\n\tassert.equal(usesAnthropicBearerAuth(\"minimax-cn\"), true);\n\tassert.equal(usesAnthropicBearerAuth(\"anthropic\"), false);\n});\n\ntest(\"createClient routes Bearer-auth providers through authToken (#3783)\", () => {\n\tconst options = buildAnthropicClientOptions(anthropicModel({ provider: \"minimax\" }), \"bearer-token\", false);\n\n\tassert.equal(options.apiKey, null, \"Bearer-auth providers should skip x-api-key auth\");\n\tassert.equal(options.authToken, \"bearer-token\", \"Bearer-auth providers should send authToken instead\");\n});\n\n// Minimal model stub — only the field resolveAnthropicBaseUrl cares about.\nconst stubModel = { baseUrl: \"https://api.anthropic.com\" } as Parameters<typeof resolveAnthropicBaseUrl>[0];\n\ntest(\"resolveAnthropicBaseUrl returns model.baseUrl when ANTHROPIC_BASE_URL is unset (#4140)\", (t) => {\n\tconst saved = process.env.ANTHROPIC_BASE_URL;\n\tt.after(() => {\n\t\tif (saved === undefined) delete process.env.ANTHROPIC_BASE_URL;\n\t\telse process.env.ANTHROPIC_BASE_URL = saved;\n\t});\n\n\tdelete process.env.ANTHROPIC_BASE_URL;\n\tassert.equal(resolveAnthropicBaseUrl(stubModel), \"https://api.anthropic.com\");\n});\n\ntest(\"resolveAnthropicBaseUrl prefers ANTHROPIC_BASE_URL over model.baseUrl (#4140)\", (t) => {\n\tconst saved = process.env.ANTHROPIC_BASE_URL;\n\tt.after(() => {\n\t\tif (saved === undefined) delete process.env.ANTHROPIC_BASE_URL;\n\t\telse process.env.ANTHROPIC_BASE_URL = saved;\n\t});\n\n\tprocess.env.ANTHROPIC_BASE_URL = \"https://proxy.example.com\";\n\tassert.equal(resolveAnthropicBaseUrl(stubModel), \"https://proxy.example.com\");\n});\n\ntest(\"resolveAnthropicBaseUrl ignores whitespace-only ANTHROPIC_BASE_URL (#4140)\", (t) => {\n\tconst saved = process.env.ANTHROPIC_BASE_URL;\n\tt.after(() => {\n\t\tif (saved === undefined) delete process.env.ANTHROPIC_BASE_URL;\n\t\telse process.env.ANTHROPIC_BASE_URL = saved;\n\t});\n\n\tprocess.env.ANTHROPIC_BASE_URL = \" \";\n\tassert.equal(resolveAnthropicBaseUrl(stubModel), \"https://api.anthropic.com\");\n});\n\ntest(\"createClient uses resolveAnthropicBaseUrl for all auth paths (#4140)\", () => {\n\tconst saved = process.env.ANTHROPIC_BASE_URL;\n\ttry {\n\t\tprocess.env.ANTHROPIC_BASE_URL = \"https://proxy.example.com\";\n\t\tconst apiKeyOptions = buildAnthropicClientOptions(anthropicModel(), \"api-key\", false);\n\t\tconst bearerOptions = buildAnthropicClientOptions(anthropicModel({ provider: \"minimax\" }), \"bearer-token\", false);\n\t\tconst copilotOptions = buildAnthropicClientOptions(\n\t\t\tanthropicModel({ provider: \"github-copilot\", baseUrl: \"https://api.githubcopilot.com\" }),\n\t\t\t\"copilot-token\",\n\t\t\tfalse,\n\t\t);\n\n\t\tassert.equal(apiKeyOptions.baseURL, \"https://proxy.example.com\");\n\t\tassert.equal(bearerOptions.baseURL, \"https://proxy.example.com\");\n\t\tassert.equal(copilotOptions.baseURL, \"https://proxy.example.com\");\n\t} finally {\n\t\tif (saved === undefined) delete process.env.ANTHROPIC_BASE_URL;\n\t\telse process.env.ANTHROPIC_BASE_URL = saved;\n\t}\n});\n"]}
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { buildAnthropicClientOptions } from "./anthropic.js";
|
|
4
|
+
function anthropicModel(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
id: "claude-sonnet-4",
|
|
7
|
+
name: "Claude Sonnet 4",
|
|
8
|
+
api: "anthropic-messages",
|
|
9
|
+
provider: "anthropic",
|
|
10
|
+
baseUrl: "https://api.anthropic.com",
|
|
11
|
+
reasoning: true,
|
|
12
|
+
input: ["text"],
|
|
13
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
14
|
+
contextWindow: 200000,
|
|
15
|
+
maxTokens: 8192,
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
10
18
|
}
|
|
11
|
-
const source = readFileSync(resolveSourcePath("anthropic.ts"), "utf-8");
|
|
12
19
|
describe("anthropic bearer auth for custom providers (#3874)", () => {
|
|
13
20
|
it("treats Bearer Authorization headers as authToken-capable providers", () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
21
|
+
const options = buildAnthropicClientOptions(anthropicModel({
|
|
22
|
+
provider: "custom-anthropic-compatible",
|
|
23
|
+
headers: { Authorization: "Bearer upstream-token" },
|
|
24
|
+
}), "request-token", false);
|
|
25
|
+
assert.equal(options.apiKey, null, "custom providers with Authorization headers should not send x-api-key");
|
|
26
|
+
assert.equal(options.authToken, "request-token", "custom providers with Authorization headers should use authToken");
|
|
17
27
|
});
|
|
18
28
|
});
|
|
19
29
|
//# sourceMappingURL=anthropic-bearer-auth.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-bearer-auth.test.js","sourceRoot":"","sources":["../../src/providers/anthropic-bearer-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-bearer-auth.test.js","sourceRoot":"","sources":["../../src/providers/anthropic-bearer-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,SAAS,cAAc,CAAC,YAAkD,EAAE;IAC3E,OAAO;QACN,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE,oBAAoB;QACzB,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,2BAA2B;QACpC,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC1D,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,IAAI;QACf,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,OAAO,GAAG,2BAA2B,CAC1C,cAAc,CAAC;YACd,QAAQ,EAAE,6BAA6B;YACvC,OAAO,EAAE,EAAE,aAAa,EAAE,uBAAuB,EAAE;SACnD,CAAC,EACF,eAAe,EACf,KAAK,CACL,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,uEAAuE,CAAC,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,kEAAkE,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport type { Model } from \"../types.js\";\nimport { buildAnthropicClientOptions } from \"./anthropic.js\";\n\nfunction anthropicModel(overrides: Partial<Model<\"anthropic-messages\">> = {}): Model<\"anthropic-messages\"> {\n\treturn {\n\t\tid: \"claude-sonnet-4\",\n\t\tname: \"Claude Sonnet 4\",\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"anthropic\",\n\t\tbaseUrl: \"https://api.anthropic.com\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 8192,\n\t\t...overrides,\n\t};\n}\n\ndescribe(\"anthropic bearer auth for custom providers (#3874)\", () => {\n\tit(\"treats Bearer Authorization headers as authToken-capable providers\", () => {\n\t\tconst options = buildAnthropicClientOptions(\n\t\t\tanthropicModel({\n\t\t\t\tprovider: \"custom-anthropic-compatible\",\n\t\t\t\theaders: { Authorization: \"Bearer upstream-token\" },\n\t\t\t}),\n\t\t\t\"request-token\",\n\t\t\tfalse,\n\t\t);\n\n\t\tassert.equal(options.apiKey, null, \"custom providers with Authorization headers should not send x-api-key\");\n\t\tassert.equal(options.authToken, \"request-token\", \"custom providers with Authorization headers should use authToken\");\n\t});\n});\n"]}
|
|
@@ -14,6 +14,13 @@ export { extractRetryAfterMs };
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function resolveAnthropicBaseUrl(model: Model<"anthropic-messages">): string;
|
|
16
16
|
export declare function usesAnthropicBearerAuth(provider: Model<"anthropic-messages">["provider"]): boolean;
|
|
17
|
+
export declare function buildAnthropicClientOptions(model: Model<"anthropic-messages">, apiKey: string, interleavedThinking: boolean, optionsHeaders?: Record<string, string>, dynamicHeaders?: Record<string, string>): {
|
|
18
|
+
apiKey: string | null;
|
|
19
|
+
authToken: string | undefined;
|
|
20
|
+
baseURL: string;
|
|
21
|
+
dangerouslyAllowBrowser: boolean;
|
|
22
|
+
defaultHeaders: Record<string, string>;
|
|
23
|
+
};
|
|
17
24
|
export declare const streamAnthropic: StreamFunction<"anthropic-messages", AnthropicOptions>;
|
|
18
25
|
export declare const streamSimpleAnthropic: StreamFunction<"anthropic-messages", SimpleStreamOptions>;
|
|
19
26
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,KAAK,EACL,mBAAmB,EACnB,cAAc,EACd,MAAM,aAAa,CAAC;AAKrB,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,EAInB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAMlF;AAqBD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAElG;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,KAAK,EACL,mBAAmB,EACnB,cAAc,EACd,MAAM,aAAa,CAAC;AAKrB,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,EAInB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAMlF;AAqBD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAElG;AAOD,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,OAAO,EAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;;EA8DvC;AAoBD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAsClF,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAuC3F,CAAC"}
|
|
@@ -45,8 +45,7 @@ function hasBearerAuthorizationHeader(model) {
|
|
|
45
45
|
const authHeader = model.headers?.Authorization ?? model.headers?.authorization;
|
|
46
46
|
return typeof authHeader === "string" && authHeader.trim().toLowerCase().startsWith("bearer ");
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
const AnthropicClass = await getAnthropicClass();
|
|
48
|
+
export function buildAnthropicClientOptions(model, apiKey, interleavedThinking, optionsHeaders, dynamicHeaders) {
|
|
50
49
|
// Adaptive thinking models (Opus 4.6, Sonnet 4.6) have interleaved thinking built-in.
|
|
51
50
|
// The beta header is deprecated on Opus 4.6 and redundant on Sonnet 4.6, so skip it.
|
|
52
51
|
const needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model.id);
|
|
@@ -56,7 +55,7 @@ async function createClient(model, apiKey, interleavedThinking, optionsHeaders,
|
|
|
56
55
|
if (needsInterleavedBeta) {
|
|
57
56
|
betaFeatures.push("interleaved-thinking-2025-05-14");
|
|
58
57
|
}
|
|
59
|
-
|
|
58
|
+
return {
|
|
60
59
|
apiKey: null,
|
|
61
60
|
authToken: apiKey,
|
|
62
61
|
baseURL: resolveAnthropicBaseUrl(model),
|
|
@@ -66,8 +65,7 @@ async function createClient(model, apiKey, interleavedThinking, optionsHeaders,
|
|
|
66
65
|
"anthropic-dangerous-direct-browser-access": "true",
|
|
67
66
|
...(betaFeatures.length > 0 ? { "anthropic-beta": betaFeatures.join(",") } : {}),
|
|
68
67
|
}, model.headers, dynamicHeaders, optionsHeaders),
|
|
69
|
-
}
|
|
70
|
-
return { client, isOAuthToken: false };
|
|
68
|
+
};
|
|
71
69
|
}
|
|
72
70
|
// Skip beta headers for providers that don't support fine-grained-tool-streaming.
|
|
73
71
|
// MiniMax and minimax-cn implement the beta by emitting empty tool names in
|
|
@@ -83,7 +81,7 @@ async function createClient(model, apiKey, interleavedThinking, optionsHeaders,
|
|
|
83
81
|
// API key auth (Anthropic OAuth removed per TOS compliance — use API keys or Claude CLI)
|
|
84
82
|
// Some Anthropic-compatible providers require Bearer auth instead of x-api-key.
|
|
85
83
|
const usesBearerAuth = usesAnthropicBearerAuth(model.provider) || hasBearerAuthorizationHeader(model);
|
|
86
|
-
|
|
84
|
+
return {
|
|
87
85
|
apiKey: usesBearerAuth ? null : apiKey,
|
|
88
86
|
authToken: usesBearerAuth ? apiKey : undefined,
|
|
89
87
|
baseURL: resolveAnthropicBaseUrl(model),
|
|
@@ -93,7 +91,11 @@ async function createClient(model, apiKey, interleavedThinking, optionsHeaders,
|
|
|
93
91
|
"anthropic-dangerous-direct-browser-access": "true",
|
|
94
92
|
...(betaFeatures.length > 0 ? { "anthropic-beta": betaFeatures.join(",") } : {}),
|
|
95
93
|
}, model.headers, optionsHeaders),
|
|
96
|
-
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async function createClient(model, apiKey, interleavedThinking, optionsHeaders, dynamicHeaders) {
|
|
97
|
+
const AnthropicClass = await getAnthropicClass();
|
|
98
|
+
const client = new AnthropicClass(buildAnthropicClientOptions(model, apiKey, interleavedThinking, optionsHeaders, dynamicHeaders));
|
|
97
99
|
return { client, isOAuthToken: false };
|
|
98
100
|
}
|
|
99
101
|
export const streamAnthropic = (model, context, options) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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","sourcesContent":["// Lazy-loaded: Anthropic SDK (~500ms) is imported on first use, not at startup.\n// This avoids penalizing users who don't use Anthropic models.\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport type {\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { adjustMaxTokensForThinking, buildBaseOptions } from \"./simple-options.js\";\nimport {\n\ttype AnthropicEffort,\n\ttype AnthropicOptions,\n\textractRetryAfterMs,\n\tmapThinkingLevelToEffort,\n\tprocessAnthropicStream,\n\tsupportsAdaptiveThinking,\n} from \"./anthropic-shared.js\";\n\n// Re-export types used by other modules\nexport type { AnthropicEffort, AnthropicOptions };\nexport { extractRetryAfterMs };\n\n/**\n * Resolve the base URL for Anthropic API requests.\n *\n * Resolution order:\n * 1. ANTHROPIC_BASE_URL environment variable (if set and non-empty after trim)\n * 2. model.baseUrl (from the model definition)\n *\n * This allows routing traffic through custom proxy endpoints (e.g. OpusMax,\n * local mirrors, corporate gateways) without modifying model definitions.\n */\nexport function resolveAnthropicBaseUrl(model: Model<\"anthropic-messages\">): string {\n\tconst envBaseUrl = process.env.ANTHROPIC_BASE_URL?.trim();\n\tif (envBaseUrl) {\n\t\treturn envBaseUrl;\n\t}\n\treturn model.baseUrl;\n}\n\nlet _AnthropicClass: typeof Anthropic | undefined;\nasync function getAnthropicClass(): Promise<typeof Anthropic> {\n\tif (!_AnthropicClass) {\n\t\tconst mod = await import(\"@anthropic-ai/sdk\");\n\t\t_AnthropicClass = mod.default;\n\t}\n\treturn _AnthropicClass;\n}\n\nfunction mergeHeaders(...headerSources: (Record<string, string> | undefined)[]): Record<string, string> {\n\tconst merged: Record<string, string> = {};\n\tfor (const headers of headerSources) {\n\t\tif (headers) {\n\t\t\tObject.assign(merged, headers);\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport function usesAnthropicBearerAuth(provider: Model<\"anthropic-messages\">[\"provider\"]): boolean {\n\treturn provider === \"alibaba-coding-plan\" || provider === \"minimax\" || provider === \"minimax-cn\";\n}\n\nfunction hasBearerAuthorizationHeader(model: Model<\"anthropic-messages\">): boolean {\n\tconst authHeader = model.headers?.Authorization ?? model.headers?.authorization;\n\treturn typeof authHeader === \"string\" && authHeader.trim().toLowerCase().startsWith(\"bearer \");\n}\n\nasync function createClient(\n\tmodel: Model<\"anthropic-messages\">,\n\tapiKey: string,\n\tinterleavedThinking: boolean,\n\toptionsHeaders?: Record<string, string>,\n\tdynamicHeaders?: Record<string, string>,\n): Promise<{ client: Anthropic; isOAuthToken: boolean }> {\n\tconst AnthropicClass = await getAnthropicClass();\n\t// Adaptive thinking models (Opus 4.6, Sonnet 4.6) have interleaved thinking built-in.\n\t// The beta header is deprecated on Opus 4.6 and redundant on Sonnet 4.6, so skip it.\n\tconst needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model.id);\n\n\t// Copilot: Bearer auth, selective betas (no fine-grained-tool-streaming)\n\tif (model.provider === \"github-copilot\") {\n\t\tconst betaFeatures: string[] = [];\n\t\tif (needsInterleavedBeta) {\n\t\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t\t}\n\n\t\tconst client = new AnthropicClass({\n\t\t\tapiKey: null,\n\t\t\tauthToken: apiKey,\n\t\t\tbaseURL: resolveAnthropicBaseUrl(model),\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tdefaultHeaders: mergeHeaders(\n\t\t\t\t{\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t\t...(betaFeatures.length > 0 ? { \"anthropic-beta\": betaFeatures.join(\",\") } : {}),\n\t\t\t\t},\n\t\t\t\tmodel.headers,\n\t\t\t\tdynamicHeaders,\n\t\t\t\toptionsHeaders,\n\t\t\t),\n\t\t});\n\n\t\treturn { client, isOAuthToken: false };\n\t}\n\n\t// Skip beta headers for providers that don't support fine-grained-tool-streaming.\n\t// MiniMax and minimax-cn implement the beta by emitting empty tool names in\n\t// content_block_start (name arrives as a delta instead), which corrupts conversation\n\t// history and triggers MiniMax error 2013 on the next request (#4538).\n\tconst skipBetaHeaders =\n\t\tmodel.provider === \"alibaba-coding-plan\" ||\n\t\tmodel.provider === \"minimax\" ||\n\t\tmodel.provider === \"minimax-cn\";\n\tconst betaFeatures = skipBetaHeaders ? [] : [\"fine-grained-tool-streaming-2025-05-14\"];\n\tif (needsInterleavedBeta && !skipBetaHeaders) {\n\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t}\n\n\t// API key auth (Anthropic OAuth removed per TOS compliance — use API keys or Claude CLI)\n\t// Some Anthropic-compatible providers require Bearer auth instead of x-api-key.\n\tconst usesBearerAuth = usesAnthropicBearerAuth(model.provider) || hasBearerAuthorizationHeader(model);\n\tconst client = new AnthropicClass({\n\t\tapiKey: usesBearerAuth ? null : apiKey,\n\t\tauthToken: usesBearerAuth ? apiKey : undefined,\n\t\tbaseURL: resolveAnthropicBaseUrl(model),\n\t\tdangerouslyAllowBrowser: true,\n\t\tdefaultHeaders: mergeHeaders(\n\t\t\t{\n\t\t\t\taccept: \"application/json\",\n\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t...(betaFeatures.length > 0 ? { \"anthropic-beta\": betaFeatures.join(\",\") } : {}),\n\t\t\t},\n\t\t\tmodel.headers,\n\t\t\toptionsHeaders,\n\t\t),\n\t});\n\n\treturn { client, isOAuthToken: false };\n}\n\nexport const streamAnthropic: StreamFunction<\"anthropic-messages\", AnthropicOptions> = (\n\tmodel: Model<\"anthropic-messages\">,\n\tcontext: Context,\n\toptions?: AnthropicOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\t(async () => {\n\t\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider) ?? \"\";\n\n\t\tlet copilotDynamicHeaders: Record<string, string> | undefined;\n\t\tif (model.provider === \"github-copilot\") {\n\t\t\tconst hasImages = hasCopilotVisionInput(context.messages);\n\t\t\tcopilotDynamicHeaders = buildCopilotDynamicHeaders({\n\t\t\t\tmessages: context.messages,\n\t\t\t\thasImages,\n\t\t\t});\n\t\t}\n\n\t\tconst { client, isOAuthToken: isOAuth } = await createClient(\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\toptions?.interleavedThinking ?? true,\n\t\t\toptions?.headers,\n\t\t\tcopilotDynamicHeaders,\n\t\t);\n\n\t\tprocessAnthropicStream(stream, {\n\t\t\tclient,\n\t\t\tmodel,\n\t\t\tcontext,\n\t\t\tisOAuthToken: isOAuth,\n\t\t\toptions,\n\t\t\tAnthropicSdkClass: _AnthropicClass,\n\t\t});\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimpleAnthropic: StreamFunction<\"anthropic-messages\", SimpleStreamOptions> = (\n\tmodel: Model<\"anthropic-messages\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t}\n\n\tconst base = buildBaseOptions(model, options, apiKey);\n\tif (!options?.reasoning) {\n\t\treturn streamAnthropic(model, context, { ...base, thinkingEnabled: false } satisfies AnthropicOptions);\n\t}\n\n\t// For Opus 4.6 and Sonnet 4.6: use adaptive thinking with effort level\n\t// For older models: use budget-based thinking\n\tif (supportsAdaptiveThinking(model.id)) {\n\t\tconst effort = mapThinkingLevelToEffort(options.reasoning, model.id);\n\t\treturn streamAnthropic(model, context, {\n\t\t\t...base,\n\t\t\tthinkingEnabled: true,\n\t\t\teffort,\n\t\t} satisfies AnthropicOptions);\n\t}\n\n\tconst adjusted = adjustMaxTokensForThinking(\n\t\tbase.maxTokens || 0,\n\t\tmodel.maxTokens,\n\t\toptions.reasoning,\n\t\toptions.thinkingBudgets,\n\t);\n\n\treturn streamAnthropic(model, context, {\n\t\t...base,\n\t\tmaxTokens: adjusted.maxTokens,\n\t\tthinkingEnabled: true,\n\t\tthinkingBudgetTokens: adjusted.thinkingBudget,\n\t} satisfies AnthropicOptions);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOlD,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAGN,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACxB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAkC;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,IAAI,eAA6C,CAAC;AAClD,KAAK,UAAU,iBAAiB;IAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,CAAC;IACD,OAAO,eAAe,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,GAAG,aAAqD;IAC7E,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAiD;IACxF,OAAO,QAAQ,KAAK,qBAAqB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,YAAY,CAAC;AAClG,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAkC;IACvE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;IAChF,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,KAAkC,EAClC,MAAc,EACd,mBAA4B,EAC5B,cAAuC,EACvC,cAAuC;IAEvC,sFAAsF;IACtF,qFAAqF;IACrF,MAAM,oBAAoB,GAAG,mBAAmB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAExF,yEAAyE;IACzE,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QACzC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,oBAAoB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO;YACN,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,uBAAuB,CAAC,KAAK,CAAC;YACvC,uBAAuB,EAAE,IAAI;YAC7B,cAAc,EAAE,YAAY,CAC3B;gBACC,MAAM,EAAE,kBAAkB;gBAC1B,2CAA2C,EAAE,MAAM;gBACnD,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChF,EACD,KAAK,CAAC,OAAO,EACb,cAAc,EACd,cAAc,CACd;SACD,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,4EAA4E;IAC5E,qFAAqF;IACrF,uEAAuE;IACvE,MAAM,eAAe,GACpB,KAAK,CAAC,QAAQ,KAAK,qBAAqB;QACxC,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC;IACjC,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC;IACvF,IAAI,oBAAoB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,YAAY,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACtD,CAAC;IAED,yFAAyF;IACzF,gFAAgF;IAChF,MAAM,cAAc,GAAG,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACtG,OAAO;QACN,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACtC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,OAAO,EAAE,uBAAuB,CAAC,KAAK,CAAC;QACvC,uBAAuB,EAAE,IAAI;QAC7B,cAAc,EAAE,YAAY,CAC3B;YACC,MAAM,EAAE,kBAAkB;YAC1B,2CAA2C,EAAE,MAAM;YACnD,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,EACD,KAAK,CAAC,OAAO,EACb,cAAc,CACd;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAC1B,KAAkC,EAClC,MAAc,EACd,mBAA4B,EAC5B,cAAuC,EACvC,cAAuC;IAEvC,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,2BAA2B,CAC5D,KAAK,EACL,MAAM,EACN,mBAAmB,EACnB,cAAc,EACd,cAAc,CACd,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAA2D,CACtF,KAAkC,EAClC,OAAgB,EAChB,OAA0B,EACI,EAAE;IAChC,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;IAEjD,CAAC,KAAK,IAAI,EAAE;QACX,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAErE,IAAI,qBAAyD,CAAC;QAC9D,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1D,qBAAqB,GAAG,0BAA0B,CAAC;gBAClD,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS;aACT,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAC3D,KAAK,EACL,MAAM,EACN,OAAO,EAAE,mBAAmB,IAAI,IAAI,EACpC,OAAO,EAAE,OAAO,EAChB,qBAAqB,CACrB,CAAC;QAEF,sBAAsB,CAAC,MAAM,EAAE;YAC9B,MAAM;YACN,KAAK;YACL,OAAO;YACP,YAAY,EAAE,OAAO;YACrB,OAAO;YACP,iBAAiB,EAAE,eAAe;SAClC,CAAC,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAA8D,CAC/F,KAAkC,EAClC,OAAgB,EAChB,OAA6B,EACC,EAAE;IAChC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACzB,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,KAAK,EAA6B,CAAC,CAAC;IACxG,CAAC;IAED,uEAAuE;IACvE,8CAA8C;IAC9C,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE;YACtC,GAAG,IAAI;YACP,eAAe,EAAE,IAAI;YACrB,MAAM;SACqB,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,0BAA0B,CAC1C,IAAI,CAAC,SAAS,IAAI,CAAC,EACnB,KAAK,CAAC,SAAS,EACf,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,eAAe,CACvB,CAAC;IAEF,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE;QACtC,GAAG,IAAI;QACP,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,QAAQ,CAAC,cAAc;KAClB,CAAC,CAAC;AAC/B,CAAC,CAAC","sourcesContent":["// Lazy-loaded: Anthropic SDK (~500ms) is imported on first use, not at startup.\n// This avoids penalizing users who don't use Anthropic models.\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport type {\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { adjustMaxTokensForThinking, buildBaseOptions } from \"./simple-options.js\";\nimport {\n\ttype AnthropicEffort,\n\ttype AnthropicOptions,\n\textractRetryAfterMs,\n\tmapThinkingLevelToEffort,\n\tprocessAnthropicStream,\n\tsupportsAdaptiveThinking,\n} from \"./anthropic-shared.js\";\n\n// Re-export types used by other modules\nexport type { AnthropicEffort, AnthropicOptions };\nexport { extractRetryAfterMs };\n\n/**\n * Resolve the base URL for Anthropic API requests.\n *\n * Resolution order:\n * 1. ANTHROPIC_BASE_URL environment variable (if set and non-empty after trim)\n * 2. model.baseUrl (from the model definition)\n *\n * This allows routing traffic through custom proxy endpoints (e.g. OpusMax,\n * local mirrors, corporate gateways) without modifying model definitions.\n */\nexport function resolveAnthropicBaseUrl(model: Model<\"anthropic-messages\">): string {\n\tconst envBaseUrl = process.env.ANTHROPIC_BASE_URL?.trim();\n\tif (envBaseUrl) {\n\t\treturn envBaseUrl;\n\t}\n\treturn model.baseUrl;\n}\n\nlet _AnthropicClass: typeof Anthropic | undefined;\nasync function getAnthropicClass(): Promise<typeof Anthropic> {\n\tif (!_AnthropicClass) {\n\t\tconst mod = await import(\"@anthropic-ai/sdk\");\n\t\t_AnthropicClass = mod.default;\n\t}\n\treturn _AnthropicClass;\n}\n\nfunction mergeHeaders(...headerSources: (Record<string, string> | undefined)[]): Record<string, string> {\n\tconst merged: Record<string, string> = {};\n\tfor (const headers of headerSources) {\n\t\tif (headers) {\n\t\t\tObject.assign(merged, headers);\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport function usesAnthropicBearerAuth(provider: Model<\"anthropic-messages\">[\"provider\"]): boolean {\n\treturn provider === \"alibaba-coding-plan\" || provider === \"minimax\" || provider === \"minimax-cn\";\n}\n\nfunction hasBearerAuthorizationHeader(model: Model<\"anthropic-messages\">): boolean {\n\tconst authHeader = model.headers?.Authorization ?? model.headers?.authorization;\n\treturn typeof authHeader === \"string\" && authHeader.trim().toLowerCase().startsWith(\"bearer \");\n}\n\nexport function buildAnthropicClientOptions(\n\tmodel: Model<\"anthropic-messages\">,\n\tapiKey: string,\n\tinterleavedThinking: boolean,\n\toptionsHeaders?: Record<string, string>,\n\tdynamicHeaders?: Record<string, string>,\n) {\n\t// Adaptive thinking models (Opus 4.6, Sonnet 4.6) have interleaved thinking built-in.\n\t// The beta header is deprecated on Opus 4.6 and redundant on Sonnet 4.6, so skip it.\n\tconst needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinking(model.id);\n\n\t// Copilot: Bearer auth, selective betas (no fine-grained-tool-streaming)\n\tif (model.provider === \"github-copilot\") {\n\t\tconst betaFeatures: string[] = [];\n\t\tif (needsInterleavedBeta) {\n\t\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t\t}\n\n\t\treturn {\n\t\t\tapiKey: null,\n\t\t\tauthToken: apiKey,\n\t\t\tbaseURL: resolveAnthropicBaseUrl(model),\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tdefaultHeaders: mergeHeaders(\n\t\t\t\t{\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t\t...(betaFeatures.length > 0 ? { \"anthropic-beta\": betaFeatures.join(\",\") } : {}),\n\t\t\t\t},\n\t\t\t\tmodel.headers,\n\t\t\t\tdynamicHeaders,\n\t\t\t\toptionsHeaders,\n\t\t\t),\n\t\t};\n\t}\n\n\t// Skip beta headers for providers that don't support fine-grained-tool-streaming.\n\t// MiniMax and minimax-cn implement the beta by emitting empty tool names in\n\t// content_block_start (name arrives as a delta instead), which corrupts conversation\n\t// history and triggers MiniMax error 2013 on the next request (#4538).\n\tconst skipBetaHeaders =\n\t\tmodel.provider === \"alibaba-coding-plan\" ||\n\t\tmodel.provider === \"minimax\" ||\n\t\tmodel.provider === \"minimax-cn\";\n\tconst betaFeatures = skipBetaHeaders ? [] : [\"fine-grained-tool-streaming-2025-05-14\"];\n\tif (needsInterleavedBeta && !skipBetaHeaders) {\n\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t}\n\n\t// API key auth (Anthropic OAuth removed per TOS compliance — use API keys or Claude CLI)\n\t// Some Anthropic-compatible providers require Bearer auth instead of x-api-key.\n\tconst usesBearerAuth = usesAnthropicBearerAuth(model.provider) || hasBearerAuthorizationHeader(model);\n\treturn {\n\t\tapiKey: usesBearerAuth ? null : apiKey,\n\t\tauthToken: usesBearerAuth ? apiKey : undefined,\n\t\tbaseURL: resolveAnthropicBaseUrl(model),\n\t\tdangerouslyAllowBrowser: true,\n\t\tdefaultHeaders: mergeHeaders(\n\t\t\t{\n\t\t\t\taccept: \"application/json\",\n\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t...(betaFeatures.length > 0 ? { \"anthropic-beta\": betaFeatures.join(\",\") } : {}),\n\t\t\t},\n\t\t\tmodel.headers,\n\t\t\toptionsHeaders,\n\t\t),\n\t};\n}\n\nasync function createClient(\n\tmodel: Model<\"anthropic-messages\">,\n\tapiKey: string,\n\tinterleavedThinking: boolean,\n\toptionsHeaders?: Record<string, string>,\n\tdynamicHeaders?: Record<string, string>,\n): Promise<{ client: Anthropic; isOAuthToken: boolean }> {\n\tconst AnthropicClass = await getAnthropicClass();\n\tconst client = new AnthropicClass(buildAnthropicClientOptions(\n\t\tmodel,\n\t\tapiKey,\n\t\tinterleavedThinking,\n\t\toptionsHeaders,\n\t\tdynamicHeaders,\n\t));\n\treturn { client, isOAuthToken: false };\n}\n\nexport const streamAnthropic: StreamFunction<\"anthropic-messages\", AnthropicOptions> = (\n\tmodel: Model<\"anthropic-messages\">,\n\tcontext: Context,\n\toptions?: AnthropicOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\t(async () => {\n\t\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider) ?? \"\";\n\n\t\tlet copilotDynamicHeaders: Record<string, string> | undefined;\n\t\tif (model.provider === \"github-copilot\") {\n\t\t\tconst hasImages = hasCopilotVisionInput(context.messages);\n\t\t\tcopilotDynamicHeaders = buildCopilotDynamicHeaders({\n\t\t\t\tmessages: context.messages,\n\t\t\t\thasImages,\n\t\t\t});\n\t\t}\n\n\t\tconst { client, isOAuthToken: isOAuth } = await createClient(\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\toptions?.interleavedThinking ?? true,\n\t\t\toptions?.headers,\n\t\t\tcopilotDynamicHeaders,\n\t\t);\n\n\t\tprocessAnthropicStream(stream, {\n\t\t\tclient,\n\t\t\tmodel,\n\t\t\tcontext,\n\t\t\tisOAuthToken: isOAuth,\n\t\t\toptions,\n\t\t\tAnthropicSdkClass: _AnthropicClass,\n\t\t});\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimpleAnthropic: StreamFunction<\"anthropic-messages\", SimpleStreamOptions> = (\n\tmodel: Model<\"anthropic-messages\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider}`);\n\t}\n\n\tconst base = buildBaseOptions(model, options, apiKey);\n\tif (!options?.reasoning) {\n\t\treturn streamAnthropic(model, context, { ...base, thinkingEnabled: false } satisfies AnthropicOptions);\n\t}\n\n\t// For Opus 4.6 and Sonnet 4.6: use adaptive thinking with effort level\n\t// For older models: use budget-based thinking\n\tif (supportsAdaptiveThinking(model.id)) {\n\t\tconst effort = mapThinkingLevelToEffort(options.reasoning, model.id);\n\t\treturn streamAnthropic(model, context, {\n\t\t\t...base,\n\t\t\tthinkingEnabled: true,\n\t\t\teffort,\n\t\t} satisfies AnthropicOptions);\n\t}\n\n\tconst adjusted = adjustMaxTokensForThinking(\n\t\tbase.maxTokens || 0,\n\t\tmodel.maxTokens,\n\t\toptions.reasoning,\n\t\toptions.thinkingBudgets,\n\t);\n\n\treturn streamAnthropic(model, context, {\n\t\t...base,\n\t\tmaxTokens: adjusted.maxTokens,\n\t\tthinkingEnabled: true,\n\t\tthinkingBudgetTokens: adjusted.thinkingBudget,\n\t} satisfies AnthropicOptions);\n};\n"]}
|
|
@@ -12,26 +12,35 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import test, { describe } from "node:test";
|
|
14
14
|
import assert from "node:assert/strict";
|
|
15
|
-
import {
|
|
16
|
-
import { dirname, join } from "node:path";
|
|
17
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
+
import { buildAnthropicClientOptions } from "./anthropic.js";
|
|
18
16
|
import { convertMessages } from "./anthropic-shared.js";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
function anthropicModel(overrides = {}) {
|
|
18
|
+
return {
|
|
19
|
+
id: "claude-sonnet-4",
|
|
20
|
+
name: "Claude Sonnet 4",
|
|
21
|
+
api: "anthropic-messages",
|
|
22
|
+
provider: "anthropic",
|
|
23
|
+
baseUrl: "https://api.anthropic.com",
|
|
24
|
+
reasoning: true,
|
|
25
|
+
input: ["text"],
|
|
26
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
27
|
+
contextWindow: 200000,
|
|
28
|
+
maxTokens: 8192,
|
|
29
|
+
...overrides,
|
|
30
|
+
};
|
|
25
31
|
}
|
|
26
|
-
const source = readFileSync(resolveSourcePath("anthropic.ts"), "utf-8");
|
|
27
32
|
describe("MiniMax fine-grained-tool-streaming exclusion (#4538)", () => {
|
|
28
33
|
test("minimax is excluded from fine-grained-tool-streaming-2025-05-14 beta", () => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
assert.match(source, /skipBetaHeaders.*minimax/s, "minimax must be included in skipBetaHeaders to suppress fine-grained-tool-streaming");
|
|
34
|
+
const options = buildAnthropicClientOptions(anthropicModel({ provider: "minimax" }), "api-key", false);
|
|
35
|
+
assert.equal(options.defaultHeaders["anthropic-beta"], undefined, "minimax must suppress fine-grained-tool-streaming");
|
|
32
36
|
});
|
|
33
37
|
test("minimax-cn is excluded from fine-grained-tool-streaming-2025-05-14 beta", () => {
|
|
34
|
-
|
|
38
|
+
const options = buildAnthropicClientOptions(anthropicModel({ provider: "minimax-cn" }), "api-key", false);
|
|
39
|
+
assert.equal(options.defaultHeaders["anthropic-beta"], undefined, "minimax-cn must suppress fine-grained-tool-streaming");
|
|
40
|
+
});
|
|
41
|
+
test("standard Anthropic-compatible providers keep fine-grained-tool-streaming enabled", () => {
|
|
42
|
+
const options = buildAnthropicClientOptions(anthropicModel(), "api-key", false);
|
|
43
|
+
assert.equal(options.defaultHeaders["anthropic-beta"], "fine-grained-tool-streaming-2025-05-14");
|
|
35
44
|
});
|
|
36
45
|
});
|
|
37
46
|
describe("empty tool name guard in convertMessages (#4538)", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimax-tool-name.test.js","sourceRoot":"","sources":["../../src/providers/minimax-tool-name.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"minimax-tool-name.test.js","sourceRoot":"","sources":["../../src/providers/minimax-tool-name.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Regression tests for MiniMax error 2013 \"function name or parameters is empty\" (#4538).\n *\n * Root cause: the `fine-grained-tool-streaming-2025-05-14` beta header is sent to\n * MiniMax. MiniMax's Anthropic-compatible API implements this beta by streaming the\n * tool name as a delta (empty string in `content_block_start`). The empty name gets\n * stored in conversation history and sent back on the next request, causing MiniMax\n * to return error 2013.\n *\n * Fix: exclude MiniMax (and minimax-cn) from the fine-grained-tool-streaming beta,\n * same as alibaba-coding-plan. Also guard against storing empty tool names.\n */\nimport test, { describe } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { buildAnthropicClientOptions } from \"./anthropic.js\";\nimport { convertMessages } from \"./anthropic-shared.js\";\nimport type { Model } from \"../types.js\";\nimport type { AssistantMessage } from \"../types.js\";\n\nfunction anthropicModel(overrides: Partial<Model<\"anthropic-messages\">> = {}): Model<\"anthropic-messages\"> {\n\treturn {\n\t\tid: \"claude-sonnet-4\",\n\t\tname: \"Claude Sonnet 4\",\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"anthropic\",\n\t\tbaseUrl: \"https://api.anthropic.com\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 8192,\n\t\t...overrides,\n\t};\n}\n\ndescribe(\"MiniMax fine-grained-tool-streaming exclusion (#4538)\", () => {\n\ttest(\"minimax is excluded from fine-grained-tool-streaming-2025-05-14 beta\", () => {\n\t\tconst options = buildAnthropicClientOptions(anthropicModel({ provider: \"minimax\" }), \"api-key\", false);\n\n\t\tassert.equal(\n\t\t\toptions.defaultHeaders[\"anthropic-beta\"],\n\t\t\tundefined,\n\t\t\t\"minimax must suppress fine-grained-tool-streaming\",\n\t\t);\n\t});\n\n\ttest(\"minimax-cn is excluded from fine-grained-tool-streaming-2025-05-14 beta\", () => {\n\t\tconst options = buildAnthropicClientOptions(anthropicModel({ provider: \"minimax-cn\" }), \"api-key\", false);\n\n\t\tassert.equal(\n\t\t\toptions.defaultHeaders[\"anthropic-beta\"],\n\t\t\tundefined,\n\t\t\t\"minimax-cn must suppress fine-grained-tool-streaming\",\n\t\t);\n\t});\n\n\ttest(\"standard Anthropic-compatible providers keep fine-grained-tool-streaming enabled\", () => {\n\t\tconst options = buildAnthropicClientOptions(anthropicModel(), \"api-key\", false);\n\n\t\tassert.equal(options.defaultHeaders[\"anthropic-beta\"], \"fine-grained-tool-streaming-2025-05-14\");\n\t});\n});\n\ndescribe(\"empty tool name guard in convertMessages (#4538)\", () => {\n\t// When fine-grained-tool-streaming causes a tool name to arrive as empty in\n\t// content_block_start, we must not store '' in conversation history.\n\t// convertMessages must skip tool_use blocks with empty/missing names.\n\tconst minimaxModel = {\n\t\tid: \"MiniMax-M2\",\n\t\tapi: \"anthropic-messages\" as const,\n\t\tprovider: \"minimax\" as const,\n\t\tbaseUrl: \"https://api.minimax.io/anthropic\",\n\t\treasoning: true,\n\t\tinput: [\"text\"] as [\"text\"],\n\t\tname: \"MiniMax-M2\",\n\t\tcost: { input: 0.3, output: 1.2, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 196608,\n\t\tmaxTokens: 128000,\n\t};\n\n\ttest(\"tool_use blocks with empty name are dropped from converted messages\", () => {\n\t\tconst assistantMsg: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid: \"toolu_01\",\n\t\t\t\t\tname: \"\", // empty — the bug: fine-grained streaming left name as \"\"\n\t\t\t\t\targuments: { path: \"/foo\" },\n\t\t\t\t},\n\t\t\t],\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tprovider: \"minimax\",\n\t\t\tmodel: \"MiniMax-M2\",\n\t\t\tusage: { input: 1, output: 1, cacheRead: 0, cacheWrite: 0, totalTokens: 2, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },\n\t\t\tstopReason: \"toolUse\",\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tconst messages = [assistantMsg];\n\t\tconst result = convertMessages(messages, minimaxModel, false, undefined);\n\n\t\t// The assistant block with the empty-name toolCall must not appear in the output.\n\t\t// If it does appear, its tool_use name must not be empty.\n\t\tfor (const param of result) {\n\t\t\tif (param.role === \"assistant\" && Array.isArray(param.content)) {\n\t\t\t\tfor (const block of param.content) {\n\t\t\t\t\tif ((block as any).type === \"tool_use\") {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t(block as any).name && (block as any).name.length > 0,\n\t\t\t\t\t\t\t`tool_use block must never have an empty name; got: \"${(block as any).name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n"]}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import { describe, test } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import {
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, normalizeDomain, } from "./github-copilot.js";
|
|
7
|
-
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
8
|
-
const packageRoot = join(__dirname, "..", "..", "..");
|
|
9
|
-
const sourceDir = existsSync(join(__dirname, "github-copilot.ts"))
|
|
10
|
-
? __dirname
|
|
11
|
-
: join(packageRoot, "src", "utils", "oauth");
|
|
12
|
-
function readSourceFile(name) {
|
|
13
|
-
return readFileSync(join(sourceDir, name), "utf-8");
|
|
14
|
-
}
|
|
3
|
+
import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, } from "./github-copilot.js";
|
|
15
4
|
function createModel(overrides = {}) {
|
|
16
5
|
return {
|
|
17
6
|
id: "test-model",
|
|
@@ -163,15 +152,53 @@ describe("GitHub Copilot OAuth — credential regression", () => {
|
|
|
163
152
|
test("module imports successfully", () => {
|
|
164
153
|
assert.ok(githubCopilotOAuthProvider);
|
|
165
154
|
});
|
|
166
|
-
test("
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
155
|
+
test("device login sends the public OAuth client id without a client secret", async (t) => {
|
|
156
|
+
const calls = [];
|
|
157
|
+
const originalFetch = globalThis.fetch;
|
|
158
|
+
t.after(() => {
|
|
159
|
+
globalThis.fetch = originalFetch;
|
|
160
|
+
});
|
|
161
|
+
globalThis.fetch = async (input, init) => {
|
|
162
|
+
const url = String(input);
|
|
163
|
+
calls.push({ url, init: init ?? {} });
|
|
164
|
+
if (url.endsWith("/login/device/code")) {
|
|
165
|
+
return Response.json({
|
|
166
|
+
device_code: "device-code",
|
|
167
|
+
user_code: "ABCD-EFGH",
|
|
168
|
+
verification_uri: "https://github.com/login/device",
|
|
169
|
+
interval: 1,
|
|
170
|
+
expires_in: 600,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (url.endsWith("/login/oauth/access_token")) {
|
|
174
|
+
return Response.json({ access_token: "github-access-token" });
|
|
175
|
+
}
|
|
176
|
+
if (url.endsWith("/copilot_internal/v2/token")) {
|
|
177
|
+
return Response.json({
|
|
178
|
+
token: "tid=123;exp=1234567890;proxy-ep=proxy.individual.githubcopilot.com;",
|
|
179
|
+
expires_at: Math.floor(Date.now() / 1000) + 3600,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (url.endsWith("/models")) {
|
|
183
|
+
return Response.json({ data: [] });
|
|
184
|
+
}
|
|
185
|
+
if (url.includes("/models/") && url.endsWith("/policy")) {
|
|
186
|
+
return Response.json({ ok: true });
|
|
187
|
+
}
|
|
188
|
+
throw new Error(`Unexpected fetch: ${url}`);
|
|
189
|
+
};
|
|
190
|
+
const credentials = await loginGitHubCopilot({
|
|
191
|
+
onPrompt: async () => "",
|
|
192
|
+
onAuth: () => { },
|
|
193
|
+
});
|
|
194
|
+
assert.equal(credentials.access, "tid=123;exp=1234567890;proxy-ep=proxy.individual.githubcopilot.com;");
|
|
195
|
+
const deviceCodeCall = calls.find((call) => call.url.endsWith("/login/device/code"));
|
|
196
|
+
assert.ok(deviceCodeCall, "device-code request should be sent");
|
|
197
|
+
const requestBody = deviceCodeCall.init.body;
|
|
198
|
+
assert.equal(typeof requestBody, "string");
|
|
199
|
+
const body = JSON.parse(requestBody);
|
|
200
|
+
assert.equal(body.client_id, "Iv1.b507a08c87ecfe98");
|
|
201
|
+
assert.equal("client_secret" in body, false, "GitHub device flow must not send a client secret");
|
|
175
202
|
});
|
|
176
203
|
});
|
|
177
204
|
test("githubCopilotOAuthProvider.modifyModels filters unavailable copilot models (#3849)", () => {
|