@evalops/maestro 0.10.22 → 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 +15171 -14298
- 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/artifacts.d.ts +58 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +3 -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/dist/runtime-app-server.d.ts +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
- 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-artifacts.d.ts.map +1 -1
- package/dist/server/handlers/session-artifacts.js +13 -74
- package/dist/server/handlers/session-artifacts.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
package/dist/oauth/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { assertEvalOpsManagedGatewayEnabled, isEvalOpsManagedGatewayEnabled, } from "../providers/evalops-managed.js";
|
|
2
2
|
import { createLogger } from "../utils/logger.js";
|
|
3
|
-
import { loginAnthropic, migrateAnthropicCredentials, refreshAnthropicToken, } from "./anthropic.js";
|
|
4
3
|
import { revokeOAuthProviderConnection, syncOAuthProviderConnection, syncStoredOAuthProviderConnection, } from "./connectors.js";
|
|
5
4
|
import { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken, loginEvalOps, refreshEvalOpsToken, revokeEvalOpsToken, } from "./evalops.js";
|
|
6
5
|
import { loginGitHubCopilot, migrateGitHubCopilotCredentials, refreshGitHubCopilotToken, } from "./github-copilot.js";
|
|
@@ -10,26 +9,33 @@ import { loginOpenAICodex, refreshOpenAICodexToken } from "./openai-codex.js";
|
|
|
10
9
|
import { loginOpenAI, migrateOpenAICredentials, refreshOpenAIToken, } from "./openai.js";
|
|
11
10
|
import { listOAuthProviders as listOAuthProvidersFromStorage, loadOAuthCredentials, removeOAuthCredentials, saveOAuthCredentials, } from "./storage.js";
|
|
12
11
|
const logger = createLogger("oauth");
|
|
13
|
-
// Re-export for convenience
|
|
14
|
-
export { listOAuthProvidersFromStorage as listOAuthProviders };
|
|
15
12
|
export { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken };
|
|
13
|
+
const SUPPORTED_OAUTH_PROVIDERS = new Set([
|
|
14
|
+
"evalops",
|
|
15
|
+
"openai",
|
|
16
|
+
"openai-codex",
|
|
17
|
+
"github-copilot",
|
|
18
|
+
"google-gemini-cli",
|
|
19
|
+
"google-antigravity",
|
|
20
|
+
]);
|
|
21
|
+
const LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS = new Set(["anthropic"]);
|
|
22
|
+
function isSupportedOAuthProvider(provider) {
|
|
23
|
+
return SUPPORTED_OAUTH_PROVIDERS.has(provider);
|
|
24
|
+
}
|
|
25
|
+
function isLegacyLogoutOnlyOAuthProvider(provider) {
|
|
26
|
+
return LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS.has(provider);
|
|
27
|
+
}
|
|
16
28
|
/**
|
|
17
29
|
* Get list of OAuth providers
|
|
18
30
|
*/
|
|
19
31
|
export function getOAuthProviders() {
|
|
20
32
|
return [
|
|
21
33
|
{
|
|
22
|
-
id: "
|
|
23
|
-
name: "
|
|
24
|
-
description: "
|
|
34
|
+
id: "openai-codex",
|
|
35
|
+
name: "OpenAI Codex",
|
|
36
|
+
description: "Codex with ChatGPT Plus/Pro login",
|
|
25
37
|
available: true,
|
|
26
38
|
},
|
|
27
|
-
{
|
|
28
|
-
id: "evalops",
|
|
29
|
-
name: "EvalOps Managed",
|
|
30
|
-
description: "Identity-backed managed gateway access",
|
|
31
|
-
available: isEvalOpsManagedGatewayEnabled(),
|
|
32
|
-
},
|
|
33
39
|
{
|
|
34
40
|
id: "openai",
|
|
35
41
|
name: "OpenAI",
|
|
@@ -37,10 +43,10 @@ export function getOAuthProviders() {
|
|
|
37
43
|
available: true,
|
|
38
44
|
},
|
|
39
45
|
{
|
|
40
|
-
id: "
|
|
41
|
-
name: "
|
|
42
|
-
description: "
|
|
43
|
-
available:
|
|
46
|
+
id: "evalops",
|
|
47
|
+
name: "EvalOps Managed",
|
|
48
|
+
description: "Identity-backed managed gateway access",
|
|
49
|
+
available: isEvalOpsManagedGatewayEnabled(),
|
|
44
50
|
},
|
|
45
51
|
{
|
|
46
52
|
id: "google-gemini-cli",
|
|
@@ -62,10 +68,34 @@ export function getOAuthProviders() {
|
|
|
62
68
|
},
|
|
63
69
|
];
|
|
64
70
|
}
|
|
71
|
+
export function listOAuthProviders() {
|
|
72
|
+
return listOAuthProvidersFromStorage().filter((provider) => isSupportedOAuthProvider(provider));
|
|
73
|
+
}
|
|
74
|
+
export function listOAuthLogoutProviders() {
|
|
75
|
+
return listOAuthProvidersFromStorage().filter((provider) => isSupportedOAuthProvider(provider) ||
|
|
76
|
+
isLegacyLogoutOnlyOAuthProvider(provider));
|
|
77
|
+
}
|
|
78
|
+
export function getOAuthLogoutProviders() {
|
|
79
|
+
const loggedInProviders = new Set(listOAuthLogoutProviders());
|
|
80
|
+
const supported = getOAuthProviders().filter((provider) => loggedInProviders.has(provider.id));
|
|
81
|
+
const legacy = [];
|
|
82
|
+
if (loggedInProviders.has("anthropic")) {
|
|
83
|
+
legacy.push({
|
|
84
|
+
id: "anthropic",
|
|
85
|
+
name: "Anthropic OAuth",
|
|
86
|
+
description: "Legacy Anthropic OAuth credentials (logout only)",
|
|
87
|
+
available: true,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return [...supported, ...legacy];
|
|
91
|
+
}
|
|
65
92
|
/**
|
|
66
93
|
* Check if a provider has OAuth credentials stored
|
|
67
94
|
*/
|
|
68
95
|
export function hasOAuthCredentials(provider) {
|
|
96
|
+
if (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
69
99
|
return loadOAuthCredentials(provider) !== null;
|
|
70
100
|
}
|
|
71
101
|
/**
|
|
@@ -74,13 +104,6 @@ export function hasOAuthCredentials(provider) {
|
|
|
74
104
|
export async function login(provider, options) {
|
|
75
105
|
let shouldSyncConnectorConnection = false;
|
|
76
106
|
switch (provider) {
|
|
77
|
-
case "anthropic":
|
|
78
|
-
if (!options.onPromptCode) {
|
|
79
|
-
throw new Error("Anthropic login requires onPromptCode callback for auth code input");
|
|
80
|
-
}
|
|
81
|
-
await loginAnthropic(options.mode ?? "pro", options.onAuthUrl, options.onPromptCode);
|
|
82
|
-
shouldSyncConnectorConnection = true;
|
|
83
|
-
break;
|
|
84
107
|
case "openai":
|
|
85
108
|
await loginOpenAI(options.onAuthUrl, options.onStatus);
|
|
86
109
|
shouldSyncConnectorConnection = true;
|
|
@@ -120,6 +143,11 @@ export async function login(provider, options) {
|
|
|
120
143
|
*/
|
|
121
144
|
export async function logout(provider) {
|
|
122
145
|
const credentials = loadOAuthCredentials(provider);
|
|
146
|
+
if (isLegacyLogoutOnlyOAuthProvider(provider)) {
|
|
147
|
+
await revokeOAuthProviderConnection(provider, credentials);
|
|
148
|
+
removeOAuthCredentials(provider);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
123
151
|
if (provider === "evalops" && credentials?.refresh) {
|
|
124
152
|
try {
|
|
125
153
|
await revokeEvalOpsToken(credentials.refresh, credentials.metadata);
|
|
@@ -146,9 +174,6 @@ export async function refreshToken(provider) {
|
|
|
146
174
|
}
|
|
147
175
|
let newCredentials;
|
|
148
176
|
switch (provider) {
|
|
149
|
-
case "anthropic":
|
|
150
|
-
newCredentials = await refreshAnthropicToken(credentials.refresh, credentials.metadata);
|
|
151
|
-
break;
|
|
152
177
|
case "openai":
|
|
153
178
|
newCredentials = await refreshOpenAIToken(credentials.refresh, credentials.metadata);
|
|
154
179
|
break;
|
|
@@ -181,6 +206,9 @@ export async function refreshToken(provider) {
|
|
|
181
206
|
* Get OAuth token for provider (auto-refreshes if expired)
|
|
182
207
|
*/
|
|
183
208
|
export async function getOAuthToken(provider) {
|
|
209
|
+
if (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
184
212
|
const credentials = loadOAuthCredentials(provider);
|
|
185
213
|
if (!credentials) {
|
|
186
214
|
return null;
|
|
@@ -204,11 +232,6 @@ export async function getOAuthToken(provider) {
|
|
|
204
232
|
* Migrate old provider-specific OAuth credentials to new generic format
|
|
205
233
|
*/
|
|
206
234
|
export async function migrateOAuthCredentials() {
|
|
207
|
-
// Migrate Anthropic credentials
|
|
208
|
-
const anthropicMigrated = await migrateAnthropicCredentials();
|
|
209
|
-
if (anthropicMigrated) {
|
|
210
|
-
logger.info("Migrated Anthropic OAuth credentials to new format");
|
|
211
|
-
}
|
|
212
235
|
// Migrate OpenAI credentials
|
|
213
236
|
const openaiMigrated = await migrateOpenAICredentials();
|
|
214
237
|
if (openaiMigrated) {
|
package/dist/oauth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnthropicLoginMode } from \"../providers/anthropic-auth.js\";\nimport {\n\tassertEvalOpsManagedGatewayEnabled,\n\tisEvalOpsManagedGatewayEnabled,\n} from \"../providers/evalops-managed.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\tloginAnthropic,\n\tmigrateAnthropicCredentials,\n\trefreshAnthropicToken,\n} from \"./anthropic.js\";\nimport {\n\trevokeOAuthProviderConnection,\n\tsyncOAuthProviderConnection,\n\tsyncStoredOAuthProviderConnection,\n} from \"./connectors.js\";\nimport {\n\tbuildEvalOpsDelegationEnvironment,\n\tissueEvalOpsDelegationToken,\n\tloginEvalOps,\n\trefreshEvalOpsToken,\n\trevokeEvalOpsToken,\n} from \"./evalops.js\";\nimport {\n\tloginGitHubCopilot,\n\tmigrateGitHubCopilotCredentials,\n\trefreshGitHubCopilotToken,\n} from \"./github-copilot.js\";\nimport {\n\tloginGoogleAntigravity,\n\trefreshGoogleAntigravityToken,\n} from \"./google-antigravity.js\";\nimport {\n\tloginGoogleGeminiCli,\n\trefreshGoogleGeminiCliToken,\n} from \"./google-gemini-cli.js\";\nimport { loginOpenAICodex, refreshOpenAICodexToken } from \"./openai-codex.js\";\nimport {\n\tloginOpenAI,\n\tmigrateOpenAICredentials,\n\trefreshOpenAIToken,\n} from \"./openai.js\";\nimport {\n\ttype OAuthCredentials,\n\tlistOAuthProviders as listOAuthProvidersFromStorage,\n\tloadOAuthCredentials,\n\tremoveOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth\");\n\n// Re-export for convenience\nexport { listOAuthProvidersFromStorage as listOAuthProviders };\nexport type { OAuthCredentials } from \"./storage.js\";\nexport { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken };\n\nexport type SupportedOAuthProvider =\n\t| \"anthropic\"\n\t| \"evalops\"\n\t| \"openai\"\n\t| \"openai-codex\"\n\t| \"github-copilot\"\n\t| \"google-gemini-cli\"\n\t| \"google-antigravity\";\n\nexport interface OAuthProviderInfo {\n\tid: SupportedOAuthProvider;\n\tname: string;\n\tdescription: string;\n\tavailable: boolean;\n}\n\n/**\n * Get list of OAuth providers\n */\nexport function getOAuthProviders(): OAuthProviderInfo[] {\n\treturn [\n\t\t{\n\t\t\tid: \"anthropic\",\n\t\t\tname: \"Anthropic\",\n\t\t\tdescription: \"Claude Pro/Max subscription\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"evalops\",\n\t\t\tname: \"EvalOps Managed\",\n\t\t\tdescription: \"Identity-backed managed gateway access\",\n\t\t\tavailable: isEvalOpsManagedGatewayEnabled(),\n\t\t},\n\t\t{\n\t\t\tid: \"openai\",\n\t\t\tname: \"OpenAI\",\n\t\t\tdescription: \"OpenAI Platform API via ChatGPT login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"openai-codex\",\n\t\t\tname: \"OpenAI Codex\",\n\t\t\tdescription: \"Codex with ChatGPT Plus/Pro login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"google-gemini-cli\",\n\t\t\tname: \"Google Gemini CLI\",\n\t\t\tdescription: \"Cloud Code Assist OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"google-antigravity\",\n\t\t\tname: \"Google Antigravity\",\n\t\t\tdescription: \"Antigravity sandbox OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"github-copilot\",\n\t\t\tname: \"GitHub Copilot\",\n\t\t\tdescription: \"GitHub Copilot subscription\",\n\t\t\tavailable: true,\n\t\t},\n\t];\n}\n\n/**\n * Check if a provider has OAuth credentials stored\n */\nexport function hasOAuthCredentials(provider: SupportedOAuthProvider): boolean {\n\treturn loadOAuthCredentials(provider) !== null;\n}\n\n/**\n * Login with OAuth provider\n */\nexport async function login(\n\tprovider: SupportedOAuthProvider,\n\toptions: {\n\t\tmode?: AnthropicLoginMode;\n\t\tonAuthUrl: (url: string) => void;\n\t\tonPromptCode?: () => Promise<string>;\n\t\tonStatus?: (status: string) => void;\n\t\tonDeviceCode?: (code: string, verificationUri: string) => void;\n\t},\n): Promise<void> {\n\tlet shouldSyncConnectorConnection = false;\n\tswitch (provider) {\n\t\tcase \"anthropic\":\n\t\t\tif (!options.onPromptCode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Anthropic login requires onPromptCode callback for auth code input\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait loginAnthropic(\n\t\t\t\toptions.mode ?? \"pro\",\n\t\t\t\toptions.onAuthUrl,\n\t\t\t\toptions.onPromptCode,\n\t\t\t);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"openai\":\n\t\t\tawait loginOpenAI(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tawait loginOpenAICodex(\n\t\t\t\toptions.onAuthUrl,\n\t\t\t\toptions.onPromptCode,\n\t\t\t\toptions.onStatus,\n\t\t\t);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tassertEvalOpsManagedGatewayEnabled();\n\t\t\tawait loginEvalOps(options.onAuthUrl, options.onStatus);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tawait loginGoogleGeminiCli(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tawait loginGoogleAntigravity(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tif (!options.onDeviceCode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"GitHub Copilot requires onDeviceCode callback for device flow\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait loginGitHubCopilot(options.onDeviceCode, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\tif (shouldSyncConnectorConnection) {\n\t\tawait syncStoredOAuthProviderConnection(provider);\n\t}\n}\n\n/**\n * Logout from OAuth provider\n */\nexport async function logout(provider: SupportedOAuthProvider): Promise<void> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (provider === \"evalops\" && credentials?.refresh) {\n\t\ttry {\n\t\t\tawait revokeEvalOpsToken(credentials.refresh, credentials.metadata);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to revoke EvalOps refresh token during logout\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tprovider,\n\t\t\t});\n\t\t}\n\t}\n\tif (provider !== \"evalops\") {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t}\n\tremoveOAuthCredentials(provider);\n}\n\n/**\n * Refresh OAuth token for provider\n */\nexport async function refreshToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\tthrow new Error(`No OAuth credentials found for ${provider}`);\n\t}\n\n\tlet newCredentials: OAuthCredentials;\n\n\tswitch (provider) {\n\t\tcase \"anthropic\":\n\t\t\tnewCredentials = await refreshAnthropicToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"openai\":\n\t\t\tnewCredentials = await refreshOpenAIToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tnewCredentials = await refreshOpenAICodexToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tnewCredentials = await refreshEvalOpsToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tnewCredentials = await refreshGoogleGeminiCliToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tnewCredentials = await refreshGoogleAntigravityToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tnewCredentials = await refreshGitHubCopilotToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\n\tif (provider !== \"evalops\") {\n\t\tnewCredentials = await syncOAuthProviderConnection(\n\t\t\tprovider,\n\t\t\tnewCredentials,\n\t\t);\n\t}\n\n\t// Save new credentials\n\tsaveOAuthCredentials(provider, newCredentials);\n\n\treturn newCredentials.access;\n}\n\n/**\n * Get OAuth token for provider (auto-refreshes if expired)\n */\nexport async function getOAuthToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string | null> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\treturn null;\n\t}\n\n\t// Check if token is expired (with 1 min buffer)\n\tif (Date.now() >= credentials.expires - 60_000) {\n\t\t// Token expired or expiring soon - refresh it\n\t\ttry {\n\t\t\treturn await refreshToken(provider);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to refresh OAuth token\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t{ provider },\n\t\t\t);\n\t\t\t// Remove invalid credentials\n\t\t\tremoveOAuthCredentials(provider);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn credentials.access;\n}\n\n/**\n * Migrate old provider-specific OAuth credentials to new generic format\n */\nexport async function migrateOAuthCredentials(): Promise<void> {\n\t// Migrate Anthropic credentials\n\tconst anthropicMigrated = await migrateAnthropicCredentials();\n\tif (anthropicMigrated) {\n\t\tlogger.info(\"Migrated Anthropic OAuth credentials to new format\");\n\t}\n\n\t// Migrate OpenAI credentials\n\tconst openaiMigrated = await migrateOpenAICredentials();\n\tif (openaiMigrated) {\n\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t}\n\n\t// Migrate GitHub Copilot credentials from environment\n\tconst copilotMigrated = await migrateGitHubCopilotCredentials();\n\tif (copilotMigrated) {\n\t\tlogger.info(\"Migrated GitHub Copilot credentials from environment\");\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tassertEvalOpsManagedGatewayEnabled,\n\tisEvalOpsManagedGatewayEnabled,\n} from \"../providers/evalops-managed.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\trevokeOAuthProviderConnection,\n\tsyncOAuthProviderConnection,\n\tsyncStoredOAuthProviderConnection,\n} from \"./connectors.js\";\nimport {\n\tbuildEvalOpsDelegationEnvironment,\n\tissueEvalOpsDelegationToken,\n\tloginEvalOps,\n\trefreshEvalOpsToken,\n\trevokeEvalOpsToken,\n} from \"./evalops.js\";\nimport {\n\tloginGitHubCopilot,\n\tmigrateGitHubCopilotCredentials,\n\trefreshGitHubCopilotToken,\n} from \"./github-copilot.js\";\nimport {\n\tloginGoogleAntigravity,\n\trefreshGoogleAntigravityToken,\n} from \"./google-antigravity.js\";\nimport {\n\tloginGoogleGeminiCli,\n\trefreshGoogleGeminiCliToken,\n} from \"./google-gemini-cli.js\";\nimport { loginOpenAICodex, refreshOpenAICodexToken } from \"./openai-codex.js\";\nimport {\n\tloginOpenAI,\n\tmigrateOpenAICredentials,\n\trefreshOpenAIToken,\n} from \"./openai.js\";\nimport {\n\ttype OAuthCredentials,\n\tlistOAuthProviders as listOAuthProvidersFromStorage,\n\tloadOAuthCredentials,\n\tremoveOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth\");\n\nexport type { OAuthCredentials } from \"./storage.js\";\nexport { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken };\n\nexport type SupportedOAuthProvider =\n\t| \"evalops\"\n\t| \"openai\"\n\t| \"openai-codex\"\n\t| \"github-copilot\"\n\t| \"google-gemini-cli\"\n\t| \"google-antigravity\";\n\nexport type LegacyLogoutOnlyOAuthProvider = \"anthropic\";\nexport type OAuthLogoutProvider =\n\t| SupportedOAuthProvider\n\t| LegacyLogoutOnlyOAuthProvider;\n\nconst SUPPORTED_OAUTH_PROVIDERS = new Set<SupportedOAuthProvider>([\n\t\"evalops\",\n\t\"openai\",\n\t\"openai-codex\",\n\t\"github-copilot\",\n\t\"google-gemini-cli\",\n\t\"google-antigravity\",\n]);\n\nconst LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS =\n\tnew Set<LegacyLogoutOnlyOAuthProvider>([\"anthropic\"]);\n\nexport interface OAuthProviderInfo<\n\tTProvider extends string = SupportedOAuthProvider,\n> {\n\tid: TProvider;\n\tname: string;\n\tdescription: string;\n\tavailable: boolean;\n}\n\nfunction isSupportedOAuthProvider(\n\tprovider: string,\n): provider is SupportedOAuthProvider {\n\treturn SUPPORTED_OAUTH_PROVIDERS.has(provider as SupportedOAuthProvider);\n}\n\nfunction isLegacyLogoutOnlyOAuthProvider(\n\tprovider: string,\n): provider is LegacyLogoutOnlyOAuthProvider {\n\treturn LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS.has(\n\t\tprovider as LegacyLogoutOnlyOAuthProvider,\n\t);\n}\n\n/**\n * Get list of OAuth providers\n */\nexport function getOAuthProviders(): OAuthProviderInfo[] {\n\treturn [\n\t\t{\n\t\t\tid: \"openai-codex\",\n\t\t\tname: \"OpenAI Codex\",\n\t\t\tdescription: \"Codex with ChatGPT Plus/Pro login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"openai\",\n\t\t\tname: \"OpenAI\",\n\t\t\tdescription: \"OpenAI Platform API via ChatGPT login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"evalops\",\n\t\t\tname: \"EvalOps Managed\",\n\t\t\tdescription: \"Identity-backed managed gateway access\",\n\t\t\tavailable: isEvalOpsManagedGatewayEnabled(),\n\t\t},\n\t\t{\n\t\t\tid: \"google-gemini-cli\",\n\t\t\tname: \"Google Gemini CLI\",\n\t\t\tdescription: \"Cloud Code Assist OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"google-antigravity\",\n\t\t\tname: \"Google Antigravity\",\n\t\t\tdescription: \"Antigravity sandbox OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"github-copilot\",\n\t\t\tname: \"GitHub Copilot\",\n\t\t\tdescription: \"GitHub Copilot subscription\",\n\t\t\tavailable: true,\n\t\t},\n\t];\n}\n\nexport function listOAuthProviders(): SupportedOAuthProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is SupportedOAuthProvider =>\n\t\t\tisSupportedOAuthProvider(provider),\n\t);\n}\n\nexport function listOAuthLogoutProviders(): OAuthLogoutProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is OAuthLogoutProvider =>\n\t\t\tisSupportedOAuthProvider(provider) ||\n\t\t\tisLegacyLogoutOnlyOAuthProvider(provider),\n\t);\n}\n\nexport function getOAuthLogoutProviders(): OAuthProviderInfo<OAuthLogoutProvider>[] {\n\tconst loggedInProviders = new Set(listOAuthLogoutProviders());\n\tconst supported = getOAuthProviders().filter((provider) =>\n\t\tloggedInProviders.has(provider.id),\n\t);\n\tconst legacy: OAuthProviderInfo<OAuthLogoutProvider>[] = [];\n\tif (loggedInProviders.has(\"anthropic\")) {\n\t\tlegacy.push({\n\t\t\tid: \"anthropic\",\n\t\t\tname: \"Anthropic OAuth\",\n\t\t\tdescription: \"Legacy Anthropic OAuth credentials (logout only)\",\n\t\t\tavailable: true,\n\t\t});\n\t}\n\treturn [...supported, ...legacy];\n}\n\n/**\n * Check if a provider has OAuth credentials stored\n */\nexport function hasOAuthCredentials(provider: SupportedOAuthProvider): boolean {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn false;\n\t}\n\treturn loadOAuthCredentials(provider) !== null;\n}\n\n/**\n * Login with OAuth provider\n */\nexport async function login(\n\tprovider: SupportedOAuthProvider,\n\toptions: {\n\t\tmode?: string;\n\t\tonAuthUrl: (url: string) => void;\n\t\tonPromptCode?: () => Promise<string>;\n\t\tonStatus?: (status: string) => void;\n\t\tonDeviceCode?: (code: string, verificationUri: string) => void;\n\t},\n): Promise<void> {\n\tlet shouldSyncConnectorConnection = false;\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tawait loginOpenAI(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tawait loginOpenAICodex(\n\t\t\t\toptions.onAuthUrl,\n\t\t\t\toptions.onPromptCode,\n\t\t\t\toptions.onStatus,\n\t\t\t);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tassertEvalOpsManagedGatewayEnabled();\n\t\t\tawait loginEvalOps(options.onAuthUrl, options.onStatus);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tawait loginGoogleGeminiCli(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tawait loginGoogleAntigravity(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tif (!options.onDeviceCode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"GitHub Copilot requires onDeviceCode callback for device flow\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait loginGitHubCopilot(options.onDeviceCode, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\tif (shouldSyncConnectorConnection) {\n\t\tawait syncStoredOAuthProviderConnection(provider);\n\t}\n}\n\n/**\n * Logout from OAuth provider\n */\nexport async function logout(provider: OAuthLogoutProvider): Promise<void> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (isLegacyLogoutOnlyOAuthProvider(provider)) {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t\tremoveOAuthCredentials(provider);\n\t\treturn;\n\t}\n\tif (provider === \"evalops\" && credentials?.refresh) {\n\t\ttry {\n\t\t\tawait revokeEvalOpsToken(credentials.refresh, credentials.metadata);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to revoke EvalOps refresh token during logout\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tprovider,\n\t\t\t});\n\t\t}\n\t}\n\tif (provider !== \"evalops\") {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t}\n\tremoveOAuthCredentials(provider);\n}\n\n/**\n * Refresh OAuth token for provider\n */\nexport async function refreshToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\tthrow new Error(`No OAuth credentials found for ${provider}`);\n\t}\n\n\tlet newCredentials: OAuthCredentials;\n\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tnewCredentials = await refreshOpenAIToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tnewCredentials = await refreshOpenAICodexToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tnewCredentials = await refreshEvalOpsToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tnewCredentials = await refreshGoogleGeminiCliToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tnewCredentials = await refreshGoogleAntigravityToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tnewCredentials = await refreshGitHubCopilotToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\n\tif (provider !== \"evalops\") {\n\t\tnewCredentials = await syncOAuthProviderConnection(\n\t\t\tprovider,\n\t\t\tnewCredentials,\n\t\t);\n\t}\n\n\t// Save new credentials\n\tsaveOAuthCredentials(provider, newCredentials);\n\n\treturn newCredentials.access;\n}\n\n/**\n * Get OAuth token for provider (auto-refreshes if expired)\n */\nexport async function getOAuthToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string | null> {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn null;\n\t}\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\treturn null;\n\t}\n\n\t// Check if token is expired (with 1 min buffer)\n\tif (Date.now() >= credentials.expires - 60_000) {\n\t\t// Token expired or expiring soon - refresh it\n\t\ttry {\n\t\t\treturn await refreshToken(provider);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to refresh OAuth token\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t{ provider },\n\t\t\t);\n\t\t\t// Remove invalid credentials\n\t\t\tremoveOAuthCredentials(provider);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn credentials.access;\n}\n\n/**\n * Migrate old provider-specific OAuth credentials to new generic format\n */\nexport async function migrateOAuthCredentials(): Promise<void> {\n\t// Migrate OpenAI credentials\n\tconst openaiMigrated = await migrateOpenAICredentials();\n\tif (openaiMigrated) {\n\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t}\n\n\t// Migrate GitHub Copilot credentials from environment\n\tconst copilotMigrated = await migrateGitHubCopilotCredentials();\n\tif (copilotMigrated) {\n\t\tlogger.info(\"Migrated GitHub Copilot credentials from environment\");\n\t}\n}\n"]}
|
package/dist/oauth/openai.d.ts
CHANGED
package/dist/oauth/openai.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenAI OAuth integration for
|
|
2
|
+
* OpenAI OAuth integration for Maestro.
|
|
3
3
|
*
|
|
4
4
|
* This module provides OAuth login flow for OpenAI/ChatGPT accounts,
|
|
5
5
|
* allowing users to authenticate with their ChatGPT Plus subscription.
|
|
@@ -137,7 +137,7 @@ export async function loginOpenAI(onAuthUrl, onStatus) {
|
|
|
137
137
|
<body style="font-family: sans-serif; padding: 40px;">
|
|
138
138
|
<h1>Success!</h1>
|
|
139
139
|
<p>You are now logged in to OpenAI.</p>
|
|
140
|
-
<p>You can close this window and return to
|
|
140
|
+
<p>You can close this window and return to Maestro.</p>
|
|
141
141
|
<script>window.close();</script>
|
|
142
142
|
</body>
|
|
143
143
|
</html>
|
package/dist/oauth/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/oauth/openai.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * OpenAI OAuth integration for Composer.\n *\n * This module provides OAuth login flow for OpenAI/ChatGPT accounts,\n * allowing users to authenticate with their ChatGPT Plus subscription.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport {\n\ttype IncomingMessage,\n\ttype ServerResponse,\n\tcreateServer,\n} from \"node:http\";\nimport {\n\ttype OpenAIOAuthCredential,\n\texchangeIdTokenForApiKey,\n\texchangeOpenAIAuthorizationCode,\n\tgenerateOpenAILoginUrl,\n\tgetStoredOpenAIOAuthCredential,\n\trefreshOpenAIOAuthToken,\n} from \"../providers/openai-auth.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\ttype OAuthCredentials,\n\tloadOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth:openai\");\n\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = \"/auth/callback\";\nconst CALLBACK_ORIGIN = `http://127.0.0.1:${CALLBACK_PORT}`;\n\n/**\n * Convert OpenAI provider credentials to generic OAuth credentials.\n */\nfunction toGenericCredentials(cred: OpenAIOAuthCredential): OAuthCredentials {\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: cred.apiKey ?? cred.accessToken,\n\t\trefresh: cred.refreshToken,\n\t\texpires: cred.expiresAt,\n\t\tmetadata: {\n\t\t\tmode: cred.mode,\n\t\t\tidToken: cred.idToken,\n\t\t\t// Store original access token if we have API key\n\t\t\toriginalAccessToken: cred.apiKey ? cred.accessToken : undefined,\n\t\t},\n\t};\n}\n\n/**\n * Start the OAuth login flow for OpenAI.\n *\n * This opens a local HTTP server to receive the OAuth callback,\n * then opens the browser to the OpenAI authorization page.\n */\nexport async function loginOpenAI(\n\tonAuthUrl: (url: string) => void,\n\tonStatus?: (status: string) => void,\n): Promise<void> {\n\t// Generate login URL with PKCE\n\tconst loginInfo = await generateOpenAILoginUrl();\n\tconst { url, verifier: codeVerifier, state } = loginInfo;\n\n\t// Start local callback server\n\tconst credentials = await new Promise<OpenAIOAuthCredential>(\n\t\t(resolve, reject) => {\n\t\t\tconst server = createServer(\n\t\t\t\tasync (req: IncomingMessage, res: ServerResponse) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst reqUrl = new URL(req.url ?? \"\", CALLBACK_ORIGIN);\n\n\t\t\t\t\t\tif (reqUrl.pathname !== CALLBACK_PATH) {\n\t\t\t\t\t\t\tres.writeHead(404);\n\t\t\t\t\t\t\tres.end(\"Not found\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst code = reqUrl.searchParams.get(\"code\");\n\t\t\t\t\t\tconst returnedState = reqUrl.searchParams.get(\"state\");\n\t\t\t\t\t\tconst error = reqUrl.searchParams.get(\"error\");\n\t\t\t\t\t\tconst errorDescription =\n\t\t\t\t\t\t\treqUrl.searchParams.get(\"error_description\");\n\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Authentication Failed</h1>\n\t\t\t\t\t\t\t\t\t\t<p>Error: ${error}</p>\n\t\t\t\t\t\t\t\t\t\t<p>${errorDescription ?? \"\"}</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(`OAuth error: ${error} - ${errorDescription}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!code || !returnedState) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Invalid Callback</h1>\n\t\t\t\t\t\t\t\t\t\t<p>Missing authorization code or state.</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(\"Missing code or state in callback\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Verify state to prevent CSRF\n\t\t\t\t\t\tconst stateBuffer = Buffer.from(state);\n\t\t\t\t\t\tconst returnedBuffer = Buffer.from(returnedState);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstateBuffer.length !== returnedBuffer.length ||\n\t\t\t\t\t\t\t!timingSafeEqual(stateBuffer, returnedBuffer)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Security Error</h1>\n\t\t\t\t\t\t\t\t\t\t<p>State mismatch - possible CSRF attack.</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(\"State mismatch in OAuth callback\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonStatus?.(\"Exchanging authorization code...\");\n\n\t\t\t\t\t\t// Exchange code for tokens\n\t\t\t\t\t\tconst tokens = await exchangeOpenAIAuthorizationCode(\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tcodeVerifier,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!tokens) {\n\t\t\t\t\t\t\tthrow new Error(\"Failed to exchange authorization code\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonStatus?.(\"Getting API key...\");\n\n\t\t\t\t\t\t// Exchange ID token for API key\n\t\t\t\t\t\tlet apiKey: string | undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst key = await exchangeIdTokenForApiKey(tokens.idToken);\n\t\t\t\t\t\t\tapiKey = key ?? undefined;\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.warn(\"Failed to exchange ID token for API key\", {\n\t\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// Continue without API key - will use access token directly\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst credential: OpenAIOAuthCredential = {\n\t\t\t\t\t\t\taccessToken: tokens.accessToken,\n\t\t\t\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t\t\t\t\tidToken: tokens.idToken,\n\t\t\t\t\t\t\texpiresAt: tokens.expiresAt,\n\t\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\t\tmode: \"openai-oauth\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t<h1>Success!</h1>\n\t\t\t\t\t\t\t\t\t<p>You are now logged in to OpenAI.</p>\n\t\t\t\t\t\t\t\t\t<p>You can close this window and return to Composer.</p>\n\t\t\t\t\t\t\t\t\t<script>window.close();</script>\n\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t`);\n\n\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\tresolve(credential);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\"OAuth callback error\",\n\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tres.writeHead(500, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t<h1>Error</h1>\n\t\t\t\t\t\t\t\t\t<p>An error occurred during authentication.</p>\n\t\t\t\t\t\t\t\t\t<p>${error instanceof Error ? error.message : String(error)}</p>\n\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t`);\n\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tserver.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n\t\t\t\tlogger.info(\"OAuth callback server started\", { port: CALLBACK_PORT });\n\t\t\t\t// Tell the user to open the URL\n\t\t\t\tonAuthUrl(url);\n\t\t\t});\n\n\t\t\tserver.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"OAuth callback server error\",\n\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t);\n\t\t\t\treject(error);\n\t\t\t});\n\n\t\t\t// Timeout after 5 minutes\n\t\t\tconst timeout = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tserver.close();\n\t\t\t\t\treject(new Error(\"OAuth login timed out\"));\n\t\t\t\t},\n\t\t\t\t5 * 60 * 1000,\n\t\t\t);\n\n\t\t\tserver.on(\"close\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t});\n\t\t},\n\t);\n\n\t// Save credentials\n\tconst genericCreds = toGenericCredentials(credentials);\n\tsaveOAuthCredentials(\"openai\", genericCreds);\n\n\tlogger.info(\"OpenAI OAuth login successful\");\n}\n\n/**\n * Refresh an expired OpenAI OAuth token.\n */\nexport async function refreshOpenAIToken(\n\trefreshToken: string,\n\tmetadata?: Record<string, unknown>,\n): Promise<OAuthCredentials> {\n\tconst tokens = await refreshOpenAIOAuthToken(refreshToken);\n\tif (!tokens) {\n\t\tthrow new Error(\"Failed to refresh OpenAI OAuth token\");\n\t}\n\n\t// Try to get new API key from refreshed ID token\n\tlet apiKey: string | undefined;\n\tif (tokens.idToken) {\n\t\ttry {\n\t\t\tconst key = await exchangeIdTokenForApiKey(tokens.idToken);\n\t\t\tapiKey = key ?? undefined;\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to refresh API key from ID token\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: apiKey ?? tokens.accessToken,\n\t\trefresh: tokens.refreshToken ?? refreshToken,\n\t\texpires: tokens.expiresAt,\n\t\tmetadata: {\n\t\t\t...(metadata ?? {}),\n\t\t\tmode: \"openai-oauth\",\n\t\t\tidToken: tokens.idToken,\n\t\t\toriginalAccessToken: apiKey ? tokens.accessToken : undefined,\n\t\t},\n\t};\n}\n\n/**\n * Migrate old OpenAI OAuth credentials to new format.\n */\nexport async function migrateOpenAICredentials(): Promise<boolean> {\n\t// Check if already migrated\n\tconst existing = loadOAuthCredentials(\"openai\");\n\tif (existing) {\n\t\treturn false; // Already have new format\n\t}\n\n\t// Try to load from old format\n\ttry {\n\t\tconst oldCreds = await getStoredOpenAIOAuthCredential();\n\t\tif (oldCreds) {\n\t\t\tconst newCreds = toGenericCredentials(oldCreds);\n\t\t\tsaveOAuthCredentials(\"openai\", newCreds);\n\t\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t\t\treturn true;\n\t\t}\n\t} catch (error) {\n\t\tlogger.debug(\"No old OpenAI OAuth credentials to migrate\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t}\n\n\treturn false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/oauth/openai.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * OpenAI OAuth integration for Maestro.\n *\n * This module provides OAuth login flow for OpenAI/ChatGPT accounts,\n * allowing users to authenticate with their ChatGPT Plus subscription.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport {\n\ttype IncomingMessage,\n\ttype ServerResponse,\n\tcreateServer,\n} from \"node:http\";\nimport {\n\ttype OpenAIOAuthCredential,\n\texchangeIdTokenForApiKey,\n\texchangeOpenAIAuthorizationCode,\n\tgenerateOpenAILoginUrl,\n\tgetStoredOpenAIOAuthCredential,\n\trefreshOpenAIOAuthToken,\n} from \"../providers/openai-auth.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\ttype OAuthCredentials,\n\tloadOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth:openai\");\n\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = \"/auth/callback\";\nconst CALLBACK_ORIGIN = `http://127.0.0.1:${CALLBACK_PORT}`;\n\n/**\n * Convert OpenAI provider credentials to generic OAuth credentials.\n */\nfunction toGenericCredentials(cred: OpenAIOAuthCredential): OAuthCredentials {\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: cred.apiKey ?? cred.accessToken,\n\t\trefresh: cred.refreshToken,\n\t\texpires: cred.expiresAt,\n\t\tmetadata: {\n\t\t\tmode: cred.mode,\n\t\t\tidToken: cred.idToken,\n\t\t\t// Store original access token if we have API key\n\t\t\toriginalAccessToken: cred.apiKey ? cred.accessToken : undefined,\n\t\t},\n\t};\n}\n\n/**\n * Start the OAuth login flow for OpenAI.\n *\n * This opens a local HTTP server to receive the OAuth callback,\n * then opens the browser to the OpenAI authorization page.\n */\nexport async function loginOpenAI(\n\tonAuthUrl: (url: string) => void,\n\tonStatus?: (status: string) => void,\n): Promise<void> {\n\t// Generate login URL with PKCE\n\tconst loginInfo = await generateOpenAILoginUrl();\n\tconst { url, verifier: codeVerifier, state } = loginInfo;\n\n\t// Start local callback server\n\tconst credentials = await new Promise<OpenAIOAuthCredential>(\n\t\t(resolve, reject) => {\n\t\t\tconst server = createServer(\n\t\t\t\tasync (req: IncomingMessage, res: ServerResponse) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst reqUrl = new URL(req.url ?? \"\", CALLBACK_ORIGIN);\n\n\t\t\t\t\t\tif (reqUrl.pathname !== CALLBACK_PATH) {\n\t\t\t\t\t\t\tres.writeHead(404);\n\t\t\t\t\t\t\tres.end(\"Not found\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst code = reqUrl.searchParams.get(\"code\");\n\t\t\t\t\t\tconst returnedState = reqUrl.searchParams.get(\"state\");\n\t\t\t\t\t\tconst error = reqUrl.searchParams.get(\"error\");\n\t\t\t\t\t\tconst errorDescription =\n\t\t\t\t\t\t\treqUrl.searchParams.get(\"error_description\");\n\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Authentication Failed</h1>\n\t\t\t\t\t\t\t\t\t\t<p>Error: ${error}</p>\n\t\t\t\t\t\t\t\t\t\t<p>${errorDescription ?? \"\"}</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(`OAuth error: ${error} - ${errorDescription}`));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!code || !returnedState) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Invalid Callback</h1>\n\t\t\t\t\t\t\t\t\t\t<p>Missing authorization code or state.</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(\"Missing code or state in callback\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Verify state to prevent CSRF\n\t\t\t\t\t\tconst stateBuffer = Buffer.from(state);\n\t\t\t\t\t\tconst returnedBuffer = Buffer.from(returnedState);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstateBuffer.length !== returnedBuffer.length ||\n\t\t\t\t\t\t\t!timingSafeEqual(stateBuffer, returnedBuffer)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t\t<h1>Security Error</h1>\n\t\t\t\t\t\t\t\t\t\t<p>State mismatch - possible CSRF attack.</p>\n\t\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\t\treject(new Error(\"State mismatch in OAuth callback\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonStatus?.(\"Exchanging authorization code...\");\n\n\t\t\t\t\t\t// Exchange code for tokens\n\t\t\t\t\t\tconst tokens = await exchangeOpenAIAuthorizationCode(\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tcodeVerifier,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!tokens) {\n\t\t\t\t\t\t\tthrow new Error(\"Failed to exchange authorization code\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonStatus?.(\"Getting API key...\");\n\n\t\t\t\t\t\t// Exchange ID token for API key\n\t\t\t\t\t\tlet apiKey: string | undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst key = await exchangeIdTokenForApiKey(tokens.idToken);\n\t\t\t\t\t\t\tapiKey = key ?? undefined;\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.warn(\"Failed to exchange ID token for API key\", {\n\t\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// Continue without API key - will use access token directly\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst credential: OpenAIOAuthCredential = {\n\t\t\t\t\t\t\taccessToken: tokens.accessToken,\n\t\t\t\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t\t\t\t\tidToken: tokens.idToken,\n\t\t\t\t\t\t\texpiresAt: tokens.expiresAt,\n\t\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\t\tmode: \"openai-oauth\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t<h1>Success!</h1>\n\t\t\t\t\t\t\t\t\t<p>You are now logged in to OpenAI.</p>\n\t\t\t\t\t\t\t\t\t<p>You can close this window and return to Maestro.</p>\n\t\t\t\t\t\t\t\t\t<script>window.close();</script>\n\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t`);\n\n\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\tresolve(credential);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\"OAuth callback error\",\n\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tres.writeHead(500, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\t\tres.end(`\n\t\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t\t<body style=\"font-family: sans-serif; padding: 40px;\">\n\t\t\t\t\t\t\t\t\t<h1>Error</h1>\n\t\t\t\t\t\t\t\t\t<p>An error occurred during authentication.</p>\n\t\t\t\t\t\t\t\t\t<p>${error instanceof Error ? error.message : String(error)}</p>\n\t\t\t\t\t\t\t\t\t<p>You can close this window.</p>\n\t\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t\t</html>\n\t\t\t\t\t\t`);\n\t\t\t\t\t\tserver.close();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tserver.listen(CALLBACK_PORT, \"127.0.0.1\", () => {\n\t\t\t\tlogger.info(\"OAuth callback server started\", { port: CALLBACK_PORT });\n\t\t\t\t// Tell the user to open the URL\n\t\t\t\tonAuthUrl(url);\n\t\t\t});\n\n\t\t\tserver.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"OAuth callback server error\",\n\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t);\n\t\t\t\treject(error);\n\t\t\t});\n\n\t\t\t// Timeout after 5 minutes\n\t\t\tconst timeout = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tserver.close();\n\t\t\t\t\treject(new Error(\"OAuth login timed out\"));\n\t\t\t\t},\n\t\t\t\t5 * 60 * 1000,\n\t\t\t);\n\n\t\t\tserver.on(\"close\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t});\n\t\t},\n\t);\n\n\t// Save credentials\n\tconst genericCreds = toGenericCredentials(credentials);\n\tsaveOAuthCredentials(\"openai\", genericCreds);\n\n\tlogger.info(\"OpenAI OAuth login successful\");\n}\n\n/**\n * Refresh an expired OpenAI OAuth token.\n */\nexport async function refreshOpenAIToken(\n\trefreshToken: string,\n\tmetadata?: Record<string, unknown>,\n): Promise<OAuthCredentials> {\n\tconst tokens = await refreshOpenAIOAuthToken(refreshToken);\n\tif (!tokens) {\n\t\tthrow new Error(\"Failed to refresh OpenAI OAuth token\");\n\t}\n\n\t// Try to get new API key from refreshed ID token\n\tlet apiKey: string | undefined;\n\tif (tokens.idToken) {\n\t\ttry {\n\t\t\tconst key = await exchangeIdTokenForApiKey(tokens.idToken);\n\t\t\tapiKey = key ?? undefined;\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to refresh API key from ID token\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: apiKey ?? tokens.accessToken,\n\t\trefresh: tokens.refreshToken ?? refreshToken,\n\t\texpires: tokens.expiresAt,\n\t\tmetadata: {\n\t\t\t...(metadata ?? {}),\n\t\t\tmode: \"openai-oauth\",\n\t\t\tidToken: tokens.idToken,\n\t\t\toriginalAccessToken: apiKey ? tokens.accessToken : undefined,\n\t\t},\n\t};\n}\n\n/**\n * Migrate old OpenAI OAuth credentials to new format.\n */\nexport async function migrateOpenAICredentials(): Promise<boolean> {\n\t// Check if already migrated\n\tconst existing = loadOAuthCredentials(\"openai\");\n\tif (existing) {\n\t\treturn false; // Already have new format\n\t}\n\n\t// Try to load from old format\n\ttry {\n\t\tconst oldCreds = await getStoredOpenAIOAuthCredential();\n\t\tif (oldCreds) {\n\t\t\tconst newCreds = toGenericCredentials(oldCreds);\n\t\t\tsaveOAuthCredentials(\"openai\", newCreds);\n\t\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t\t\treturn true;\n\t\t}\n\t} catch (error) {\n\t\tlogger.debug(\"No old OpenAI OAuth credentials to migrate\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t}\n\n\treturn false;\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { SwarmState } from "../agent/swarm/types.js";
|
|
2
|
+
import type { A2ATaskLedgerFile } from "./a2a-task-ledger.js";
|
|
3
|
+
export declare const A2A_COMPLETION_AUDIT_SCHEMA = "evalops.maestro.a2a-completion-audit.v1";
|
|
4
|
+
export type A2ACompletionEvidenceKey = "status" | "artifact" | "task" | "workGraph" | "push" | "correlation";
|
|
5
|
+
export interface A2ACompletionAuditLane {
|
|
6
|
+
laneId: string;
|
|
7
|
+
parentTaskId?: string;
|
|
8
|
+
a2aTaskId: string;
|
|
9
|
+
a2aMessageId?: string;
|
|
10
|
+
contextId?: string;
|
|
11
|
+
peer: string;
|
|
12
|
+
status?: string;
|
|
13
|
+
terminal: boolean;
|
|
14
|
+
evidence: Record<A2ACompletionEvidenceKey, boolean>;
|
|
15
|
+
missingEvidence: A2ACompletionEvidenceKey[];
|
|
16
|
+
}
|
|
17
|
+
export interface A2ACompletionAudit {
|
|
18
|
+
schema: typeof A2A_COMPLETION_AUDIT_SCHEMA;
|
|
19
|
+
swarmId: string;
|
|
20
|
+
generatedAt: string;
|
|
21
|
+
complete: boolean;
|
|
22
|
+
counts: {
|
|
23
|
+
remoteLanes: number;
|
|
24
|
+
completeLanes: number;
|
|
25
|
+
incompleteLanes: number;
|
|
26
|
+
pushCoveredLanes: number;
|
|
27
|
+
workGraphCoveredLanes: number;
|
|
28
|
+
};
|
|
29
|
+
lanes: A2ACompletionAuditLane[];
|
|
30
|
+
}
|
|
31
|
+
export interface BuildA2ACompletionAuditInput {
|
|
32
|
+
swarm: SwarmState;
|
|
33
|
+
ledger: A2ATaskLedgerFile;
|
|
34
|
+
pushEvidenceKeys?: ReadonlySet<string>;
|
|
35
|
+
pushTaskIds?: ReadonlySet<string>;
|
|
36
|
+
generatedAt?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function buildA2ACompletionAudit(input: BuildA2ACompletionAuditInput): A2ACompletionAudit;
|
|
39
|
+
export declare function a2aPushEvidenceKey(peer: string, taskId: string): string;
|
|
40
|
+
export declare function a2aDelegationLaneId(peer: string, parentTaskId: string): string;
|
|
41
|
+
//# sourceMappingURL=a2a-completion-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-completion-audit.d.ts","sourceRoot":"","sources":["../../src/platform/a2a-completion-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAEX,iBAAiB,EACjB,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,2BAA2B,4CACE,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GACjC,QAAQ,GACR,UAAU,GACV,MAAM,GACN,WAAW,GACX,MAAM,GACN,aAAa,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACpD,eAAe,EAAE,wBAAwB,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,OAAO,2BAA2B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,qBAAqB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,KAAK,EAAE,sBAAsB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC5C,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAqBD,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,4BAA4B,GACjC,kBAAkB,CA2BpB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAClB,MAAM,CAER"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { isTerminalA2AState } from "./a2a-task-ledger.js";
|
|
2
|
+
export const A2A_COMPLETION_AUDIT_SCHEMA = "evalops.maestro.a2a-completion-audit.v1";
|
|
3
|
+
const EVIDENCE_ORDER = [
|
|
4
|
+
"status",
|
|
5
|
+
"artifact",
|
|
6
|
+
"task",
|
|
7
|
+
"workGraph",
|
|
8
|
+
"push",
|
|
9
|
+
"correlation",
|
|
10
|
+
];
|
|
11
|
+
export function buildA2ACompletionAudit(input) {
|
|
12
|
+
const remoteLanes = buildRemoteLaneSources(input);
|
|
13
|
+
const remoteTaskIdCounts = countRemoteTaskIds(remoteLanes);
|
|
14
|
+
const lanes = remoteLanes.map((lane) => buildLaneAudit(input, lane, remoteTaskIdCounts));
|
|
15
|
+
const completeLanes = lanes.filter((lane) => lane.terminal && lane.missingEvidence.length === 0).length;
|
|
16
|
+
const pushCoveredLanes = lanes.filter((lane) => lane.evidence.push).length;
|
|
17
|
+
const workGraphCoveredLanes = lanes.filter((lane) => lane.evidence.workGraph).length;
|
|
18
|
+
return {
|
|
19
|
+
schema: A2A_COMPLETION_AUDIT_SCHEMA,
|
|
20
|
+
swarmId: input.swarm.id,
|
|
21
|
+
generatedAt: input.generatedAt ?? new Date().toISOString(),
|
|
22
|
+
complete: lanes.length === completeLanes,
|
|
23
|
+
counts: {
|
|
24
|
+
remoteLanes: lanes.length,
|
|
25
|
+
completeLanes,
|
|
26
|
+
incompleteLanes: lanes.length - completeLanes,
|
|
27
|
+
pushCoveredLanes,
|
|
28
|
+
workGraphCoveredLanes,
|
|
29
|
+
},
|
|
30
|
+
lanes,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function a2aPushEvidenceKey(peer, taskId) {
|
|
34
|
+
return `${peer}\u0000${taskId}`;
|
|
35
|
+
}
|
|
36
|
+
export function a2aDelegationLaneId(peer, parentTaskId) {
|
|
37
|
+
return `a2a:${encodeURIComponent(peer)}:${encodeURIComponent(parentTaskId)}`;
|
|
38
|
+
}
|
|
39
|
+
function buildRemoteLaneSources(input) {
|
|
40
|
+
const teammateLanes = input.swarm.teammates
|
|
41
|
+
.filter(hasA2ATask)
|
|
42
|
+
.map((teammate) => {
|
|
43
|
+
const ledgerEntry = findLedgerEntry(input.ledger, teammate.a2a);
|
|
44
|
+
const parentTaskId = parentTaskIdForLane(teammate.completedTasks, ledgerEntry, teammate.a2a);
|
|
45
|
+
return {
|
|
46
|
+
laneId: parentTaskId
|
|
47
|
+
? a2aDelegationLaneId(teammate.a2a.peer, parentTaskId)
|
|
48
|
+
: teammate.id,
|
|
49
|
+
parentTaskId,
|
|
50
|
+
completedTasks: teammate.completedTasks,
|
|
51
|
+
a2a: teammate.a2a,
|
|
52
|
+
ledgerEntry,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const seen = new Set(teammateLanes.map((lane) => laneKey(lane.a2a)));
|
|
56
|
+
const ledgerOnlyLanes = input.ledger.tasks
|
|
57
|
+
.filter((entry) => entry.kind === "delegation")
|
|
58
|
+
.filter((entry) => stringMetadata(entry, "swarmId") === input.swarm.id)
|
|
59
|
+
.filter((entry) => !seen.has(a2aPushEvidenceKey(entry.peer, entry.taskId)))
|
|
60
|
+
.map((entry) => {
|
|
61
|
+
const parentTaskId = parentTaskIdForLedger(entry);
|
|
62
|
+
return {
|
|
63
|
+
laneId: parentTaskId
|
|
64
|
+
? a2aDelegationLaneId(entry.peer, parentTaskId)
|
|
65
|
+
: fallbackRemoteLaneId(entry.peer, entry.taskId),
|
|
66
|
+
parentTaskId,
|
|
67
|
+
completedTasks: [],
|
|
68
|
+
a2a: {
|
|
69
|
+
peer: entry.peer,
|
|
70
|
+
peerDisplayName: entry.peerDisplayName,
|
|
71
|
+
source: "registry",
|
|
72
|
+
taskId: entry.taskId,
|
|
73
|
+
contextId: entry.contextId,
|
|
74
|
+
messageId: entry.messageId ?? "",
|
|
75
|
+
role: entry.role,
|
|
76
|
+
},
|
|
77
|
+
ledgerEntry: entry,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return [...teammateLanes, ...ledgerOnlyLanes];
|
|
81
|
+
}
|
|
82
|
+
function hasA2ATask(teammate) {
|
|
83
|
+
return Boolean(teammate.a2a?.taskId);
|
|
84
|
+
}
|
|
85
|
+
function laneKey(a2a) {
|
|
86
|
+
return a2aPushEvidenceKey(a2a.peer, a2a.taskId);
|
|
87
|
+
}
|
|
88
|
+
function findLedgerEntry(ledger, a2a) {
|
|
89
|
+
return ledger.tasks.find((entry) => entry.taskId === a2a.taskId && entry.peer === a2a.peer);
|
|
90
|
+
}
|
|
91
|
+
function buildLaneAudit(input, lane, remoteTaskIdCounts) {
|
|
92
|
+
const { a2a, ledgerEntry } = lane;
|
|
93
|
+
const parentTaskId = lane.parentTaskId ??
|
|
94
|
+
parentTaskIdForLane(lane.completedTasks, ledgerEntry, a2a);
|
|
95
|
+
const status = ledgerEntry?.state;
|
|
96
|
+
const evidence = {
|
|
97
|
+
status: Boolean(status),
|
|
98
|
+
artifact: hasArtifactEvidence(ledgerEntry),
|
|
99
|
+
task: Boolean(ledgerEntry),
|
|
100
|
+
workGraph: Boolean(ledgerEntry?.workGraph),
|
|
101
|
+
push: hasPushEvidence(input, a2a, remoteTaskIdCounts),
|
|
102
|
+
correlation: hasCorrelationEvidence(input.swarm.id, parentTaskId, a2a, ledgerEntry),
|
|
103
|
+
};
|
|
104
|
+
const missingEvidence = EVIDENCE_ORDER.filter((key) => !evidence[key]);
|
|
105
|
+
return {
|
|
106
|
+
laneId: lane.laneId,
|
|
107
|
+
parentTaskId,
|
|
108
|
+
a2aTaskId: a2a.taskId,
|
|
109
|
+
a2aMessageId: a2a.messageId,
|
|
110
|
+
contextId: a2a.contextId ?? ledgerEntry?.contextId,
|
|
111
|
+
peer: a2a.peer,
|
|
112
|
+
status,
|
|
113
|
+
terminal: Boolean(status && isTerminalA2AState(status)),
|
|
114
|
+
evidence,
|
|
115
|
+
missingEvidence,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function countRemoteTaskIds(lanes) {
|
|
119
|
+
const counts = new Map();
|
|
120
|
+
for (const lane of lanes) {
|
|
121
|
+
const taskId = lane.a2a.taskId;
|
|
122
|
+
counts.set(taskId, (counts.get(taskId) ?? 0) + 1);
|
|
123
|
+
}
|
|
124
|
+
return counts;
|
|
125
|
+
}
|
|
126
|
+
function hasPushEvidence(input, a2a, remoteTaskIdCounts) {
|
|
127
|
+
const exactKey = a2aPushEvidenceKey(a2a.peer, a2a.taskId);
|
|
128
|
+
if (input.pushEvidenceKeys?.has(exactKey)) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if ((remoteTaskIdCounts.get(a2a.taskId) ?? 0) > 1) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
return input.pushTaskIds?.has(a2a.taskId) ?? false;
|
|
135
|
+
}
|
|
136
|
+
function parentTaskIdForLedger(ledgerEntry) {
|
|
137
|
+
return (stringMetadata(ledgerEntry, "taskId") ??
|
|
138
|
+
stringMetadata(ledgerEntry, "task_id"));
|
|
139
|
+
}
|
|
140
|
+
function parentTaskIdForLane(completedTasks, ledgerEntry, a2a) {
|
|
141
|
+
const ledgerParentTaskId = parentTaskIdForLedger(ledgerEntry);
|
|
142
|
+
const a2aParentTaskId = a2a?.parentTaskId;
|
|
143
|
+
if (ledgerEntry?.state && !isCompletedA2AState(ledgerEntry.state)) {
|
|
144
|
+
return ledgerParentTaskId ?? a2aParentTaskId ?? lastValue(completedTasks);
|
|
145
|
+
}
|
|
146
|
+
return lastValue(completedTasks) ?? ledgerParentTaskId ?? a2aParentTaskId;
|
|
147
|
+
}
|
|
148
|
+
function isCompletedA2AState(state) {
|
|
149
|
+
return /COMPLETED/u.test(state.toUpperCase().replace(/[\s-]+/gu, "_"));
|
|
150
|
+
}
|
|
151
|
+
function lastValue(values) {
|
|
152
|
+
return values.length > 0 ? values[values.length - 1] : undefined;
|
|
153
|
+
}
|
|
154
|
+
function fallbackRemoteLaneId(peer, taskId) {
|
|
155
|
+
return `a2a:${encodeURIComponent(peer)}:remote:${encodeURIComponent(taskId)}`;
|
|
156
|
+
}
|
|
157
|
+
function hasArtifactEvidence(entry) {
|
|
158
|
+
return Boolean(entry?.responseText?.trim() ||
|
|
159
|
+
entry?.transcript.some((item) => item.role === "agent" && item.text.trim().length > 0));
|
|
160
|
+
}
|
|
161
|
+
function hasCorrelationEvidence(swarmId, parentTaskId, a2a, entry) {
|
|
162
|
+
if (!entry) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const ledgerParentTaskId = stringMetadata(entry, "taskId") ?? stringMetadata(entry, "task_id");
|
|
166
|
+
return Boolean(a2a.messageId &&
|
|
167
|
+
entry.messageId === a2a.messageId &&
|
|
168
|
+
(a2a.contextId ? entry.contextId === a2a.contextId : entry.contextId) &&
|
|
169
|
+
stringMetadata(entry, "swarmId") === swarmId &&
|
|
170
|
+
parentTaskId &&
|
|
171
|
+
ledgerParentTaskId === parentTaskId);
|
|
172
|
+
}
|
|
173
|
+
function stringMetadata(entry, key) {
|
|
174
|
+
const value = entry?.metadata?.[key];
|
|
175
|
+
return typeof value === "string" ? value : undefined;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=a2a-completion-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-completion-audit.js","sourceRoot":"","sources":["../../src/platform/a2a-completion-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SwarmState, SwarmTeammate } from \"../agent/swarm/types.js\";\nimport type {\n\tA2ATaskLedgerEntry,\n\tA2ATaskLedgerFile,\n} from \"./a2a-task-ledger.js\";\nimport { isTerminalA2AState } from \"./a2a-task-ledger.js\";\n\nexport const A2A_COMPLETION_AUDIT_SCHEMA =\n\t\"evalops.maestro.a2a-completion-audit.v1\";\n\nexport type A2ACompletionEvidenceKey =\n\t| \"status\"\n\t| \"artifact\"\n\t| \"task\"\n\t| \"workGraph\"\n\t| \"push\"\n\t| \"correlation\";\n\nexport interface A2ACompletionAuditLane {\n\tlaneId: string;\n\tparentTaskId?: string;\n\ta2aTaskId: string;\n\ta2aMessageId?: string;\n\tcontextId?: string;\n\tpeer: string;\n\tstatus?: string;\n\tterminal: boolean;\n\tevidence: Record<A2ACompletionEvidenceKey, boolean>;\n\tmissingEvidence: A2ACompletionEvidenceKey[];\n}\n\nexport interface A2ACompletionAudit {\n\tschema: typeof A2A_COMPLETION_AUDIT_SCHEMA;\n\tswarmId: string;\n\tgeneratedAt: string;\n\tcomplete: boolean;\n\tcounts: {\n\t\tremoteLanes: number;\n\t\tcompleteLanes: number;\n\t\tincompleteLanes: number;\n\t\tpushCoveredLanes: number;\n\t\tworkGraphCoveredLanes: number;\n\t};\n\tlanes: A2ACompletionAuditLane[];\n}\n\nexport interface BuildA2ACompletionAuditInput {\n\tswarm: SwarmState;\n\tledger: A2ATaskLedgerFile;\n\tpushEvidenceKeys?: ReadonlySet<string>;\n\tpushTaskIds?: ReadonlySet<string>;\n\tgeneratedAt?: string;\n}\n\nconst EVIDENCE_ORDER: A2ACompletionEvidenceKey[] = [\n\t\"status\",\n\t\"artifact\",\n\t\"task\",\n\t\"workGraph\",\n\t\"push\",\n\t\"correlation\",\n];\n\ntype A2AAuditA2A = NonNullable<SwarmTeammate[\"a2a\"]>;\n\ninterface A2AAuditLaneSource {\n\tlaneId: string;\n\tparentTaskId?: string;\n\tcompletedTasks: string[];\n\ta2a: A2AAuditA2A;\n\tledgerEntry?: A2ATaskLedgerEntry;\n}\n\nexport function buildA2ACompletionAudit(\n\tinput: BuildA2ACompletionAuditInput,\n): A2ACompletionAudit {\n\tconst remoteLanes = buildRemoteLaneSources(input);\n\tconst remoteTaskIdCounts = countRemoteTaskIds(remoteLanes);\n\tconst lanes = remoteLanes.map((lane) =>\n\t\tbuildLaneAudit(input, lane, remoteTaskIdCounts),\n\t);\n\tconst completeLanes = lanes.filter(\n\t\t(lane) => lane.terminal && lane.missingEvidence.length === 0,\n\t).length;\n\tconst pushCoveredLanes = lanes.filter((lane) => lane.evidence.push).length;\n\tconst workGraphCoveredLanes = lanes.filter(\n\t\t(lane) => lane.evidence.workGraph,\n\t).length;\n\treturn {\n\t\tschema: A2A_COMPLETION_AUDIT_SCHEMA,\n\t\tswarmId: input.swarm.id,\n\t\tgeneratedAt: input.generatedAt ?? new Date().toISOString(),\n\t\tcomplete: lanes.length === completeLanes,\n\t\tcounts: {\n\t\t\tremoteLanes: lanes.length,\n\t\t\tcompleteLanes,\n\t\t\tincompleteLanes: lanes.length - completeLanes,\n\t\t\tpushCoveredLanes,\n\t\t\tworkGraphCoveredLanes,\n\t\t},\n\t\tlanes,\n\t};\n}\n\nexport function a2aPushEvidenceKey(peer: string, taskId: string): string {\n\treturn `${peer}\\u0000${taskId}`;\n}\n\nexport function a2aDelegationLaneId(\n\tpeer: string,\n\tparentTaskId: string,\n): string {\n\treturn `a2a:${encodeURIComponent(peer)}:${encodeURIComponent(parentTaskId)}`;\n}\n\nfunction buildRemoteLaneSources(\n\tinput: BuildA2ACompletionAuditInput,\n): A2AAuditLaneSource[] {\n\tconst teammateLanes = input.swarm.teammates\n\t\t.filter(hasA2ATask)\n\t\t.map((teammate) => {\n\t\t\tconst ledgerEntry = findLedgerEntry(input.ledger, teammate.a2a);\n\t\t\tconst parentTaskId = parentTaskIdForLane(\n\t\t\t\tteammate.completedTasks,\n\t\t\t\tledgerEntry,\n\t\t\t\tteammate.a2a,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tlaneId: parentTaskId\n\t\t\t\t\t? a2aDelegationLaneId(teammate.a2a.peer, parentTaskId)\n\t\t\t\t\t: teammate.id,\n\t\t\t\tparentTaskId,\n\t\t\t\tcompletedTasks: teammate.completedTasks,\n\t\t\t\ta2a: teammate.a2a,\n\t\t\t\tledgerEntry,\n\t\t\t};\n\t\t});\n\tconst seen = new Set(teammateLanes.map((lane) => laneKey(lane.a2a)));\n\tconst ledgerOnlyLanes = input.ledger.tasks\n\t\t.filter((entry) => entry.kind === \"delegation\")\n\t\t.filter((entry) => stringMetadata(entry, \"swarmId\") === input.swarm.id)\n\t\t.filter((entry) => !seen.has(a2aPushEvidenceKey(entry.peer, entry.taskId)))\n\t\t.map((entry) => {\n\t\t\tconst parentTaskId = parentTaskIdForLedger(entry);\n\t\t\treturn {\n\t\t\t\tlaneId: parentTaskId\n\t\t\t\t\t? a2aDelegationLaneId(entry.peer, parentTaskId)\n\t\t\t\t\t: fallbackRemoteLaneId(entry.peer, entry.taskId),\n\t\t\t\tparentTaskId,\n\t\t\t\tcompletedTasks: [],\n\t\t\t\ta2a: {\n\t\t\t\t\tpeer: entry.peer,\n\t\t\t\t\tpeerDisplayName: entry.peerDisplayName,\n\t\t\t\t\tsource: \"registry\" as const,\n\t\t\t\t\ttaskId: entry.taskId,\n\t\t\t\t\tcontextId: entry.contextId,\n\t\t\t\t\tmessageId: entry.messageId ?? \"\",\n\t\t\t\t\trole: entry.role,\n\t\t\t\t},\n\t\t\t\tledgerEntry: entry,\n\t\t\t};\n\t\t});\n\treturn [...teammateLanes, ...ledgerOnlyLanes];\n}\n\nfunction hasA2ATask(\n\tteammate: SwarmTeammate,\n): teammate is SwarmTeammate & { a2a: A2AAuditA2A } {\n\treturn Boolean(teammate.a2a?.taskId);\n}\n\nfunction laneKey(a2a: A2AAuditA2A): string {\n\treturn a2aPushEvidenceKey(a2a.peer, a2a.taskId);\n}\n\nfunction findLedgerEntry(\n\tledger: A2ATaskLedgerFile,\n\ta2a: A2AAuditA2A,\n): A2ATaskLedgerEntry | undefined {\n\treturn ledger.tasks.find(\n\t\t(entry) => entry.taskId === a2a.taskId && entry.peer === a2a.peer,\n\t);\n}\n\nfunction buildLaneAudit(\n\tinput: BuildA2ACompletionAuditInput,\n\tlane: A2AAuditLaneSource,\n\tremoteTaskIdCounts: ReadonlyMap<string, number>,\n): A2ACompletionAuditLane {\n\tconst { a2a, ledgerEntry } = lane;\n\tconst parentTaskId =\n\t\tlane.parentTaskId ??\n\t\tparentTaskIdForLane(lane.completedTasks, ledgerEntry, a2a);\n\tconst status = ledgerEntry?.state;\n\tconst evidence: Record<A2ACompletionEvidenceKey, boolean> = {\n\t\tstatus: Boolean(status),\n\t\tartifact: hasArtifactEvidence(ledgerEntry),\n\t\ttask: Boolean(ledgerEntry),\n\t\tworkGraph: Boolean(ledgerEntry?.workGraph),\n\t\tpush: hasPushEvidence(input, a2a, remoteTaskIdCounts),\n\t\tcorrelation: hasCorrelationEvidence(\n\t\t\tinput.swarm.id,\n\t\t\tparentTaskId,\n\t\t\ta2a,\n\t\t\tledgerEntry,\n\t\t),\n\t};\n\tconst missingEvidence = EVIDENCE_ORDER.filter((key) => !evidence[key]);\n\treturn {\n\t\tlaneId: lane.laneId,\n\t\tparentTaskId,\n\t\ta2aTaskId: a2a.taskId,\n\t\ta2aMessageId: a2a.messageId,\n\t\tcontextId: a2a.contextId ?? ledgerEntry?.contextId,\n\t\tpeer: a2a.peer,\n\t\tstatus,\n\t\tterminal: Boolean(status && isTerminalA2AState(status)),\n\t\tevidence,\n\t\tmissingEvidence,\n\t};\n}\n\nfunction countRemoteTaskIds(lanes: A2AAuditLaneSource[]): Map<string, number> {\n\tconst counts = new Map<string, number>();\n\tfor (const lane of lanes) {\n\t\tconst taskId = lane.a2a.taskId;\n\t\tcounts.set(taskId, (counts.get(taskId) ?? 0) + 1);\n\t}\n\treturn counts;\n}\n\nfunction hasPushEvidence(\n\tinput: BuildA2ACompletionAuditInput,\n\ta2a: NonNullable<SwarmTeammate[\"a2a\"]>,\n\tremoteTaskIdCounts: ReadonlyMap<string, number>,\n): boolean {\n\tconst exactKey = a2aPushEvidenceKey(a2a.peer, a2a.taskId);\n\tif (input.pushEvidenceKeys?.has(exactKey)) {\n\t\treturn true;\n\t}\n\tif ((remoteTaskIdCounts.get(a2a.taskId) ?? 0) > 1) {\n\t\treturn false;\n\t}\n\treturn input.pushTaskIds?.has(a2a.taskId) ?? false;\n}\n\nfunction parentTaskIdForLedger(\n\tledgerEntry: A2ATaskLedgerEntry | undefined,\n): string | undefined {\n\treturn (\n\t\tstringMetadata(ledgerEntry, \"taskId\") ??\n\t\tstringMetadata(ledgerEntry, \"task_id\")\n\t);\n}\n\nfunction parentTaskIdForLane(\n\tcompletedTasks: string[],\n\tledgerEntry: A2ATaskLedgerEntry | undefined,\n\ta2a?: A2AAuditA2A,\n): string | undefined {\n\tconst ledgerParentTaskId = parentTaskIdForLedger(ledgerEntry);\n\tconst a2aParentTaskId = a2a?.parentTaskId;\n\tif (ledgerEntry?.state && !isCompletedA2AState(ledgerEntry.state)) {\n\t\treturn ledgerParentTaskId ?? a2aParentTaskId ?? lastValue(completedTasks);\n\t}\n\treturn lastValue(completedTasks) ?? ledgerParentTaskId ?? a2aParentTaskId;\n}\n\nfunction isCompletedA2AState(state: string): boolean {\n\treturn /COMPLETED/u.test(state.toUpperCase().replace(/[\\s-]+/gu, \"_\"));\n}\n\nfunction lastValue(values: string[]): string | undefined {\n\treturn values.length > 0 ? values[values.length - 1] : undefined;\n}\n\nfunction fallbackRemoteLaneId(peer: string, taskId: string): string {\n\treturn `a2a:${encodeURIComponent(peer)}:remote:${encodeURIComponent(taskId)}`;\n}\n\nfunction hasArtifactEvidence(entry: A2ATaskLedgerEntry | undefined): boolean {\n\treturn Boolean(\n\t\tentry?.responseText?.trim() ||\n\t\t\tentry?.transcript.some(\n\t\t\t\t(item) => item.role === \"agent\" && item.text.trim().length > 0,\n\t\t\t),\n\t);\n}\n\nfunction hasCorrelationEvidence(\n\tswarmId: string,\n\tparentTaskId: string | undefined,\n\ta2a: NonNullable<SwarmTeammate[\"a2a\"]>,\n\tentry: A2ATaskLedgerEntry | undefined,\n): boolean {\n\tif (!entry) {\n\t\treturn false;\n\t}\n\tconst ledgerParentTaskId =\n\t\tstringMetadata(entry, \"taskId\") ?? stringMetadata(entry, \"task_id\");\n\treturn Boolean(\n\t\ta2a.messageId &&\n\t\t\tentry.messageId === a2a.messageId &&\n\t\t\t(a2a.contextId ? entry.contextId === a2a.contextId : entry.contextId) &&\n\t\t\tstringMetadata(entry, \"swarmId\") === swarmId &&\n\t\t\tparentTaskId &&\n\t\t\tledgerParentTaskId === parentTaskId,\n\t);\n}\n\nfunction stringMetadata(\n\tentry: A2ATaskLedgerEntry | undefined,\n\tkey: string,\n): string | undefined {\n\tconst value = entry?.metadata?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-task-ledger.d.ts","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACN,KAAK,oBAAoB,EAGzB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CACjE;
|
|
1
|
+
{"version":3,"file":"a2a-task-ledger.d.ts","sourceRoot":"","sources":["../../src/platform/a2a-task-ledger.ts"],"names":[],"mappings":"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"}
|