@adcp/sdk 12.0.0 → 12.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/content-standards-adapter.mjs +0 -6
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/derived-account-store.mjs +0 -6
- package/dist/lib/adapters/derived-account-store.mjs.map +1 -1
- package/dist/lib/adapters/governance-adapter.mjs +0 -6
- package/dist/lib/adapters/governance-adapter.mjs.map +1 -1
- package/dist/lib/adapters/implicit-account-store.mjs +0 -6
- package/dist/lib/adapters/implicit-account-store.mjs.map +1 -1
- package/dist/lib/adapters/index.mjs +0 -6
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/create_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/get_products.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/index.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/index.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/list_creative_formats.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/preview_creative.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/sync_creatives.mjs.map +1 -1
- package/dist/lib/adapters/legacy/v2-5/types.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs +0 -6
- package/dist/lib/adapters/legacy/v2-5/update_media_buy.mjs.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs +0 -6
- package/dist/lib/adapters/oauth-passthrough-resolver.mjs.map +1 -1
- package/dist/lib/adapters/property-list-adapter.mjs +0 -6
- package/dist/lib/adapters/property-list-adapter.mjs.map +1 -1
- package/dist/lib/adapters/roster-account-store.mjs +0 -6
- package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
- package/dist/lib/adapters/si-session-manager.mjs +0 -6
- package/dist/lib/adapters/si-session-manager.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +0 -6
- package/dist/lib/adapters/version/3.0/brand-fields.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/get-products.mjs +0 -6
- package/dist/lib/adapters/version/3.0/get-products.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/index.mjs +0 -6
- package/dist/lib/adapters/version/3.0/index.mjs.map +1 -1
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs +0 -6
- package/dist/lib/adapters/version/3.0/sync-accounts.mjs.map +1 -1
- package/dist/lib/adapters/version/index.mjs +0 -6
- package/dist/lib/adapters/version/index.mjs.map +1 -1
- package/dist/lib/adapters/version/types.mjs +0 -6
- package/dist/lib/advanced.mjs +0 -6
- package/dist/lib/advanced.mjs.map +1 -1
- package/dist/lib/agents/index.generated.mjs +0 -6
- package/dist/lib/agents/index.generated.mjs.map +1 -1
- package/dist/lib/auth/index.mjs +0 -6
- package/dist/lib/auth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/CLIFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs +0 -6
- package/dist/lib/auth/oauth/ClientCredentialsFlow.mjs.map +1 -1
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs +0 -6
- package/dist/lib/auth/oauth/MCPOAuthProvider.mjs.map +1 -1
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs +0 -6
- package/dist/lib/auth/oauth/NonInteractiveFlowHandler.mjs.map +1 -1
- package/dist/lib/auth/oauth/authorization-required.mjs +0 -6
- package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnose.mjs +0 -6
- package/dist/lib/auth/oauth/diagnose.mjs.map +1 -1
- package/dist/lib/auth/oauth/diagnostics.mjs +0 -6
- package/dist/lib/auth/oauth/diagnostics.mjs.map +1 -1
- package/dist/lib/auth/oauth/discovery.mjs +0 -6
- package/dist/lib/auth/oauth/discovery.mjs.map +1 -1
- package/dist/lib/auth/oauth/file-storage.mjs +0 -6
- package/dist/lib/auth/oauth/file-storage.mjs.map +1 -1
- package/dist/lib/auth/oauth/index.mjs +0 -6
- package/dist/lib/auth/oauth/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/secret-resolver.mjs +0 -6
- package/dist/lib/auth/oauth/secret-resolver.mjs.map +1 -1
- package/dist/lib/auth/oauth/storage-registry.mjs +0 -6
- package/dist/lib/auth/oauth/storage-registry.mjs.map +1 -1
- package/dist/lib/auth/oauth/types.mjs +0 -6
- package/dist/lib/auth/oauth/types.mjs.map +1 -1
- package/dist/lib/auth/oauth/web-flow.mjs +0 -6
- package/dist/lib/auth/oauth/web-flow.mjs.map +1 -1
- package/dist/lib/brand/index.mjs +0 -6
- package/dist/lib/brand/index.mjs.map +1 -1
- package/dist/lib/canonical-references/index.mjs +6 -7
- package/dist/lib/canonical-references/index.mjs.map +1 -1
- package/dist/lib/client/index.mjs +0 -6
- package/dist/lib/client/index.mjs.map +1 -1
- package/dist/lib/compliance/index.mjs +0 -6
- package/dist/lib/compliance/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/index.mjs +0 -6
- package/dist/lib/compliance-fixtures/index.mjs.map +1 -1
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs +0 -6
- package/dist/lib/compliance-fixtures/test-authorization-server.mjs.map +1 -1
- package/dist/lib/conformance/index.mjs +0 -6
- package/dist/lib/conformance/index.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs +0 -6
- package/dist/lib/conformance/invariants/uniformErrorComparator.mjs.map +1 -1
- package/dist/lib/conformance/oracle.mjs +0 -6
- package/dist/lib/conformance/oracle.mjs.map +1 -1
- package/dist/lib/conformance/runConformance.mjs +0 -6
- package/dist/lib/conformance/runConformance.mjs.map +1 -1
- package/dist/lib/conformance/runners.mjs +0 -6
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/schemaArbitrary.mjs +0 -6
- package/dist/lib/conformance/schemaArbitrary.mjs.map +1 -1
- package/dist/lib/conformance/schemaLoader.mjs +5 -6
- package/dist/lib/conformance/schemaLoader.mjs.map +1 -1
- package/dist/lib/conformance/seeder.mjs +0 -6
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/conformance/types.mjs +0 -6
- package/dist/lib/conformance/types.mjs.map +1 -1
- package/dist/lib/conformance/webhook.mjs +0 -6
- package/dist/lib/conformance/webhook.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +0 -6
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.mjs +0 -6
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +0 -6
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConfigurationManager.mjs +0 -6
- package/dist/lib/core/ConfigurationManager.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs +0 -6
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/GovernanceMiddleware.mjs +0 -6
- package/dist/lib/core/GovernanceMiddleware.mjs.map +1 -1
- package/dist/lib/core/GovernanceTypes.mjs +0 -6
- package/dist/lib/core/GovernanceTypes.mjs.map +1 -1
- package/dist/lib/core/ProtocolResponseParser.mjs +0 -6
- package/dist/lib/core/ProtocolResponseParser.mjs.map +1 -1
- package/dist/lib/core/ResponseValidator.mjs +0 -6
- package/dist/lib/core/ResponseValidator.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +0 -6
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskEventTypes.mjs +0 -6
- package/dist/lib/core/TaskEventTypes.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +0 -6
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/core/match.mjs +0 -6
- package/dist/lib/core/match.mjs.map +1 -1
- package/dist/lib/core/task-status.mjs +0 -6
- package/dist/lib/core/task-status.mjs.map +1 -1
- package/dist/lib/core/webhook-url.mjs +0 -6
- package/dist/lib/core/webhook-url.mjs.map +1 -1
- package/dist/lib/discovery/adagents-redirects.mjs +0 -6
- package/dist/lib/discovery/adagents-redirects.mjs.map +1 -1
- package/dist/lib/discovery/agent-directory.mjs +0 -6
- package/dist/lib/discovery/agent-directory.mjs.map +1 -1
- package/dist/lib/discovery/inline-publisher-properties.mjs +0 -6
- package/dist/lib/discovery/inline-publisher-properties.mjs.map +1 -1
- package/dist/lib/discovery/network-consistency-checker.mjs +0 -6
- package/dist/lib/discovery/network-consistency-checker.mjs.map +1 -1
- package/dist/lib/discovery/property-crawler.mjs +0 -6
- package/dist/lib/discovery/property-crawler.mjs.map +1 -1
- package/dist/lib/discovery/property-index.mjs +0 -6
- package/dist/lib/discovery/property-index.mjs.map +1 -1
- package/dist/lib/discovery/publisher-property-selector.mjs +0 -6
- package/dist/lib/discovery/publisher-property-selector.mjs.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.mjs +0 -6
- package/dist/lib/discovery/resolve-agent-properties.mjs.map +1 -1
- package/dist/lib/discovery/types.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs +0 -6
- package/dist/lib/discovery/validate-adagents.mjs.map +1 -1
- package/dist/lib/enums.mjs +0 -6
- package/dist/lib/enums.mjs.map +1 -1
- package/dist/lib/errors/index.mjs +0 -6
- package/dist/lib/errors/index.mjs.map +1 -1
- package/dist/lib/express-mcp/index.mjs +0 -6
- package/dist/lib/express-mcp/index.mjs.map +1 -1
- package/dist/lib/governance/index.mjs +0 -6
- package/dist/lib/governance/index.mjs.map +1 -1
- package/dist/lib/handlers/types.mjs +0 -6
- package/dist/lib/handlers/types.mjs.map +1 -1
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +0 -6
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/media-buy/available-actions.mjs +0 -6
- package/dist/lib/media-buy/available-actions.mjs.map +1 -1
- package/dist/lib/media-buy/index.mjs +0 -6
- package/dist/lib/media-buy/index.mjs.map +1 -1
- package/dist/lib/media-buy/preflight.mjs +0 -6
- package/dist/lib/media-buy/preflight.mjs.map +1 -1
- package/dist/lib/media-buy/property-policy.mjs +0 -6
- package/dist/lib/media-buy/property-policy.mjs.map +1 -1
- package/dist/lib/media-buy/types.mjs +0 -6
- package/dist/lib/media-buy/types.mjs.map +1 -1
- package/dist/lib/media-buy/update-fields.generated.mjs +0 -6
- package/dist/lib/media-buy/update-fields.generated.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/server.mjs +0 -6
- package/dist/lib/mock-server/creative-ad-server/server.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.mjs +0 -6
- package/dist/lib/mock-server/creative-template/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/creative-template/server.mjs +0 -6
- package/dist/lib/mock-server/creative-template/server.mjs.map +1 -1
- package/dist/lib/mock-server/index.mjs +0 -6
- package/dist/lib/mock-server/index.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/recipe.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs +0 -6
- package/dist/lib/mock-server/sales-non-guaranteed/server.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sales-social/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sales-social/server.mjs +0 -6
- package/dist/lib/mock-server/sales-social/server.mjs.map +1 -1
- package/dist/lib/mock-server/scenario.mjs +0 -6
- package/dist/lib/mock-server/scenario.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/signal-marketplace/server.mjs +0 -6
- package/dist/lib/mock-server/signal-marketplace/server.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.mjs.map +1 -1
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs +0 -6
- package/dist/lib/mock-server/sponsored-intelligence/server.mjs.map +1 -1
- package/dist/lib/net/address-guards.mjs +0 -6
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/net/index.mjs +0 -6
- package/dist/lib/net/index.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +0 -6
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/observability/index.mjs +0 -6
- package/dist/lib/observability/index.mjs.map +1 -1
- package/dist/lib/observability/tracing.mjs +6 -7
- package/dist/lib/observability/tracing.mjs.map +1 -1
- package/dist/lib/protocols/a2a.mjs +0 -6
- package/dist/lib/protocols/a2a.mjs.map +1 -1
- package/dist/lib/protocols/abort.mjs +0 -6
- package/dist/lib/protocols/abort.mjs.map +1 -1
- package/dist/lib/protocols/index.mjs +0 -6
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +0 -6
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/protocols/mcp-tasks.mjs +0 -6
- package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
- package/dist/lib/protocols/mcp.mjs +0 -6
- package/dist/lib/protocols/mcp.mjs.map +1 -1
- package/dist/lib/protocols/rawResponseCapture.mjs +0 -6
- package/dist/lib/protocols/rawResponseCapture.mjs.map +1 -1
- package/dist/lib/protocols/responseSizeLimit.mjs +0 -6
- package/dist/lib/protocols/responseSizeLimit.mjs.map +1 -1
- package/dist/lib/protocols/transportDiagnostics.mjs +0 -6
- package/dist/lib/protocols/transportDiagnostics.mjs.map +1 -1
- package/dist/lib/registry/cursor-store.mjs +0 -6
- package/dist/lib/registry/cursor-store.mjs.map +1 -1
- package/dist/lib/registry/feed-stream.mjs +0 -6
- package/dist/lib/registry/feed-stream.mjs.map +1 -1
- package/dist/lib/registry/index.mjs +0 -6
- package/dist/lib/registry/index.mjs.map +1 -1
- package/dist/lib/registry/property-registry.mjs +0 -6
- package/dist/lib/registry/property-registry.mjs.map +1 -1
- package/dist/lib/registry/sync.mjs +0 -6
- package/dist/lib/registry/sync.mjs.map +1 -1
- package/dist/lib/registry/types.generated.mjs +0 -6
- package/dist/lib/registry/types.mjs +0 -6
- package/dist/lib/schemas/index.mjs +0 -6
- package/dist/lib/schemas/index.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/a2a-adapter.mjs +0 -6
- package/dist/lib/server/a2a-adapter.mjs.map +1 -1
- package/dist/lib/server/account-mode.mjs +0 -6
- package/dist/lib/server/account-mode.mjs.map +1 -1
- package/dist/lib/server/adcp-server.mjs +0 -6
- package/dist/lib/server/adcp-server.mjs.map +1 -1
- package/dist/lib/server/auth-introspection.mjs +0 -6
- package/dist/lib/server/auth-introspection.mjs.map +1 -1
- package/dist/lib/server/auth-signature.mjs +0 -6
- package/dist/lib/server/auth-signature.mjs.map +1 -1
- package/dist/lib/server/auth.mjs +0 -6
- package/dist/lib/server/auth.mjs.map +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts +13 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +3 -2
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +3 -8
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/credential-policy.mjs +0 -6
- package/dist/lib/server/credential-policy.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/memory.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/memory.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/pg.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/pg.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/redis.mjs +0 -6
- package/dist/lib/server/ctx-metadata/backends/redis.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/index.mjs +0 -6
- package/dist/lib/server/ctx-metadata/index.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/store.mjs +0 -6
- package/dist/lib/server/ctx-metadata/store.mjs.map +1 -1
- package/dist/lib/server/ctx-metadata/wire-shape.mjs +0 -6
- package/dist/lib/server/ctx-metadata/wire-shape.mjs.map +1 -1
- package/dist/lib/server/decisioning/account.mjs +0 -6
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/admin-router.mjs +0 -6
- package/dist/lib/server/decisioning/admin-router.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.mjs +0 -6
- package/dist/lib/server/decisioning/async-outcome.mjs.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.mjs +0 -6
- package/dist/lib/server/decisioning/buyer-agent.mjs.map +1 -1
- package/dist/lib/server/decisioning/capabilities.mjs +0 -6
- package/dist/lib/server/decisioning/capabilities.mjs.map +1 -1
- package/dist/lib/server/decisioning/compose.mjs +0 -6
- package/dist/lib/server/decisioning/compose.mjs.map +1 -1
- package/dist/lib/server/decisioning/context.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs +0 -6
- package/dist/lib/server/decisioning/errors-typed.mjs.map +1 -1
- package/dist/lib/server/decisioning/helpers.mjs +0 -6
- package/dist/lib/server/decisioning/helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +0 -6
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/pagination.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs +0 -6
- package/dist/lib/server/decisioning/platform-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/platform.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/store.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/store.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs +0 -6
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/resolve-presets.mjs +0 -6
- package/dist/lib/server/decisioning/resolve-presets.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/observed-modes.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/task-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/to-context.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs +0 -6
- package/dist/lib/server/decisioning/runtime/validate-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/audiences.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/brand-rights.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/campaign-governance.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/content-standards.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/creative.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/lists.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sales.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/signals.mjs +0 -6
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs +0 -6
- package/dist/lib/server/decisioning/start-time.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-changes.mjs +0 -6
- package/dist/lib/server/decisioning/status-changes.mjs.map +1 -1
- package/dist/lib/server/decisioning/status-mappers.mjs +0 -6
- package/dist/lib/server/decisioning/status-mappers.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-registry.mjs.map +1 -1
- package/dist/lib/server/decisioning/tenant-store.mjs +0 -6
- package/dist/lib/server/decisioning/tenant-store.mjs.map +1 -1
- package/dist/lib/server/decisioning/validate-specialisms.mjs +0 -6
- package/dist/lib/server/decisioning/validate-specialisms.mjs.map +1 -1
- package/dist/lib/server/dynamic-registry.mjs +0 -6
- package/dist/lib/server/dynamic-registry.mjs.map +1 -1
- package/dist/lib/server/envelope-allowlist.mjs +0 -6
- package/dist/lib/server/envelope-allowlist.mjs.map +1 -1
- package/dist/lib/server/error-arm-tools.mjs +5 -6
- package/dist/lib/server/error-arm-tools.mjs.map +1 -1
- package/dist/lib/server/errors.mjs +0 -6
- package/dist/lib/server/errors.mjs.map +1 -1
- package/dist/lib/server/example-tld-guard.mjs +0 -6
- package/dist/lib/server/example-tld-guard.mjs.map +1 -1
- package/dist/lib/server/express-adapter.mjs +0 -6
- package/dist/lib/server/express-adapter.mjs.map +1 -1
- package/dist/lib/server/governance.mjs +0 -6
- package/dist/lib/server/governance.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/lazy.mjs +0 -6
- package/dist/lib/server/idempotency/backends/lazy.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/memory.mjs +0 -6
- package/dist/lib/server/idempotency/backends/memory.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/pg.mjs +0 -6
- package/dist/lib/server/idempotency/backends/pg.mjs.map +1 -1
- package/dist/lib/server/idempotency/backends/redis.mjs +0 -6
- package/dist/lib/server/idempotency/backends/redis.mjs.map +1 -1
- package/dist/lib/server/idempotency/index.mjs +0 -6
- package/dist/lib/server/idempotency/index.mjs.map +1 -1
- package/dist/lib/server/idempotency/store.mjs +0 -6
- package/dist/lib/server/idempotency/store.mjs.map +1 -1
- package/dist/lib/server/index.d.mts +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/index.mjs +0 -6
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.mts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +0 -6
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/mcp-modern-server.mjs +0 -6
- package/dist/lib/server/mcp-modern-server.mjs.map +1 -1
- package/dist/lib/server/media-buy-actions.mjs +0 -6
- package/dist/lib/server/media-buy-actions.mjs.map +1 -1
- package/dist/lib/server/media-buy-helpers.mjs +0 -6
- package/dist/lib/server/media-buy-helpers.mjs.map +1 -1
- package/dist/lib/server/media-buy-store.mjs +0 -6
- package/dist/lib/server/media-buy-store.mjs.map +1 -1
- package/dist/lib/server/normalize-errors.mjs +0 -6
- package/dist/lib/server/normalize-errors.mjs.map +1 -1
- package/dist/lib/server/operational-platform.mjs +0 -6
- package/dist/lib/server/operational-platform.mjs.map +1 -1
- package/dist/lib/server/pick-safe-details.mjs +0 -6
- package/dist/lib/server/pick-safe-details.mjs.map +1 -1
- package/dist/lib/server/pin-and-bind-fetch.mjs +0 -6
- package/dist/lib/server/pin-and-bind-fetch.mjs.map +1 -1
- package/dist/lib/server/postgres-state-store.mjs +0 -6
- package/dist/lib/server/postgres-state-store.mjs.map +1 -1
- package/dist/lib/server/postgres-task-store.mjs +0 -6
- package/dist/lib/server/postgres-task-store.mjs.map +1 -1
- package/dist/lib/server/product-defaults.mjs +0 -6
- package/dist/lib/server/product-defaults.mjs.map +1 -1
- package/dist/lib/server/redact.mjs +0 -6
- package/dist/lib/server/redact.mjs.map +1 -1
- package/dist/lib/server/responses.mjs +0 -6
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/server/serve.mjs +0 -6
- package/dist/lib/server/serve.mjs.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.mjs +0 -6
- package/dist/lib/server/socket-mode/conformance-client.mjs.map +1 -1
- package/dist/lib/server/socket-mode/index.mjs +0 -6
- package/dist/lib/server/socket-mode/index.mjs.map +1 -1
- package/dist/lib/server/socket-mode/ws-transport.mjs +0 -6
- package/dist/lib/server/socket-mode/ws-transport.mjs.map +1 -1
- package/dist/lib/server/state-machine.mjs +0 -6
- package/dist/lib/server/state-machine.mjs.map +1 -1
- package/dist/lib/server/state-store.mjs +0 -6
- package/dist/lib/server/state-store.mjs.map +1 -1
- package/dist/lib/server/structured-serialize.mjs +0 -6
- package/dist/lib/server/structured-serialize.mjs.map +1 -1
- package/dist/lib/server/targeting-helpers.mjs +0 -6
- package/dist/lib/server/targeting-helpers.mjs.map +1 -1
- package/dist/lib/server/tasks.mjs +0 -6
- package/dist/lib/server/tasks.mjs.map +1 -1
- package/dist/lib/server/test-controller-bridge.mjs +0 -6
- package/dist/lib/server/test-controller-bridge.mjs.map +1 -1
- package/dist/lib/server/test-controller.mjs +0 -6
- package/dist/lib/server/test-controller.mjs.map +1 -1
- package/dist/lib/server/upstream-helpers.mjs +0 -6
- package/dist/lib/server/upstream-helpers.mjs.map +1 -1
- package/dist/lib/server/webhook-emitter.mjs +0 -6
- package/dist/lib/server/webhook-emitter.mjs.map +1 -1
- package/dist/lib/server/wire-safe.mjs +0 -6
- package/dist/lib/server/wire-safe.mjs.map +1 -1
- package/dist/lib/server/wire-spec-fields.generated.mjs +0 -6
- package/dist/lib/server/wire-spec-fields.generated.mjs.map +1 -1
- package/dist/lib/server/wrap-envelope.mjs +0 -6
- package/dist/lib/server/wrap-envelope.mjs.map +1 -1
- package/dist/lib/signing/agent-context.mjs +0 -6
- package/dist/lib/signing/agent-context.mjs.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +0 -6
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +0 -6
- package/dist/lib/signing/agent-resolver/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs +0 -6
- package/dist/lib/signing/agent-resolver/capabilities-types.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/consistency.mjs +0 -6
- package/dist/lib/signing/agent-resolver/consistency.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/errors.mjs +0 -6
- package/dist/lib/signing/agent-resolver/errors.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.mjs +0 -6
- package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +0 -6
- package/dist/lib/signing/agent-resolver/fetch-helpers.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/index.mjs +0 -6
- package/dist/lib/signing/agent-resolver/index.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/jwks-set.mjs +0 -6
- package/dist/lib/signing/agent-resolver/jwks-set.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/resolve-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/select-agent.mjs +0 -6
- package/dist/lib/signing/agent-resolver/select-agent.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/strict-json.mjs +0 -6
- package/dist/lib/signing/agent-resolver/strict-json.mjs.map +1 -1
- package/dist/lib/signing/brand-jwks.mjs +0 -6
- package/dist/lib/signing/brand-jwks.mjs.map +1 -1
- package/dist/lib/signing/canonicalize.mjs +0 -6
- package/dist/lib/signing/canonicalize.mjs.map +1 -1
- package/dist/lib/signing/capability-cache.mjs +0 -6
- package/dist/lib/signing/capability-cache.mjs.map +1 -1
- package/dist/lib/signing/capability-priming.mjs +0 -6
- package/dist/lib/signing/capability-priming.mjs.map +1 -1
- package/dist/lib/signing/client.mjs +0 -6
- package/dist/lib/signing/client.mjs.map +1 -1
- package/dist/lib/signing/content-digest.mjs +0 -6
- package/dist/lib/signing/content-digest.mjs.map +1 -1
- package/dist/lib/signing/crypto.mjs +0 -6
- package/dist/lib/signing/crypto.mjs.map +1 -1
- package/dist/lib/signing/ecdsa-encoding.mjs +0 -6
- package/dist/lib/signing/ecdsa-encoding.mjs.map +1 -1
- package/dist/lib/signing/errors.mjs +0 -6
- package/dist/lib/signing/errors.mjs.map +1 -1
- package/dist/lib/signing/fetch-async.mjs +0 -6
- package/dist/lib/signing/fetch-async.mjs.map +1 -1
- package/dist/lib/signing/fetch.mjs +0 -6
- package/dist/lib/signing/fetch.mjs.map +1 -1
- package/dist/lib/signing/index.mjs +0 -6
- package/dist/lib/signing/index.mjs.map +1 -1
- package/dist/lib/signing/jwks-helpers.mjs +0 -6
- package/dist/lib/signing/jwks-helpers.mjs.map +1 -1
- package/dist/lib/signing/jwks-https.mjs +0 -6
- package/dist/lib/signing/jwks-https.mjs.map +1 -1
- package/dist/lib/signing/jwks.mjs +0 -6
- package/dist/lib/signing/jwks.mjs.map +1 -1
- package/dist/lib/signing/middleware.mjs +0 -6
- package/dist/lib/signing/middleware.mjs.map +1 -1
- package/dist/lib/signing/parser.mjs +0 -6
- package/dist/lib/signing/parser.mjs.map +1 -1
- package/dist/lib/signing/postgres-replay-store.mjs +0 -6
- package/dist/lib/signing/postgres-replay-store.mjs.map +1 -1
- package/dist/lib/signing/protocol-response.mjs +0 -6
- package/dist/lib/signing/protocol-response.mjs.map +1 -1
- package/dist/lib/signing/provider.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs +0 -6
- package/dist/lib/signing/redis-replay-store.mjs.map +1 -1
- package/dist/lib/signing/replay.mjs +0 -6
- package/dist/lib/signing/replay.mjs.map +1 -1
- package/dist/lib/signing/request-context.mjs +0 -6
- package/dist/lib/signing/request-context.mjs.map +1 -1
- package/dist/lib/signing/revocation-https.mjs +0 -6
- package/dist/lib/signing/revocation-https.mjs.map +1 -1
- package/dist/lib/signing/revocation.mjs +0 -6
- package/dist/lib/signing/revocation.mjs.map +1 -1
- package/dist/lib/signing/server.mjs +0 -6
- package/dist/lib/signing/server.mjs.map +1 -1
- package/dist/lib/signing/signer-async.mjs +0 -6
- package/dist/lib/signing/signer-async.mjs.map +1 -1
- package/dist/lib/signing/signer.mjs +0 -6
- package/dist/lib/signing/signer.mjs.map +1 -1
- package/dist/lib/signing/testing.mjs +0 -6
- package/dist/lib/signing/testing.mjs.map +1 -1
- package/dist/lib/signing/types.mjs +0 -6
- package/dist/lib/signing/types.mjs.map +1 -1
- package/dist/lib/signing/verifier.mjs +0 -6
- package/dist/lib/signing/verifier.mjs.map +1 -1
- package/dist/lib/signing/webhook-auth-detection.mjs +0 -6
- package/dist/lib/signing/webhook-auth-detection.mjs.map +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +0 -6
- package/dist/lib/signing/webhook-verifier.mjs.map +1 -1
- package/dist/lib/storage/MemoryStorage.mjs +0 -6
- package/dist/lib/storage/MemoryStorage.mjs.map +1 -1
- package/dist/lib/storage/interfaces.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs +0 -6
- package/dist/lib/substitution/encoder/SubstitutionEncoder.mjs.map +1 -1
- package/dist/lib/substitution/encoder/index.mjs +0 -6
- package/dist/lib/substitution/encoder/index.mjs.map +1 -1
- package/dist/lib/substitution/index.mjs +0 -6
- package/dist/lib/substitution/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs +0 -6
- package/dist/lib/substitution/observer/SubstitutionObserver.mjs.map +1 -1
- package/dist/lib/substitution/observer/alignment.mjs +0 -6
- package/dist/lib/substitution/observer/alignment.mjs.map +1 -1
- package/dist/lib/substitution/observer/assertions.mjs +0 -6
- package/dist/lib/substitution/observer/assertions.mjs.map +1 -1
- package/dist/lib/substitution/observer/html-parser.mjs +0 -6
- package/dist/lib/substitution/observer/html-parser.mjs.map +1 -1
- package/dist/lib/substitution/observer/index.mjs +0 -6
- package/dist/lib/substitution/observer/index.mjs.map +1 -1
- package/dist/lib/substitution/observer/ssrf.mjs +0 -6
- package/dist/lib/substitution/observer/ssrf.mjs.map +1 -1
- package/dist/lib/substitution/rfc3986.mjs +0 -6
- package/dist/lib/substitution/rfc3986.mjs.map +1 -1
- package/dist/lib/substitution/translate.mjs +0 -6
- package/dist/lib/substitution/translate.mjs.map +1 -1
- package/dist/lib/substitution/types.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs +0 -6
- package/dist/lib/substitution/vectors.mjs.map +1 -1
- package/dist/lib/testing/agent-tester.mjs +0 -6
- package/dist/lib/testing/agent-tester.mjs.map +1 -1
- package/dist/lib/testing/client.mjs +0 -6
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/briefs.mjs +0 -6
- package/dist/lib/testing/compliance/briefs.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +0 -6
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/compliance/index.mjs +0 -6
- package/dist/lib/testing/compliance/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/spec-conformance.mjs +0 -6
- package/dist/lib/testing/compliance/spec-conformance.mjs.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +0 -6
- package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
- package/dist/lib/testing/compliance/summary.mjs +0 -6
- package/dist/lib/testing/compliance/summary.mjs.map +1 -1
- package/dist/lib/testing/compliance/types.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs +0 -6
- package/dist/lib/testing/comply-controller.mjs.map +1 -1
- package/dist/lib/testing/controller-assertions.mjs +0 -6
- package/dist/lib/testing/controller-assertions.mjs.map +1 -1
- package/dist/lib/testing/formatter.mjs +0 -6
- package/dist/lib/testing/formatter.mjs.map +1 -1
- package/dist/lib/testing/index.mjs +0 -6
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/local-agent-runner.mjs +0 -6
- package/dist/lib/testing/local-agent-runner.mjs.map +1 -1
- package/dist/lib/testing/orchestrator.mjs +0 -6
- package/dist/lib/testing/orchestrator.mjs.map +1 -1
- package/dist/lib/testing/personas/index.mjs +0 -6
- package/dist/lib/testing/personas/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +0 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/capabilities.mjs +0 -6
- package/dist/lib/testing/scenarios/capabilities.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +0 -6
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.mjs +0 -6
- package/dist/lib/testing/scenarios/deterministic.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +0 -6
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +0 -6
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/error-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/error-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +0 -6
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/health.mjs +0 -6
- package/dist/lib/testing/scenarios/health.mjs.map +1 -1
- package/dist/lib/testing/scenarios/index.mjs +0 -6
- package/dist/lib/testing/scenarios/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +0 -6
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +0 -6
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/signals.mjs +0 -6
- package/dist/lib/testing/scenarios/signals.mjs.map +1 -1
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs +0 -6
- package/dist/lib/testing/scenarios/sponsored-intelligence.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +0 -6
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/seed-merge.mjs +0 -6
- package/dist/lib/testing/seed-merge.mjs.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +0 -6
- package/dist/lib/testing/storyboard/agent-routing.mjs.map +1 -1
- package/dist/lib/testing/storyboard/assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +0 -6
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs.map +1 -1
- package/dist/lib/testing/storyboard/compliance.mjs +5 -6
- package/dist/lib/testing/storyboard/compliance.mjs.map +1 -1
- package/dist/lib/testing/storyboard/context.mjs +0 -6
- package/dist/lib/testing/storyboard/context.mjs.map +1 -1
- package/dist/lib/testing/storyboard/default-invariants.mjs +0 -6
- package/dist/lib/testing/storyboard/default-invariants.mjs.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +0 -6
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/junit.mjs +0 -6
- package/dist/lib/testing/storyboard/junit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/loader.mjs +0 -6
- package/dist/lib/testing/storyboard/loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/parallel-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/path.mjs +0 -6
- package/dist/lib/testing/storyboard/path.mjs.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +0 -6
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs +0 -6
- package/dist/lib/testing/storyboard/rate-limit-trip.mjs.map +1 -1
- package/dist/lib/testing/storyboard/rejection-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/rejection-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/builder.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/builder.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/index.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/probe.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/probe.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/types.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +0 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +0 -6
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/sandbox-entities.mjs +0 -6
- package/dist/lib/testing/storyboard/sandbox-entities.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +0 -6
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/grader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/index.mjs +0 -6
- package/dist/lib/testing/storyboard/signer-grader/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/signer-grader/types.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs +0 -6
- package/dist/lib/testing/storyboard/strict-validation-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +0 -6
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/storyboard/test-kit.mjs +0 -6
- package/dist/lib/testing/storyboard/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +0 -6
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +0 -6
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-assertions.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-assertions.mjs.map +1 -1
- package/dist/lib/testing/storyboard/webhook-receiver.mjs +0 -6
- package/dist/lib/testing/storyboard/webhook-receiver.mjs.map +1 -1
- package/dist/lib/testing/stubs/governance-agent-stub.mjs +0 -6
- package/dist/lib/testing/stubs/governance-agent-stub.mjs.map +1 -1
- package/dist/lib/testing/stubs/index.mjs +0 -6
- package/dist/lib/testing/stubs/index.mjs.map +1 -1
- package/dist/lib/testing/test-controller.mjs +0 -6
- package/dist/lib/testing/test-controller.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.mjs +0 -6
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/testing/types.mjs +0 -6
- package/dist/lib/types/adcp.mjs +0 -6
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/asset-instances.mjs +0 -6
- package/dist/lib/types/compat.mjs +0 -6
- package/dist/lib/types/compat.mjs.map +1 -1
- package/dist/lib/types/core.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs +0 -6
- package/dist/lib/types/enums.generated.mjs.map +1 -1
- package/dist/lib/types/error-codes.mjs +0 -6
- package/dist/lib/types/error-codes.mjs.map +1 -1
- package/dist/lib/types/error-details.aliases.mjs +0 -6
- package/dist/lib/types/error-details.aliases.mjs.map +1 -1
- package/dist/lib/types/format-asset-slots.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs +0 -6
- package/dist/lib/types/forward-compat-error-codes.mjs.map +1 -1
- package/dist/lib/types/index.mjs +0 -6
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/types/inline-enums.aliases.mjs +0 -6
- package/dist/lib/types/inline-enums.aliases.mjs.map +1 -1
- package/dist/lib/types/inline-enums.generated.mjs +0 -6
- package/dist/lib/types/inline-enums.generated.mjs.map +1 -1
- package/dist/lib/types/manifest.generated.mjs +0 -6
- package/dist/lib/types/manifest.generated.mjs.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +0 -6
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/server-payload-aliases.mjs +0 -6
- package/dist/lib/types/server-payload.mjs +0 -6
- package/dist/lib/types/sync-rows.mjs +0 -6
- package/dist/lib/types/tools.generated.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs +0 -6
- package/dist/lib/types/v2-5/index.mjs.map +1 -1
- package/dist/lib/types/v2-5/tools.generated.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs +0 -6
- package/dist/lib/types/v3-1-beta/index.mjs.map +1 -1
- package/dist/lib/types/v3-1-beta/tools.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs +0 -6
- package/dist/lib/types/wellknown-schemas.generated.mjs.map +1 -1
- package/dist/lib/upstream-recorder/constants.mjs +0 -6
- package/dist/lib/upstream-recorder/constants.mjs.map +1 -1
- package/dist/lib/upstream-recorder/index.mjs +0 -6
- package/dist/lib/upstream-recorder/index.mjs.map +1 -1
- package/dist/lib/upstream-recorder/recorder.mjs +0 -6
- package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
- package/dist/lib/upstream-recorder/types.mjs +0 -6
- package/dist/lib/upstream-recorder/types.mjs.map +1 -1
- package/dist/lib/utils/a2a-artifacts.mjs +0 -6
- package/dist/lib/utils/a2a-artifacts.mjs.map +1 -1
- package/dist/lib/utils/a2a-discovery.mjs +0 -6
- package/dist/lib/utils/a2a-discovery.mjs.map +1 -1
- package/dist/lib/utils/activation-key-builders.mjs +0 -6
- package/dist/lib/utils/activation-key-builders.mjs.map +1 -1
- package/dist/lib/utils/adcp-version-config.mjs +0 -6
- package/dist/lib/utils/adcp-version-config.mjs.map +1 -1
- package/dist/lib/utils/asset-builders.mjs +0 -6
- package/dist/lib/utils/asset-builders.mjs.map +1 -1
- package/dist/lib/utils/build-creative-return-builders.mjs +0 -6
- package/dist/lib/utils/build-creative-return-builders.mjs.map +1 -1
- package/dist/lib/utils/buyer-retry-policy.mjs +0 -6
- package/dist/lib/utils/buyer-retry-policy.mjs.map +1 -1
- package/dist/lib/utils/capabilities.mjs +0 -6
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/capability-rollups.mjs +0 -6
- package/dist/lib/utils/capability-rollups.mjs.map +1 -1
- package/dist/lib/utils/creative-adapter.mjs +0 -6
- package/dist/lib/utils/creative-adapter.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +0 -6
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/deprecation.mjs +0 -6
- package/dist/lib/utils/deprecation.mjs.map +1 -1
- package/dist/lib/utils/envelope-status-compat.mjs +0 -6
- package/dist/lib/utils/envelope-status-compat.mjs.map +1 -1
- package/dist/lib/utils/error-extraction.mjs +0 -6
- package/dist/lib/utils/error-extraction.mjs.map +1 -1
- package/dist/lib/utils/extract-result.mjs +0 -6
- package/dist/lib/utils/extract-result.mjs.map +1 -1
- package/dist/lib/utils/format-asset-slot-builders.mjs +0 -6
- package/dist/lib/utils/format-asset-slot-builders.mjs.map +1 -1
- package/dist/lib/utils/format-assets.mjs +0 -6
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/format-render-builders.mjs +0 -6
- package/dist/lib/utils/format-render-builders.mjs.map +1 -1
- package/dist/lib/utils/format-renders.mjs +0 -6
- package/dist/lib/utils/format-renders.mjs.map +1 -1
- package/dist/lib/utils/get-products-cache-scope.mjs +0 -6
- package/dist/lib/utils/get-products-cache-scope.mjs.map +1 -1
- package/dist/lib/utils/glob.mjs +0 -6
- package/dist/lib/utils/glob.mjs.map +1 -1
- package/dist/lib/utils/global-async-local-storage.mjs +0 -6
- package/dist/lib/utils/global-async-local-storage.mjs.map +1 -1
- package/dist/lib/utils/idempotency.mjs +0 -6
- package/dist/lib/utils/idempotency.mjs.map +1 -1
- package/dist/lib/utils/index.mjs +0 -6
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/jcs.mjs +0 -6
- package/dist/lib/utils/jcs.mjs.map +1 -1
- package/dist/lib/utils/json-depth.mjs +0 -6
- package/dist/lib/utils/json-depth.mjs.map +1 -1
- package/dist/lib/utils/logger.mjs +0 -6
- package/dist/lib/utils/logger.mjs.map +1 -1
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs +0 -6
- package/dist/lib/utils/media-buy-delivery-notification-builders.mjs.map +1 -1
- package/dist/lib/utils/media-buy-status.mjs +0 -6
- package/dist/lib/utils/media-buy-status.mjs.map +1 -1
- package/dist/lib/utils/pagination.mjs +0 -6
- package/dist/lib/utils/pagination.mjs.map +1 -1
- package/dist/lib/utils/preview-creative-builders.mjs +0 -6
- package/dist/lib/utils/preview-creative-builders.mjs.map +1 -1
- package/dist/lib/utils/preview-normalizer.mjs +0 -6
- package/dist/lib/utils/preview-normalizer.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +0 -6
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/pricing-adapter.mjs +0 -6
- package/dist/lib/utils/pricing-adapter.mjs.map +1 -1
- package/dist/lib/utils/probe-policy.mjs +0 -6
- package/dist/lib/utils/probe-policy.mjs.map +1 -1
- package/dist/lib/utils/protocol-detection.mjs +0 -6
- package/dist/lib/utils/protocol-detection.mjs.map +1 -1
- package/dist/lib/utils/redact-secrets.mjs +0 -6
- package/dist/lib/utils/redact-secrets.mjs.map +1 -1
- package/dist/lib/utils/redis-default-prefix-warn.mjs +0 -6
- package/dist/lib/utils/redis-default-prefix-warn.mjs.map +1 -1
- package/dist/lib/utils/render-builders.mjs +0 -6
- package/dist/lib/utils/render-builders.mjs.map +1 -1
- package/dist/lib/utils/request-normalizer.mjs +0 -6
- package/dist/lib/utils/request-normalizer.mjs.map +1 -1
- package/dist/lib/utils/response-schemas.mjs +0 -6
- package/dist/lib/utils/response-schemas.mjs.map +1 -1
- package/dist/lib/utils/response-unwrapper.mjs +0 -6
- package/dist/lib/utils/response-unwrapper.mjs.map +1 -1
- package/dist/lib/utils/retry.mjs +0 -6
- package/dist/lib/utils/retry.mjs.map +1 -1
- package/dist/lib/utils/signal-discovery-helpers.mjs +0 -6
- package/dist/lib/utils/signal-discovery-helpers.mjs.map +1 -1
- package/dist/lib/utils/signal-id-builders.mjs +0 -6
- package/dist/lib/utils/signal-id-builders.mjs.map +1 -1
- package/dist/lib/utils/sync-creatives-adapter.mjs +0 -6
- package/dist/lib/utils/sync-creatives-adapter.mjs.map +1 -1
- package/dist/lib/utils/task-state.mjs +0 -6
- package/dist/lib/utils/task-state.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.mjs +0 -6
- package/dist/lib/utils/tool-request-schemas.mjs.map +1 -1
- package/dist/lib/utils/typeGuards.mjs +0 -6
- package/dist/lib/utils/typeGuards.mjs.map +1 -1
- package/dist/lib/utils/union-errors.mjs +0 -6
- package/dist/lib/utils/union-errors.mjs.map +1 -1
- package/dist/lib/utils/validate-user-agent.mjs +0 -6
- package/dist/lib/utils/validate-user-agent.mjs.map +1 -1
- package/dist/lib/v2/format-schema/fetch.mjs +0 -6
- package/dist/lib/v2/format-schema/fetch.mjs.map +1 -1
- package/dist/lib/v2/format-schema/index.mjs +0 -6
- package/dist/lib/v2/format-schema/index.mjs.map +1 -1
- package/dist/lib/v2/format-schema/regex-safety.mjs +0 -6
- package/dist/lib/v2/format-schema/regex-safety.mjs.map +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +7 -8
- package/dist/lib/v2/format-schema/resolver.mjs.map +1 -1
- package/dist/lib/v2/format-schema/sandbox-refs.mjs +0 -6
- package/dist/lib/v2/format-schema/sandbox-refs.mjs.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +0 -6
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +0 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/cache-versions.mjs +0 -6
- package/dist/lib/v2/projection/cache-versions.mjs.map +1 -1
- package/dist/lib/v2/projection/canonical-properties.mjs +5 -6
- package/dist/lib/v2/projection/canonical-properties.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +5 -6
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/constants.mjs +0 -6
- package/dist/lib/v2/projection/constants.mjs.map +1 -1
- package/dist/lib/v2/projection/index.mjs +0 -6
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/registry.mjs +5 -6
- package/dist/lib/v2/projection/registry.mjs.map +1 -1
- package/dist/lib/v2/projection/types.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs +0 -6
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +0 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +0 -6
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/formats.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/formats.mjs.map +1 -1
- package/dist/lib/v2/publisher-catalog/index.mjs +0 -6
- package/dist/lib/v2/publisher-catalog/index.mjs.map +1 -1
- package/dist/lib/validation/client-hooks.mjs +0 -6
- package/dist/lib/validation/client-hooks.mjs.map +1 -1
- package/dist/lib/validation/hints.mjs +0 -6
- package/dist/lib/validation/hints.mjs.map +1 -1
- package/dist/lib/validation/index.mjs +0 -6
- package/dist/lib/validation/index.mjs.map +1 -1
- package/dist/lib/validation/schema-errors.mjs +0 -6
- package/dist/lib/validation/schema-errors.mjs.map +1 -1
- package/dist/lib/validation/schema-loader.mjs +5 -6
- package/dist/lib/validation/schema-loader.mjs.map +1 -1
- package/dist/lib/validation/schema-validator.mjs +0 -6
- package/dist/lib/validation/schema-validator.mjs.map +1 -1
- package/dist/lib/validation/sync-creatives.mjs +0 -6
- package/dist/lib/validation/sync-creatives.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -9
- package/dist/lib/version.mjs.map +1 -1
- package/dist/lib/webhooks/index.mjs +0 -6
- package/dist/lib/webhooks/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/index.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/index.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/sync.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/sync.mjs.map +1 -1
- package/dist/lib/wholesale-feed-sync/types.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +0 -6
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/protocols/transportDiagnostics.ts"],"sourcesContent":["import { globalAsyncLocalStorage } from '../utils/global-async-local-storage';\nimport { createHmac } from 'node:crypto';\n\nexport type TransportActivityType = 'request_started' | 'response_received' | 'request_failed';\n\nexport interface TransportActivityContext {\n agentId: string;\n protocol: 'mcp' | 'a2a';\n tool?: string;\n taskType?: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n}\n\nexport interface TransportActivity {\n type: TransportActivityType;\n agentId: string;\n protocol: 'mcp' | 'a2a';\n tool?: string;\n taskType?: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKeyHash?: string;\n method: string;\n url: string;\n requestHeaders: Record<string, string>;\n requestBody?: string;\n requestBodyTruncated?: boolean;\n startedAt: string;\n timestamp: string;\n durationMs?: number;\n httpStatus?: number;\n statusText?: string;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n responseBodyTruncated?: boolean;\n errorName?: string;\n errorMessage?: string;\n}\n\nexport type TransportActivityHandler = (event: TransportActivity) => void | Promise<void>;\n\ninterface TransportDiagnosticsSlot extends TransportActivityContext {\n onTransportActivity?: TransportActivityHandler;\n pending: Promise<void>[];\n}\n\nconst BODY_SNIPPET_LIMIT = 64 * 1024;\nconst REDACTED = '[redacted]';\n\nconst SAFE_HEADER_NAMES = new Set([\n 'accept',\n 'accept-encoding',\n 'content-type',\n 'last-event-id',\n 'mcp-protocol-version',\n 'traceparent',\n 'tracestate',\n 'user-agent',\n 'x-adcp-agent-id',\n 'x-adcp-request-id',\n 'x-correlation-id',\n 'x-request-id',\n 'x-scope3-debug-id',\n]);\n\nconst SENSITIVE_HEADER_NAMES = new Set([\n 'authorization',\n 'cookie',\n 'proxy-authorization',\n 'set-cookie',\n 'x-adcp-auth',\n 'x-api-key',\n 'mcp-session-id',\n]);\n\nconst SENSITIVE_KEY_RE =\n /(^|[_-])(authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)([_-]|$)/i;\nconst SENSITIVE_TEXT_FIELD_RE =\n /((?:\"[^\"]*(?:authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)[^\"]*\"\\s*:\\s*)|(?:^|[&\\s])[^=&\\s]*(?:authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)[^=&\\s]*=)(\"[^\"]*\"|[^&\\s,}]+)/gi;\nconst URL_LIKE_RE = /\\bhttps?:\\/\\/[^\\s\"'<>]+/gi;\n\nexport const transportDiagnosticsStorage = globalAsyncLocalStorage<TransportDiagnosticsSlot>('transportDiagnostics');\n\nexport function withTransportDiagnostics<T>(\n context: TransportActivityContext & { onTransportActivity?: TransportActivityHandler },\n fn: () => Promise<T>\n): Promise<T> {\n if (!context.onTransportActivity) return fn();\n const slot: TransportDiagnosticsSlot = { ...context, pending: [] };\n return transportDiagnosticsStorage.run(slot, async () => {\n try {\n return await fn();\n } finally {\n await Promise.allSettled(slot.pending);\n }\n });\n}\n\nexport function sanitizeTransportUrl(value: string): string {\n try {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return 'invalid_url';\n }\n}\n\nexport function sanitizeTransportHeaders(headers: HeadersInit | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of headerEntries(headers)) {\n const lower = key.toLowerCase();\n if (SENSITIVE_HEADER_NAMES.has(lower) || SENSITIVE_KEY_RE.test(lower)) {\n out[lower] = REDACTED;\n } else if (SAFE_HEADER_NAMES.has(lower) || isSafeCorrelationHeader(lower)) {\n out[lower] = value;\n }\n }\n return out;\n}\n\nexport function wrapFetchWithTransportDiagnostics(upstream: typeof fetch): typeof fetch {\n const wrapped: typeof fetch = async (input, init) => {\n const slot = transportDiagnosticsStorage.getStore();\n if (!slot?.onTransportActivity) return upstream(input, init);\n\n const startedAtMs = Date.now();\n const startedAt = new Date(startedAtMs).toISOString();\n const method = getMethod(input, init);\n const url = sanitizeTransportUrl(getUrl(input));\n const requestHeaders = sanitizeTransportHeaders(mergeRequestHeaders(input, init));\n const requestBody = bodySnippet(init?.body);\n const baseEvent = {\n agentId: slot.agentId,\n protocol: slot.protocol,\n ...(slot.tool && { tool: slot.tool, taskType: slot.taskType ?? slot.tool }),\n ...(slot.operationId && { operationId: slot.operationId }),\n ...(slot.taskId && { taskId: slot.taskId }),\n ...(slot.contextId && { contextId: slot.contextId }),\n ...(slot.idempotencyKey && { idempotencyKeyHash: fingerprintDiagnosticValue(slot.idempotencyKey) }),\n method,\n url,\n requestHeaders,\n ...(requestBody && {\n requestBody: requestBody.body,\n requestBodyTruncated: requestBody.truncated,\n }),\n startedAt,\n };\n\n emitTransportActivity(slot.onTransportActivity, {\n type: 'request_started',\n ...baseEvent,\n timestamp: startedAt,\n });\n\n try {\n const response = await upstream(input, init);\n const durationMs = Date.now() - startedAtMs;\n const responseHeaders = sanitizeResponseHeaders(response.headers);\n const responseBody = await responseBodySnippet(response);\n emitTransportActivity(slot.onTransportActivity, {\n type: 'response_received',\n ...baseEvent,\n timestamp: new Date().toISOString(),\n durationMs,\n httpStatus: response.status,\n statusText: response.statusText,\n responseHeaders,\n ...(responseBody && {\n responseBody: responseBody.body,\n responseBodyTruncated: responseBody.truncated,\n }),\n });\n return response;\n } catch (error) {\n emitTransportActivity(slot.onTransportActivity, {\n type: 'request_failed',\n ...baseEvent,\n timestamp: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n errorName: error instanceof Error ? error.name : typeof error,\n errorMessage: sanitizeDiagnosticText(error instanceof Error ? error.message : String(error)),\n });\n throw error;\n }\n };\n return wrapped;\n}\n\nfunction emitTransportActivity(handler: TransportActivityHandler, event: TransportActivity): void {\n try {\n const slot = transportDiagnosticsStorage.getStore();\n const frozen = Object.freeze(structuredClone(event));\n const pending = Promise.resolve()\n .then(() => handler(frozen))\n .then(\n () => {},\n () => {}\n );\n slot?.pending.push(pending);\n } catch {\n // Observability hooks must not change protocol behavior.\n }\n}\n\nfunction getUrl(input: RequestInfo | URL): string {\n return typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n}\n\nfunction getMethod(input: RequestInfo | URL, init?: RequestInit): string {\n return (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n}\n\nfunction mergeRequestHeaders(input: RequestInfo | URL, init?: RequestInit): Headers {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n if (init?.headers) {\n for (const [key, value] of headerEntries(init.headers)) {\n headers.set(key, value);\n }\n }\n return headers;\n}\n\nfunction sanitizeResponseHeaders(headers: Headers): Record<string, string> {\n return sanitizeTransportHeaders(headers);\n}\n\nfunction headerEntries(headers: HeadersInit | undefined): Array<[string, string]> {\n if (!headers) return [];\n if (headers instanceof Headers) {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => entries.push([key, value]));\n return entries;\n }\n if (Array.isArray(headers)) return headers.map(([key, value]) => [key, value]);\n return Object.entries(headers).map(([key, value]) => [key, String(value)]);\n}\n\nfunction isSafeCorrelationHeader(lower: string): boolean {\n if (!lower.startsWith('x-')) return false;\n return (\n lower.includes('correlation') || lower.includes('debug') || lower.includes('request-id') || lower.includes('trace')\n );\n}\n\nfunction bodySnippet(body: BodyInit | null | undefined): { body: string; truncated: boolean } | undefined {\n if (body == null) return undefined;\n if (typeof body === 'string') return sanitizeBodyText(body, BODY_SNIPPET_LIMIT);\n if (body instanceof URLSearchParams) return sanitizeBodyText(body.toString(), BODY_SNIPPET_LIMIT);\n if (body instanceof Blob) return { body: `[blob ${body.size} bytes]`, truncated: false };\n if (body instanceof ArrayBuffer) {\n return sanitizeBodyText(Buffer.from(body).toString('utf8'), BODY_SNIPPET_LIMIT);\n }\n if (ArrayBuffer.isView(body)) {\n return sanitizeBodyText(\n Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8'),\n BODY_SNIPPET_LIMIT\n );\n }\n return undefined;\n}\n\nasync function responseBodySnippet(response: Response): Promise<{ body: string; truncated: boolean } | undefined> {\n const contentType = response.headers.get('content-type') ?? '';\n if (!isDiagnosticTextContentType(contentType)) return undefined;\n try {\n const { text, truncated } = await readResponseTextBounded(response.clone(), BODY_SNIPPET_LIMIT);\n return { body: redactSensitiveJsonOrText(text), truncated };\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeBodyText(text: string, limit: number): { body: string; truncated: boolean } {\n const truncated = text.length > limit;\n const bounded = truncated ? text.slice(0, limit) : text;\n return { body: redactSensitiveJsonOrText(bounded), truncated };\n}\n\nfunction redactSensitiveJsonOrText(text: string): string {\n try {\n return JSON.stringify(redactSensitiveValue(JSON.parse(text)));\n } catch {\n return sanitizeDiagnosticText(text);\n }\n}\n\nfunction redactSensitiveValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveValue);\n if (typeof value === 'string') return sanitizeStringValue(value);\n if (!value || typeof value !== 'object') return value;\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n out[key] = isSensitiveKey(key) ? REDACTED : redactSensitiveValue(child);\n }\n return out;\n}\n\nfunction sanitizeDiagnosticText(text: string): string {\n return text\n .replace(URL_LIKE_RE, value => sanitizeTransportUrl(value))\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, 'Bearer [redacted]')\n .replace(/Basic\\s+[A-Za-z0-9+/=-]+/gi, 'Basic [redacted]')\n .replace(SENSITIVE_TEXT_FIELD_RE, (_match, prefix) => `${prefix}${REDACTED}`);\n}\n\nfunction sanitizeStringValue(value: string): string {\n return sanitizeDiagnosticText(value);\n}\n\nfunction normalizedKey(key: string): string {\n return key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase();\n}\n\nfunction isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEY_RE.test(normalizedKey(key));\n}\n\nfunction isDiagnosticTextContentType(contentType: string): boolean {\n const lower = contentType.toLowerCase();\n if (!lower) return true;\n if (lower.includes('text/event-stream')) return false;\n return (\n lower.startsWith('text/') ||\n lower.includes('json') ||\n lower.includes('xml') ||\n lower.includes('javascript') ||\n lower.includes('x-www-form-urlencoded')\n );\n}\n\nasync function readResponseTextBounded(\n response: Response,\n limit: number\n): Promise<{ text: string; truncated: boolean }> {\n if (!response.body) {\n const text = await response.text();\n return { text: text.slice(0, limit), truncated: text.length > limit };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let text = '';\n let truncated = false;\n\n try {\n while (text.length <= limit) {\n const { done, value } = await reader.read();\n if (done) break;\n text += decoder.decode(value, { stream: true });\n if (text.length > limit) {\n truncated = true;\n text = text.slice(0, limit);\n await reader.cancel();\n break;\n }\n }\n if (!truncated) text += decoder.decode();\n } finally {\n reader.releaseLock();\n }\n\n return { text, truncated };\n}\n\nfunction fingerprintDiagnosticValue(value: string): string {\n return createHmac('sha256', 'adcp-transport-diagnostics').update(value).digest('hex').slice(0, 16);\n}\n"],"mappings":";;;;;;AAAA,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAiD3B,MAAM,qBAAqB,KAAK;AAChC,MAAM,WAAW;AAEjB,MAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,mBACJ;AACF,MAAM,0BACJ;AACF,MAAM,cAAc;AAEb,MAAM,8BAA8B,wBAAkD,sBAAsB;AAE5G,SAAS,yBACd,SACA,IACY;AACZ,MAAI,CAAC,QAAQ,oBAAqB,QAAO,GAAG;AAC5C,QAAM,OAAiC,EAAE,GAAG,SAAS,SAAS,CAAC,EAAE;AACjE,SAAO,4BAA4B,IAAI,MAAM,YAAY;AACvD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,YAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACvC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,SAAS;AACb,QAAI,OAAO;AACX,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,yBAAyB,SAA0D;AACjG,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc,OAAO,GAAG;AACjD,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,uBAAuB,IAAI,KAAK,KAAK,iBAAiB,KAAK,KAAK,GAAG;AACrE,UAAI,KAAK,IAAI;AAAA,IACf,WAAW,kBAAkB,IAAI,KAAK,KAAK,wBAAwB,KAAK,GAAG;AACzE,UAAI,KAAK,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kCAAkC,UAAsC;AACtF,QAAM,UAAwB,OAAO,OAAO,SAAS;AACnD,UAAM,OAAO,4BAA4B,SAAS;AAClD,QAAI,CAAC,MAAM,oBAAqB,QAAO,SAAS,OAAO,IAAI;AAE3D,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,YAAY,IAAI,KAAK,WAAW,EAAE,YAAY;AACpD,UAAM,SAAS,UAAU,OAAO,IAAI;AACpC,UAAM,MAAM,qBAAqB,OAAO,KAAK,CAAC;AAC9C,UAAM,iBAAiB,yBAAyB,oBAAoB,OAAO,IAAI,CAAC;AAChF,UAAM,cAAc,YAAY,MAAM,IAAI;AAC1C,UAAM,YAAY;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM,UAAU,KAAK,YAAY,KAAK,KAAK;AAAA,MACzE,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,YAAY;AAAA,MACxD,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAO;AAAA,MACzC,GAAI,KAAK,aAAa,EAAE,WAAW,KAAK,UAAU;AAAA,MAClD,GAAI,KAAK,kBAAkB,EAAE,oBAAoB,2BAA2B,KAAK,cAAc,EAAE;AAAA,MACjG;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,eAAe;AAAA,QACjB,aAAa,YAAY;AAAA,QACzB,sBAAsB,YAAY;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAEA,0BAAsB,KAAK,qBAAqB;AAAA,MAC9C,MAAM;AAAA,MACN,GAAG;AAAA,MACH,WAAW;AAAA,IACb,CAAC;AAED,QAAI;AACF,YAAM,WAAW,MAAM,SAAS,OAAO,IAAI;AAC3C,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,kBAAkB,wBAAwB,SAAS,OAAO;AAChE,YAAM,eAAe,MAAM,oBAAoB,QAAQ;AACvD,4BAAsB,KAAK,qBAAqB;AAAA,QAC9C,MAAM;AAAA,QACN,GAAG;AAAA,QACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,QACA,YAAY,SAAS;AAAA,QACrB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,GAAI,gBAAgB;AAAA,UAClB,cAAc,aAAa;AAAA,UAC3B,uBAAuB,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,4BAAsB,KAAK,qBAAqB;AAAA,QAC9C,MAAM;AAAA,QACN,GAAG;AAAA,QACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,WAAW,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,QACxD,cAAc,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC7F,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAmC,OAAgC;AAChG,MAAI;AACF,UAAM,OAAO,4BAA4B,SAAS;AAClD,UAAM,SAAS,OAAO,OAAO,gBAAgB,KAAK,CAAC;AACnD,UAAM,UAAU,QAAQ,QAAQ,EAC7B,KAAK,MAAM,QAAQ,MAAM,CAAC,EAC1B;AAAA,MACC,MAAM;AAAA,MAAC;AAAA,MACP,MAAM;AAAA,MAAC;AAAA,IACT;AACF,UAAM,QAAQ,KAAK,OAAO;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,OAAO,OAAkC;AAChD,SAAO,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,SAAS,IAAI,MAAM;AAC7F;AAEA,SAAS,UAAU,OAA0B,MAA4B;AACvE,UAAQ,MAAM,WAAW,iBAAiB,UAAU,MAAM,SAAS,QAAQ,YAAY;AACzF;AAEA,SAAS,oBAAoB,OAA0B,MAA6B;AAClF,QAAM,UAAU,IAAI,QAAQ,iBAAiB,UAAU,MAAM,UAAU,MAAS;AAChF,MAAI,MAAM,SAAS;AACjB,eAAW,CAAC,KAAK,KAAK,KAAK,cAAc,KAAK,OAAO,GAAG;AACtD,cAAQ,IAAI,KAAK,KAAK;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAA0C;AACzE,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,cAAc,SAA2D;AAChF,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI,mBAAmB,SAAS;AAC9B,UAAM,UAAmC,CAAC;AAC1C,YAAQ,QAAQ,CAAC,OAAO,QAAQ,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAC1D,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,OAAO,EAAG,QAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC;AAC7E,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAC3E;AAEA,SAAS,wBAAwB,OAAwB;AACvD,MAAI,CAAC,MAAM,WAAW,IAAI,EAAG,QAAO;AACpC,SACE,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,OAAO;AAEtH;AAEA,SAAS,YAAY,MAAqF;AACxG,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,OAAO,SAAS,SAAU,QAAO,iBAAiB,MAAM,kBAAkB;AAC9E,MAAI,gBAAgB,gBAAiB,QAAO,iBAAiB,KAAK,SAAS,GAAG,kBAAkB;AAChG,MAAI,gBAAgB,KAAM,QAAO,EAAE,MAAM,SAAS,KAAK,IAAI,WAAW,WAAW,MAAM;AACvF,MAAI,gBAAgB,aAAa;AAC/B,WAAO,iBAAiB,OAAO,KAAK,IAAI,EAAE,SAAS,MAAM,GAAG,kBAAkB;AAAA,EAChF;AACA,MAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU,EAAE,SAAS,MAAM;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oBAAoB,UAA+E;AAChH,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,MAAI,CAAC,4BAA4B,WAAW,EAAG,QAAO;AACtD,MAAI;AACF,UAAM,EAAE,MAAM,UAAU,IAAI,MAAM,wBAAwB,SAAS,MAAM,GAAG,kBAAkB;AAC9F,WAAO,EAAE,MAAM,0BAA0B,IAAI,GAAG,UAAU;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,MAAc,OAAqD;AAC3F,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,UAAU,YAAY,KAAK,MAAM,GAAG,KAAK,IAAI;AACnD,SAAO,EAAE,MAAM,0BAA0B,OAAO,GAAG,UAAU;AAC/D;AAEA,SAAS,0BAA0B,MAAsB;AACvD,MAAI;AACF,WAAO,KAAK,UAAU,qBAAqB,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,EAC9D,QAAQ;AACN,WAAO,uBAAuB,IAAI;AAAA,EACpC;AACF;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,oBAAoB;AAC/D,MAAI,OAAO,UAAU,SAAU,QAAO,oBAAoB,KAAK;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,GAAG,IAAI,eAAe,GAAG,IAAI,WAAW,qBAAqB,KAAK;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,KACJ,QAAQ,aAAa,WAAS,qBAAqB,KAAK,CAAC,EACzD,QAAQ,kCAAkC,mBAAmB,EAC7D,QAAQ,8BAA8B,kBAAkB,EACxD,QAAQ,yBAAyB,CAAC,QAAQ,WAAW,GAAG,MAAM,GAAG,QAAQ,EAAE;AAChF;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,uBAAuB,KAAK;AACrC;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,IAAI,QAAQ,sBAAsB,OAAO,EAAE,YAAY;AAChE;AAEA,SAAS,eAAe,KAAsB;AAC5C,SAAO,iBAAiB,KAAK,cAAc,GAAG,CAAC;AACjD;AAEA,SAAS,4BAA4B,aAA8B;AACjE,QAAM,QAAQ,YAAY,YAAY;AACtC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAChD,SACE,MAAM,WAAW,OAAO,KACxB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,YAAY,KAC3B,MAAM,SAAS,uBAAuB;AAE1C;AAEA,eAAe,wBACb,UACA,OAC+C;AAC/C,MAAI,CAAC,SAAS,MAAM;AAClB,UAAMA,QAAO,MAAM,SAAS,KAAK;AACjC,WAAO,EAAE,MAAMA,MAAK,MAAM,GAAG,KAAK,GAAG,WAAWA,MAAK,SAAS,MAAM;AAAA,EACtE;AAEA,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,OAAO;AACX,MAAI,YAAY;AAEhB,MAAI;AACF,WAAO,KAAK,UAAU,OAAO;AAC3B,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,cAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAC9C,UAAI,KAAK,SAAS,OAAO;AACvB,oBAAY;AACZ,eAAO,KAAK,MAAM,GAAG,KAAK;AAC1B,cAAM,OAAO,OAAO;AACpB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,UAAW,SAAQ,QAAQ,OAAO;AAAA,EACzC,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEA,SAAS,2BAA2B,OAAuB;AACzD,SAAO,WAAW,UAAU,4BAA4B,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACnG;","names":["text"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/protocols/transportDiagnostics.ts"],"sourcesContent":["import { globalAsyncLocalStorage } from '../utils/global-async-local-storage';\nimport { createHmac } from 'node:crypto';\n\nexport type TransportActivityType = 'request_started' | 'response_received' | 'request_failed';\n\nexport interface TransportActivityContext {\n agentId: string;\n protocol: 'mcp' | 'a2a';\n tool?: string;\n taskType?: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n}\n\nexport interface TransportActivity {\n type: TransportActivityType;\n agentId: string;\n protocol: 'mcp' | 'a2a';\n tool?: string;\n taskType?: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKeyHash?: string;\n method: string;\n url: string;\n requestHeaders: Record<string, string>;\n requestBody?: string;\n requestBodyTruncated?: boolean;\n startedAt: string;\n timestamp: string;\n durationMs?: number;\n httpStatus?: number;\n statusText?: string;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n responseBodyTruncated?: boolean;\n errorName?: string;\n errorMessage?: string;\n}\n\nexport type TransportActivityHandler = (event: TransportActivity) => void | Promise<void>;\n\ninterface TransportDiagnosticsSlot extends TransportActivityContext {\n onTransportActivity?: TransportActivityHandler;\n pending: Promise<void>[];\n}\n\nconst BODY_SNIPPET_LIMIT = 64 * 1024;\nconst REDACTED = '[redacted]';\n\nconst SAFE_HEADER_NAMES = new Set([\n 'accept',\n 'accept-encoding',\n 'content-type',\n 'last-event-id',\n 'mcp-protocol-version',\n 'traceparent',\n 'tracestate',\n 'user-agent',\n 'x-adcp-agent-id',\n 'x-adcp-request-id',\n 'x-correlation-id',\n 'x-request-id',\n 'x-scope3-debug-id',\n]);\n\nconst SENSITIVE_HEADER_NAMES = new Set([\n 'authorization',\n 'cookie',\n 'proxy-authorization',\n 'set-cookie',\n 'x-adcp-auth',\n 'x-api-key',\n 'mcp-session-id',\n]);\n\nconst SENSITIVE_KEY_RE =\n /(^|[_-])(authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)([_-]|$)/i;\nconst SENSITIVE_TEXT_FIELD_RE =\n /((?:\"[^\"]*(?:authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)[^\"]*\"\\s*:\\s*)|(?:^|[&\\s])[^=&\\s]*(?:authorization|cookie|credentials?|secret|signature|token|api[_-]?key|private[_-]?key|idempotency[_-]?key|password)[^=&\\s]*=)(\"[^\"]*\"|[^&\\s,}]+)/gi;\nconst URL_LIKE_RE = /\\bhttps?:\\/\\/[^\\s\"'<>]+/gi;\n\nexport const transportDiagnosticsStorage = globalAsyncLocalStorage<TransportDiagnosticsSlot>('transportDiagnostics');\n\nexport function withTransportDiagnostics<T>(\n context: TransportActivityContext & { onTransportActivity?: TransportActivityHandler },\n fn: () => Promise<T>\n): Promise<T> {\n if (!context.onTransportActivity) return fn();\n const slot: TransportDiagnosticsSlot = { ...context, pending: [] };\n return transportDiagnosticsStorage.run(slot, async () => {\n try {\n return await fn();\n } finally {\n await Promise.allSettled(slot.pending);\n }\n });\n}\n\nexport function sanitizeTransportUrl(value: string): string {\n try {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return 'invalid_url';\n }\n}\n\nexport function sanitizeTransportHeaders(headers: HeadersInit | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of headerEntries(headers)) {\n const lower = key.toLowerCase();\n if (SENSITIVE_HEADER_NAMES.has(lower) || SENSITIVE_KEY_RE.test(lower)) {\n out[lower] = REDACTED;\n } else if (SAFE_HEADER_NAMES.has(lower) || isSafeCorrelationHeader(lower)) {\n out[lower] = value;\n }\n }\n return out;\n}\n\nexport function wrapFetchWithTransportDiagnostics(upstream: typeof fetch): typeof fetch {\n const wrapped: typeof fetch = async (input, init) => {\n const slot = transportDiagnosticsStorage.getStore();\n if (!slot?.onTransportActivity) return upstream(input, init);\n\n const startedAtMs = Date.now();\n const startedAt = new Date(startedAtMs).toISOString();\n const method = getMethod(input, init);\n const url = sanitizeTransportUrl(getUrl(input));\n const requestHeaders = sanitizeTransportHeaders(mergeRequestHeaders(input, init));\n const requestBody = bodySnippet(init?.body);\n const baseEvent = {\n agentId: slot.agentId,\n protocol: slot.protocol,\n ...(slot.tool && { tool: slot.tool, taskType: slot.taskType ?? slot.tool }),\n ...(slot.operationId && { operationId: slot.operationId }),\n ...(slot.taskId && { taskId: slot.taskId }),\n ...(slot.contextId && { contextId: slot.contextId }),\n ...(slot.idempotencyKey && { idempotencyKeyHash: fingerprintDiagnosticValue(slot.idempotencyKey) }),\n method,\n url,\n requestHeaders,\n ...(requestBody && {\n requestBody: requestBody.body,\n requestBodyTruncated: requestBody.truncated,\n }),\n startedAt,\n };\n\n emitTransportActivity(slot.onTransportActivity, {\n type: 'request_started',\n ...baseEvent,\n timestamp: startedAt,\n });\n\n try {\n const response = await upstream(input, init);\n const durationMs = Date.now() - startedAtMs;\n const responseHeaders = sanitizeResponseHeaders(response.headers);\n const responseBody = await responseBodySnippet(response);\n emitTransportActivity(slot.onTransportActivity, {\n type: 'response_received',\n ...baseEvent,\n timestamp: new Date().toISOString(),\n durationMs,\n httpStatus: response.status,\n statusText: response.statusText,\n responseHeaders,\n ...(responseBody && {\n responseBody: responseBody.body,\n responseBodyTruncated: responseBody.truncated,\n }),\n });\n return response;\n } catch (error) {\n emitTransportActivity(slot.onTransportActivity, {\n type: 'request_failed',\n ...baseEvent,\n timestamp: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n errorName: error instanceof Error ? error.name : typeof error,\n errorMessage: sanitizeDiagnosticText(error instanceof Error ? error.message : String(error)),\n });\n throw error;\n }\n };\n return wrapped;\n}\n\nfunction emitTransportActivity(handler: TransportActivityHandler, event: TransportActivity): void {\n try {\n const slot = transportDiagnosticsStorage.getStore();\n const frozen = Object.freeze(structuredClone(event));\n const pending = Promise.resolve()\n .then(() => handler(frozen))\n .then(\n () => {},\n () => {}\n );\n slot?.pending.push(pending);\n } catch {\n // Observability hooks must not change protocol behavior.\n }\n}\n\nfunction getUrl(input: RequestInfo | URL): string {\n return typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n}\n\nfunction getMethod(input: RequestInfo | URL, init?: RequestInit): string {\n return (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n}\n\nfunction mergeRequestHeaders(input: RequestInfo | URL, init?: RequestInit): Headers {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n if (init?.headers) {\n for (const [key, value] of headerEntries(init.headers)) {\n headers.set(key, value);\n }\n }\n return headers;\n}\n\nfunction sanitizeResponseHeaders(headers: Headers): Record<string, string> {\n return sanitizeTransportHeaders(headers);\n}\n\nfunction headerEntries(headers: HeadersInit | undefined): Array<[string, string]> {\n if (!headers) return [];\n if (headers instanceof Headers) {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => entries.push([key, value]));\n return entries;\n }\n if (Array.isArray(headers)) return headers.map(([key, value]) => [key, value]);\n return Object.entries(headers).map(([key, value]) => [key, String(value)]);\n}\n\nfunction isSafeCorrelationHeader(lower: string): boolean {\n if (!lower.startsWith('x-')) return false;\n return (\n lower.includes('correlation') || lower.includes('debug') || lower.includes('request-id') || lower.includes('trace')\n );\n}\n\nfunction bodySnippet(body: BodyInit | null | undefined): { body: string; truncated: boolean } | undefined {\n if (body == null) return undefined;\n if (typeof body === 'string') return sanitizeBodyText(body, BODY_SNIPPET_LIMIT);\n if (body instanceof URLSearchParams) return sanitizeBodyText(body.toString(), BODY_SNIPPET_LIMIT);\n if (body instanceof Blob) return { body: `[blob ${body.size} bytes]`, truncated: false };\n if (body instanceof ArrayBuffer) {\n return sanitizeBodyText(Buffer.from(body).toString('utf8'), BODY_SNIPPET_LIMIT);\n }\n if (ArrayBuffer.isView(body)) {\n return sanitizeBodyText(\n Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString('utf8'),\n BODY_SNIPPET_LIMIT\n );\n }\n return undefined;\n}\n\nasync function responseBodySnippet(response: Response): Promise<{ body: string; truncated: boolean } | undefined> {\n const contentType = response.headers.get('content-type') ?? '';\n if (!isDiagnosticTextContentType(contentType)) return undefined;\n try {\n const { text, truncated } = await readResponseTextBounded(response.clone(), BODY_SNIPPET_LIMIT);\n return { body: redactSensitiveJsonOrText(text), truncated };\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeBodyText(text: string, limit: number): { body: string; truncated: boolean } {\n const truncated = text.length > limit;\n const bounded = truncated ? text.slice(0, limit) : text;\n return { body: redactSensitiveJsonOrText(bounded), truncated };\n}\n\nfunction redactSensitiveJsonOrText(text: string): string {\n try {\n return JSON.stringify(redactSensitiveValue(JSON.parse(text)));\n } catch {\n return sanitizeDiagnosticText(text);\n }\n}\n\nfunction redactSensitiveValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveValue);\n if (typeof value === 'string') return sanitizeStringValue(value);\n if (!value || typeof value !== 'object') return value;\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n out[key] = isSensitiveKey(key) ? REDACTED : redactSensitiveValue(child);\n }\n return out;\n}\n\nfunction sanitizeDiagnosticText(text: string): string {\n return text\n .replace(URL_LIKE_RE, value => sanitizeTransportUrl(value))\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, 'Bearer [redacted]')\n .replace(/Basic\\s+[A-Za-z0-9+/=-]+/gi, 'Basic [redacted]')\n .replace(SENSITIVE_TEXT_FIELD_RE, (_match, prefix) => `${prefix}${REDACTED}`);\n}\n\nfunction sanitizeStringValue(value: string): string {\n return sanitizeDiagnosticText(value);\n}\n\nfunction normalizedKey(key: string): string {\n return key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase();\n}\n\nfunction isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEY_RE.test(normalizedKey(key));\n}\n\nfunction isDiagnosticTextContentType(contentType: string): boolean {\n const lower = contentType.toLowerCase();\n if (!lower) return true;\n if (lower.includes('text/event-stream')) return false;\n return (\n lower.startsWith('text/') ||\n lower.includes('json') ||\n lower.includes('xml') ||\n lower.includes('javascript') ||\n lower.includes('x-www-form-urlencoded')\n );\n}\n\nasync function readResponseTextBounded(\n response: Response,\n limit: number\n): Promise<{ text: string; truncated: boolean }> {\n if (!response.body) {\n const text = await response.text();\n return { text: text.slice(0, limit), truncated: text.length > limit };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let text = '';\n let truncated = false;\n\n try {\n while (text.length <= limit) {\n const { done, value } = await reader.read();\n if (done) break;\n text += decoder.decode(value, { stream: true });\n if (text.length > limit) {\n truncated = true;\n text = text.slice(0, limit);\n await reader.cancel();\n break;\n }\n }\n if (!truncated) text += decoder.decode();\n } finally {\n reader.releaseLock();\n }\n\n return { text, truncated };\n}\n\nfunction fingerprintDiagnosticValue(value: string): string {\n return createHmac('sha256', 'adcp-transport-diagnostics').update(value).digest('hex').slice(0, 16);\n}\n"],"mappings":"AAAA,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAiD3B,MAAM,qBAAqB,KAAK;AAChC,MAAM,WAAW;AAEjB,MAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,mBACJ;AACF,MAAM,0BACJ;AACF,MAAM,cAAc;AAEb,MAAM,8BAA8B,wBAAkD,sBAAsB;AAE5G,SAAS,yBACd,SACA,IACY;AACZ,MAAI,CAAC,QAAQ,oBAAqB,QAAO,GAAG;AAC5C,QAAM,OAAiC,EAAE,GAAG,SAAS,SAAS,CAAC,EAAE;AACjE,SAAO,4BAA4B,IAAI,MAAM,YAAY;AACvD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,YAAM,QAAQ,WAAW,KAAK,OAAO;AAAA,IACvC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,SAAS;AACb,QAAI,OAAO;AACX,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,yBAAyB,SAA0D;AACjG,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc,OAAO,GAAG;AACjD,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,uBAAuB,IAAI,KAAK,KAAK,iBAAiB,KAAK,KAAK,GAAG;AACrE,UAAI,KAAK,IAAI;AAAA,IACf,WAAW,kBAAkB,IAAI,KAAK,KAAK,wBAAwB,KAAK,GAAG;AACzE,UAAI,KAAK,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kCAAkC,UAAsC;AACtF,QAAM,UAAwB,OAAO,OAAO,SAAS;AACnD,UAAM,OAAO,4BAA4B,SAAS;AAClD,QAAI,CAAC,MAAM,oBAAqB,QAAO,SAAS,OAAO,IAAI;AAE3D,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,YAAY,IAAI,KAAK,WAAW,EAAE,YAAY;AACpD,UAAM,SAAS,UAAU,OAAO,IAAI;AACpC,UAAM,MAAM,qBAAqB,OAAO,KAAK,CAAC;AAC9C,UAAM,iBAAiB,yBAAyB,oBAAoB,OAAO,IAAI,CAAC;AAChF,UAAM,cAAc,YAAY,MAAM,IAAI;AAC1C,UAAM,YAAY;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,GAAI,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM,UAAU,KAAK,YAAY,KAAK,KAAK;AAAA,MACzE,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,YAAY;AAAA,MACxD,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAO;AAAA,MACzC,GAAI,KAAK,aAAa,EAAE,WAAW,KAAK,UAAU;AAAA,MAClD,GAAI,KAAK,kBAAkB,EAAE,oBAAoB,2BAA2B,KAAK,cAAc,EAAE;AAAA,MACjG;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,eAAe;AAAA,QACjB,aAAa,YAAY;AAAA,QACzB,sBAAsB,YAAY;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAEA,0BAAsB,KAAK,qBAAqB;AAAA,MAC9C,MAAM;AAAA,MACN,GAAG;AAAA,MACH,WAAW;AAAA,IACb,CAAC;AAED,QAAI;AACF,YAAM,WAAW,MAAM,SAAS,OAAO,IAAI;AAC3C,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,kBAAkB,wBAAwB,SAAS,OAAO;AAChE,YAAM,eAAe,MAAM,oBAAoB,QAAQ;AACvD,4BAAsB,KAAK,qBAAqB;AAAA,QAC9C,MAAM;AAAA,QACN,GAAG;AAAA,QACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,QACA,YAAY,SAAS;AAAA,QACrB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,GAAI,gBAAgB;AAAA,UAClB,cAAc,aAAa;AAAA,UAC3B,uBAAuB,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,4BAAsB,KAAK,qBAAqB;AAAA,QAC9C,MAAM;AAAA,QACN,GAAG;AAAA,QACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,WAAW,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,QACxD,cAAc,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC7F,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAmC,OAAgC;AAChG,MAAI;AACF,UAAM,OAAO,4BAA4B,SAAS;AAClD,UAAM,SAAS,OAAO,OAAO,gBAAgB,KAAK,CAAC;AACnD,UAAM,UAAU,QAAQ,QAAQ,EAC7B,KAAK,MAAM,QAAQ,MAAM,CAAC,EAC1B;AAAA,MACC,MAAM;AAAA,MAAC;AAAA,MACP,MAAM;AAAA,MAAC;AAAA,IACT;AACF,UAAM,QAAQ,KAAK,OAAO;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,OAAO,OAAkC;AAChD,SAAO,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,SAAS,IAAI,MAAM;AAC7F;AAEA,SAAS,UAAU,OAA0B,MAA4B;AACvE,UAAQ,MAAM,WAAW,iBAAiB,UAAU,MAAM,SAAS,QAAQ,YAAY;AACzF;AAEA,SAAS,oBAAoB,OAA0B,MAA6B;AAClF,QAAM,UAAU,IAAI,QAAQ,iBAAiB,UAAU,MAAM,UAAU,MAAS;AAChF,MAAI,MAAM,SAAS;AACjB,eAAW,CAAC,KAAK,KAAK,KAAK,cAAc,KAAK,OAAO,GAAG;AACtD,cAAQ,IAAI,KAAK,KAAK;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAA0C;AACzE,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,cAAc,SAA2D;AAChF,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI,mBAAmB,SAAS;AAC9B,UAAM,UAAmC,CAAC;AAC1C,YAAQ,QAAQ,CAAC,OAAO,QAAQ,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAC1D,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,OAAO,EAAG,QAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC;AAC7E,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAC3E;AAEA,SAAS,wBAAwB,OAAwB;AACvD,MAAI,CAAC,MAAM,WAAW,IAAI,EAAG,QAAO;AACpC,SACE,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,OAAO;AAEtH;AAEA,SAAS,YAAY,MAAqF;AACxG,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,OAAO,SAAS,SAAU,QAAO,iBAAiB,MAAM,kBAAkB;AAC9E,MAAI,gBAAgB,gBAAiB,QAAO,iBAAiB,KAAK,SAAS,GAAG,kBAAkB;AAChG,MAAI,gBAAgB,KAAM,QAAO,EAAE,MAAM,SAAS,KAAK,IAAI,WAAW,WAAW,MAAM;AACvF,MAAI,gBAAgB,aAAa;AAC/B,WAAO,iBAAiB,OAAO,KAAK,IAAI,EAAE,SAAS,MAAM,GAAG,kBAAkB;AAAA,EAChF;AACA,MAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU,EAAE,SAAS,MAAM;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oBAAoB,UAA+E;AAChH,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,MAAI,CAAC,4BAA4B,WAAW,EAAG,QAAO;AACtD,MAAI;AACF,UAAM,EAAE,MAAM,UAAU,IAAI,MAAM,wBAAwB,SAAS,MAAM,GAAG,kBAAkB;AAC9F,WAAO,EAAE,MAAM,0BAA0B,IAAI,GAAG,UAAU;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,MAAc,OAAqD;AAC3F,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,UAAU,YAAY,KAAK,MAAM,GAAG,KAAK,IAAI;AACnD,SAAO,EAAE,MAAM,0BAA0B,OAAO,GAAG,UAAU;AAC/D;AAEA,SAAS,0BAA0B,MAAsB;AACvD,MAAI;AACF,WAAO,KAAK,UAAU,qBAAqB,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,EAC9D,QAAQ;AACN,WAAO,uBAAuB,IAAI;AAAA,EACpC;AACF;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,oBAAoB;AAC/D,MAAI,OAAO,UAAU,SAAU,QAAO,oBAAoB,KAAK;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,GAAG,IAAI,eAAe,GAAG,IAAI,WAAW,qBAAqB,KAAK;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,KACJ,QAAQ,aAAa,WAAS,qBAAqB,KAAK,CAAC,EACzD,QAAQ,kCAAkC,mBAAmB,EAC7D,QAAQ,8BAA8B,kBAAkB,EACxD,QAAQ,yBAAyB,CAAC,QAAQ,WAAW,GAAG,MAAM,GAAG,QAAQ,EAAE;AAChF;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,uBAAuB,KAAK;AACrC;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,IAAI,QAAQ,sBAAsB,OAAO,EAAE,YAAY;AAChE;AAEA,SAAS,eAAe,KAAsB;AAC5C,SAAO,iBAAiB,KAAK,cAAc,GAAG,CAAC;AACjD;AAEA,SAAS,4BAA4B,aAA8B;AACjE,QAAM,QAAQ,YAAY,YAAY;AACtC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAChD,SACE,MAAM,WAAW,OAAO,KACxB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,YAAY,KAC3B,MAAM,SAAS,uBAAuB;AAE1C;AAEA,eAAe,wBACb,UACA,OAC+C;AAC/C,MAAI,CAAC,SAAS,MAAM;AAClB,UAAMA,QAAO,MAAM,SAAS,KAAK;AACjC,WAAO,EAAE,MAAMA,MAAK,MAAM,GAAG,KAAK,GAAG,WAAWA,MAAK,SAAS,MAAM;AAAA,EACtE;AAEA,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,OAAO;AACX,MAAI,YAAY;AAEhB,MAAI;AACF,WAAO,KAAK,UAAU,OAAO;AAC3B,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,cAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAC9C,UAAI,KAAK,SAAS,OAAO;AACvB,oBAAY;AACZ,eAAO,KAAK,MAAM,GAAG,KAAK;AAC1B,cAAM,OAAO,OAAO;AACpB;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,UAAW,SAAQ,QAAQ,OAAO;AAAA,EACzC,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEA,SAAS,2BAA2B,OAAuB;AACzD,SAAO,WAAW,UAAU,4BAA4B,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACnG;","names":["text"]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
8
2
|
import { dirname } from "node:path";
|
|
9
3
|
class InMemoryCursorStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/registry/cursor-store.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\n// ====== CursorStore Interface ======\n\n/** Abstraction for persisting the event feed cursor between restarts. */\nexport interface CursorStore {\n getCursor(): Promise<string | null>;\n setCursor(cursor: string): Promise<void>;\n /**\n * Remove the persisted cursor. Used by sync engines on `RETENTION_EXPIRED`\n * recovery — the agent no longer holds events for our cursor, so we\n * re-bootstrap and want subsequent `getCursor()` calls to return `null`.\n *\n * Implementations may delete the underlying storage (file) or store a\n * sentinel value, as long as `getCursor()` returns `null` afterward.\n */\n clearCursor(): Promise<void>;\n}\n\n// ====== InMemoryCursorStore ======\n\n/** Default cursor store that holds the cursor in memory. Lost on process restart. */\nexport class InMemoryCursorStore implements CursorStore {\n private cursor: string | null = null;\n\n async getCursor(): Promise<string | null> {\n return this.cursor;\n }\n\n async setCursor(cursor: string): Promise<void> {\n this.cursor = cursor;\n }\n\n async clearCursor(): Promise<void> {\n this.cursor = null;\n }\n}\n\n// ====== FileCursorStore ======\n\n/** File-based cursor store for CLI/server use. Survives process restarts. */\nexport class FileCursorStore implements CursorStore {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n async getCursor(): Promise<string | null> {\n try {\n const data = await readFile(this.filePath, 'utf-8');\n const trimmed = data.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch (err: unknown) {\n if (err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n async setCursor(cursor: string): Promise<void> {\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(this.filePath, cursor, 'utf-8');\n }\n\n async clearCursor(): Promise<void> {\n const { unlink } = await import('node:fs/promises');\n try {\n await unlink(this.filePath);\n } catch (err: unknown) {\n // Already-gone is the desired post-state; any other error rethrows.\n if (err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n return;\n }\n throw err;\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/registry/cursor-store.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\n// ====== CursorStore Interface ======\n\n/** Abstraction for persisting the event feed cursor between restarts. */\nexport interface CursorStore {\n getCursor(): Promise<string | null>;\n setCursor(cursor: string): Promise<void>;\n /**\n * Remove the persisted cursor. Used by sync engines on `RETENTION_EXPIRED`\n * recovery — the agent no longer holds events for our cursor, so we\n * re-bootstrap and want subsequent `getCursor()` calls to return `null`.\n *\n * Implementations may delete the underlying storage (file) or store a\n * sentinel value, as long as `getCursor()` returns `null` afterward.\n */\n clearCursor(): Promise<void>;\n}\n\n// ====== InMemoryCursorStore ======\n\n/** Default cursor store that holds the cursor in memory. Lost on process restart. */\nexport class InMemoryCursorStore implements CursorStore {\n private cursor: string | null = null;\n\n async getCursor(): Promise<string | null> {\n return this.cursor;\n }\n\n async setCursor(cursor: string): Promise<void> {\n this.cursor = cursor;\n }\n\n async clearCursor(): Promise<void> {\n this.cursor = null;\n }\n}\n\n// ====== FileCursorStore ======\n\n/** File-based cursor store for CLI/server use. Survives process restarts. */\nexport class FileCursorStore implements CursorStore {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n async getCursor(): Promise<string | null> {\n try {\n const data = await readFile(this.filePath, 'utf-8');\n const trimmed = data.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch (err: unknown) {\n if (err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n async setCursor(cursor: string): Promise<void> {\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(this.filePath, cursor, 'utf-8');\n }\n\n async clearCursor(): Promise<void> {\n const { unlink } = await import('node:fs/promises');\n try {\n await unlink(this.filePath);\n } catch (err: unknown) {\n // Already-gone is the desired post-state; any other error rethrows.\n if (err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n return;\n }\n throw err;\n }\n }\n}\n"],"mappings":"AAAA,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,eAAe;AAsBjB,MAAM,oBAA2C;AAAA,EAC9C,SAAwB;AAAA,EAEhC,MAAM,YAAoC;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,QAA+B;AAC7C,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,cAA6B;AACjC,SAAK,SAAS;AAAA,EAChB;AACF;AAKO,MAAM,gBAAuC;AAAA,EACjC;AAAA,EAEjB,YAAY,UAAkB;AAC5B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,YAAoC;AACxC,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,KAAK,UAAU,OAAO;AAClD,YAAM,UAAU,KAAK,KAAK;AAC1B,aAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,IACxC,SAAS,KAAc;AACrB,UAAI,eAAe,SAAS,UAAU,OAAQ,IAA8B,SAAS,UAAU;AAC7F,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAA+B;AAC7C,UAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,UAAM,UAAU,KAAK,UAAU,QAAQ,OAAO;AAAA,EAChD;AAAA,EAEA,MAAM,cAA6B;AACjC,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,kBAAkB;AAClD,QAAI;AACF,YAAM,OAAO,KAAK,QAAQ;AAAA,IAC5B,SAAS,KAAc;AAErB,UAAI,eAAe,SAAS,UAAU,OAAQ,IAA8B,SAAS,UAAU;AAC7F;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
class FeedStreamError extends Error {
|
|
8
2
|
constructor(message) {
|
|
9
3
|
super(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/registry/feed-stream.ts"],"sourcesContent":["/**\n * Server-Sent Events transport for the registry change feed\n * (`GET /api/registry/feed/stream`, adcp#5733).\n *\n * Generated OpenAPI types alone are not enough because the response is\n * `text/event-stream`. This module provides a fetch-based SSE reader (so it can\n * carry the `Authorization` bearer and run under Node) plus the typed message\n * and error shapes the stream emits.\n *\n * The stream carries the resume cursor in the JSON `data.cursor` payload, not in\n * SSE `id:` / `Last-Event-ID` (the registry does not use native EventSource\n * resume in 3.x). Consumers persist `data.cursor` and reconnect with `?cursor=`.\n */\n\nimport type { FeedResponse } from './types';\nimport type { FeedFreshness } from './types.generated';\n\n/** Query parameters for `GET /api/registry/feed/stream`. */\nexport interface FeedStreamQuery {\n /** Resume after this event id. Omit to start at the beginning of retention. */\n cursor?: string;\n /** Comma-separated event type filters with glob support (e.g. `authorization.*`). */\n types?: string;\n /** Max events per SSE feed page (default 100, max 10,000). */\n limit?: number;\n /** Server-side interval while caught up (5–60s, default 15). Backlog pages are sent without waiting. */\n pollIntervalSeconds?: number;\n}\n\n/** `heartbeat` event payload. Emitted while caught up; does not advance the cursor. */\nexport interface FeedHeartbeat {\n generated_at: string;\n cursor: string | null;\n freshness?: FeedFreshness;\n}\n\n/** `error` event payload. Sent once before the server closes the stream. */\nexport interface FeedStreamErrorData {\n /** e.g. `cursor_expired`, `feed_stream_error`. */\n error: string;\n message?: string;\n}\n\n/**\n * A typed message decoded from the SSE stream.\n *\n * @remarks\n * Registry-supplied strings (event payloads, `freshness`, `error.message`) are\n * untrusted input. Sanitize before logging them or injecting them into LLM\n * prompts/instructions or other executable context.\n */\nexport type FeedStreamMessage =\n | { type: 'feed'; page: FeedResponse }\n | { type: 'heartbeat'; heartbeat: FeedHeartbeat }\n | { type: 'error'; error: FeedStreamErrorData };\n\n// ====== Errors ======\n\n/** Base class for feed-stream transport failures. */\nexport class FeedStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamError';\n }\n}\n\n/**\n * The stream endpoint is unavailable (404/406/501) or did not return an event\n * stream (proxy returned HTML/JSON). Callers in `auto` mode fall back to polling.\n */\nexport class FeedStreamUnsupportedError extends FeedStreamError {\n readonly status: number | undefined;\n constructor(message: string, status?: number) {\n super(message);\n this.name = 'FeedStreamUnsupportedError';\n this.status = status;\n }\n}\n\n/** The initial cursor is expired (HTTP 410). Callers re-bootstrap then resume. */\nexport class FeedStreamCursorExpiredError extends FeedStreamError {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamCursorExpiredError';\n }\n}\n\n/** A non-success HTTP status that is neither unsupported nor cursor-expired (e.g. 429, 500). */\nexport class FeedStreamHttpError extends FeedStreamError {\n readonly status: number;\n constructor(message: string, status: number) {\n super(message);\n this.name = 'FeedStreamHttpError';\n this.status = status;\n }\n}\n\n/** A feed/heartbeat/error frame carried data that was not valid JSON or had the wrong shape. */\nexport class FeedStreamParseError extends FeedStreamError {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamParseError';\n }\n}\n\n// ====== SSE line parser ======\n\ninterface SseEvent {\n event: string;\n data: string;\n}\n\n/** Mutable accumulation state for the SSE field parser. */\ninterface ParseState {\n dataLines: string[];\n dataBytes: number;\n eventType: string;\n}\n\n/**\n * Apply one SSE line to the accumulation state. Returns an event to yield when a\n * blank line dispatches a buffered event with data, else null. Follows the\n * WHATWG rules: `:`-prefixed comments ignored, one leading space stripped from\n * each value, `id`/`retry` ignored (the registry uses `data.cursor`, not\n * Last-Event-ID).\n *\n * Throws {@link FeedStreamParseError} as soon as accumulated `data` exceeds\n * `maxFrameBytes` — before the dispatching blank line — so an oversized frame is\n * never yielded (or JSON-parsed downstream), even when the whole frame, blank\n * line included, arrives in a single chunk.\n */\nfunction feedLine(line: string, st: ParseState, maxFrameBytes: number): SseEvent | null {\n if (line === '') {\n const ev = st.dataLines.length > 0 ? { event: st.eventType || 'message', data: st.dataLines.join('\\n') } : null;\n st.dataLines = [];\n st.dataBytes = 0;\n st.eventType = '';\n return ev;\n }\n if (line[0] === ':') return null; // comment\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? '' : line.slice(colon + 1);\n if (value[0] === ' ') value = value.slice(1);\n if (field === 'event') st.eventType = value;\n else if (field === 'data') {\n st.dataLines.push(value);\n st.dataBytes += value.length;\n if (st.dataBytes > maxFrameBytes) {\n throw new FeedStreamParseError(`registry feed stream event exceeded ${maxFrameBytes} bytes without dispatching`);\n }\n }\n return null;\n}\n\nfunction asAsyncIterable(source: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>): AsyncIterable<Uint8Array> {\n if (Symbol.asyncIterator in (source as object)) {\n return source as AsyncIterable<Uint8Array>;\n }\n const reader = (source as ReadableStream<Uint8Array>).getReader();\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n const { done, value } = await reader.read();\n return done ? { done: true, value: undefined } : { done: false, value: value! };\n },\n async return() {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\n/**\n * Default cap on a single un-dispatched SSE event before the parser fails\n * closed. Measured in UTF-16 code units (an approximate byte bound — JS string\n * length, which tracks heap cost). Generous enough for a full feed page (the\n * JSON feed endpoint caps responses at ~2 MiB) while bounding memory against a\n * hostile or buggy stream that never emits a blank line.\n */\nexport const DEFAULT_MAX_SSE_FRAME_BYTES = 16 * 1024 * 1024;\n\n/**\n * Parse an SSE byte stream into events. Follows the WHATWG event-stream rules:\n * comments (`:`-prefixed) are ignored, `data` lines accumulate (joined by `\\n`),\n * a blank line dispatches the buffered event, and a final block with no trailing\n * blank line is dropped as incomplete (so a partially-transferred page is never\n * surfaced).\n *\n * The in-progress line plus accumulated `data` lines for a single event are\n * bounded by `maxFrameBytes`; a stream that exceeds it (no line terminator, or\n * an unbounded run of `data:` lines before a blank line) throws\n * {@link FeedStreamParseError} rather than growing memory without limit — the\n * JSON feed path enforces the same fail-closed posture via its body-size cap.\n *\n * Parsing is O(n) regardless of how the bytes are chunked: each decoded chunk is\n * scanned once, and an un-terminated line is held as a list of fragments joined\n * only when it completes — never re-scanning or re-flattening a growing buffer.\n */\nexport async function* parseSseStream(\n source: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>,\n options?: { maxFrameBytes?: number }\n): AsyncGenerator<SseEvent> {\n const maxFrameBytes = options?.maxFrameBytes ?? DEFAULT_MAX_SSE_FRAME_BYTES;\n const decoder = new TextDecoder();\n const st: ParseState = { dataLines: [], dataBytes: 0, eventType: '' };\n // Fragments of the current un-terminated line, spanning chunks; joined once\n // when the line completes.\n let lineFragments: string[] = [];\n let lineFragmentsLen = 0;\n // A `\\r` ended the previous chunk; a leading `\\n` here is the LF of that CRLF\n // and must be skipped (the line already terminated at the `\\r`).\n let skipLeadingLF = false;\n\n for await (const chunk of asAsyncIterable(source)) {\n const c = decoder.decode(chunk, { stream: true });\n if (c.length === 0) continue;\n let pos = 0;\n if (skipLeadingLF) {\n if (c[0] === '\\n') pos = 1;\n skipLeadingLF = false;\n }\n while (pos < c.length) {\n // Scan only this (small) chunk for the next terminator — never the\n // accumulated frame — so indexing stays on a flat, short string.\n let j = pos;\n while (j < c.length && c[j] !== '\\n' && c[j] !== '\\r') j += 1;\n if (j === c.length) break; // no terminator in the rest of this chunk\n lineFragments.push(c.slice(pos, j));\n const line = lineFragments.length === 1 ? lineFragments[0]! : lineFragments.join('');\n lineFragments = [];\n lineFragmentsLen = 0;\n const ev = feedLine(line, st, maxFrameBytes);\n if (ev) yield ev;\n if (c[j] === '\\r') {\n if (j === c.length - 1) {\n skipLeadingLF = true; // defer the CRLF check to the next chunk\n pos = c.length;\n } else {\n pos = c[j + 1] === '\\n' ? j + 2 : j + 1;\n }\n } else {\n pos = j + 1;\n }\n }\n if (pos < c.length) {\n const tail = c.slice(pos);\n lineFragments.push(tail);\n lineFragmentsLen += tail.length;\n }\n // Fail closed if a single un-dispatched event grows past the cap, whether\n // from an unterminated line or an unbounded run of data lines.\n if (lineFragmentsLen + st.dataBytes > maxFrameBytes) {\n throw new FeedStreamParseError(`registry feed stream event exceeded ${maxFrameBytes} bytes without dispatching`);\n }\n }\n}\n\n// ====== Frame → typed message ======\n\nfunction parseJsonFrame(event: string, data: string): unknown {\n try {\n return JSON.parse(data);\n } catch {\n throw new FeedStreamParseError(`registry feed stream sent malformed JSON on '${event}' event`);\n }\n}\n\nfunction toFeedStreamMessage(evt: SseEvent): FeedStreamMessage | null {\n switch (evt.event) {\n case 'feed': {\n const page = parseJsonFrame('feed', evt.data);\n if (!page || typeof page !== 'object' || !Array.isArray((page as FeedResponse).events)) {\n throw new FeedStreamParseError(\"registry feed stream 'feed' event was not a feed page\");\n }\n return { type: 'feed', page: page as FeedResponse };\n }\n case 'heartbeat': {\n const heartbeat = parseJsonFrame('heartbeat', evt.data);\n if (!heartbeat || typeof heartbeat !== 'object') {\n throw new FeedStreamParseError(\"registry feed stream 'heartbeat' event was not an object\");\n }\n return { type: 'heartbeat', heartbeat: heartbeat as FeedHeartbeat };\n }\n case 'error': {\n const error = parseJsonFrame('error', evt.data);\n if (!error || typeof error !== 'object' || typeof (error as FeedStreamErrorData).error !== 'string') {\n throw new FeedStreamParseError(\"registry feed stream 'error' event had no error code\");\n }\n return { type: 'error', error: error as FeedStreamErrorData };\n }\n default:\n // Unknown / `message` events (e.g. comments-as-keepalive frames) are ignored.\n return null;\n }\n}\n\n// ====== Connection ======\n\nconst ERROR_BODY_LIMIT_BYTES = 64 * 1024;\nconst ERROR_MESSAGE_MAX_CHARS = 256;\n\n/**\n * Escape control characters and bound the length of a registry-supplied string\n * before it is embedded in an Error message or logged. Registry/proxy text is\n * untrusted input — left raw it is a log-injection / terminal-spoofing vector\n * (and the repo treats registry strings as untrusted everywhere else). Mirrors\n * the JSON client's `preview()`.\n */\nexport function sanitizeStreamText(text: string, maxChars = ERROR_MESSAGE_MAX_CHARS): string {\n // Match C0 controls (\\u0000-\\u001f) and DEL (\\u007f); built from a string so\n // the source never carries raw control bytes.\n const CONTROL = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]', 'g');\n return text.slice(0, maxChars).replace(CONTROL, ch => `\\\\u${ch.charCodeAt(0).toString(16).padStart(4, '0')}`);\n}\n\nfunction buildStreamUrl(baseUrl: string, query?: FeedStreamQuery): string {\n const params = new URLSearchParams();\n if (query?.cursor) params.set('cursor', query.cursor);\n if (query?.types) params.set('types', query.types);\n if (query?.limit != null) params.set('limit', String(query.limit));\n if (query?.pollIntervalSeconds != null) params.set('poll_interval_seconds', String(query.pollIntervalSeconds));\n const qs = params.toString();\n return `${baseUrl}/api/registry/feed/stream${qs ? `?${qs}` : ''}`;\n}\n\n/** Read at most `maxBytes` of a response body, then cancel — never buffers a hostile multi-GB error body. */\nasync function readBoundedText(res: Response, maxBytes: number): Promise<string> {\n const reader = res.body?.getReader();\n if (!reader) {\n // No stream (e.g. a mocked Response): fall back, but still bound the result.\n const text = await res.text().catch(() => '');\n return text.slice(0, maxBytes);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (total < maxBytes) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n total += value.byteLength;\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n return new TextDecoder().decode(concatChunks(chunks)).slice(0, maxBytes);\n}\n\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n\nasync function readErrorMessage(res: Response): Promise<string | undefined> {\n try {\n const trimmed = await readBoundedText(res, ERROR_BODY_LIMIT_BYTES);\n try {\n const body = JSON.parse(trimmed) as { message?: unknown; error?: unknown };\n if (typeof body.message === 'string') return sanitizeStreamText(body.message);\n if (typeof body.error === 'string') return sanitizeStreamText(body.error);\n } catch {\n /* not JSON */\n }\n const tail = trimmed.trim();\n return tail ? sanitizeStreamText(tail) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface OpenFeedStreamOptions {\n fetchImpl: typeof globalThis.fetch;\n baseUrl: string;\n apiKey: string;\n query?: FeedStreamQuery;\n /**\n * Redirect policy for the stream fetch. Defaults to `'error'`, which prevents\n * the `Authorization` bearer from being replayed to a redirect target. Set\n * `'follow'` only with a fully trusted `baseUrl` — fetch may forward the bearer\n * to the redirect location.\n */\n redirect?: 'follow' | 'error';\n /** Cap on bytes buffered for a single un-dispatched SSE event. See {@link DEFAULT_MAX_SSE_FRAME_BYTES}. */\n maxFrameBytes?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Open the SSE feed stream and yield typed messages until the stream closes.\n *\n * Throws {@link FeedStreamCursorExpiredError} (410), {@link FeedStreamUnsupportedError}\n * (404/406/501 or non-stream content-type), {@link FeedStreamHttpError} (other\n * non-2xx), or {@link FeedStreamParseError} (malformed frame). Network/abort\n * errors propagate from the underlying fetch.\n */\nexport async function* openFeedStream(opts: OpenFeedStreamOptions): AsyncGenerator<FeedStreamMessage> {\n const url = buildStreamUrl(opts.baseUrl, opts.query);\n const res = await opts.fetchImpl(url, {\n method: 'GET',\n headers: { Accept: 'text/event-stream', Authorization: `Bearer ${opts.apiKey}` },\n redirect: opts.redirect ?? 'error',\n signal: opts.signal,\n });\n\n if (!res.ok) {\n const message = await readErrorMessage(res);\n if (res.status === 410) {\n throw new FeedStreamCursorExpiredError(message ?? 'registry feed cursor expired');\n }\n if (res.status === 404 || res.status === 406 || res.status === 501) {\n throw new FeedStreamUnsupportedError(\n `registry feed stream unsupported (HTTP ${res.status})${message ? `: ${message}` : ''}`,\n res.status\n );\n }\n throw new FeedStreamHttpError(\n `registry feed stream request failed (HTTP ${res.status})${message ? `: ${message}` : ''}`,\n res.status\n );\n }\n\n const contentType = res.headers.get('content-type') ?? '';\n if (!contentType.includes('text/event-stream')) {\n await res.body?.cancel?.().catch(() => {});\n throw new FeedStreamUnsupportedError(\n `registry feed stream returned non-stream content-type: ${contentType || 'none'}`\n );\n }\n if (!res.body) {\n throw new FeedStreamUnsupportedError('registry feed stream response had no body');\n }\n\n for await (const evt of parseSseStream(res.body, { maxFrameBytes: opts.maxFrameBytes })) {\n const msg = toFeedStreamMessage(evt);\n if (msg) yield msg;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/registry/feed-stream.ts"],"sourcesContent":["/**\n * Server-Sent Events transport for the registry change feed\n * (`GET /api/registry/feed/stream`, adcp#5733).\n *\n * Generated OpenAPI types alone are not enough because the response is\n * `text/event-stream`. This module provides a fetch-based SSE reader (so it can\n * carry the `Authorization` bearer and run under Node) plus the typed message\n * and error shapes the stream emits.\n *\n * The stream carries the resume cursor in the JSON `data.cursor` payload, not in\n * SSE `id:` / `Last-Event-ID` (the registry does not use native EventSource\n * resume in 3.x). Consumers persist `data.cursor` and reconnect with `?cursor=`.\n */\n\nimport type { FeedResponse } from './types';\nimport type { FeedFreshness } from './types.generated';\n\n/** Query parameters for `GET /api/registry/feed/stream`. */\nexport interface FeedStreamQuery {\n /** Resume after this event id. Omit to start at the beginning of retention. */\n cursor?: string;\n /** Comma-separated event type filters with glob support (e.g. `authorization.*`). */\n types?: string;\n /** Max events per SSE feed page (default 100, max 10,000). */\n limit?: number;\n /** Server-side interval while caught up (5–60s, default 15). Backlog pages are sent without waiting. */\n pollIntervalSeconds?: number;\n}\n\n/** `heartbeat` event payload. Emitted while caught up; does not advance the cursor. */\nexport interface FeedHeartbeat {\n generated_at: string;\n cursor: string | null;\n freshness?: FeedFreshness;\n}\n\n/** `error` event payload. Sent once before the server closes the stream. */\nexport interface FeedStreamErrorData {\n /** e.g. `cursor_expired`, `feed_stream_error`. */\n error: string;\n message?: string;\n}\n\n/**\n * A typed message decoded from the SSE stream.\n *\n * @remarks\n * Registry-supplied strings (event payloads, `freshness`, `error.message`) are\n * untrusted input. Sanitize before logging them or injecting them into LLM\n * prompts/instructions or other executable context.\n */\nexport type FeedStreamMessage =\n | { type: 'feed'; page: FeedResponse }\n | { type: 'heartbeat'; heartbeat: FeedHeartbeat }\n | { type: 'error'; error: FeedStreamErrorData };\n\n// ====== Errors ======\n\n/** Base class for feed-stream transport failures. */\nexport class FeedStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamError';\n }\n}\n\n/**\n * The stream endpoint is unavailable (404/406/501) or did not return an event\n * stream (proxy returned HTML/JSON). Callers in `auto` mode fall back to polling.\n */\nexport class FeedStreamUnsupportedError extends FeedStreamError {\n readonly status: number | undefined;\n constructor(message: string, status?: number) {\n super(message);\n this.name = 'FeedStreamUnsupportedError';\n this.status = status;\n }\n}\n\n/** The initial cursor is expired (HTTP 410). Callers re-bootstrap then resume. */\nexport class FeedStreamCursorExpiredError extends FeedStreamError {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamCursorExpiredError';\n }\n}\n\n/** A non-success HTTP status that is neither unsupported nor cursor-expired (e.g. 429, 500). */\nexport class FeedStreamHttpError extends FeedStreamError {\n readonly status: number;\n constructor(message: string, status: number) {\n super(message);\n this.name = 'FeedStreamHttpError';\n this.status = status;\n }\n}\n\n/** A feed/heartbeat/error frame carried data that was not valid JSON or had the wrong shape. */\nexport class FeedStreamParseError extends FeedStreamError {\n constructor(message: string) {\n super(message);\n this.name = 'FeedStreamParseError';\n }\n}\n\n// ====== SSE line parser ======\n\ninterface SseEvent {\n event: string;\n data: string;\n}\n\n/** Mutable accumulation state for the SSE field parser. */\ninterface ParseState {\n dataLines: string[];\n dataBytes: number;\n eventType: string;\n}\n\n/**\n * Apply one SSE line to the accumulation state. Returns an event to yield when a\n * blank line dispatches a buffered event with data, else null. Follows the\n * WHATWG rules: `:`-prefixed comments ignored, one leading space stripped from\n * each value, `id`/`retry` ignored (the registry uses `data.cursor`, not\n * Last-Event-ID).\n *\n * Throws {@link FeedStreamParseError} as soon as accumulated `data` exceeds\n * `maxFrameBytes` — before the dispatching blank line — so an oversized frame is\n * never yielded (or JSON-parsed downstream), even when the whole frame, blank\n * line included, arrives in a single chunk.\n */\nfunction feedLine(line: string, st: ParseState, maxFrameBytes: number): SseEvent | null {\n if (line === '') {\n const ev = st.dataLines.length > 0 ? { event: st.eventType || 'message', data: st.dataLines.join('\\n') } : null;\n st.dataLines = [];\n st.dataBytes = 0;\n st.eventType = '';\n return ev;\n }\n if (line[0] === ':') return null; // comment\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? '' : line.slice(colon + 1);\n if (value[0] === ' ') value = value.slice(1);\n if (field === 'event') st.eventType = value;\n else if (field === 'data') {\n st.dataLines.push(value);\n st.dataBytes += value.length;\n if (st.dataBytes > maxFrameBytes) {\n throw new FeedStreamParseError(`registry feed stream event exceeded ${maxFrameBytes} bytes without dispatching`);\n }\n }\n return null;\n}\n\nfunction asAsyncIterable(source: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>): AsyncIterable<Uint8Array> {\n if (Symbol.asyncIterator in (source as object)) {\n return source as AsyncIterable<Uint8Array>;\n }\n const reader = (source as ReadableStream<Uint8Array>).getReader();\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n const { done, value } = await reader.read();\n return done ? { done: true, value: undefined } : { done: false, value: value! };\n },\n async return() {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n\n/**\n * Default cap on a single un-dispatched SSE event before the parser fails\n * closed. Measured in UTF-16 code units (an approximate byte bound — JS string\n * length, which tracks heap cost). Generous enough for a full feed page (the\n * JSON feed endpoint caps responses at ~2 MiB) while bounding memory against a\n * hostile or buggy stream that never emits a blank line.\n */\nexport const DEFAULT_MAX_SSE_FRAME_BYTES = 16 * 1024 * 1024;\n\n/**\n * Parse an SSE byte stream into events. Follows the WHATWG event-stream rules:\n * comments (`:`-prefixed) are ignored, `data` lines accumulate (joined by `\\n`),\n * a blank line dispatches the buffered event, and a final block with no trailing\n * blank line is dropped as incomplete (so a partially-transferred page is never\n * surfaced).\n *\n * The in-progress line plus accumulated `data` lines for a single event are\n * bounded by `maxFrameBytes`; a stream that exceeds it (no line terminator, or\n * an unbounded run of `data:` lines before a blank line) throws\n * {@link FeedStreamParseError} rather than growing memory without limit — the\n * JSON feed path enforces the same fail-closed posture via its body-size cap.\n *\n * Parsing is O(n) regardless of how the bytes are chunked: each decoded chunk is\n * scanned once, and an un-terminated line is held as a list of fragments joined\n * only when it completes — never re-scanning or re-flattening a growing buffer.\n */\nexport async function* parseSseStream(\n source: AsyncIterable<Uint8Array> | ReadableStream<Uint8Array>,\n options?: { maxFrameBytes?: number }\n): AsyncGenerator<SseEvent> {\n const maxFrameBytes = options?.maxFrameBytes ?? DEFAULT_MAX_SSE_FRAME_BYTES;\n const decoder = new TextDecoder();\n const st: ParseState = { dataLines: [], dataBytes: 0, eventType: '' };\n // Fragments of the current un-terminated line, spanning chunks; joined once\n // when the line completes.\n let lineFragments: string[] = [];\n let lineFragmentsLen = 0;\n // A `\\r` ended the previous chunk; a leading `\\n` here is the LF of that CRLF\n // and must be skipped (the line already terminated at the `\\r`).\n let skipLeadingLF = false;\n\n for await (const chunk of asAsyncIterable(source)) {\n const c = decoder.decode(chunk, { stream: true });\n if (c.length === 0) continue;\n let pos = 0;\n if (skipLeadingLF) {\n if (c[0] === '\\n') pos = 1;\n skipLeadingLF = false;\n }\n while (pos < c.length) {\n // Scan only this (small) chunk for the next terminator — never the\n // accumulated frame — so indexing stays on a flat, short string.\n let j = pos;\n while (j < c.length && c[j] !== '\\n' && c[j] !== '\\r') j += 1;\n if (j === c.length) break; // no terminator in the rest of this chunk\n lineFragments.push(c.slice(pos, j));\n const line = lineFragments.length === 1 ? lineFragments[0]! : lineFragments.join('');\n lineFragments = [];\n lineFragmentsLen = 0;\n const ev = feedLine(line, st, maxFrameBytes);\n if (ev) yield ev;\n if (c[j] === '\\r') {\n if (j === c.length - 1) {\n skipLeadingLF = true; // defer the CRLF check to the next chunk\n pos = c.length;\n } else {\n pos = c[j + 1] === '\\n' ? j + 2 : j + 1;\n }\n } else {\n pos = j + 1;\n }\n }\n if (pos < c.length) {\n const tail = c.slice(pos);\n lineFragments.push(tail);\n lineFragmentsLen += tail.length;\n }\n // Fail closed if a single un-dispatched event grows past the cap, whether\n // from an unterminated line or an unbounded run of data lines.\n if (lineFragmentsLen + st.dataBytes > maxFrameBytes) {\n throw new FeedStreamParseError(`registry feed stream event exceeded ${maxFrameBytes} bytes without dispatching`);\n }\n }\n}\n\n// ====== Frame → typed message ======\n\nfunction parseJsonFrame(event: string, data: string): unknown {\n try {\n return JSON.parse(data);\n } catch {\n throw new FeedStreamParseError(`registry feed stream sent malformed JSON on '${event}' event`);\n }\n}\n\nfunction toFeedStreamMessage(evt: SseEvent): FeedStreamMessage | null {\n switch (evt.event) {\n case 'feed': {\n const page = parseJsonFrame('feed', evt.data);\n if (!page || typeof page !== 'object' || !Array.isArray((page as FeedResponse).events)) {\n throw new FeedStreamParseError(\"registry feed stream 'feed' event was not a feed page\");\n }\n return { type: 'feed', page: page as FeedResponse };\n }\n case 'heartbeat': {\n const heartbeat = parseJsonFrame('heartbeat', evt.data);\n if (!heartbeat || typeof heartbeat !== 'object') {\n throw new FeedStreamParseError(\"registry feed stream 'heartbeat' event was not an object\");\n }\n return { type: 'heartbeat', heartbeat: heartbeat as FeedHeartbeat };\n }\n case 'error': {\n const error = parseJsonFrame('error', evt.data);\n if (!error || typeof error !== 'object' || typeof (error as FeedStreamErrorData).error !== 'string') {\n throw new FeedStreamParseError(\"registry feed stream 'error' event had no error code\");\n }\n return { type: 'error', error: error as FeedStreamErrorData };\n }\n default:\n // Unknown / `message` events (e.g. comments-as-keepalive frames) are ignored.\n return null;\n }\n}\n\n// ====== Connection ======\n\nconst ERROR_BODY_LIMIT_BYTES = 64 * 1024;\nconst ERROR_MESSAGE_MAX_CHARS = 256;\n\n/**\n * Escape control characters and bound the length of a registry-supplied string\n * before it is embedded in an Error message or logged. Registry/proxy text is\n * untrusted input — left raw it is a log-injection / terminal-spoofing vector\n * (and the repo treats registry strings as untrusted everywhere else). Mirrors\n * the JSON client's `preview()`.\n */\nexport function sanitizeStreamText(text: string, maxChars = ERROR_MESSAGE_MAX_CHARS): string {\n // Match C0 controls (\\u0000-\\u001f) and DEL (\\u007f); built from a string so\n // the source never carries raw control bytes.\n const CONTROL = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]', 'g');\n return text.slice(0, maxChars).replace(CONTROL, ch => `\\\\u${ch.charCodeAt(0).toString(16).padStart(4, '0')}`);\n}\n\nfunction buildStreamUrl(baseUrl: string, query?: FeedStreamQuery): string {\n const params = new URLSearchParams();\n if (query?.cursor) params.set('cursor', query.cursor);\n if (query?.types) params.set('types', query.types);\n if (query?.limit != null) params.set('limit', String(query.limit));\n if (query?.pollIntervalSeconds != null) params.set('poll_interval_seconds', String(query.pollIntervalSeconds));\n const qs = params.toString();\n return `${baseUrl}/api/registry/feed/stream${qs ? `?${qs}` : ''}`;\n}\n\n/** Read at most `maxBytes` of a response body, then cancel — never buffers a hostile multi-GB error body. */\nasync function readBoundedText(res: Response, maxBytes: number): Promise<string> {\n const reader = res.body?.getReader();\n if (!reader) {\n // No stream (e.g. a mocked Response): fall back, but still bound the result.\n const text = await res.text().catch(() => '');\n return text.slice(0, maxBytes);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (total < maxBytes) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n total += value.byteLength;\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n return new TextDecoder().decode(concatChunks(chunks)).slice(0, maxBytes);\n}\n\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n\nasync function readErrorMessage(res: Response): Promise<string | undefined> {\n try {\n const trimmed = await readBoundedText(res, ERROR_BODY_LIMIT_BYTES);\n try {\n const body = JSON.parse(trimmed) as { message?: unknown; error?: unknown };\n if (typeof body.message === 'string') return sanitizeStreamText(body.message);\n if (typeof body.error === 'string') return sanitizeStreamText(body.error);\n } catch {\n /* not JSON */\n }\n const tail = trimmed.trim();\n return tail ? sanitizeStreamText(tail) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface OpenFeedStreamOptions {\n fetchImpl: typeof globalThis.fetch;\n baseUrl: string;\n apiKey: string;\n query?: FeedStreamQuery;\n /**\n * Redirect policy for the stream fetch. Defaults to `'error'`, which prevents\n * the `Authorization` bearer from being replayed to a redirect target. Set\n * `'follow'` only with a fully trusted `baseUrl` — fetch may forward the bearer\n * to the redirect location.\n */\n redirect?: 'follow' | 'error';\n /** Cap on bytes buffered for a single un-dispatched SSE event. See {@link DEFAULT_MAX_SSE_FRAME_BYTES}. */\n maxFrameBytes?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Open the SSE feed stream and yield typed messages until the stream closes.\n *\n * Throws {@link FeedStreamCursorExpiredError} (410), {@link FeedStreamUnsupportedError}\n * (404/406/501 or non-stream content-type), {@link FeedStreamHttpError} (other\n * non-2xx), or {@link FeedStreamParseError} (malformed frame). Network/abort\n * errors propagate from the underlying fetch.\n */\nexport async function* openFeedStream(opts: OpenFeedStreamOptions): AsyncGenerator<FeedStreamMessage> {\n const url = buildStreamUrl(opts.baseUrl, opts.query);\n const res = await opts.fetchImpl(url, {\n method: 'GET',\n headers: { Accept: 'text/event-stream', Authorization: `Bearer ${opts.apiKey}` },\n redirect: opts.redirect ?? 'error',\n signal: opts.signal,\n });\n\n if (!res.ok) {\n const message = await readErrorMessage(res);\n if (res.status === 410) {\n throw new FeedStreamCursorExpiredError(message ?? 'registry feed cursor expired');\n }\n if (res.status === 404 || res.status === 406 || res.status === 501) {\n throw new FeedStreamUnsupportedError(\n `registry feed stream unsupported (HTTP ${res.status})${message ? `: ${message}` : ''}`,\n res.status\n );\n }\n throw new FeedStreamHttpError(\n `registry feed stream request failed (HTTP ${res.status})${message ? `: ${message}` : ''}`,\n res.status\n );\n }\n\n const contentType = res.headers.get('content-type') ?? '';\n if (!contentType.includes('text/event-stream')) {\n await res.body?.cancel?.().catch(() => {});\n throw new FeedStreamUnsupportedError(\n `registry feed stream returned non-stream content-type: ${contentType || 'none'}`\n );\n }\n if (!res.body) {\n throw new FeedStreamUnsupportedError('registry feed stream response had no body');\n }\n\n for await (const evt of parseSseStream(res.body, { maxFrameBytes: opts.maxFrameBytes })) {\n const msg = toFeedStreamMessage(evt);\n if (msg) yield msg;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import { fileURLToPath as __adcpFileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname as __adcpDirname } from 'node:path';
|
|
3
|
-
import { createRequire as __adcpCreateRequire } from 'node:module';
|
|
4
|
-
const __filename = __adcpFileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __adcpDirname(__filename);
|
|
6
|
-
const require = __adcpCreateRequire(import.meta.url);
|
|
7
1
|
import { openFeedStream } from "./feed-stream.mjs";
|
|
8
2
|
import { RegistrySync } from "./sync.mjs";
|
|
9
3
|
import {
|