@evalops/maestro 0.10.23 → 0.10.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/keys.d.ts +2 -5
- package/dist/agent/keys.d.ts.map +1 -1
- package/dist/agent/keys.js +4 -5
- package/dist/agent/keys.js.map +1 -1
- package/dist/agent/modes.d.ts +2 -2
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +6 -7
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +4 -4
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/google.js +1 -1
- package/dist/agent/swarm/executor.d.ts +2 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +208 -35
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +2 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/tool-capability-types.d.ts +36 -0
- package/dist/agent/tool-capability-types.d.ts.map +1 -0
- package/dist/agent/tool-capability-types.js +2 -0
- package/dist/agent/tool-capability-types.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +28 -15
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/agent/transport/transport-utils.d.ts.map +1 -1
- package/dist/agent/transport/transport-utils.js +2 -3
- package/dist/agent/transport/transport-utils.js.map +1 -1
- package/dist/agent/transport.js +1 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/type-guards.d.ts +1 -1
- package/dist/agent/type-guards.js +1 -1
- package/dist/agent/type-guards.js.map +1 -1
- package/dist/agent/types.d.ts +5 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -2
- package/dist/agent/types.js.map +1 -1
- package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
- package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
- package/dist/app-server/daemon-lifecycle-api.js +259 -0
- package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
- package/dist/app-server/external-agent-import-api.d.ts +30 -0
- package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
- package/dist/app-server/external-agent-import-api.js +553 -0
- package/dist/app-server/external-agent-import-api.js.map +1 -0
- package/dist/app-server/host-control-api.d.ts +30 -0
- package/dist/app-server/host-control-api.d.ts.map +1 -0
- package/dist/app-server/host-control-api.js +343 -0
- package/dist/app-server/host-control-api.js.map +1 -0
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.d.ts.map +1 -1
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/network-governance-api.d.ts +26 -0
- package/dist/app-server/network-governance-api.d.ts.map +1 -0
- package/dist/app-server/network-governance-api.js +476 -0
- package/dist/app-server/network-governance-api.js.map +1 -0
- package/dist/app-server/plugin-bundle-api.d.ts +17 -0
- package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
- package/dist/app-server/plugin-bundle-api.js +219 -0
- package/dist/app-server/plugin-bundle-api.js.map +1 -0
- package/dist/app-server/policy-control-api.d.ts +14 -0
- package/dist/app-server/policy-control-api.d.ts.map +1 -0
- package/dist/app-server/policy-control-api.js +200 -0
- package/dist/app-server/policy-control-api.js.map +1 -0
- package/dist/app-server/protocol-modes-api.d.ts +22 -0
- package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
- package/dist/app-server/protocol-modes-api.js +124 -0
- package/dist/app-server/protocol-modes-api.js.map +1 -0
- package/dist/app-server/sandbox-proof-api.d.ts +21 -0
- package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
- package/dist/app-server/sandbox-proof-api.js +127 -0
- package/dist/app-server/sandbox-proof-api.js.map +1 -0
- package/dist/app-server/session-api.d.ts +93 -3
- package/dist/app-server/session-api.d.ts.map +1 -1
- package/dist/app-server/session-api.js +706 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/auth-setup.d.ts.map +1 -1
- package/dist/bootstrap/auth-setup.js +17 -2
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
- package/dist/bootstrap/model-resolution-setup.js +19 -4
- package/dist/bootstrap/model-resolution-setup.js.map +1 -1
- package/dist/cli/args.d.ts +2 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +226 -14
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/anthropic.d.ts +1 -1
- package/dist/cli/commands/anthropic.d.ts.map +1 -1
- package/dist/cli/commands/anthropic.js +3 -68
- package/dist/cli/commands/anthropic.js.map +1 -1
- package/dist/cli/commands/modes.js +1 -1
- package/dist/cli/commands/modes.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -7
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/rpc-mode.d.ts +1 -1
- package/dist/cli/rpc-mode.js +1 -1
- package/dist/cli/rpc-mode.js.map +1 -1
- package/dist/cli/session.js +1 -1
- package/dist/cli/session.js.map +1 -1
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +7 -12
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/custom-editor.d.ts +1 -1
- package/dist/cli-tui/custom-editor.js +2 -2
- package/dist/cli-tui/custom-editor.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +0 -1
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +3 -4
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
- package/dist/cli-tui/tui-renderer.js +2 -2
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
- package/dist/cli-tui/utils/footer-utils.js +1 -1
- package/dist/cli-tui/utils/footer-utils.js.map +1 -1
- package/dist/cli.js +15156 -14232
- package/dist/commands/prompts.d.ts +1 -1
- package/dist/commands/prompts.js +1 -1
- package/dist/commands/prompts.js.map +1 -1
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/toml-config.js +3 -3
- package/dist/config/toml-config.js.map +1 -1
- package/dist/db/client.d.ts +2 -2
- package/dist/db/client.js +2 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +1 -1
- package/dist/db/migrate.js +1 -1
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +2 -2
- package/dist/db/schema.js +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/errors/index.d.ts +2 -2
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/main.d.ts +4 -5
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -14
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +15 -2
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +50 -26
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts.map +1 -1
- package/dist/mcp/fathom-cua.js +10 -0
- package/dist/mcp/fathom-cua.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +32 -1
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +12 -3
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/mcp/tool-capabilities.d.ts +5 -0
- package/dist/mcp/tool-capabilities.d.ts.map +1 -0
- package/dist/mcp/tool-capabilities.js +271 -0
- package/dist/mcp/tool-capabilities.js.map +1 -0
- package/dist/mcp/types.d.ts +6 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/models/config-loader.d.ts +1 -1
- package/dist/models/factory-integration.d.ts +1 -1
- package/dist/models/factory-integration.js +1 -1
- package/dist/models/factory-integration.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/dist/index.js +2 -2
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/connectors.d.ts +2 -2
- package/dist/oauth/connectors.d.ts.map +1 -1
- package/dist/oauth/connectors.js +3 -5
- package/dist/oauth/connectors.js.map +1 -1
- package/dist/oauth/github-copilot.d.ts +1 -1
- package/dist/oauth/github-copilot.js +1 -1
- package/dist/oauth/github-copilot.js.map +1 -1
- package/dist/oauth/index.d.ts +10 -8
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +54 -31
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/openai.d.ts +1 -1
- package/dist/oauth/openai.js +2 -2
- package/dist/oauth/openai.js.map +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +41 -0
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
- package/dist/platform/a2a-completion-audit.js +177 -0
- package/dist/platform/a2a-completion-audit.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +17 -0
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
- package/dist/platform/a2a-telemetry-inspect.js +224 -0
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
- package/dist/platform/agent-registry-client.d.ts +8 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -1
- package/dist/platform/agent-registry-client.js +9 -1
- package/dist/platform/agent-registry-client.js.map +1 -1
- package/dist/providers/api-keys.d.ts +2 -2
- package/dist/providers/api-keys.js +2 -2
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts +3 -6
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +1 -40
- package/dist/providers/auth.js.map +1 -1
- package/dist/rpc/index.d.ts +2 -2
- package/dist/rpc/index.js +2 -2
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/rpc-types.d.ts +1 -1
- package/dist/rpc/rpc-types.js +1 -1
- package/dist/rpc/rpc-types.js.map +1 -1
- package/dist/safety/nested-agent-guard.js +1 -1
- package/dist/safety/nested-agent-guard.js.map +1 -1
- package/dist/safety/policy.d.ts +2 -2
- package/dist/safety/policy.js +2 -2
- package/dist/safety/policy.js.map +1 -1
- package/dist/safety/validators/network-policy-validator.d.ts +8 -0
- package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
- package/dist/safety/validators/network-policy-validator.js +29 -4
- package/dist/safety/validators/network-policy-validator.js.map +1 -1
- package/dist/sandbox/local-sandbox.d.ts +1 -1
- package/dist/sandbox/local-sandbox.js +1 -1
- package/dist/sandbox/local-sandbox.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/attachments.d.ts.map +1 -1
- package/dist/server/handlers/attachments.js +1 -0
- package/dist/server/handlers/attachments.js.map +1 -1
- package/dist/server/handlers/models.d.ts.map +1 -1
- package/dist/server/handlers/models.js +3 -1
- package/dist/server/handlers/models.js.map +1 -1
- package/dist/server/handlers/session-attachments.d.ts.map +1 -1
- package/dist/server/handlers/session-attachments.js +2 -0
- package/dist/server/handlers/session-attachments.js.map +1 -1
- package/dist/server/handlers/sessions.js +1 -1
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/handlers/status.d.ts +2 -0
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +3 -2
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +32 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-session-manager.d.ts +2 -0
- package/dist/server/hosted-session-manager.d.ts.map +1 -1
- package/dist/server/hosted-session-manager.js +9 -0
- package/dist/server/hosted-session-manager.js.map +1 -1
- package/dist/server/model-selection.d.ts.map +1 -1
- package/dist/server/model-selection.js +9 -1
- package/dist/server/model-selection.js.map +1 -1
- package/dist/server/rate-limiter.d.ts +1 -1
- package/dist/server/rate-limiter.js +1 -1
- package/dist/server/rate-limiter.js.map +1 -1
- package/dist/server/router.d.ts +2 -2
- package/dist/server/router.js.map +1 -1
- package/dist/server/session-serialization.d.ts +9 -9
- package/dist/server/session-serialization.js +15 -15
- package/dist/server/session-serialization.js.map +1 -1
- package/dist/session/manager.d.ts +5 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +56 -8
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-catalog.d.ts +2 -0
- package/dist/session/session-catalog.d.ts.map +1 -1
- package/dist/session/session-catalog.js +6 -0
- package/dist/session/session-catalog.js.map +1 -1
- package/dist/session/session-context.d.ts +2 -0
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +15 -0
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.generated.d.ts +1 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -1
- package/dist/session/wire-format.generated.js +1 -0
- package/dist/session/wire-format.generated.js.map +1 -1
- package/dist/shared-memory/contract.d.ts +4 -4
- package/dist/shared-memory/contract.js +2 -2
- package/dist/shared-memory/contract.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +57 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +59 -1
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +24 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/telemetry/mcp-beacon.d.ts +2 -0
- package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
- package/dist/telemetry/mcp-beacon.js +15 -0
- package/dist/telemetry/mcp-beacon.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +62 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +84 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry.d.ts +44 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +84 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/theme/theme-loader.js +2 -2
- package/dist/theme/theme-loader.js.map +1 -1
- package/dist/theme/theme-schema.json +2 -2
- package/dist/theme/theme.d.ts +1 -1
- package/dist/theme/theme.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/tools/extract-document.d.ts +1 -0
- package/dist/tools/extract-document.d.ts.map +1 -1
- package/dist/tools/extract-document.js +2 -1
- package/dist/tools/extract-document.js.map +1 -1
- package/dist/tools/index.d.ts +55 -55
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tool-dsl.d.ts +1 -1
- package/dist/tools/tool-dsl.js +1 -1
- package/dist/tools/tool-dsl.js.map +1 -1
- package/dist/utils/document-extractor.d.ts +1 -0
- package/dist/utils/document-extractor.d.ts.map +1 -1
- package/dist/utils/document-extractor.js +320 -40
- package/dist/utils/document-extractor.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +12 -8
- package/dist/web-server.js.map +1 -1
- package/package.json +4 -2
- package/dist/oauth/anthropic.d.ts +0 -17
- package/dist/oauth/anthropic.d.ts.map +0 -1
- package/dist/oauth/anthropic.js +0 -81
- package/dist/oauth/anthropic.js.map +0 -1
- package/dist/providers/anthropic-auth.d.ts +0 -75
- package/dist/providers/anthropic-auth.d.ts.map +0 -1
- package/dist/providers/anthropic-auth.js +0 -221
- package/dist/providers/anthropic-auth.js.map +0 -1
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Anthropic OAuth Authentication
|
|
3
|
-
*
|
|
4
|
-
* This module implements OAuth 2.0 with PKCE for authenticating with
|
|
5
|
-
* Anthropic's Claude API. It supports both claude.ai (Pro) and
|
|
6
|
-
* console.anthropic.com (Console) login modes.
|
|
7
|
-
*
|
|
8
|
-
* ## Authentication Flow
|
|
9
|
-
*
|
|
10
|
-
* ```
|
|
11
|
-
* ┌─────────────────────────────────────────────────────────────┐
|
|
12
|
-
* │ Anthropic OAuth Flow │
|
|
13
|
-
* ├─────────────────────────────────────────────────────────────┤
|
|
14
|
-
* │ 1. Generate PKCE challenge (verifier + challenge) │
|
|
15
|
-
* │ 2. Generate login URL → User opens in browser │
|
|
16
|
-
* │ 3. User authenticates at claude.ai or console.anthropic.com│
|
|
17
|
-
* │ 4. Receive authorization code from redirect │
|
|
18
|
-
* │ 5. Exchange code + verifier for access/refresh tokens │
|
|
19
|
-
* │ 6. Store credentials in ~/.maestro/anthropic-oauth.json │
|
|
20
|
-
* │ 7. Auto-refresh tokens when they expire │
|
|
21
|
-
* └─────────────────────────────────────────────────────────────┘
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* ## Login Modes
|
|
25
|
-
*
|
|
26
|
-
* | Mode | Host | Description |
|
|
27
|
-
* |---------|-------------------------|--------------------------|
|
|
28
|
-
* | pro | claude.ai | Claude Pro subscriptions |
|
|
29
|
-
* | console | console.anthropic.com | API Console access |
|
|
30
|
-
*
|
|
31
|
-
* ## Token Storage
|
|
32
|
-
*
|
|
33
|
-
* Credentials are stored at:
|
|
34
|
-
* - Default: `~/.maestro/anthropic-oauth.json`
|
|
35
|
-
* - Custom: `$ANTHROPIC_OAUTH_FILE`
|
|
36
|
-
*
|
|
37
|
-
* File is created with mode 0o600 (owner read/write only).
|
|
38
|
-
*
|
|
39
|
-
* ## Key Functions
|
|
40
|
-
*
|
|
41
|
-
* - `generateAnthropicLoginUrl()`: Create OAuth URL for browser
|
|
42
|
-
* - `exchangeAnthropicAuthorizationCode()`: Exchange code for tokens
|
|
43
|
-
* - `getFreshAnthropicOAuthCredential()`: Get valid token (auto-refresh)
|
|
44
|
-
* - `fetchClaudeApiKey()`: Convert OAuth token to API key
|
|
45
|
-
*
|
|
46
|
-
* @module providers/anthropic-auth
|
|
47
|
-
*/
|
|
48
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
49
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
50
|
-
import { rm } from "node:fs/promises";
|
|
51
|
-
import { dirname, join, resolve } from "node:path";
|
|
52
|
-
import { getAgentDir } from "../config/constants.js";
|
|
53
|
-
import { safeJsonParse } from "../utils/json.js";
|
|
54
|
-
import { fetchOAuthHttp } from "../utils/oauth-http.js";
|
|
55
|
-
const CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
56
|
-
const ANTHROPIC_OAUTH_SERVICE_NAME = "Anthropic OAuth service";
|
|
57
|
-
const CLAUDE_LOGIN_HOST = {
|
|
58
|
-
pro: "claude.ai",
|
|
59
|
-
console: "console.anthropic.com",
|
|
60
|
-
};
|
|
61
|
-
const DEFAULT_BASE_DIR = resolve(getAgentDir(), "..");
|
|
62
|
-
const AUTH_FILE = resolve(process.env.ANTHROPIC_OAUTH_FILE ??
|
|
63
|
-
join(DEFAULT_BASE_DIR, "anthropic-oauth.json"));
|
|
64
|
-
export const CLAUDE_CODE_BETA_HEADER = "oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,advanced-tool-use-2025-11-20";
|
|
65
|
-
function toBase64Url(buffer) {
|
|
66
|
-
return buffer
|
|
67
|
-
.toString("base64")
|
|
68
|
-
.replace(/\+/g, "-")
|
|
69
|
-
.replace(/\//g, "_")
|
|
70
|
-
.replace(/=+$/g, "");
|
|
71
|
-
}
|
|
72
|
-
async function generatePKCE() {
|
|
73
|
-
const verifier = toBase64Url(randomBytes(32));
|
|
74
|
-
const challenge = toBase64Url(createHash("sha256").update(verifier).digest());
|
|
75
|
-
return { verifier, challenge };
|
|
76
|
-
}
|
|
77
|
-
function ensureAuthDir() {
|
|
78
|
-
mkdirSync(dirname(AUTH_FILE), { recursive: true });
|
|
79
|
-
}
|
|
80
|
-
export async function getStoredAnthropicOAuthCredential() {
|
|
81
|
-
try {
|
|
82
|
-
const contents = readFileSync(AUTH_FILE, "utf8");
|
|
83
|
-
const result = safeJsonParse(contents, "Anthropic auth credentials");
|
|
84
|
-
if (!result.success) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
const parsed = result.data;
|
|
88
|
-
if (typeof parsed.accessToken === "string" &&
|
|
89
|
-
typeof parsed.refreshToken === "string" &&
|
|
90
|
-
typeof parsed.expiresAt === "number") {
|
|
91
|
-
return {
|
|
92
|
-
accessToken: parsed.accessToken,
|
|
93
|
-
refreshToken: parsed.refreshToken,
|
|
94
|
-
expiresAt: parsed.expiresAt,
|
|
95
|
-
mode: parsed.mode === "console" ? "console" : "pro",
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export async function saveAnthropicOAuthCredential(credential) {
|
|
105
|
-
ensureAuthDir();
|
|
106
|
-
writeFileSync(AUTH_FILE, JSON.stringify(credential, null, 2), {
|
|
107
|
-
encoding: "utf8",
|
|
108
|
-
mode: 0o600,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
export async function deleteAnthropicOAuthCredential() {
|
|
112
|
-
try {
|
|
113
|
-
await rm(AUTH_FILE);
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
// ignore when file does not exist
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
export async function getFreshAnthropicOAuthCredential() {
|
|
120
|
-
const stored = await getStoredAnthropicOAuthCredential();
|
|
121
|
-
if (!stored) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
if (stored.expiresAt - Date.now() > 60_000) {
|
|
125
|
-
return stored;
|
|
126
|
-
}
|
|
127
|
-
const refreshed = await refreshAnthropicOAuthToken(stored.refreshToken);
|
|
128
|
-
if (!refreshed) {
|
|
129
|
-
await deleteAnthropicOAuthCredential();
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
const next = {
|
|
133
|
-
...stored,
|
|
134
|
-
accessToken: refreshed.accessToken,
|
|
135
|
-
refreshToken: refreshed.refreshToken ?? stored.refreshToken,
|
|
136
|
-
expiresAt: refreshed.expiresAt,
|
|
137
|
-
};
|
|
138
|
-
await saveAnthropicOAuthCredential(next);
|
|
139
|
-
return next;
|
|
140
|
-
}
|
|
141
|
-
export async function generateAnthropicLoginUrl(mode = "pro") {
|
|
142
|
-
const pkce = await generatePKCE();
|
|
143
|
-
const base = new URL(`https://${CLAUDE_LOGIN_HOST[mode]}/oauth/authorize`, `https://${CLAUDE_LOGIN_HOST[mode]}`);
|
|
144
|
-
base.searchParams.set("code", "true");
|
|
145
|
-
base.searchParams.set("client_id", CLIENT_ID);
|
|
146
|
-
base.searchParams.set("response_type", "code");
|
|
147
|
-
base.searchParams.set("redirect_uri", "https://console.anthropic.com/oauth/code/callback");
|
|
148
|
-
base.searchParams.set("scope", "org:create_api_key user:profile user:inference");
|
|
149
|
-
base.searchParams.set("code_challenge", pkce.challenge);
|
|
150
|
-
base.searchParams.set("code_challenge_method", "S256");
|
|
151
|
-
base.searchParams.set("state", pkce.verifier);
|
|
152
|
-
return { url: base.toString(), verifier: pkce.verifier };
|
|
153
|
-
}
|
|
154
|
-
export async function exchangeAnthropicAuthorizationCode(code, verifier) {
|
|
155
|
-
const [actualCode, state] = code.trim().split("#");
|
|
156
|
-
if (!actualCode || !state) {
|
|
157
|
-
return null;
|
|
158
|
-
}
|
|
159
|
-
const response = await fetchOAuthHttp("https://console.anthropic.com/v1/oauth/token", {
|
|
160
|
-
method: "POST",
|
|
161
|
-
headers: { "Content-Type": "application/json" },
|
|
162
|
-
body: JSON.stringify({
|
|
163
|
-
code: actualCode,
|
|
164
|
-
state,
|
|
165
|
-
grant_type: "authorization_code",
|
|
166
|
-
client_id: CLIENT_ID,
|
|
167
|
-
redirect_uri: "https://console.anthropic.com/oauth/code/callback",
|
|
168
|
-
code_verifier: verifier,
|
|
169
|
-
}),
|
|
170
|
-
}, { serviceName: ANTHROPIC_OAUTH_SERVICE_NAME });
|
|
171
|
-
if (!response.ok) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
const payload = (await response.json());
|
|
175
|
-
if (!payload.access_token || !payload.refresh_token) {
|
|
176
|
-
return null;
|
|
177
|
-
}
|
|
178
|
-
return {
|
|
179
|
-
accessToken: payload.access_token,
|
|
180
|
-
refreshToken: payload.refresh_token,
|
|
181
|
-
expiresAt: Date.now() + (payload.expires_in ?? 0) * 1000,
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
export async function refreshAnthropicOAuthToken(refreshToken) {
|
|
185
|
-
const response = await fetchOAuthHttp("https://console.anthropic.com/v1/oauth/token", {
|
|
186
|
-
method: "POST",
|
|
187
|
-
headers: { "Content-Type": "application/json" },
|
|
188
|
-
body: JSON.stringify({
|
|
189
|
-
grant_type: "refresh_token",
|
|
190
|
-
refresh_token: refreshToken,
|
|
191
|
-
client_id: CLIENT_ID,
|
|
192
|
-
}),
|
|
193
|
-
}, { serviceName: ANTHROPIC_OAUTH_SERVICE_NAME });
|
|
194
|
-
if (!response.ok) {
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
const payload = (await response.json());
|
|
198
|
-
if (!payload.access_token) {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
return {
|
|
202
|
-
accessToken: payload.access_token,
|
|
203
|
-
refreshToken: payload.refresh_token,
|
|
204
|
-
expiresAt: Date.now() + (payload.expires_in ?? 0) * 1000,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
export async function fetchClaudeApiKey(accessToken) {
|
|
208
|
-
const response = await fetchOAuthHttp("https://api.anthropic.com/api/oauth/claude_cli/create_api_key", {
|
|
209
|
-
method: "POST",
|
|
210
|
-
headers: {
|
|
211
|
-
"Content-Type": "application/json",
|
|
212
|
-
authorization: `Bearer ${accessToken}`,
|
|
213
|
-
},
|
|
214
|
-
}, { serviceName: ANTHROPIC_OAUTH_SERVICE_NAME });
|
|
215
|
-
if (!response.ok) {
|
|
216
|
-
return null;
|
|
217
|
-
}
|
|
218
|
-
const payload = (await response.json());
|
|
219
|
-
return typeof payload.raw_key === "string" ? payload.raw_key : null;
|
|
220
|
-
}
|
|
221
|
-
//# sourceMappingURL=anthropic-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-auth.js","sourceRoot":"","sources":["../../src/providers/anthropic-auth.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Anthropic OAuth Authentication\n *\n * This module implements OAuth 2.0 with PKCE for authenticating with\n * Anthropic's Claude API. It supports both claude.ai (Pro) and\n * console.anthropic.com (Console) login modes.\n *\n * ## Authentication Flow\n *\n * ```\n * ┌─────────────────────────────────────────────────────────────┐\n * │ Anthropic OAuth Flow │\n * ├─────────────────────────────────────────────────────────────┤\n * │ 1. Generate PKCE challenge (verifier + challenge) │\n * │ 2. Generate login URL → User opens in browser │\n * │ 3. User authenticates at claude.ai or console.anthropic.com│\n * │ 4. Receive authorization code from redirect │\n * │ 5. Exchange code + verifier for access/refresh tokens │\n * │ 6. Store credentials in ~/.maestro/anthropic-oauth.json │\n * │ 7. Auto-refresh tokens when they expire │\n * └─────────────────────────────────────────────────────────────┘\n * ```\n *\n * ## Login Modes\n *\n * | Mode | Host | Description |\n * |---------|-------------------------|--------------------------|\n * | pro | claude.ai | Claude Pro subscriptions |\n * | console | console.anthropic.com | API Console access |\n *\n * ## Token Storage\n *\n * Credentials are stored at:\n * - Default: `~/.maestro/anthropic-oauth.json`\n * - Custom: `$ANTHROPIC_OAUTH_FILE`\n *\n * File is created with mode 0o600 (owner read/write only).\n *\n * ## Key Functions\n *\n * - `generateAnthropicLoginUrl()`: Create OAuth URL for browser\n * - `exchangeAnthropicAuthorizationCode()`: Exchange code for tokens\n * - `getFreshAnthropicOAuthCredential()`: Get valid token (auto-refresh)\n * - `fetchClaudeApiKey()`: Convert OAuth token to API key\n *\n * @module providers/anthropic-auth\n */\n\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { getAgentDir } from \"../config/constants.js\";\nimport { safeJsonParse } from \"../utils/json.js\";\nimport { fetchOAuthHttp } from \"../utils/oauth-http.js\";\n\n// Portions of this module are derived from https://github.com/sst/opencode-anthropic-auth (MIT).\n\nexport type AnthropicLoginMode = \"pro\" | \"console\";\n\nexport interface AnthropicOAuthCredential {\n\taccessToken: string;\n\trefreshToken: string;\n\texpiresAt: number;\n\tmode: AnthropicLoginMode;\n}\n\nconst CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\nconst ANTHROPIC_OAUTH_SERVICE_NAME = \"Anthropic OAuth service\";\n\nconst CLAUDE_LOGIN_HOST: Record<AnthropicLoginMode, string> = {\n\tpro: \"claude.ai\",\n\tconsole: \"console.anthropic.com\",\n};\n\ninterface AnthropicTokenResponse {\n\taccess_token?: string;\n\trefresh_token?: string;\n\texpires_in?: number;\n\terror?: string;\n}\n\ninterface ClaudeApiKeyResponse {\n\traw_key?: string;\n}\n\nconst DEFAULT_BASE_DIR = resolve(getAgentDir(), \"..\");\n\nconst AUTH_FILE = resolve(\n\tprocess.env.ANTHROPIC_OAUTH_FILE ??\n\t\tjoin(DEFAULT_BASE_DIR, \"anthropic-oauth.json\"),\n);\n\nexport const CLAUDE_CODE_BETA_HEADER =\n\t\"oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,advanced-tool-use-2025-11-20\";\n\ninterface PKCEPair {\n\tverifier: string;\n\tchallenge: string;\n}\n\nfunction toBase64Url(buffer: Buffer): string {\n\treturn buffer\n\t\t.toString(\"base64\")\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/g, \"\");\n}\n\nasync function generatePKCE(): Promise<PKCEPair> {\n\tconst verifier = toBase64Url(randomBytes(32));\n\tconst challenge = toBase64Url(createHash(\"sha256\").update(verifier).digest());\n\treturn { verifier, challenge };\n}\n\nfunction ensureAuthDir(): void {\n\tmkdirSync(dirname(AUTH_FILE), { recursive: true });\n}\n\nexport async function getStoredAnthropicOAuthCredential(): Promise<AnthropicOAuthCredential | null> {\n\ttry {\n\t\tconst contents = readFileSync(AUTH_FILE, \"utf8\");\n\t\tconst result = safeJsonParse<{\n\t\t\taccessToken?: unknown;\n\t\t\trefreshToken?: unknown;\n\t\t\texpiresAt?: unknown;\n\t\t\tmode?: unknown;\n\t\t}>(contents, \"Anthropic auth credentials\");\n\n\t\tif (!result.success) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst parsed = result.data;\n\t\tif (\n\t\t\ttypeof parsed.accessToken === \"string\" &&\n\t\t\ttypeof parsed.refreshToken === \"string\" &&\n\t\t\ttypeof parsed.expiresAt === \"number\"\n\t\t) {\n\t\t\treturn {\n\t\t\t\taccessToken: parsed.accessToken,\n\t\t\t\trefreshToken: parsed.refreshToken,\n\t\t\t\texpiresAt: parsed.expiresAt,\n\t\t\t\tmode: parsed.mode === \"console\" ? \"console\" : \"pro\",\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function saveAnthropicOAuthCredential(\n\tcredential: AnthropicOAuthCredential,\n): Promise<void> {\n\tensureAuthDir();\n\twriteFileSync(AUTH_FILE, JSON.stringify(credential, null, 2), {\n\t\tencoding: \"utf8\",\n\t\tmode: 0o600,\n\t});\n}\n\nexport async function deleteAnthropicOAuthCredential(): Promise<void> {\n\ttry {\n\t\tawait rm(AUTH_FILE);\n\t} catch {\n\t\t// ignore when file does not exist\n\t}\n}\n\nexport async function getFreshAnthropicOAuthCredential(): Promise<AnthropicOAuthCredential | null> {\n\tconst stored = await getStoredAnthropicOAuthCredential();\n\tif (!stored) {\n\t\treturn null;\n\t}\n\tif (stored.expiresAt - Date.now() > 60_000) {\n\t\treturn stored;\n\t}\n\tconst refreshed = await refreshAnthropicOAuthToken(stored.refreshToken);\n\tif (!refreshed) {\n\t\tawait deleteAnthropicOAuthCredential();\n\t\treturn null;\n\t}\n\tconst next: AnthropicOAuthCredential = {\n\t\t...stored,\n\t\taccessToken: refreshed.accessToken,\n\t\trefreshToken: refreshed.refreshToken ?? stored.refreshToken,\n\t\texpiresAt: refreshed.expiresAt,\n\t};\n\tawait saveAnthropicOAuthCredential(next);\n\treturn next;\n}\n\nexport async function generateAnthropicLoginUrl(\n\tmode: AnthropicLoginMode = \"pro\",\n) {\n\tconst pkce = await generatePKCE();\n\tconst base = new URL(\n\t\t`https://${CLAUDE_LOGIN_HOST[mode]}/oauth/authorize`,\n\t\t`https://${CLAUDE_LOGIN_HOST[mode]}`,\n\t);\n\tbase.searchParams.set(\"code\", \"true\");\n\tbase.searchParams.set(\"client_id\", CLIENT_ID);\n\tbase.searchParams.set(\"response_type\", \"code\");\n\tbase.searchParams.set(\n\t\t\"redirect_uri\",\n\t\t\"https://console.anthropic.com/oauth/code/callback\",\n\t);\n\tbase.searchParams.set(\n\t\t\"scope\",\n\t\t\"org:create_api_key user:profile user:inference\",\n\t);\n\tbase.searchParams.set(\"code_challenge\", pkce.challenge);\n\tbase.searchParams.set(\"code_challenge_method\", \"S256\");\n\tbase.searchParams.set(\"state\", pkce.verifier);\n\treturn { url: base.toString(), verifier: pkce.verifier };\n}\n\nexport async function exchangeAnthropicAuthorizationCode(\n\tcode: string,\n\tverifier: string,\n): Promise<{\n\taccessToken: string;\n\trefreshToken: string;\n\texpiresAt: number;\n} | null> {\n\tconst [actualCode, state] = code.trim().split(\"#\");\n\tif (!actualCode || !state) {\n\t\treturn null;\n\t}\n\tconst response = await fetchOAuthHttp(\n\t\t\"https://console.anthropic.com/v1/oauth/token\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({\n\t\t\t\tcode: actualCode,\n\t\t\t\tstate,\n\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\tredirect_uri: \"https://console.anthropic.com/oauth/code/callback\",\n\t\t\t\tcode_verifier: verifier,\n\t\t\t}),\n\t\t},\n\t\t{ serviceName: ANTHROPIC_OAUTH_SERVICE_NAME },\n\t);\n\tif (!response.ok) {\n\t\treturn null;\n\t}\n\tconst payload = (await response.json()) as AnthropicTokenResponse;\n\tif (!payload.access_token || !payload.refresh_token) {\n\t\treturn null;\n\t}\n\treturn {\n\t\taccessToken: payload.access_token,\n\t\trefreshToken: payload.refresh_token,\n\t\texpiresAt: Date.now() + (payload.expires_in ?? 0) * 1000,\n\t};\n}\n\nexport async function refreshAnthropicOAuthToken(\n\trefreshToken: string,\n): Promise<{\n\taccessToken: string;\n\trefreshToken?: string;\n\texpiresAt: number;\n} | null> {\n\tconst response = await fetchOAuthHttp(\n\t\t\"https://console.anthropic.com/v1/oauth/token\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify({\n\t\t\t\tgrant_type: \"refresh_token\",\n\t\t\t\trefresh_token: refreshToken,\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t}),\n\t\t},\n\t\t{ serviceName: ANTHROPIC_OAUTH_SERVICE_NAME },\n\t);\n\tif (!response.ok) {\n\t\treturn null;\n\t}\n\tconst payload = (await response.json()) as AnthropicTokenResponse;\n\tif (!payload.access_token) {\n\t\treturn null;\n\t}\n\treturn {\n\t\taccessToken: payload.access_token,\n\t\trefreshToken: payload.refresh_token,\n\t\texpiresAt: Date.now() + (payload.expires_in ?? 0) * 1000,\n\t};\n}\n\nexport async function fetchClaudeApiKey(\n\taccessToken: string,\n): Promise<string | null> {\n\tconst response = await fetchOAuthHttp(\n\t\t\"https://api.anthropic.com/api/oauth/claude_cli/create_api_key\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tauthorization: `Bearer ${accessToken}`,\n\t\t\t},\n\t\t},\n\t\t{ serviceName: ANTHROPIC_OAUTH_SERVICE_NAME },\n\t);\n\tif (!response.ok) {\n\t\treturn null;\n\t}\n\tconst payload = (await response.json()) as ClaudeApiKeyResponse;\n\treturn typeof payload.raw_key === \"string\" ? payload.raw_key : null;\n}\n"]}
|