@adcp/sdk 14.0.0-rc.37 → 14.0.0-rc.39
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/bin/adcp-storyboard-summary.js +286 -0
- package/bin/adcp.js +221 -10
- package/dist/lib/conformance/schemaLoader.d.mts +1 -1
- package/dist/lib/conformance/schemaLoader.d.ts +1 -1
- package/dist/lib/core/AgentClient.d.mts +6 -1
- package/dist/lib/core/AgentClient.d.ts +6 -1
- package/dist/lib/core/AgentClient.js +9 -0
- package/dist/lib/core/AgentClient.mjs +9 -0
- package/dist/lib/core/ConversationTypes.d.mts +29 -0
- package/dist/lib/core/ConversationTypes.d.ts +29 -0
- package/dist/lib/core/SingleAgentClient.d.mts +3 -1
- package/dist/lib/core/SingleAgentClient.d.ts +3 -1
- package/dist/lib/core/SingleAgentClient.js +9 -1
- package/dist/lib/core/SingleAgentClient.mjs +9 -1
- package/dist/lib/core/TaskExecutor.d.mts +13 -1
- package/dist/lib/core/TaskExecutor.d.ts +13 -1
- package/dist/lib/core/TaskExecutor.js +216 -18
- package/dist/lib/core/TaskExecutor.mjs +216 -19
- package/dist/lib/index.d.mts +5 -2
- package/dist/lib/index.d.ts +5 -2
- package/dist/lib/index.js +10 -1
- package/dist/lib/index.mjs +10 -1
- package/dist/lib/media-buy/action-assessment.d.mts +77 -0
- package/dist/lib/media-buy/action-assessment.d.ts +77 -0
- package/dist/lib/media-buy/action-assessment.js +300 -0
- package/dist/lib/media-buy/action-assessment.mjs +284 -0
- package/dist/lib/media-buy/action-constraints.d.mts +9 -0
- package/dist/lib/media-buy/action-constraints.d.ts +9 -0
- package/dist/lib/media-buy/action-constraints.js +170 -0
- package/dist/lib/media-buy/action-constraints.mjs +146 -0
- package/dist/lib/media-buy/action-contracts.d.mts +40 -0
- package/dist/lib/media-buy/action-contracts.d.ts +40 -0
- package/dist/lib/media-buy/action-contracts.js +304 -0
- package/dist/lib/media-buy/action-contracts.mjs +267 -0
- package/dist/lib/media-buy/action-metadata.generated.d.mts +37 -0
- package/dist/lib/media-buy/action-metadata.generated.d.ts +37 -0
- package/dist/lib/media-buy/action-metadata.generated.js +128 -0
- package/dist/lib/media-buy/action-metadata.generated.mjs +101 -0
- package/dist/lib/media-buy/action-types.d.mts +106 -0
- package/dist/lib/media-buy/action-types.d.ts +106 -0
- package/dist/lib/{types/v3-1-beta/tools.generated.js → media-buy/action-types.js} +2 -2
- package/dist/lib/media-buy/actions.d.mts +6 -0
- package/dist/lib/media-buy/actions.d.ts +6 -0
- package/dist/lib/media-buy/actions.js +38 -0
- package/dist/lib/media-buy/actions.mjs +9 -0
- package/dist/lib/media-buy/available-actions.d.mts +2 -1
- package/dist/lib/media-buy/available-actions.d.ts +2 -1
- package/dist/lib/media-buy/available-actions.js +4 -3
- package/dist/lib/media-buy/available-actions.mjs +4 -3
- package/dist/lib/media-buy/compatibility.js +3 -0
- package/dist/lib/media-buy/compatibility.mjs +3 -0
- package/dist/lib/media-buy/index.d.mts +4 -0
- package/dist/lib/media-buy/index.d.ts +4 -0
- package/dist/lib/media-buy/index.js +3 -1
- package/dist/lib/media-buy/index.mjs +1 -0
- package/dist/lib/media-buy/legacy-action-ids.d.mts +1 -0
- package/dist/lib/media-buy/legacy-action-ids.d.ts +1 -0
- package/dist/lib/media-buy/legacy-action-ids.js +50 -0
- package/dist/lib/media-buy/legacy-action-ids.mjs +26 -0
- package/dist/lib/media-buy/mutations.d.mts +70 -0
- package/dist/lib/media-buy/mutations.d.ts +70 -0
- package/dist/lib/media-buy/mutations.js +525 -0
- package/dist/lib/media-buy/mutations.mjs +498 -0
- package/dist/lib/media-buy/preflight.d.mts +20 -69
- package/dist/lib/media-buy/preflight.d.ts +20 -69
- package/dist/lib/media-buy/preflight.js +100 -336
- package/dist/lib/media-buy/preflight.mjs +111 -333
- package/dist/lib/media-buy/targeting-input.d.mts +7 -4
- package/dist/lib/media-buy/targeting-input.d.ts +7 -4
- package/dist/lib/media-buy/types.d.mts +55 -7
- package/dist/lib/media-buy/types.d.ts +55 -7
- package/dist/lib/protocols/rawResponseCapture.d.mts +12 -0
- package/dist/lib/protocols/rawResponseCapture.d.ts +12 -0
- package/dist/lib/protocols/rawResponseCapture.js +33 -3
- package/dist/lib/protocols/rawResponseCapture.mjs +32 -3
- package/dist/lib/registry/types.generated.d.mts +377 -9
- package/dist/lib/registry/types.generated.d.ts +377 -9
- package/dist/lib/reporting/content-mismatch.d.mts +126 -0
- package/dist/lib/reporting/content-mismatch.d.ts +126 -0
- package/dist/lib/reporting/content-mismatch.js +90 -0
- package/dist/lib/reporting/content-mismatch.mjs +66 -0
- package/dist/lib/reporting/evidence.d.mts +1 -0
- package/dist/lib/reporting/evidence.d.ts +1 -0
- package/dist/lib/reporting/evidence.js +32 -3
- package/dist/lib/reporting/evidence.mjs +31 -3
- package/dist/lib/reporting/index.d.mts +3 -1
- package/dist/lib/reporting/index.d.ts +3 -1
- package/dist/lib/reporting/index.js +3 -0
- package/dist/lib/reporting/index.mjs +2 -0
- package/dist/lib/reporting/ledger/handler.d.mts +51 -1
- package/dist/lib/reporting/ledger/handler.d.ts +51 -1
- package/dist/lib/reporting/ledger/handler.js +306 -38
- package/dist/lib/reporting/ledger/handler.mjs +304 -37
- package/dist/lib/reporting/ledger/health.d.mts +12 -0
- package/dist/lib/reporting/ledger/health.d.ts +12 -0
- package/dist/lib/reporting/ledger/health.js +15 -2
- package/dist/lib/reporting/ledger/health.mjs +13 -1
- package/dist/lib/reporting/ledger/index.d.mts +3 -0
- package/dist/lib/reporting/ledger/index.d.ts +3 -0
- package/dist/lib/reporting/ledger/index.js +7 -1
- package/dist/lib/reporting/ledger/index.mjs +3 -0
- package/dist/lib/reporting/ledger/lifecycle.d.mts +31 -4
- package/dist/lib/reporting/ledger/lifecycle.d.ts +31 -4
- package/dist/lib/reporting/ledger/lifecycle.js +244 -37
- package/dist/lib/reporting/ledger/lifecycle.mjs +244 -37
- package/dist/lib/reporting/ledger/managed-postgres.d.mts +231 -0
- package/dist/lib/reporting/ledger/managed-postgres.d.ts +231 -0
- package/dist/lib/reporting/ledger/managed-postgres.js +1797 -0
- package/dist/lib/reporting/ledger/managed-postgres.mjs +1776 -0
- package/dist/lib/reporting/ledger/managed.d.mts +355 -0
- package/dist/lib/reporting/ledger/managed.d.ts +355 -0
- package/dist/lib/reporting/ledger/managed.js +661 -0
- package/dist/lib/reporting/ledger/managed.mjs +633 -0
- package/dist/lib/reporting/ledger/notification-activity.d.mts +222 -0
- package/dist/lib/reporting/ledger/notification-activity.d.ts +222 -0
- package/dist/lib/reporting/ledger/notification-activity.js +1139 -0
- package/dist/lib/reporting/ledger/notification-activity.mjs +1110 -0
- package/dist/lib/reporting/ledger/postgres.d.mts +161 -1
- package/dist/lib/reporting/ledger/postgres.d.ts +161 -1
- package/dist/lib/reporting/ledger/postgres.js +1153 -21
- package/dist/lib/reporting/ledger/postgres.mjs +1152 -21
- package/dist/lib/reporting/ledger/producer.d.mts +8 -0
- package/dist/lib/reporting/ledger/producer.d.ts +8 -0
- package/dist/lib/reporting/ledger/producer.js +146 -52
- package/dist/lib/reporting/ledger/producer.mjs +146 -51
- package/dist/lib/reporting/ledger/types.d.mts +358 -1
- package/dist/lib/reporting/ledger/types.d.ts +358 -1
- package/dist/lib/reporting/ledger/types.js +3 -0
- package/dist/lib/reporting/ledger/types.mjs +2 -0
- package/dist/lib/reporting/reconciliation.d.mts +362 -2
- package/dist/lib/reporting/reconciliation.d.ts +362 -2
- package/dist/lib/reporting/reconciliation.js +1051 -7
- package/dist/lib/reporting/reconciliation.mjs +1053 -7
- package/dist/lib/reporting/service/conformance.d.mts +35 -0
- package/dist/lib/reporting/service/conformance.d.ts +35 -0
- package/dist/lib/reporting/service/conformance.js +89 -0
- package/dist/lib/reporting/service/conformance.mjs +68 -0
- package/dist/lib/reporting/service/index.d.mts +182 -0
- package/dist/lib/reporting/service/index.d.ts +182 -0
- package/dist/lib/reporting/service/index.js +793 -0
- package/dist/lib/reporting/service/index.mjs +787 -0
- package/dist/lib/reporting/source/index.d.mts +2 -1
- package/dist/lib/reporting/source/index.d.ts +2 -1
- package/dist/lib/reporting/source/index.js +16 -3
- package/dist/lib/reporting/source/index.mjs +12 -1
- package/dist/lib/reporting/source/inline.d.mts +88 -1
- package/dist/lib/reporting/source/inline.d.ts +88 -1
- package/dist/lib/reporting/source/inline.js +1161 -163
- package/dist/lib/reporting/source/inline.mjs +1166 -163
- package/dist/lib/reporting/source/manifest.js +12 -7
- package/dist/lib/reporting/source/manifest.mjs +12 -7
- package/dist/lib/reporting/source/source.d.mts +26 -0
- package/dist/lib/reporting/source/source.d.ts +26 -0
- package/dist/lib/reporting/source/source.js +71 -2
- package/dist/lib/reporting/source/source.mjs +65 -1
- package/dist/lib/schemas/index.d.mts +22 -1
- package/dist/lib/schemas/index.d.ts +22 -1
- package/dist/lib/schemas/index.js +7 -0
- package/dist/lib/schemas/index.mjs +7 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +18 -0
- package/dist/lib/server/create-adcp-server.d.ts +18 -0
- package/dist/lib/server/create-adcp-server.js +52 -2
- package/dist/lib/server/create-adcp-server.mjs +52 -2
- package/dist/lib/server/decisioning/account.d.mts +1 -1
- package/dist/lib/server/decisioning/account.d.ts +1 -1
- package/dist/lib/server/decisioning/index.d.mts +1 -0
- package/dist/lib/server/decisioning/index.d.ts +1 -0
- package/dist/lib/server/decisioning/platform.d.mts +3 -0
- package/dist/lib/server/decisioning/platform.d.ts +3 -0
- package/dist/lib/server/decisioning/runtime/from-platform.js +88 -10
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +88 -10
- package/dist/lib/server/decisioning/specialisms/reporting.d.mts +38 -0
- package/dist/lib/server/decisioning/specialisms/reporting.d.ts +38 -0
- package/dist/lib/{types/v3-1-beta/index.js → server/decisioning/specialisms/reporting.js} +2 -8
- package/dist/lib/server/decisioning/specialisms/reporting.mjs +0 -0
- package/dist/lib/server/index.d.mts +4 -2
- package/dist/lib/server/index.d.ts +4 -2
- package/dist/lib/server/index.js +5 -0
- package/dist/lib/server/index.mjs +4 -0
- package/dist/lib/server/media-buy-action-resolver.d.mts +63 -0
- package/dist/lib/server/media-buy-action-resolver.d.ts +63 -0
- package/dist/lib/server/media-buy-action-resolver.js +297 -0
- package/dist/lib/server/media-buy-action-resolver.mjs +285 -0
- package/dist/lib/server/media-buy-actions.d.mts +7 -8
- package/dist/lib/server/media-buy-actions.d.ts +7 -8
- package/dist/lib/server/media-buy-actions.js +57 -14
- package/dist/lib/server/media-buy-actions.mjs +63 -14
- package/dist/lib/server/notification-subscriptions/index.d.mts +2 -2
- package/dist/lib/server/notification-subscriptions/index.d.ts +2 -2
- package/dist/lib/server/notification-subscriptions/index.js +2 -0
- package/dist/lib/server/notification-subscriptions/index.mjs +2 -0
- package/dist/lib/server/notification-subscriptions/postgres-runtime.d.mts +3 -1
- package/dist/lib/server/notification-subscriptions/postgres-runtime.d.ts +3 -1
- package/dist/lib/server/notification-subscriptions/postgres-runtime.js +1 -0
- package/dist/lib/server/notification-subscriptions/postgres-runtime.mjs +1 -0
- package/dist/lib/server/notification-subscriptions/runtime.d.mts +12 -1
- package/dist/lib/server/notification-subscriptions/runtime.d.ts +12 -1
- package/dist/lib/server/notification-subscriptions/runtime.js +102 -16
- package/dist/lib/server/notification-subscriptions/runtime.mjs +101 -16
- package/dist/lib/server/notification-subscriptions/types.d.mts +104 -1
- package/dist/lib/server/notification-subscriptions/types.d.ts +104 -1
- package/dist/lib/server/webhook-emitter.d.mts +40 -5
- package/dist/lib/server/webhook-emitter.d.ts +40 -5
- package/dist/lib/server/webhook-emitter.js +23 -12
- package/dist/lib/server/webhook-emitter.mjs +23 -12
- package/dist/lib/storage/interfaces.d.mts +14 -2
- package/dist/lib/storage/interfaces.d.ts +14 -2
- package/dist/lib/testing/compliance/comply.d.mts +9 -3
- package/dist/lib/testing/compliance/comply.d.ts +9 -3
- package/dist/lib/testing/compliance/comply.js +158 -3
- package/dist/lib/testing/compliance/comply.mjs +159 -4
- package/dist/lib/testing/compliance/storyboard-tracks.js +7 -5
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +7 -5
- package/dist/lib/testing/compliance/summary.js +10 -1
- package/dist/lib/testing/compliance/summary.mjs +10 -1
- package/dist/lib/testing/index.d.mts +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.js +2 -0
- package/dist/lib/testing/index.mjs +3 -1
- package/dist/lib/testing/storyboard/agent-routing.d.mts +12 -43
- package/dist/lib/testing/storyboard/agent-routing.d.ts +12 -43
- package/dist/lib/testing/storyboard/agent-routing.js +75 -13
- package/dist/lib/testing/storyboard/agent-routing.mjs +70 -12
- package/dist/lib/testing/storyboard/index.d.mts +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +1 -0
- package/dist/lib/testing/storyboard/index.js +3 -0
- package/dist/lib/testing/storyboard/index.mjs +2 -0
- package/dist/lib/testing/storyboard/junit.d.mts +1 -1
- package/dist/lib/testing/storyboard/junit.d.ts +1 -1
- package/dist/lib/testing/storyboard/junit.js +21 -2
- package/dist/lib/testing/storyboard/junit.mjs +21 -2
- package/dist/lib/testing/storyboard/probes.d.mts +130 -0
- package/dist/lib/testing/storyboard/probes.d.ts +130 -0
- package/dist/lib/testing/storyboard/probes.js +682 -10
- package/dist/lib/testing/storyboard/probes.mjs +683 -3
- package/dist/lib/testing/storyboard/request-signing/builder.d.mts +16 -5
- package/dist/lib/testing/storyboard/request-signing/builder.d.ts +16 -5
- package/dist/lib/testing/storyboard/request-signing/grader.d.mts +44 -1
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts +44 -1
- package/dist/lib/testing/storyboard/request-signing/grader.js +46 -22
- package/dist/lib/testing/storyboard/request-signing/grader.mjs +43 -21
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +86 -11
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +86 -11
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +119 -25
- package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +117 -26
- package/dist/lib/testing/storyboard/request-signing/synthesize.js +22 -2
- package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +22 -2
- package/dist/lib/testing/storyboard/runner.d.mts +103 -0
- package/dist/lib/testing/storyboard/runner.d.ts +103 -0
- package/dist/lib/testing/storyboard/runner.js +1090 -268
- package/dist/lib/testing/storyboard/runner.mjs +1096 -261
- package/dist/lib/testing/storyboard/seeding.d.mts +4 -1
- package/dist/lib/testing/storyboard/seeding.d.ts +4 -1
- package/dist/lib/testing/storyboard/seeding.js +55 -24
- package/dist/lib/testing/storyboard/seeding.mjs +55 -24
- package/dist/lib/testing/storyboard/test-kit.d.mts +37 -3
- package/dist/lib/testing/storyboard/test-kit.d.ts +37 -3
- package/dist/lib/testing/storyboard/test-kit.js +8 -2
- package/dist/lib/testing/storyboard/test-kit.mjs +7 -2
- package/dist/lib/testing/storyboard/types.d.mts +132 -10
- package/dist/lib/testing/storyboard/types.d.ts +132 -10
- package/dist/lib/testing/storyboard/types.js +17 -0
- package/dist/lib/testing/storyboard/types.mjs +16 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/validations.js +16 -0
- package/dist/lib/testing/storyboard/validations.mjs +16 -0
- package/dist/lib/testing/test-controller.d.mts +1 -1
- package/dist/lib/testing/test-controller.d.ts +1 -1
- package/dist/lib/types/buy-products.d.ts +71 -6
- package/dist/lib/types/control-media-buy.d.ts +25 -11
- package/dist/lib/types/core.generated.d.mts +69 -10
- package/dist/lib/types/core.generated.d.ts +69 -10
- package/dist/lib/types/create-media-buy.d.ts +71 -6
- package/dist/lib/types/forward-compat-error-codes.d.mts +7 -6
- package/dist/lib/types/forward-compat-error-codes.d.ts +7 -6
- package/dist/lib/types/index.d.mts +2 -2
- package/dist/lib/types/index.d.ts +2 -2
- package/dist/lib/types/schemas.generated.d.ts +8040 -8116
- package/dist/lib/types/schemas.generated.js +1074 -309
- package/dist/lib/types/schemas.generated.mjs +1068 -309
- package/dist/lib/types/tools.generated.d.mts +65 -6
- package/dist/lib/types/tools.generated.d.ts +65 -6
- package/dist/lib/types/update-media-buy.d.ts +71 -6
- package/dist/lib/utils/redact-secrets.d.mts +1 -1
- package/dist/lib/utils/redact-secrets.d.ts +1 -1
- package/dist/lib/utils/redact-secrets.js +1 -1
- package/dist/lib/utils/redact-secrets.mjs +1 -1
- package/dist/lib/v2/projection/cache-versions.d.mts +0 -1
- package/dist/lib/v2/projection/cache-versions.d.ts +0 -1
- package/dist/lib/v2/projection/cache-versions.js +1 -15
- package/dist/lib/v2/projection/cache-versions.mjs +1 -14
- package/dist/lib/v2/projection/canonical-properties.js +2 -2
- package/dist/lib/v2/projection/canonical-properties.mjs +3 -3
- package/dist/lib/v2/projection/registry.d.mts +1 -1
- package/dist/lib/v2/projection/registry.d.ts +1 -1
- package/dist/lib/v2/projection/registry.js +2 -2
- package/dist/lib/v2/projection/registry.mjs +3 -3
- package/dist/lib/validation/schema-loader.d.mts +9 -1
- package/dist/lib/validation/schema-loader.d.ts +9 -1
- package/dist/lib/validation/schema-loader.js +65 -8
- package/dist/lib/validation/schema-loader.mjs +64 -8
- package/dist/lib/version.d.mts +5 -5
- package/dist/lib/version.d.ts +5 -5
- package/dist/lib/version.js +3 -8
- package/dist/lib/version.mjs +3 -8
- package/dist/lib/wholesale-feed-sync/index.d.mts +1 -0
- package/dist/lib/wholesale-feed-sync/index.d.ts +1 -0
- package/dist/lib/wholesale-feed-sync/protocol-types.d.mts +42 -0
- package/dist/lib/wholesale-feed-sync/protocol-types.d.ts +42 -0
- package/dist/lib/wholesale-feed-sync/protocol-types.js +16 -0
- package/dist/lib/wholesale-feed-sync/protocol-types.mjs +0 -0
- package/dist/lib/wholesale-feed-sync/sync.d.mts +6 -6
- package/dist/lib/wholesale-feed-sync/sync.d.ts +6 -6
- package/dist/lib/wholesale-feed-sync/sync.js +3 -1
- package/dist/lib/wholesale-feed-sync/sync.mjs +3 -1
- package/dist/lib/wholesale-feed-sync/types.d.mts +15 -14
- package/dist/lib/wholesale-feed-sync/types.d.ts +15 -14
- package/dist/lib/wholesale-feed-sync/webhook-notification.d.mts +7 -5
- package/dist/lib/wholesale-feed-sync/webhook-notification.d.ts +7 -5
- package/dist/lib/wholesale-feed-sync/webhook-notification.js +45 -0
- package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +44 -0
- package/docs/CLI.md +1 -1
- package/docs/TYPE-SUMMARY.md +118 -4
- package/docs/guides/ASYNC-API-REFERENCE.md +62 -1
- package/docs/guides/ASYNC-DEVELOPER-GUIDE.md +25 -0
- package/docs/guides/ASYNC-DOCUMENTATION-INDEX.md +3 -0
- package/docs/guides/BUYER-QUICKSTART-3.2.md +5 -0
- package/docs/guides/DURABLE-BUYER-WRITES.md +337 -0
- package/docs/guides/EXISTING-PLATFORM.md +80 -1
- package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +57 -0
- package/docs/guides/MEDIA-BUY-ACTION-ASSESSMENT.md +300 -0
- package/docs/guides/REPORTING-LEDGER.md +654 -3
- package/docs/guides/REPORTING-RECONCILIATION.md +50 -0
- package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +63 -1
- package/docs/guides/SELLER-QUICKSTART-3.2.md +2 -0
- package/docs/guides/VALIDATE-YOUR-AGENT.md +35 -0
- package/docs/guides/idempotency-crash-recovery.md +4 -0
- package/docs/llms.txt +4 -2
- package/docs/migration-14.x-rc-worksheet.md +60 -5
- package/docs/migration-7.9-to-7.10.md +7 -5
- package/examples/README.md +17 -0
- package/examples/durable-buyer-writes/caller.ts +745 -0
- package/examples/durable-buyer-writes/worker.ts +240 -0
- package/examples/reliable-reporting-service/README.md +100 -0
- package/examples/seller-3.2-starter.ts +7 -8
- package/examples/targeting-input-existing-platform.ts +153 -0
- package/package.json +41 -29
- package/skills/build-seller-agent/SKILL.md +2 -0
- package/skills/build-seller-agent/specialisms/signed-requests.md +11 -1
- package/skills/cross-cutting.md +28 -11
- package/compliance/cache/3.1.0-beta.7/domains/brand/index.yaml +0 -160
- package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -415
- package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/single_side_trust_extension.yaml +0 -454
- package/compliance/cache/3.1.0-beta.7/domains/creative/index.yaml +0 -339
- package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/billing_out_of_band.yaml +0 -153
- package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
- package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/native_in_feed.yaml +0 -543
- package/compliance/cache/3.1.0-beta.7/domains/governance/index.yaml +0 -682
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/index.yaml +0 -781
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -380
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/available_actions.yaml +0 -565
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/canonical_formats.yaml +0 -711
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -234
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_reception.yaml +0 -247
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/delivery_reporting.yaml +0 -357
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment.yaml +0 -633
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -399
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_approved.yaml +0 -214
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_conditions.yaml +0 -199
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied.yaml +0 -204
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/invalid_transitions.yaml +0 -289
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_accountability.yaml +0 -244
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -428
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -373
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize.yaml +0 -399
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -517
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -823
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_products.yaml +0 -148
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
- package/compliance/cache/3.1.0-beta.7/domains/media-buy/state-machine.yaml +0 -442
- package/compliance/cache/3.1.0-beta.7/domains/signals/index.yaml +0 -266
- package/compliance/cache/3.1.0-beta.7/domains/sponsored-intelligence/index.yaml +0 -256
- package/compliance/cache/3.1.0-beta.7/index.json +0 -356
- package/compliance/cache/3.1.0-beta.7/protocols/brand/index.yaml +0 -160
- package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -415
- package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -454
- package/compliance/cache/3.1.0-beta.7/protocols/creative/index.yaml +0 -339
- package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/billing_out_of_band.yaml +0 -153
- package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
- package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/native_in_feed.yaml +0 -543
- package/compliance/cache/3.1.0-beta.7/protocols/governance/index.yaml +0 -682
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/index.yaml +0 -781
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -380
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/available_actions.yaml +0 -565
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/canonical_formats.yaml +0 -711
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -234
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_reception.yaml +0 -247
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -357
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -633
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -399
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_approved.yaml +0 -214
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_conditions.yaml +0 -199
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied.yaml +0 -204
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -289
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -244
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -428
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -373
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -399
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -517
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -823
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_products.yaml +0 -148
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
- package/compliance/cache/3.1.0-beta.7/protocols/media-buy/state-machine.yaml +0 -442
- package/compliance/cache/3.1.0-beta.7/protocols/signals/index.yaml +0 -266
- package/compliance/cache/3.1.0-beta.7/protocols/sponsored-intelligence/index.yaml +0 -256
- package/compliance/cache/3.1.0-beta.7/specialisms/audience-sync/index.yaml +0 -313
- package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/index.yaml +0 -350
- package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -226
- package/compliance/cache/3.1.0-beta.7/specialisms/collection-lists/index.yaml +0 -359
- package/compliance/cache/3.1.0-beta.7/specialisms/content-standards/index.yaml +0 -572
- package/compliance/cache/3.1.0-beta.7/specialisms/creative-ad-server/index.yaml +0 -409
- package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/generative-seller.yaml +0 -807
- package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/index.yaml +0 -758
- package/compliance/cache/3.1.0-beta.7/specialisms/creative-template/index.yaml +0 -510
- package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/index.yaml +0 -143
- package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -117
- package/compliance/cache/3.1.0-beta.7/specialisms/governance-delivery-monitor/index.yaml +0 -441
- package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/denied.yaml +0 -221
- package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/index.yaml +0 -330
- package/compliance/cache/3.1.0-beta.7/specialisms/property-lists/index.yaml +0 -482
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-broadcast-tv/index.yaml +0 -738
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-catalog-driven/index.yaml +0 -840
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-guaranteed/index.yaml +0 -601
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-non-guaranteed/index.yaml +0 -546
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-proposal-mode/index.yaml +0 -586
- package/compliance/cache/3.1.0-beta.7/specialisms/sales-social/index.yaml +0 -919
- package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/index.yaml +0 -424
- package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -211
- package/compliance/cache/3.1.0-beta.7/specialisms/signal-owned/index.yaml +0 -317
- package/compliance/cache/3.1.0-beta.7/specialisms/sponsored-intelligence/index.yaml +0 -59
- package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor-live.yaml +0 -78
- package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor.yaml +0 -223
- package/compliance/cache/3.1.0-beta.7/test-kits/billing-gate-runner.yaml +0 -115
- package/compliance/cache/3.1.0-beta.7/test-kits/bistro-oranje.yaml +0 -126
- package/compliance/cache/3.1.0-beta.7/test-kits/distributed-brand-runner.yaml +0 -281
- package/compliance/cache/3.1.0-beta.7/test-kits/nova-motors.yaml +0 -262
- package/compliance/cache/3.1.0-beta.7/test-kits/osei-natural.yaml +0 -126
- package/compliance/cache/3.1.0-beta.7/test-kits/parallel-dispatch-runner.yaml +0 -196
- package/compliance/cache/3.1.0-beta.7/test-kits/rate-limit-trip-runner.yaml +0 -172
- package/compliance/cache/3.1.0-beta.7/test-kits/signed-requests-runner.yaml +0 -155
- package/compliance/cache/3.1.0-beta.7/test-kits/single-side-trust-runner.yaml +0 -294
- package/compliance/cache/3.1.0-beta.7/test-kits/substitution-observer-runner.yaml +0 -688
- package/compliance/cache/3.1.0-beta.7/test-kits/summit-foods.yaml +0 -125
- package/compliance/cache/3.1.0-beta.7/test-kits/webhook-receiver-runner.yaml +0 -265
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/001-minimal-plan.json +0 -43
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/002-full-plan.json +0 -217
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -60
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004a-human-review-omitted.json +0 -43
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -49
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -53
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -57
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -49
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -53
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/007-unicode-objectives.json +0 -43
- package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -65
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/README.md +0 -220
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/canonicalization.json +0 -241
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/keys.json +0 -60
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/001-no-signature-header.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/002-wrong-tag.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/003-expired-signature.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/004-window-too-long.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -27
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -33
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/011-malformed-header.json +0 -27
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/013-expires-le-created.json +0 -27
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -27
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/015-signature-invalid.json +0 -28
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -35
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/017-key-revoked.json +0 -38
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -28
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/020-rate-abuse.json +0 -34
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -31
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -31
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -32
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -31
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -43
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -31
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -25
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/001-basic-post.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -31
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/003-es256-post.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -30
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/README.md +0 -211
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/keys.json +0 -61
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -25
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -25
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -37
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -32
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -33
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -32
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -41
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -26
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/001-basic-post.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/002-es256-post.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -24
- package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -25
- package/compliance/cache/3.1.0-beta.7/universal/billing-gate-dispatch.yaml +0 -450
- package/compliance/cache/3.1.0-beta.7/universal/canonical-format-validate-input.yaml +0 -640
- package/compliance/cache/3.1.0-beta.7/universal/capability-discovery.yaml +0 -125
- package/compliance/cache/3.1.0-beta.7/universal/collection-lists-pagination-integrity.yaml +0 -306
- package/compliance/cache/3.1.0-beta.7/universal/comply-controller-mode-gate.yaml +0 -141
- package/compliance/cache/3.1.0-beta.7/universal/content-standards-pagination-integrity.yaml +0 -326
- package/compliance/cache/3.1.0-beta.7/universal/deterministic-testing.yaml +0 -1430
- package/compliance/cache/3.1.0-beta.7/universal/error-compliance-signals.yaml +0 -377
- package/compliance/cache/3.1.0-beta.7/universal/error-compliance.yaml +0 -528
- package/compliance/cache/3.1.0-beta.7/universal/fictional-entities.yaml +0 -307
- package/compliance/cache/3.1.0-beta.7/universal/get-media-buys-pagination-integrity.yaml +0 -160
- package/compliance/cache/3.1.0-beta.7/universal/get-signals-pagination-integrity.yaml +0 -211
- package/compliance/cache/3.1.0-beta.7/universal/idempotency.yaml +0 -861
- package/compliance/cache/3.1.0-beta.7/universal/notification-config-event-scope.yaml +0 -119
- package/compliance/cache/3.1.0-beta.7/universal/notification-config-lifecycle.yaml +0 -337
- package/compliance/cache/3.1.0-beta.7/universal/notification-config-rejections.yaml +0 -107
- package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-creative-formats.yaml +0 -265
- package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-list-accounts.yaml +0 -245
- package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity.yaml +0 -263
- package/compliance/cache/3.1.0-beta.7/universal/property-lists-pagination-integrity.yaml +0 -307
- package/compliance/cache/3.1.0-beta.7/universal/read-tool-idempotency.yaml +0 -405
- package/compliance/cache/3.1.0-beta.7/universal/runner-output-contract.yaml +0 -1266
- package/compliance/cache/3.1.0-beta.7/universal/schema-validation-signals.yaml +0 -181
- package/compliance/cache/3.1.0-beta.7/universal/schema-validation.yaml +0 -548
- package/compliance/cache/3.1.0-beta.7/universal/security.yaml +0 -539
- package/compliance/cache/3.1.0-beta.7/universal/signed-requests.yaml +0 -217
- package/compliance/cache/3.1.0-beta.7/universal/stale-response-advisory.yaml +0 -295
- package/compliance/cache/3.1.0-beta.7/universal/storyboard-schema.yaml +0 -2136
- package/compliance/cache/3.1.0-beta.7/universal/v3-envelope-integrity.yaml +0 -117
- package/compliance/cache/3.1.0-beta.7/universal/version-negotiation.yaml +0 -130
- package/compliance/cache/3.1.0-beta.7/universal/webhook-emission.yaml +0 -411
- package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-bulk-webhooks.yaml +0 -82
- package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-product-webhooks.yaml +0 -83
- package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-products.yaml +0 -151
- package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signal-webhooks.yaml +0 -83
- package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signals.yaml +0 -149
- package/dist/lib/types/v3-1-beta/index.d.mts +0 -1
- package/dist/lib/types/v3-1-beta/index.d.ts +0 -1
- package/dist/lib/types/v3-1-beta/index.mjs +0 -1
- package/dist/lib/types/v3-1-beta/tools.generated.d.mts +0 -26788
- package/dist/lib/types/v3-1-beta/tools.generated.d.ts +0 -26788
- /package/dist/lib/{types/v3-1-beta/tools.generated.mjs → media-buy/action-types.mjs} +0 -0
|
@@ -5,7 +5,7 @@ import { type MutatingRequestInput } from '../utils/idempotency';
|
|
|
5
5
|
import type { MCPWebhookPayload, TaskStatus } from '../types/core.generated';
|
|
6
6
|
type A2ATask = Record<string, any>;
|
|
7
7
|
type TaskStatusUpdateEvent = Record<string, any>;
|
|
8
|
-
import type { InputHandler, Message, TaskOptions, TaskResult, ConversationConfig, TaskInfo, TaskState, WebhookUrlTemplate } from './ConversationTypes';
|
|
8
|
+
import type { InputHandler, Message, TaskOptions, TaskResult, ConversationConfig, TaskInfo, TaskState, WebhookUrlTemplate, DirectPauseRecoveryRequest } from './ConversationTypes';
|
|
9
9
|
import type { AdcpTaskName, TaskRequestFor, TaskResponseTypeMap } from './AgentClient';
|
|
10
10
|
import type { DeferredTaskStorage } from '../storage/interfaces';
|
|
11
11
|
import type { Activity, AsyncHandlerConfig } from './AsyncHandler';
|
|
@@ -523,6 +523,8 @@ export declare class SingleAgentClient {
|
|
|
523
523
|
* version. Wire-shape adapters key off this method in subsequent stages.
|
|
524
524
|
*/
|
|
525
525
|
getAdcpVersion(): string;
|
|
526
|
+
/** Recover the current generation of an opt-in direct mutation pause. */
|
|
527
|
+
recoverDirectPauseContinuation<T>(request: DirectPauseRecoveryRequest): Promise<TaskResult<T>>;
|
|
526
528
|
private recoverDurableSettlement;
|
|
527
529
|
private recoverPersistedDeferredTerminal;
|
|
528
530
|
private taskResultFromRecoveredSettlement;
|
|
@@ -503,6 +503,9 @@ function snapshotTaskOptions(options) {
|
|
|
503
503
|
...options.metadata !== void 0 && { metadata: structuredClone(options.metadata) },
|
|
504
504
|
...options.delegatedOperatorAuthorization !== void 0 && {
|
|
505
505
|
delegatedOperatorAuthorization: { ...options.delegatedOperatorAuthorization }
|
|
506
|
+
},
|
|
507
|
+
...options.durableContinuationRecovery !== void 0 && {
|
|
508
|
+
durableContinuationRecovery: { ...options.durableContinuationRecovery }
|
|
506
509
|
}
|
|
507
510
|
};
|
|
508
511
|
}
|
|
@@ -1309,6 +1312,11 @@ class SingleAgentClient {
|
|
|
1309
1312
|
recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus = true) {
|
|
1310
1313
|
return this.executor.recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus);
|
|
1311
1314
|
}
|
|
1315
|
+
/** Recover the current generation of an opt-in direct mutation pause. */
|
|
1316
|
+
async recoverDirectPauseContinuation(request) {
|
|
1317
|
+
const recovered = await this.executor.recoverDirectPauseContinuation(request);
|
|
1318
|
+
return isDeferredClientFinalizationContext(recovered.clientContext) ? this.finalizeTaskResult(recovered.result, recovered.clientContext) : recovered.result;
|
|
1319
|
+
}
|
|
1312
1320
|
/** Bridge a store-recovered callback into the deferred terminal checkpoint. @internal */
|
|
1313
1321
|
checkpointExternalDeferredSettlement(token, operationId, terminalResult) {
|
|
1314
1322
|
return this.executor.checkpointExternalDeferredSettlement(token, operationId, terminalResult);
|
|
@@ -5033,7 +5041,7 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
|
|
|
5033
5041
|
if (error instanceof import_TaskExecutor.BeforeProtocolDispatchHookError || error instanceof import_TaskExecutor.AfterProtocolDispatchHookError) {
|
|
5034
5042
|
throw error.original;
|
|
5035
5043
|
}
|
|
5036
|
-
if (error instanceof import_errors.AuthenticationRequiredError || error instanceof import_errors.TaskTimeoutError || error instanceof import_errors.VersionUnsupportedError || error instanceof import_errors.FeatureUnsupportedError || (0, import_abort.isAbortOrTimeoutError)(error)) {
|
|
5044
|
+
if (error instanceof import_errors.AuthenticationRequiredError || error instanceof import_errors.TaskTimeoutError || error instanceof import_errors.VersionUnsupportedError || error instanceof import_errors.FeatureUnsupportedError || error instanceof import_errors.ConfigurationError && options?.durableContinuationRecovery !== void 0 || (0, import_abort.isAbortOrTimeoutError)(error)) {
|
|
5037
5045
|
throw error;
|
|
5038
5046
|
}
|
|
5039
5047
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -557,6 +557,9 @@ function snapshotTaskOptions(options) {
|
|
|
557
557
|
...options.metadata !== void 0 && { metadata: structuredClone(options.metadata) },
|
|
558
558
|
...options.delegatedOperatorAuthorization !== void 0 && {
|
|
559
559
|
delegatedOperatorAuthorization: { ...options.delegatedOperatorAuthorization }
|
|
560
|
+
},
|
|
561
|
+
...options.durableContinuationRecovery !== void 0 && {
|
|
562
|
+
durableContinuationRecovery: { ...options.durableContinuationRecovery }
|
|
560
563
|
}
|
|
561
564
|
};
|
|
562
565
|
}
|
|
@@ -1363,6 +1366,11 @@ class SingleAgentClient {
|
|
|
1363
1366
|
recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus = true) {
|
|
1364
1367
|
return this.executor.recoverDeferredTaskForOperation(operationId, recoveryKey, publishTerminalTaskStatus);
|
|
1365
1368
|
}
|
|
1369
|
+
/** Recover the current generation of an opt-in direct mutation pause. */
|
|
1370
|
+
async recoverDirectPauseContinuation(request) {
|
|
1371
|
+
const recovered = await this.executor.recoverDirectPauseContinuation(request);
|
|
1372
|
+
return isDeferredClientFinalizationContext(recovered.clientContext) ? this.finalizeTaskResult(recovered.result, recovered.clientContext) : recovered.result;
|
|
1373
|
+
}
|
|
1366
1374
|
/** Bridge a store-recovered callback into the deferred terminal checkpoint. @internal */
|
|
1367
1375
|
checkpointExternalDeferredSettlement(token, operationId, terminalResult) {
|
|
1368
1376
|
return this.executor.checkpointExternalDeferredSettlement(token, operationId, terminalResult);
|
|
@@ -5087,7 +5095,7 @@ Hint: this usually means agent_uri does not include the MCP endpoint path. The S
|
|
|
5087
5095
|
if (error instanceof BeforeProtocolDispatchHookError || error instanceof AfterProtocolDispatchHookError) {
|
|
5088
5096
|
throw error.original;
|
|
5089
5097
|
}
|
|
5090
|
-
if (error instanceof AuthenticationRequiredError || error instanceof TaskTimeoutError || error instanceof VersionUnsupportedError || error instanceof FeatureUnsupportedError || isAbortOrTimeoutError(error)) {
|
|
5098
|
+
if (error instanceof AuthenticationRequiredError || error instanceof TaskTimeoutError || error instanceof VersionUnsupportedError || error instanceof FeatureUnsupportedError || error instanceof ConfigurationError && options?.durableContinuationRecovery !== void 0 || isAbortOrTimeoutError(error)) {
|
|
5091
5099
|
throw error;
|
|
5092
5100
|
}
|
|
5093
5101
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -2,7 +2,7 @@ import type { AgentConfig } from '../types/index.mjs';
|
|
|
2
2
|
import type { DeferredTaskStorage } from '../storage/interfaces.mjs';
|
|
3
3
|
import { type ValidationHookConfig } from '../validation/client-hooks.mjs';
|
|
4
4
|
import type { AdcpCapabilities } from '../utils/capabilities.mjs';
|
|
5
|
-
import type { Message, InputHandler, TaskOptions, TaskResult, TaskState, TaskStatus, TaskInfo, WebhookUrlTemplate } from './ConversationTypes.mjs';
|
|
5
|
+
import type { Message, InputHandler, TaskOptions, TaskResult, TaskState, TaskStatus, TaskInfo, DirectPauseRecoveryRequest, WebhookUrlTemplate } from './ConversationTypes.mjs';
|
|
6
6
|
import type { Activity } from './AsyncHandler.mjs';
|
|
7
7
|
import { GovernanceMiddleware } from './GovernanceMiddleware.mjs';
|
|
8
8
|
import type { GovernanceConfig } from './GovernanceTypes.mjs';
|
|
@@ -25,6 +25,12 @@ export declare const DEFERRED_SETTLEMENT_ACK: unique symbol;
|
|
|
25
25
|
export declare class DeferredSettlementOwnershipError extends Error {
|
|
26
26
|
constructor(message: string, options?: ErrorOptions);
|
|
27
27
|
}
|
|
28
|
+
export type DirectContinuationRecoveryFailure = 'not_authorized' | 'in_progress' | 'superseded';
|
|
29
|
+
/** Typed failure from the public direct-continuation recovery boundary. */
|
|
30
|
+
export declare class DirectContinuationRecoveryError extends DeferredSettlementOwnershipError {
|
|
31
|
+
readonly reason: DirectContinuationRecoveryFailure;
|
|
32
|
+
constructor(message: string, reason: DirectContinuationRecoveryFailure);
|
|
33
|
+
}
|
|
28
34
|
/** Carry only the SDK's private settlement controls across an internal result projection. */
|
|
29
35
|
export declare function transferDeferredSettlementAcknowledgement<T extends object>(source: object, target: T): T;
|
|
30
36
|
/** Identify the internal submitted continuation that owns a durable pending checkpoint. */
|
|
@@ -339,6 +345,12 @@ export declare class TaskExecutor {
|
|
|
339
345
|
private requireDeferredSettlementOperationRouting;
|
|
340
346
|
private loadDeferredSettlementOperationRoute;
|
|
341
347
|
private replaceDeferredState;
|
|
348
|
+
/** Recover an opt-in direct continuation through its secret operation capability. */
|
|
349
|
+
recoverDirectPauseContinuation<T>(request: DirectPauseRecoveryRequest, publishTerminalTaskStatus?: boolean): Promise<{
|
|
350
|
+
token: string;
|
|
351
|
+
result: TaskResult<T>;
|
|
352
|
+
clientContext?: unknown;
|
|
353
|
+
}>;
|
|
342
354
|
private recoverRoutedDeferredTask;
|
|
343
355
|
/** A live owner closure may carry its committed settlement wrapper in process. */
|
|
344
356
|
private resumeDeferredTaskFromLiveClosure;
|
|
@@ -2,7 +2,7 @@ import type { AgentConfig } from '../types';
|
|
|
2
2
|
import type { DeferredTaskStorage } from '../storage/interfaces';
|
|
3
3
|
import { type ValidationHookConfig } from '../validation/client-hooks';
|
|
4
4
|
import type { AdcpCapabilities } from '../utils/capabilities';
|
|
5
|
-
import type { Message, InputHandler, TaskOptions, TaskResult, TaskState, TaskStatus, TaskInfo, WebhookUrlTemplate } from './ConversationTypes';
|
|
5
|
+
import type { Message, InputHandler, TaskOptions, TaskResult, TaskState, TaskStatus, TaskInfo, DirectPauseRecoveryRequest, WebhookUrlTemplate } from './ConversationTypes';
|
|
6
6
|
import type { Activity } from './AsyncHandler';
|
|
7
7
|
import { GovernanceMiddleware } from './GovernanceMiddleware';
|
|
8
8
|
import type { GovernanceConfig } from './GovernanceTypes';
|
|
@@ -25,6 +25,12 @@ export declare const DEFERRED_SETTLEMENT_ACK: unique symbol;
|
|
|
25
25
|
export declare class DeferredSettlementOwnershipError extends Error {
|
|
26
26
|
constructor(message: string, options?: ErrorOptions);
|
|
27
27
|
}
|
|
28
|
+
export type DirectContinuationRecoveryFailure = 'not_authorized' | 'in_progress' | 'superseded';
|
|
29
|
+
/** Typed failure from the public direct-continuation recovery boundary. */
|
|
30
|
+
export declare class DirectContinuationRecoveryError extends DeferredSettlementOwnershipError {
|
|
31
|
+
readonly reason: DirectContinuationRecoveryFailure;
|
|
32
|
+
constructor(message: string, reason: DirectContinuationRecoveryFailure);
|
|
33
|
+
}
|
|
28
34
|
/** Carry only the SDK's private settlement controls across an internal result projection. */
|
|
29
35
|
export declare function transferDeferredSettlementAcknowledgement<T extends object>(source: object, target: T): T;
|
|
30
36
|
/** Identify the internal submitted continuation that owns a durable pending checkpoint. */
|
|
@@ -339,6 +345,12 @@ export declare class TaskExecutor {
|
|
|
339
345
|
private requireDeferredSettlementOperationRouting;
|
|
340
346
|
private loadDeferredSettlementOperationRoute;
|
|
341
347
|
private replaceDeferredState;
|
|
348
|
+
/** Recover an opt-in direct continuation through its secret operation capability. */
|
|
349
|
+
recoverDirectPauseContinuation<T>(request: DirectPauseRecoveryRequest, publishTerminalTaskStatus?: boolean): Promise<{
|
|
350
|
+
token: string;
|
|
351
|
+
result: TaskResult<T>;
|
|
352
|
+
clientContext?: unknown;
|
|
353
|
+
}>;
|
|
342
354
|
private recoverRoutedDeferredTask;
|
|
343
355
|
/** A live owner closure may carry its committed settlement wrapper in process. */
|
|
344
356
|
private resumeDeferredTaskFromLiveClosure;
|
|
@@ -23,6 +23,7 @@ __export(TaskExecutor_exports, {
|
|
|
23
23
|
DEFERRED_SETTLEMENT_ACK: () => DEFERRED_SETTLEMENT_ACK,
|
|
24
24
|
DeferredSettlementOwnershipError: () => DeferredSettlementOwnershipError,
|
|
25
25
|
DeferredTaskError: () => DeferredTaskError,
|
|
26
|
+
DirectContinuationRecoveryError: () => DirectContinuationRecoveryError,
|
|
26
27
|
InputRequiredError: () => InputRequiredError,
|
|
27
28
|
MaxClarificationError: () => MaxClarificationError,
|
|
28
29
|
TaskExecutor: () => TaskExecutor,
|
|
@@ -102,6 +103,14 @@ class DeferredSettlementOwnershipError extends Error {
|
|
|
102
103
|
this.name = "DeferredSettlementOwnershipError";
|
|
103
104
|
}
|
|
104
105
|
}
|
|
106
|
+
class DirectContinuationRecoveryError extends DeferredSettlementOwnershipError {
|
|
107
|
+
constructor(message, reason) {
|
|
108
|
+
super(message);
|
|
109
|
+
this.reason = reason;
|
|
110
|
+
this.name = "DirectContinuationRecoveryError";
|
|
111
|
+
}
|
|
112
|
+
reason;
|
|
113
|
+
}
|
|
105
114
|
function transferDeferredSettlementAcknowledgement(source, target) {
|
|
106
115
|
for (const symbol of [DEFERRED_SETTLEMENT_ACK, DEFERRED_SETTLEMENT_NACK]) {
|
|
107
116
|
const descriptor = Object.getOwnPropertyDescriptor(source, symbol);
|
|
@@ -375,9 +384,63 @@ function snapshotTaskOptions(options) {
|
|
|
375
384
|
...options.metadata !== void 0 && { metadata: structuredClone(options.metadata) },
|
|
376
385
|
...options.delegatedOperatorAuthorization !== void 0 && {
|
|
377
386
|
delegatedOperatorAuthorization: { ...options.delegatedOperatorAuthorization }
|
|
387
|
+
},
|
|
388
|
+
...options.durableContinuationRecovery !== void 0 && {
|
|
389
|
+
durableContinuationRecovery: { ...options.durableContinuationRecovery }
|
|
378
390
|
}
|
|
379
391
|
};
|
|
380
392
|
}
|
|
393
|
+
const DIRECT_CONTINUATION_RECOVERY_KEY_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
394
|
+
const MAX_DIRECT_CONTINUATION_OWNER_SCOPE_BYTES = 1024;
|
|
395
|
+
function directContinuationRecoveryDigest(key) {
|
|
396
|
+
return (0, import_crypto.createHash)("sha256").update(key, "utf8").digest("base64url");
|
|
397
|
+
}
|
|
398
|
+
function directContinuationDigestMatches(expectedDigest, actualDigest) {
|
|
399
|
+
try {
|
|
400
|
+
const expected = Buffer.from(expectedDigest, "base64url");
|
|
401
|
+
const actual = Buffer.from(actualDigest, "base64url");
|
|
402
|
+
return expected.length === actual.length && (0, import_crypto.timingSafeEqual)(expected, actual);
|
|
403
|
+
} catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
function directContinuationRecoveryKeyMatches(expectedDigest, recoveryKey) {
|
|
408
|
+
return directContinuationDigestMatches(expectedDigest, directContinuationRecoveryDigest(recoveryKey));
|
|
409
|
+
}
|
|
410
|
+
function assertDirectContinuationOwnerScope(ownerScope) {
|
|
411
|
+
if (typeof ownerScope !== "string" || ownerScope.trim().length === 0 || /[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u.test(ownerScope) || Buffer.byteLength(ownerScope, "utf8") > MAX_DIRECT_CONTINUATION_OWNER_SCOPE_BYTES) {
|
|
412
|
+
throw new import_errors.ConfigurationError(
|
|
413
|
+
"durableContinuationRecovery.ownerScope must be a non-empty authenticated owner/account scope of at most 1024 UTF-8 bytes."
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function directContinuationSellerOrigin(agent) {
|
|
418
|
+
let sellerOrigin = agent.agent_uri;
|
|
419
|
+
try {
|
|
420
|
+
sellerOrigin = new URL(agent.agent_uri).origin;
|
|
421
|
+
} catch {
|
|
422
|
+
}
|
|
423
|
+
return sellerOrigin;
|
|
424
|
+
}
|
|
425
|
+
function directContinuationOwnerBindingDigest(agent, ownerScope) {
|
|
426
|
+
return directContinuationRecoveryDigest(
|
|
427
|
+
(0, import_jcs.canonicalize)({
|
|
428
|
+
ownerScope,
|
|
429
|
+
seller: { id: agent.id, origin: directContinuationSellerOrigin(agent), protocol: agent.protocol }
|
|
430
|
+
})
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
function directContinuationRecoveryDenied() {
|
|
434
|
+
return new DirectContinuationRecoveryError("Direct continuation recovery is not authorized.", "not_authorized");
|
|
435
|
+
}
|
|
436
|
+
function attachDirectContinuationRecovery(result, recovery) {
|
|
437
|
+
const deferred = result.deferred;
|
|
438
|
+
if (!deferred) return result;
|
|
439
|
+
const resume = deferred.resume;
|
|
440
|
+
deferred.recovery = { ...recovery };
|
|
441
|
+
deferred.resume = async (input) => attachDirectContinuationRecovery(await resume(input), recovery);
|
|
442
|
+
return result;
|
|
443
|
+
}
|
|
381
444
|
function snapshotTransportOptions(transport) {
|
|
382
445
|
return transport === void 0 ? void 0 : { ...transport };
|
|
383
446
|
}
|
|
@@ -708,6 +771,19 @@ class TaskExecutor {
|
|
|
708
771
|
const effectiveServerVersion = serverVersion ?? "v3";
|
|
709
772
|
this.lastKnownServerVersion = effectiveServerVersion;
|
|
710
773
|
params = structuredClone(params);
|
|
774
|
+
if (options.durableContinuationRecovery !== void 0) {
|
|
775
|
+
assertDirectContinuationOwnerScope(options.durableContinuationRecovery.ownerScope);
|
|
776
|
+
if (agent.protocol !== "a2a") {
|
|
777
|
+
throw new import_errors.ConfigurationError("durableContinuationRecovery is supported only for resumable A2A mutations.");
|
|
778
|
+
}
|
|
779
|
+
if (!(0, import_idempotency.requestUsesIdempotency)(taskName, params)) {
|
|
780
|
+
throw new import_errors.ConfigurationError("durableContinuationRecovery is supported only for mutating AdCP requests.");
|
|
781
|
+
}
|
|
782
|
+
if (!this.config.deferredStorage) {
|
|
783
|
+
throw new import_errors.ConfigurationError("durableContinuationRecovery requires deferredStorage.");
|
|
784
|
+
}
|
|
785
|
+
this.requireDeferredSettlementOperationRouting(this.config.deferredStorage, true);
|
|
786
|
+
}
|
|
711
787
|
const taskId = (0, import_task_deadline.getTaskOperationId)(options) ?? (0, import_crypto.randomUUID)();
|
|
712
788
|
const startTime = Date.now();
|
|
713
789
|
const workingTimeout = this.config.workingTimeout || 12e4;
|
|
@@ -1797,7 +1873,9 @@ class TaskExecutor {
|
|
|
1797
1873
|
const inputRequest = this.responseParser.parseInputRequest(response);
|
|
1798
1874
|
const serverContextId = this.responseParser.getContextId(response) ?? response.contextId;
|
|
1799
1875
|
const a2aTaskId = this.responseParser.getA2AContinuationTaskId(response);
|
|
1800
|
-
const
|
|
1876
|
+
const directContinuationRecovery = !deferTerminalTaskStatus && options.durableContinuationRecovery !== void 0;
|
|
1877
|
+
const operationRoutedContinuation = deferTerminalTaskStatus || directContinuationRecovery;
|
|
1878
|
+
const settlementServerTaskId = operationRoutedContinuation ? this.responseParser.getTaskId(response) : void 0;
|
|
1801
1879
|
if (agent.protocol === "mcp" || !a2aTaskId) {
|
|
1802
1880
|
const partialData = this.extractResponseData(response, debugLogs, taskName, serverVersion);
|
|
1803
1881
|
const metadata = this.buildMetadata({
|
|
@@ -1834,6 +1912,7 @@ class TaskExecutor {
|
|
|
1834
1912
|
const token = (0, import_crypto.randomUUID)();
|
|
1835
1913
|
const deferredStorage = this.config.deferredStorage;
|
|
1836
1914
|
const usesDurableStorage = deferredStorage !== void 0 && persistPausedContinuation;
|
|
1915
|
+
const directRecoveryKey = directContinuationRecovery && usesDurableStorage ? (0, import_crypto.randomBytes)(32).toString("base64url") : void 0;
|
|
1837
1916
|
if (usesDurableStorage) {
|
|
1838
1917
|
const createdAt = Date.now();
|
|
1839
1918
|
const ttlSeconds = this.config.deferredTaskTtlSeconds ?? DEFAULT_DEFERRED_TASK_TTL_SECONDS;
|
|
@@ -1857,10 +1936,18 @@ class TaskExecutor {
|
|
|
1857
1936
|
...deferredClientContext !== void 0 && {
|
|
1858
1937
|
clientContext: durableDeferredSnapshot(deferredClientContext)
|
|
1859
1938
|
},
|
|
1860
|
-
...
|
|
1939
|
+
...operationRoutedContinuation && {
|
|
1861
1940
|
settlementOperationId: taskId,
|
|
1862
1941
|
settlementOperationRouteRequired: true
|
|
1863
1942
|
},
|
|
1943
|
+
...directContinuationRecovery && {
|
|
1944
|
+
directContinuationRecovery: true,
|
|
1945
|
+
directContinuationRecoveryKeyDigest: directContinuationRecoveryDigest(directRecoveryKey),
|
|
1946
|
+
directContinuationOwnerBindingDigest: directContinuationOwnerBindingDigest(
|
|
1947
|
+
agent,
|
|
1948
|
+
options.durableContinuationRecovery.ownerScope
|
|
1949
|
+
)
|
|
1950
|
+
},
|
|
1864
1951
|
...deferTerminalTaskStatus && requireDeferredSettlementResumeAuthorization && {
|
|
1865
1952
|
settlementResumeAuthorizationRequired: true
|
|
1866
1953
|
},
|
|
@@ -1868,8 +1955,10 @@ class TaskExecutor {
|
|
|
1868
1955
|
createdAt,
|
|
1869
1956
|
expiresAt: createdAt + ttlSeconds * 1e3
|
|
1870
1957
|
};
|
|
1871
|
-
if (
|
|
1872
|
-
|
|
1958
|
+
if (operationRoutedContinuation) {
|
|
1959
|
+
this.requireDeferredSettlementOperationRouting(deferredStorage, directContinuationRecovery);
|
|
1960
|
+
}
|
|
1961
|
+
const stored = operationRoutedContinuation ? await deferredStorage.putForSettlementOperationIfAbsent(taskId, token, deferredState, ttlSeconds) : await deferredStorage.putIfAbsent(token, deferredState, ttlSeconds);
|
|
1873
1962
|
if (!stored) {
|
|
1874
1963
|
throw new Error("Deferred continuation token already exists; refusing to replace another task.");
|
|
1875
1964
|
}
|
|
@@ -1910,6 +1999,12 @@ class TaskExecutor {
|
|
|
1910
1999
|
question: inputRequest.question,
|
|
1911
2000
|
resume: usesDurableStorage ? (input) => this.resumeDeferredTaskFromLiveClosure(token, input, !deferTerminalTaskStatus) : resumeInProcess
|
|
1912
2001
|
};
|
|
2002
|
+
if (directRecoveryKey !== void 0) {
|
|
2003
|
+
const recovery = { operationId: taskId, recoveryKey: directRecoveryKey };
|
|
2004
|
+
deferred.recovery = recovery;
|
|
2005
|
+
const resume = deferred.resume;
|
|
2006
|
+
deferred.resume = async (input) => attachDirectContinuationRecovery(await resume(input), recovery);
|
|
2007
|
+
}
|
|
1913
2008
|
return {
|
|
1914
2009
|
success: true,
|
|
1915
2010
|
// The task is progressing, not failed
|
|
@@ -1958,6 +2053,7 @@ class TaskExecutor {
|
|
|
1958
2053
|
const token = handlerResponse.token;
|
|
1959
2054
|
const deferredStorage = this.config.deferredStorage;
|
|
1960
2055
|
const usesDurableStorage = deferredStorage !== void 0 && persistPausedContinuation;
|
|
2056
|
+
const directRecoveryKey = directContinuationRecovery && usesDurableStorage ? (0, import_crypto.randomBytes)(32).toString("base64url") : void 0;
|
|
1961
2057
|
if (usesDurableStorage) {
|
|
1962
2058
|
assertDeferredContinuationToken(token);
|
|
1963
2059
|
const createdAt = Date.now();
|
|
@@ -1982,10 +2078,18 @@ class TaskExecutor {
|
|
|
1982
2078
|
...deferredClientContext !== void 0 && {
|
|
1983
2079
|
clientContext: durableDeferredSnapshot(deferredClientContext)
|
|
1984
2080
|
},
|
|
1985
|
-
...
|
|
2081
|
+
...operationRoutedContinuation && {
|
|
1986
2082
|
settlementOperationId: taskId,
|
|
1987
2083
|
settlementOperationRouteRequired: true
|
|
1988
2084
|
},
|
|
2085
|
+
...directContinuationRecovery && {
|
|
2086
|
+
directContinuationRecovery: true,
|
|
2087
|
+
directContinuationRecoveryKeyDigest: directContinuationRecoveryDigest(directRecoveryKey),
|
|
2088
|
+
directContinuationOwnerBindingDigest: directContinuationOwnerBindingDigest(
|
|
2089
|
+
agent,
|
|
2090
|
+
options.durableContinuationRecovery.ownerScope
|
|
2091
|
+
)
|
|
2092
|
+
},
|
|
1989
2093
|
...deferTerminalTaskStatus && requireDeferredSettlementResumeAuthorization && {
|
|
1990
2094
|
settlementResumeAuthorizationRequired: true
|
|
1991
2095
|
},
|
|
@@ -1993,8 +2097,10 @@ class TaskExecutor {
|
|
|
1993
2097
|
createdAt,
|
|
1994
2098
|
expiresAt: createdAt + ttlSeconds * 1e3
|
|
1995
2099
|
};
|
|
1996
|
-
if (
|
|
1997
|
-
|
|
2100
|
+
if (operationRoutedContinuation) {
|
|
2101
|
+
this.requireDeferredSettlementOperationRouting(deferredStorage, directContinuationRecovery);
|
|
2102
|
+
}
|
|
2103
|
+
const stored = operationRoutedContinuation ? await deferredStorage.putForSettlementOperationIfAbsent(taskId, token, deferredState, ttlSeconds) : await deferredStorage.putIfAbsent(token, deferredState, ttlSeconds);
|
|
1998
2104
|
if (!stored) {
|
|
1999
2105
|
throw new Error("Deferred continuation token already exists; refusing to replace another task.");
|
|
2000
2106
|
}
|
|
@@ -2036,6 +2142,12 @@ class TaskExecutor {
|
|
|
2036
2142
|
question: inputRequest.question,
|
|
2037
2143
|
resume: usesDurableStorage ? (input) => this.resumeDeferredTaskFromLiveClosure(token, input, !deferTerminalTaskStatus) : resumeInProcess
|
|
2038
2144
|
};
|
|
2145
|
+
if (directRecoveryKey !== void 0) {
|
|
2146
|
+
const recovery = { operationId: taskId, recoveryKey: directRecoveryKey };
|
|
2147
|
+
deferred.recovery = recovery;
|
|
2148
|
+
const resume = deferred.resume;
|
|
2149
|
+
deferred.resume = async (input) => attachDirectContinuationRecovery(await resume(input), recovery);
|
|
2150
|
+
}
|
|
2039
2151
|
return {
|
|
2040
2152
|
success: true,
|
|
2041
2153
|
// The task is progressing, not failed
|
|
@@ -2400,10 +2512,10 @@ class TaskExecutor {
|
|
|
2400
2512
|
assertDeferredContinuationToken(token);
|
|
2401
2513
|
return await this.config.deferredStorage.has(token) === true;
|
|
2402
2514
|
}
|
|
2403
|
-
requireDeferredSettlementOperationRouting(storage) {
|
|
2515
|
+
requireDeferredSettlementOperationRouting(storage, direct = false) {
|
|
2404
2516
|
if (typeof storage.putForSettlementOperationIfAbsent !== "function" || typeof storage.getBySettlementOperationId !== "function" || typeof storage.replaceForSettlementOperationIfVersion !== "function") {
|
|
2405
2517
|
throw new import_errors.ConfigurationError(
|
|
2406
|
-
"Committed deferred settlement requires atomic operation routing so paused mutations remain discoverable across crashes. Use MemoryStorage or implement the DeferredTaskStorage operation-route contract."
|
|
2518
|
+
direct ? "durableContinuationRecovery requires atomic DeferredTaskStorage operation routing. Use MemoryStorage or implement putForSettlementOperationIfAbsent(), getBySettlementOperationId(), and replaceForSettlementOperationIfVersion()." : "Committed deferred settlement requires atomic operation routing so paused mutations remain discoverable across crashes. Use MemoryStorage or implement the DeferredTaskStorage operation-route contract."
|
|
2407
2519
|
);
|
|
2408
2520
|
}
|
|
2409
2521
|
}
|
|
@@ -2421,7 +2533,7 @@ class TaskExecutor {
|
|
|
2421
2533
|
if (state.settlementOperationId === void 0 || state.settlementOperationRouteRequired !== true) {
|
|
2422
2534
|
return storage.replaceIfVersion(token, expectedVersion, state, ttlSeconds);
|
|
2423
2535
|
}
|
|
2424
|
-
this.requireDeferredSettlementOperationRouting(storage);
|
|
2536
|
+
this.requireDeferredSettlementOperationRouting(storage, state.directContinuationRecovery === true);
|
|
2425
2537
|
return storage.replaceForSettlementOperationIfVersion(
|
|
2426
2538
|
state.settlementOperationId,
|
|
2427
2539
|
token,
|
|
@@ -2454,8 +2566,58 @@ class TaskExecutor {
|
|
|
2454
2566
|
}
|
|
2455
2567
|
const routed = await this.loadDeferredSettlementOperationRoute(storage, operationId);
|
|
2456
2568
|
if (!routed) return void 0;
|
|
2569
|
+
if (routed.state.directContinuationRecovery === true) {
|
|
2570
|
+
throw new DeferredSettlementOwnershipError(
|
|
2571
|
+
"A direct continuation route cannot be recovered through committed settlement authorization."
|
|
2572
|
+
);
|
|
2573
|
+
}
|
|
2457
2574
|
return this.recoverRoutedDeferredTask(operationId, routed, publishTerminalTaskStatus);
|
|
2458
2575
|
}
|
|
2576
|
+
/** Recover an opt-in direct continuation through its secret operation capability. */
|
|
2577
|
+
async recoverDirectPauseContinuation(request, publishTerminalTaskStatus = true) {
|
|
2578
|
+
const storage = this.config.deferredStorage;
|
|
2579
|
+
if (!storage) throw new import_errors.ConfigurationError("Direct continuation recovery requires deferredStorage.");
|
|
2580
|
+
this.requireDeferredSettlementOperationRouting(storage, true);
|
|
2581
|
+
const operationId = typeof request?.operationId === "string" ? request.operationId : "";
|
|
2582
|
+
const recoveryKey = typeof request?.recoveryKey === "string" ? request.recoveryKey : "";
|
|
2583
|
+
const ownerScope = typeof request?.ownerScope === "string" ? request.ownerScope : "";
|
|
2584
|
+
if (!operationId || !DIRECT_CONTINUATION_RECOVERY_KEY_PATTERN.test(recoveryKey) || ownerScope.trim().length === 0 || /[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u.test(ownerScope) || Buffer.byteLength(ownerScope, "utf8") > MAX_DIRECT_CONTINUATION_OWNER_SCOPE_BYTES) {
|
|
2585
|
+
throw directContinuationRecoveryDenied();
|
|
2586
|
+
}
|
|
2587
|
+
const routed = await this.loadDeferredSettlementOperationRoute(storage, operationId);
|
|
2588
|
+
const digest = routed?.state.directContinuationRecoveryKeyDigest;
|
|
2589
|
+
if (!routed || routed.state.directContinuationRecovery !== true || typeof digest !== "string" || !directContinuationRecoveryKeyMatches(digest, recoveryKey)) {
|
|
2590
|
+
throw directContinuationRecoveryDenied();
|
|
2591
|
+
}
|
|
2592
|
+
let agent;
|
|
2593
|
+
try {
|
|
2594
|
+
agent = this.deferredAgents.get(routed.state.agentId) ?? await this.config.resolveDeferredAgent?.(routed.state.agentId);
|
|
2595
|
+
} catch {
|
|
2596
|
+
throw directContinuationRecoveryDenied();
|
|
2597
|
+
}
|
|
2598
|
+
const expectedOwnerBinding = routed.state.directContinuationOwnerBindingDigest;
|
|
2599
|
+
if (!agent || agent.id !== routed.state.agentId || agent.protocol !== "a2a" || typeof expectedOwnerBinding !== "string" || !directContinuationDigestMatches(expectedOwnerBinding, directContinuationOwnerBindingDigest(agent, ownerScope))) {
|
|
2600
|
+
throw directContinuationRecoveryDenied();
|
|
2601
|
+
}
|
|
2602
|
+
this.deferredAgents.set(agent.id, agent);
|
|
2603
|
+
const recovered = await this.recoverRoutedDeferredTask(operationId, routed, publishTerminalTaskStatus);
|
|
2604
|
+
if (!recovered) {
|
|
2605
|
+
if (routed.state.continuationClaimed === true) {
|
|
2606
|
+
throw new DirectContinuationRecoveryError(
|
|
2607
|
+
"The direct continuation is already being resumed; do not redispatch the mutation.",
|
|
2608
|
+
"in_progress"
|
|
2609
|
+
);
|
|
2610
|
+
}
|
|
2611
|
+
throw directContinuationRecoveryDenied();
|
|
2612
|
+
}
|
|
2613
|
+
return {
|
|
2614
|
+
...recovered,
|
|
2615
|
+
result: attachDirectContinuationRecovery(recovered.result, { operationId, recoveryKey }),
|
|
2616
|
+
...routed.state.clientContext !== void 0 && {
|
|
2617
|
+
clientContext: structuredClone(routed.state.clientContext)
|
|
2618
|
+
}
|
|
2619
|
+
};
|
|
2620
|
+
}
|
|
2459
2621
|
async recoverRoutedDeferredTask(operationId, routed, publishTerminalTaskStatus) {
|
|
2460
2622
|
const { token, state } = routed;
|
|
2461
2623
|
if (state.settlementOperationId !== operationId || state.settlementOperationRouteRequired !== true || state.expiresAt <= Date.now()) {
|
|
@@ -2468,7 +2630,9 @@ class TaskExecutor {
|
|
|
2468
2630
|
};
|
|
2469
2631
|
}
|
|
2470
2632
|
if (state.continuationClaimed) {
|
|
2471
|
-
|
|
2633
|
+
const lease = state.settlementResumeDispatchLease;
|
|
2634
|
+
const reclaimableAdmission = state.directContinuationRecovery === true && lease?.phase === "admission" && Number.isFinite(lease.expiresAt) && lease.expiresAt <= Date.now();
|
|
2635
|
+
if (!reclaimableAdmission) return void 0;
|
|
2472
2636
|
}
|
|
2473
2637
|
if (!state.pauseStatus || !state.pauseQuestion) {
|
|
2474
2638
|
throw new DeferredSettlementOwnershipError(
|
|
@@ -2525,6 +2689,11 @@ class TaskExecutor {
|
|
|
2525
2689
|
});
|
|
2526
2690
|
}
|
|
2527
2691
|
if (!state) throw new Error("The linked deferred callback checkpoint is unavailable.");
|
|
2692
|
+
if (state.directContinuationRecovery === true) {
|
|
2693
|
+
throw new DeferredSettlementOwnershipError(
|
|
2694
|
+
"A direct continuation route cannot be checkpointed through committed settlement authorization."
|
|
2695
|
+
);
|
|
2696
|
+
}
|
|
2528
2697
|
if (state.settlementOperationId !== operationId) {
|
|
2529
2698
|
throw new Error("The deferred callback token is bound to a different committed operation.");
|
|
2530
2699
|
}
|
|
@@ -2597,6 +2766,11 @@ class TaskExecutor {
|
|
|
2597
2766
|
}
|
|
2598
2767
|
const currentRoute = await this.loadDeferredSettlementOperationRoute(storage, operationId);
|
|
2599
2768
|
if (!currentRoute) return void 0;
|
|
2769
|
+
if (currentRoute.state.directContinuationRecovery === true) {
|
|
2770
|
+
throw new DeferredSettlementOwnershipError(
|
|
2771
|
+
"A direct continuation route cannot be checkpointed through committed settlement authorization."
|
|
2772
|
+
);
|
|
2773
|
+
}
|
|
2600
2774
|
if (currentRoute.state.settlementOperationRouteRequired !== true) {
|
|
2601
2775
|
throw new DeferredSettlementOwnershipError("The callback operation route is not a current-format checkpoint.");
|
|
2602
2776
|
}
|
|
@@ -2636,9 +2810,21 @@ class TaskExecutor {
|
|
|
2636
2810
|
throw new Error("Deferred task expired.");
|
|
2637
2811
|
}
|
|
2638
2812
|
const committedOperationId = state.settlementOperationId;
|
|
2639
|
-
const
|
|
2813
|
+
const operationRouteRequired = committedOperationId !== void 0 && state.settlementOperationRouteRequired === true;
|
|
2814
|
+
const requiresSettlement = committedOperationId !== void 0 && state.directContinuationRecovery !== true;
|
|
2815
|
+
const requiresRoutedAdmission = requiresSettlement || operationRouteRequired;
|
|
2640
2816
|
const requiresRecoveredSettlement = requiresSettlement && !liveSettlementOwner;
|
|
2641
|
-
if (
|
|
2817
|
+
if (operationRouteRequired && state.directContinuationRecovery !== true && (state.directContinuationRecoveryKeyDigest !== void 0 || state.directContinuationOwnerBindingDigest !== void 0)) {
|
|
2818
|
+
throw new DeferredSettlementOwnershipError(
|
|
2819
|
+
"The direct continuation route lost its route-kind discriminator in durable storage."
|
|
2820
|
+
);
|
|
2821
|
+
}
|
|
2822
|
+
if (state.directContinuationRecovery === true && (typeof state.directContinuationRecoveryKeyDigest !== "string" || typeof state.directContinuationOwnerBindingDigest !== "string")) {
|
|
2823
|
+
throw new DeferredSettlementOwnershipError(
|
|
2824
|
+
"The direct continuation route is missing its recovery ownership binding."
|
|
2825
|
+
);
|
|
2826
|
+
}
|
|
2827
|
+
if (operationRouteRequired) {
|
|
2642
2828
|
this.requireDeferredSettlementOperationRouting(this.config.deferredStorage);
|
|
2643
2829
|
}
|
|
2644
2830
|
if (requiresSettlement && state.settlementFinalizedResult !== void 0) {
|
|
@@ -2674,7 +2860,7 @@ class TaskExecutor {
|
|
|
2674
2860
|
);
|
|
2675
2861
|
}
|
|
2676
2862
|
}
|
|
2677
|
-
if (
|
|
2863
|
+
if (operationRouteRequired) {
|
|
2678
2864
|
const currentRoute = await this.loadDeferredSettlementOperationRoute(
|
|
2679
2865
|
this.config.deferredStorage,
|
|
2680
2866
|
committedOperationId
|
|
@@ -2685,6 +2871,12 @@ class TaskExecutor {
|
|
|
2685
2871
|
"The committed continuation operation route does not match its stored generation."
|
|
2686
2872
|
);
|
|
2687
2873
|
}
|
|
2874
|
+
if (state.directContinuationRecovery === true) {
|
|
2875
|
+
throw new DirectContinuationRecoveryError(
|
|
2876
|
+
"The direct continuation advanced to a newer generation; use owner-bound operation recovery.",
|
|
2877
|
+
"superseded"
|
|
2878
|
+
);
|
|
2879
|
+
}
|
|
2688
2880
|
if (state.settlementResumeAuthorizationRequired === true) {
|
|
2689
2881
|
let replacementAuthorized = await this.config.authorizeDeferredSettlementResume?.(committedOperationId, currentRoute.token) === true;
|
|
2690
2882
|
if (!replacementAuthorized) {
|
|
@@ -2815,7 +3007,7 @@ class TaskExecutor {
|
|
|
2815
3007
|
}
|
|
2816
3008
|
if (state.continuationClaimed) {
|
|
2817
3009
|
const dispatchLease = state.settlementResumeDispatchLease;
|
|
2818
|
-
const reclaimableAdmission =
|
|
3010
|
+
const reclaimableAdmission = requiresRoutedAdmission && dispatchLease?.phase === "admission" && Number.isFinite(dispatchLease.expiresAt) && dispatchLease.expiresAt <= Date.now();
|
|
2819
3011
|
if (!reclaimableAdmission) {
|
|
2820
3012
|
throw new DeferredSettlementOwnershipError("Deferred task is already being resumed.");
|
|
2821
3013
|
}
|
|
@@ -2828,7 +3020,7 @@ class TaskExecutor {
|
|
|
2828
3020
|
const claimTtlSeconds = this.deferredSafetyRetentionSeconds();
|
|
2829
3021
|
const claimedVersion = (0, import_crypto.randomUUID)();
|
|
2830
3022
|
const claimedAt = Date.now();
|
|
2831
|
-
const dispatchOwnerId =
|
|
3023
|
+
const dispatchOwnerId = requiresRoutedAdmission ? (0, import_crypto.randomUUID)() : void 0;
|
|
2832
3024
|
const claimedMessages = durableDeferredSnapshot(state.messages);
|
|
2833
3025
|
const resumedMessages = durableDeferredSnapshot(state.messages);
|
|
2834
3026
|
const claimedState = {
|
|
@@ -2999,7 +3191,7 @@ class TaskExecutor {
|
|
|
2999
3191
|
}
|
|
3000
3192
|
const nextToken = resumed.deferred.token;
|
|
3001
3193
|
assertDeferredContinuationToken(nextToken);
|
|
3002
|
-
const replacementServerTaskId = requiresSettlement ? reconcileDeferredServerTaskId(trustedDeferredServerTaskId(state), [resumed.metadata.serverTaskId]) : resumed.metadata.serverTaskId;
|
|
3194
|
+
const replacementServerTaskId = requiresSettlement ? reconcileDeferredServerTaskId(trustedDeferredServerTaskId(state), [resumed.metadata.serverTaskId]) : resumed.metadata.serverTaskId ?? state.settlementServerTaskId;
|
|
3003
3195
|
const createdAt = Date.now();
|
|
3004
3196
|
const ttlSeconds = this.config.deferredTaskTtlSeconds ?? DEFAULT_DEFERRED_TASK_TTL_SECONDS;
|
|
3005
3197
|
const replacementState = {
|
|
@@ -3028,6 +3220,11 @@ class TaskExecutor {
|
|
|
3028
3220
|
...state.settlementOperationRouteRequired === true && {
|
|
3029
3221
|
settlementOperationRouteRequired: true
|
|
3030
3222
|
},
|
|
3223
|
+
...state.directContinuationRecovery === true && {
|
|
3224
|
+
directContinuationRecovery: true,
|
|
3225
|
+
directContinuationRecoveryKeyDigest: state.directContinuationRecoveryKeyDigest,
|
|
3226
|
+
directContinuationOwnerBindingDigest: state.directContinuationOwnerBindingDigest
|
|
3227
|
+
},
|
|
3031
3228
|
...state.settlementResumeAuthorizationRequired === true && {
|
|
3032
3229
|
settlementResumeAuthorizationRequired: true
|
|
3033
3230
|
},
|
|
@@ -3037,7 +3234,7 @@ class TaskExecutor {
|
|
|
3037
3234
|
createdAt,
|
|
3038
3235
|
expiresAt: createdAt + ttlSeconds * 1e3
|
|
3039
3236
|
};
|
|
3040
|
-
const stored =
|
|
3237
|
+
const stored = operationRouteRequired ? await this.config.deferredStorage.replaceForSettlementOperationIfVersion(
|
|
3041
3238
|
committedOperationId,
|
|
3042
3239
|
token,
|
|
3043
3240
|
dispatchVersion,
|
|
@@ -4302,6 +4499,7 @@ class TaskExecutor {
|
|
|
4302
4499
|
DEFERRED_SETTLEMENT_ACK,
|
|
4303
4500
|
DeferredSettlementOwnershipError,
|
|
4304
4501
|
DeferredTaskError,
|
|
4502
|
+
DirectContinuationRecoveryError,
|
|
4305
4503
|
InputRequiredError,
|
|
4306
4504
|
MaxClarificationError,
|
|
4307
4505
|
TaskExecutor,
|