@adcp/sdk 12.1.1 → 13.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -3
- package/bin/adcp-fuzz.js +3 -1
- package/dist/lib/adapters/content-standards-adapter.d.mts +9 -9
- package/dist/lib/adapters/content-standards-adapter.d.ts +9 -9
- package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
- package/dist/lib/adapters/content-standards-adapter.js +22 -22
- package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
- package/dist/lib/adapters/content-standards-adapter.mjs +18 -18
- package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
- package/dist/lib/adapters/index.d.mts +2 -2
- package/dist/lib/adapters/index.d.ts +2 -2
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +10 -10
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/adapters/index.mjs +9 -9
- package/dist/lib/adapters/index.mjs.map +1 -1
- package/dist/lib/auth/oauth/provider-cache.d.mts +7 -0
- package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
- package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
- package/dist/lib/auth/oauth/provider-cache.js +44 -0
- package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
- package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
- package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
- package/dist/lib/conformance/invariants/uniformError.js +1 -1
- package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
- package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
- package/dist/lib/conformance/runners.js +1 -1
- package/dist/lib/conformance/runners.js.map +1 -1
- package/dist/lib/conformance/runners.mjs +1 -1
- package/dist/lib/conformance/runners.mjs.map +1 -1
- package/dist/lib/conformance/seeder.js +5 -5
- package/dist/lib/conformance/seeder.js.map +1 -1
- package/dist/lib/conformance/seeder.mjs +5 -5
- package/dist/lib/conformance/seeder.mjs.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
- package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
- package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
- package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
- package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
- package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
- package/dist/lib/core/AgentClient.d.mts +148 -138
- package/dist/lib/core/AgentClient.d.ts +148 -138
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +174 -85
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AgentClient.mjs +174 -85
- package/dist/lib/core/AgentClient.mjs.map +1 -1
- package/dist/lib/core/AsyncHandler.d.mts +18 -16
- package/dist/lib/core/AsyncHandler.d.ts +18 -16
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
- package/dist/lib/core/AsyncHandler.js +22 -1
- package/dist/lib/core/AsyncHandler.js.map +1 -1
- package/dist/lib/core/AsyncHandler.mjs +22 -1
- package/dist/lib/core/AsyncHandler.mjs.map +1 -1
- package/dist/lib/core/ConversationTypes.d.mts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts +6 -2
- package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
- package/dist/lib/core/ConversationTypes.js.map +1 -1
- package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
- package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
- package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
- package/dist/lib/core/CreativeAgentClient.js +39 -12
- package/dist/lib/core/CreativeAgentClient.js.map +1 -1
- package/dist/lib/core/CreativeAgentClient.mjs +39 -12
- package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +127 -50
- package/dist/lib/core/SingleAgentClient.d.ts +127 -50
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +1617 -177
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/SingleAgentClient.mjs +1627 -177
- package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
- package/dist/lib/core/TaskExecutor.d.mts +9 -0
- package/dist/lib/core/TaskExecutor.d.ts +9 -0
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +136 -43
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/core/TaskExecutor.mjs +136 -43
- package/dist/lib/core/TaskExecutor.mjs.map +1 -1
- package/dist/lib/index.d.mts +111 -17
- package/dist/lib/index.d.ts +111 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +94 -94
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +93 -94
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +6 -15
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/index.mjs +6 -16
- package/dist/lib/protocols/index.mjs.map +1 -1
- package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
- package/dist/lib/protocols/mcp-modern.js +87 -12
- package/dist/lib/protocols/mcp-modern.js.map +1 -1
- package/dist/lib/protocols/mcp-modern.mjs +89 -12
- package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +6 -0
- package/dist/lib/server/create-adcp-server.d.ts +6 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +295 -48
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +301 -50
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
- package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
- package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
- package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
- package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/index.d.mts +13 -12
- package/dist/lib/server/decisioning/index.d.ts +13 -12
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +6 -0
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/index.mjs +9 -3
- package/dist/lib/server/decisioning/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
- package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
- package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.js +13 -3
- package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
- package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
- package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
- package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
- package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
- package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
- package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
- package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
- package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
- package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
- package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
- package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
- package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
- package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
- package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
- package/dist/lib/server/index.d.mts +3 -3
- package/dist/lib/server/index.d.ts +3 -3
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +72 -72
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/index.mjs +36 -36
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.mts +1 -0
- package/dist/lib/server/legacy/v5/index.d.ts +1 -0
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js +74 -1
- package/dist/lib/server/legacy/v5/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs +75 -1
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/server/responses.d.mts +2 -2
- package/dist/lib/server/responses.d.ts +2 -2
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/responses.mjs.map +1 -1
- package/dist/lib/testing/client.js +1 -1
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/client.mjs +1 -1
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +6 -6
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
- package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
- package/dist/lib/testing/scenarios/creative.js +7 -7
- package/dist/lib/testing/scenarios/creative.js.map +1 -1
- package/dist/lib/testing/scenarios/creative.mjs +7 -7
- package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
- package/dist/lib/testing/scenarios/discovery.js +2 -2
- package/dist/lib/testing/scenarios/discovery.js.map +1 -1
- package/dist/lib/testing/scenarios/discovery.mjs +2 -2
- package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.js +11 -11
- package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
- package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
- package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
- package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/governance.js +16 -22
- package/dist/lib/testing/scenarios/governance.js.map +1 -1
- package/dist/lib/testing/scenarios/governance.mjs +16 -22
- package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +5 -5
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
- package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.js +4 -3
- package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
- package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
- package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
- package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
- package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
- package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +43 -5
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +43 -5
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/test-helpers.d.mts +2 -2
- package/dist/lib/testing/test-helpers.d.ts +2 -2
- package/dist/lib/testing/test-helpers.js.map +1 -1
- package/dist/lib/testing/test-helpers.mjs.map +1 -1
- package/dist/lib/types/adcp.d.mts +14 -14
- package/dist/lib/types/adcp.d.ts +14 -14
- package/dist/lib/types/adcp.d.ts.map +1 -1
- package/dist/lib/types/adcp.js.map +1 -1
- package/dist/lib/types/adcp.mjs.map +1 -1
- package/dist/lib/types/index.d.mts +2 -2
- package/dist/lib/types/index.d.ts +2 -2
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/index.mjs.map +1 -1
- package/dist/lib/utils/capabilities.d.mts +6 -0
- package/dist/lib/utils/capabilities.d.ts +6 -0
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +4 -0
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/capabilities.mjs +4 -0
- package/dist/lib/utils/capabilities.mjs.map +1 -1
- package/dist/lib/utils/creative-delivery.d.mts +52 -10
- package/dist/lib/utils/creative-delivery.d.ts +52 -10
- package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
- package/dist/lib/utils/creative-delivery.js +104 -9
- package/dist/lib/utils/creative-delivery.js.map +1 -1
- package/dist/lib/utils/creative-delivery.mjs +104 -8
- package/dist/lib/utils/creative-delivery.mjs.map +1 -1
- package/dist/lib/utils/format-assets.d.mts +41 -38
- package/dist/lib/utils/format-assets.d.ts +41 -38
- package/dist/lib/utils/format-assets.d.ts.map +1 -1
- package/dist/lib/utils/format-assets.js +3 -1
- package/dist/lib/utils/format-assets.js.map +1 -1
- package/dist/lib/utils/format-assets.mjs +3 -1
- package/dist/lib/utils/format-assets.mjs.map +1 -1
- package/dist/lib/utils/index.d.mts +8 -8
- package/dist/lib/utils/index.d.ts +8 -8
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js +11 -9
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/index.mjs +9 -8
- package/dist/lib/utils/index.mjs.map +1 -1
- package/dist/lib/utils/preview-utils.d.mts +11 -8
- package/dist/lib/utils/preview-utils.d.ts +11 -8
- package/dist/lib/utils/preview-utils.d.ts.map +1 -1
- package/dist/lib/utils/preview-utils.js +4 -4
- package/dist/lib/utils/preview-utils.js.map +1 -1
- package/dist/lib/utils/preview-utils.mjs +3 -3
- package/dist/lib/utils/preview-utils.mjs.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
- package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
- package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
- package/dist/lib/v2/projection/augment-response.d.mts +31 -11
- package/dist/lib/v2/projection/augment-response.d.ts +31 -11
- package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
- package/dist/lib/v2/projection/augment-response.js +233 -27
- package/dist/lib/v2/projection/augment-response.js.map +1 -1
- package/dist/lib/v2/projection/augment-response.mjs +232 -27
- package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
- package/dist/lib/v2/projection/builders.d.mts +7 -6
- package/dist/lib/v2/projection/builders.d.ts +7 -6
- package/dist/lib/v2/projection/builders.d.ts.map +1 -1
- package/dist/lib/v2/projection/builders.js +11 -8
- package/dist/lib/v2/projection/builders.js.map +1 -1
- package/dist/lib/v2/projection/builders.mjs +9 -6
- package/dist/lib/v2/projection/builders.mjs.map +1 -1
- package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
- package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
- package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
- package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
- package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
- package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
- package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
- package/dist/lib/v2/projection/catalog.d.mts +23 -2
- package/dist/lib/v2/projection/catalog.d.ts +23 -2
- package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
- package/dist/lib/v2/projection/catalog.js +34 -10
- package/dist/lib/v2/projection/catalog.js.map +1 -1
- package/dist/lib/v2/projection/catalog.mjs +33 -10
- package/dist/lib/v2/projection/catalog.mjs.map +1 -1
- package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
- package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
- package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
- package/dist/lib/v2/projection/creative-delivery.js +967 -0
- package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
- package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
- package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
- package/dist/lib/v2/projection/index.d.mts +8 -6
- package/dist/lib/v2/projection/index.d.ts +8 -6
- package/dist/lib/v2/projection/index.d.ts.map +1 -1
- package/dist/lib/v2/projection/index.js +26 -4
- package/dist/lib/v2/projection/index.js.map +1 -1
- package/dist/lib/v2/projection/index.mjs +28 -4
- package/dist/lib/v2/projection/index.mjs.map +1 -1
- package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
- package/dist/lib/v2/projection/legacy-metadata.js +73 -0
- package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
- package/dist/lib/v2/projection/types.d.mts +29 -23
- package/dist/lib/v2/projection/types.d.ts +29 -23
- package/dist/lib/v2/projection/types.d.ts.map +1 -1
- package/dist/lib/v2/projection/types.js.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
- package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
- package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.js +218 -9
- package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
- package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
- package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
- package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
- package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.js +138 -7
- package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
- package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
- package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
- package/dist/lib/v2/projection/write-side.d.mts +12 -13
- package/dist/lib/v2/projection/write-side.d.ts +12 -13
- package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
- package/dist/lib/v2/projection/write-side.js +16 -12
- package/dist/lib/v2/projection/write-side.js.map +1 -1
- package/dist/lib/v2/projection/write-side.mjs +16 -12
- package/dist/lib/v2/projection/write-side.mjs.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/docs/guides/BUILD-AN-AGENT.md +7 -2
- package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
- package/docs/llms.txt +1 -0
- package/examples/README.md +1 -1
- package/examples/batch-preview-test.ts +3 -3
- package/examples/conversation-client.ts +2 -2
- package/examples/debug-preview-response.ts +1 -1
- package/examples/decisioning-platform-broadcast-tv.ts +10 -4
- package/examples/decisioning-platform-mock-seller.ts +16 -9
- package/examples/decisioning-platform-programmatic.ts +18 -7
- package/examples/error-compliant-server.ts +26 -16
- package/examples/generative-creative-demo.ts +7 -19
- package/examples/hello_creative_adapter_ad_server.ts +37 -16
- package/examples/hello_creative_adapter_template.ts +12 -10
- package/examples/hello_seller_adapter_guaranteed.ts +52 -23
- package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
- package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
- package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
- package/examples/hello_seller_adapter_social.ts +2 -7
- package/examples/inspect-card-formats.ts +1 -1
- package/examples/simple-getting-started.ts +1 -1
- package/examples/test-helpers-demo.ts +1 -1
- package/package.json +2 -2
- package/skills/build-decisioning-creative-template/SKILL.md +11 -11
- package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/core/TaskExecutor.ts"],"sourcesContent":["// Core task execution engine for ADCP conversation flow\n// Implements PR #78 async patterns: working/submitted/input-required/completed\n\nimport { randomUUID } from 'crypto';\nimport type { AgentConfig } from '../types';\nimport { ProtocolClient } from '../protocols';\nimport { listMCPTasks } from '../protocols/mcp-tasks';\nimport { getAuthToken } from '../auth';\nimport { is401Error, adcpErrorToTypedError } from '../errors';\nimport type { ADCPError } from '../errors';\nimport type { Storage } from '../storage/interfaces';\nimport {\n validateOutgoingRequest,\n validateIncomingResponse,\n resolveValidationModes,\n type ValidationHookConfig,\n type ValidationMode,\n} from '../validation/client-hooks';\nimport { formatIssues } from '../validation/schema-validator';\nimport { unwrapProtocolResponse, isAdcpError, isTerminalAdcpError } from '../utils/response-unwrapper';\nimport { extractAdcpErrorInfo, extractCorrelationId } from '../utils/error-extraction';\nimport { generateIdempotencyKey, isMutatingTask, redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { normalizeGetProductsResponse } from '../utils/pricing-adapter';\nimport { normalizeLegacyMediaBuyStatusForReturn } from '../utils/envelope-status-compat';\nimport { getLatestA2ADataPartFromResponse } from '../utils/a2a-artifacts';\nimport { cancelA2ATask } from '../protocols/a2a';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport type {\n Message,\n InputRequest,\n InputHandler,\n ConversationContext,\n TaskOptions,\n TaskResult,\n TaskResultMetadata,\n TaskState,\n TaskStatus,\n TaskInfo,\n DeferredContinuation,\n SubmittedContinuation,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport { normalizeHandlerResponse, isDeferResponse, isAbortResponse } from '../handlers/types';\nimport { ProtocolResponseParser, ADCP_STATUS, type ADCPStatus } from './ProtocolResponseParser';\nimport type { Activity } from './AsyncHandler';\nimport { GovernanceMiddleware } from './GovernanceMiddleware';\nimport type { GovernanceConfig, GovernanceCheckResult } from './GovernanceTypes';\nimport { attachMatch } from './match';\nimport { resolveWebhookUrl } from './webhook-url';\n/**\n * Custom errors for task execution\n */\nexport class TaskTimeoutError extends Error {\n constructor(taskId: string, timeout: number) {\n super(`Task ${taskId} timed out after ${timeout}ms`);\n this.name = 'TaskTimeoutError';\n }\n}\n\nexport class MaxClarificationError extends Error {\n constructor(taskId: string, maxAttempts: number) {\n super(`Task ${taskId} exceeded maximum clarification attempts: ${maxAttempts}`);\n this.name = 'MaxClarificationError';\n }\n}\n\nexport class DeferredTaskError extends Error {\n constructor(public token: string) {\n super(`Task deferred with token: ${token}`);\n this.name = 'DeferredTaskError';\n }\n}\n\nexport class InputRequiredError extends Error {\n constructor(question: string) {\n super(`Server requires input but no handler provided. Question: ${question}`);\n this.name = 'InputRequiredError';\n }\n}\n\n/**\n * Map an AdCP `tasks/get` response (post-unwrap) to the SDK's internal\n * `TaskInfo` shape. The AdCP 3.0 schema\n * (`schemas/cache/3.0.0/bundled/core/tasks-get-response.json`) is flat\n * snake_case: `{ task_id, task_type, protocol, status, created_at,\n * updated_at, error?, progress?, history?, completed_at?, has_webhook?,\n * context?, ext? }`. The internal `TaskInfo` is camelCase with a\n * superset of legacy fields some pre-3.0 sellers still emit.\n *\n * **Result-data extraction.** AdCP 3.1.0 defines a typed `result`\n * field on `tasks/get` responses (per adcontextprotocol/adcp#3126,\n * which closed adcp#3123). Sellers populate it when the buyer's\n * request set `include_result: true` and the task reached\n * `completed`. The mapper reads it directly into `TaskInfo.result`\n * so `pollTaskCompletion` surfaces it on the resolved\n * `TaskResult.data`. Pre-3.1.0 sellers that emitted `result` via\n * `additionalProperties: true` continue to work — the typed and\n * informal paths share the same field name.\n *\n * **Legacy nested shape.** Some pre-3.0 sellers and existing test\n * mocks emit `{ task: { ...TaskInfo } }` — a non-spec wrapper. We\n * unwrap it before the spec-shape mapping so the SDK stays\n * compatible with both surfaces during the transition.\n */\nfunction mapTasksGetResponseToTaskInfo(payload: unknown): TaskInfo {\n if (payload == null || typeof payload !== 'object') {\n return { taskId: '', status: 'unknown', taskType: 'unknown', createdAt: Date.now(), updatedAt: Date.now() };\n }\n const obj = payload as Record<string, unknown>;\n // Walk the transport-level wrappers in priority order:\n // 1. MCP `structuredContent` — the typed AdCP payload from `tools/call`\n // 2. A2A latest structured DataPart — the AdCP payload\n // surfaced via the artifact (per #899)\n // 3. Legacy nested `{ task: TaskInfo }` — pre-3.0 sellers and\n // existing test mocks\n // 4. Flat AdCP-spec shape — what AdCP 3.0 sellers emit directly\n const flat = unwrapTasksGetEnvelope(obj);\n const errorRaw = flat.error;\n const errorMessage =\n typeof errorRaw === 'string'\n ? errorRaw\n : errorRaw != null &&\n typeof errorRaw === 'object' &&\n typeof (errorRaw as { message?: unknown }).message === 'string'\n ? (errorRaw as { message: string }).message\n : undefined;\n const taskInfo: TaskInfo = {\n taskId: stringField(flat.task_id) ?? stringField(flat.taskId) ?? '',\n status: stringField(flat.status) ?? 'unknown',\n taskType: stringField(flat.task_type) ?? stringField(flat.taskType) ?? 'unknown',\n createdAt: parseTimestamp(flat.created_at ?? flat.createdAt),\n updatedAt: parseTimestamp(flat.updated_at ?? flat.updatedAt),\n };\n if (errorMessage !== undefined) taskInfo.error = errorMessage;\n // Top-level `message` field: the AdCP envelope's human-readable\n // status descriptor (advisory string accompanying any status —\n // e.g. \"Budget cap exceeded — task not started\" on a `rejected`\n // task). `pollTaskCompletion` falls back to this when the\n // `error.message` block is absent on a terminal failure. Distinct\n // from `error.message` (which lives under the structured `error`\n // object).\n const messageField = stringField(flat.message);\n if (messageField !== undefined) taskInfo.message = messageField;\n // Result extraction — see JSDoc. AdCP 3.1.0 defines `result` as\n // the canonical typed field; pre-3.1.0 sellers using\n // `additionalProperties: true` shared the same field name, so the\n // mapping is unchanged across versions.\n if (flat.result !== undefined) {\n taskInfo.result =\n flat.result != null && typeof flat.result === 'object' && !Array.isArray(flat.result)\n ? normalizeLegacyMediaBuyStatusForReturn(flat.result as Record<string, unknown>, {\n toolName: taskInfo.taskType,\n })\n : flat.result;\n }\n return taskInfo;\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Cap on the wrapper-unwrap recursion depth. Real-world responses\n * have at most two layers (MCP `structuredContent` OR A2A JSON-RPC →\n * Task → artifact → DataPart). The cap is a defense against a\n * malformed or hostile seller emitting a deeply-nested wrapper that\n * would otherwise stack-overflow the buyer.\n */\nconst TASKS_GET_UNWRAP_MAX_DEPTH = 8;\n\nfunction unwrapTasksGetEnvelope(obj: Record<string, unknown>, depth = 0, allowRawData = true): Record<string, unknown> {\n if (depth >= TASKS_GET_UNWRAP_MAX_DEPTH) return obj;\n // MCP: `tools/call` response carries the typed payload at\n // `structuredContent`.\n const sc = obj.structuredContent;\n if (sc != null && typeof sc === 'object' && !Array.isArray(sc)) {\n return unwrapTasksGetEnvelope(sc as Record<string, unknown>, depth + 1, false);\n }\n // A2A: `message/send` response is a JSON-RPC envelope wrapping a\n // Task; the AdCP payload sits on the latest structured DataPart.\n const result = obj.result;\n if (result != null && typeof result === 'object' && !Array.isArray(result)) {\n const r = result as Record<string, unknown>;\n if (r.kind === 'task') {\n const extracted = getLatestA2ADataPartFromResponse(obj);\n if (extracted) {\n return unwrapTasksGetEnvelope(extracted.data, depth + 1, false);\n }\n // adcp-client#1612: When the A2A Task has no DataPart artifacts (e.g. the\n // seller returns an A2A transport-level state without an AdCP DataPart\n // payload), surface the transport-layer status as a last-resort hint so\n // `mapTasksGetResponseToTaskInfo` can map terminal states to `failed` /\n // `completed` rather than falling through to `'unknown'`. The transport\n // state overlaps with AdCP status strings for all A2A-native values\n // (`completed`, `failed`, `rejected`, `canceled`, `working`, `submitted`).\n // Note: `auth-required` is an AdCP-layer concept; it won't surface via\n // this path (no A2A-native transport state carries that label) — those\n // responses reach the `unknown` exit branch instead. Also include the A2A\n // task handle (`result.id`) so polling error messages carry the real id.\n const transportStatus = (r.status as Record<string, unknown> | undefined)?.state;\n if (typeof transportStatus === 'string') {\n return { status: transportStatus, task_id: typeof r.id === 'string' ? r.id : undefined };\n }\n }\n }\n // Raw/in-process MCP wrappers sometimes carry the AdCP payload under\n // `data` rather than the official CallToolResult `structuredContent`.\n // Unwrap only when it looks like a task envelope and no official payload\n // has already been selected.\n const data = obj.data;\n if (allowRawData && data != null && typeof data === 'object' && !Array.isArray(data)) {\n const d = data as Record<string, unknown>;\n if ('status' in d || 'task_id' in d || 'taskId' in d) {\n return unwrapTasksGetEnvelope(d, depth + 1, true);\n }\n }\n // Legacy nested wrapper from pre-3.0 sellers and existing mocks.\n // TODO(adcp-client#967): remove once mock fixtures in\n // `test/lib/task-executor*.test.js` migrate to the AdCP-spec flat\n // shape. No real seller emits this; verified at PR review time.\n if (obj.task != null && typeof obj.task === 'object' && !Array.isArray(obj.task)) {\n return obj.task as Record<string, unknown>;\n }\n // Flat AdCP-spec shape — return as-is.\n return obj;\n}\n\nfunction parseTimestamp(value: unknown): number {\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return Date.now();\n}\n\n/**\n * Return the idempotency_key this task should use: the caller's value if\n * present, otherwise a fresh UUID v4 for mutating tasks, otherwise undefined.\n */\nfunction resolveIdempotencyKey(taskName: string, params: any): string | undefined {\n const callerSupplied =\n params && typeof params === 'object' && typeof params.idempotency_key === 'string'\n ? params.idempotency_key\n : undefined;\n if (callerSupplied) return callerSupplied;\n if (isMutatingTask(taskName)) return generateIdempotencyKey();\n return undefined;\n}\n\n/**\n * Webhook manager for submitted tasks\n */\ninterface WebhookManager {\n generateUrl(taskId: string): string;\n registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;\n processWebhook(token: string, body: any): Promise<void>;\n}\n\n/**\n * Deferred task storage for client deferrals\n */\ninterface DeferredTaskState {\n taskId: string;\n contextId: string;\n agent: AgentConfig;\n taskName: string;\n params: any;\n messages: Message[];\n createdAt: number;\n}\n\ninterface TaskStatusPollResult {\n task: TaskInfo;\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Core task execution engine that handles the conversation loop with agents\n */\nexport class TaskExecutor {\n private responseParser: ProtocolResponseParser;\n private activeTasks = new Map<string, TaskState>();\n private conversationStorage?: Map<string, Message[]>;\n private governanceMiddleware?: GovernanceMiddleware;\n private lastKnownServerVersion?: 'v2' | 'v3';\n private requestValidationMode!: ValidationMode;\n private responseValidationMode!: ValidationMode;\n\n constructor(\n private config: {\n /** Default timeout for 'working' status (max 120s per PR #78) */\n workingTimeout?: number;\n /** Polling interval for 'working' status in milliseconds (default: 2000ms) */\n pollingInterval?: number;\n /** Default max clarification attempts */\n defaultMaxClarifications?: number;\n /** Enable conversation storage */\n enableConversationStorage?: boolean;\n /** Webhook manager for submitted tasks */\n webhookManager?: WebhookManager;\n /** Storage for deferred task state */\n deferredStorage?: Storage<DeferredTaskState>;\n /** Webhook URL template for protocol-level webhook support */\n webhookUrlTemplate?: WebhookUrlTemplate;\n /** Agent ID for webhook URL generation */\n agentId?: string;\n /** Webhook secret for HMAC authentication (min 32 chars) */\n webhookSecret?: string;\n /** Fail tasks when response schema validation fails (default: true) */\n strictSchemaValidation?: boolean;\n /** Log all schema validation violations to debug logs (default: true) */\n logSchemaViolations?: boolean;\n /**\n * Schema-driven validation using the bundled AdCP JSON schemas.\n * Controls outgoing request and incoming response checks independently.\n * Defaults: strict in dev/test, warn in prod. Set a mode to `off` to\n * skip the validator entirely on that side (zero overhead).\n */\n validation?: ValidationHookConfig;\n /** Filter out invalid products from get_products responses instead of rejecting the entire response (default: false) */\n filterInvalidProducts?: boolean;\n /** Global activity callback for observability */\n onActivity?: (activity: Activity) => void | Promise<void>;\n /** Transport-level diagnostics callback for outbound HTTP requests. */\n onTransportActivity?: import('../protocols').TransportActivityHandler;\n /** Governance configuration for buyer-side campaign governance */\n governance?: GovernanceConfig;\n /**\n * AdCP version this executor speaks. Selects which schema bundle\n * `validateIncomingResponse` / `validateOutgoingRequest` validate\n * against, and which `adcp_major_version` value goes on the wire.\n * Defaults to the SDK-pinned `ADCP_VERSION` when omitted.\n *\n * Plumbed from `SingleAgentClient.resolvedAdcpVersion` so the\n * client/agent's `getAdcpVersion()` value is the single source of\n * truth for both validation and wire-level major.\n */\n adcpVersion?: string;\n wireAdcpVersion?: string;\n versionEnvelope?: import('../protocols').VersionEnvelopeMode;\n /**\n * Transport-level safeguards applied to every call this executor\n * dispatches. Per-call options can override individual fields.\n */\n transport?: import('../protocols').TransportOptions;\n } = {}\n ) {\n this.responseParser = new ProtocolResponseParser();\n if (config.enableConversationStorage) {\n this.conversationStorage = new Map();\n }\n if (config.governance) {\n this.governanceMiddleware = new GovernanceMiddleware(\n config.governance,\n config.onActivity,\n config.adcpVersion,\n config.versionEnvelope,\n config.onTransportActivity\n );\n }\n const modes = resolveValidationModes(config.validation);\n this.requestValidationMode = modes.requests;\n // Legacy `strictSchemaValidation: false` flips response-side enforcement\n // to warn mode — preserve that behaviour unless `validation.responses`\n // was set explicitly.\n if (config.validation?.responses !== undefined) {\n this.responseValidationMode = config.validation.responses;\n } else if (config.strictSchemaValidation === false) {\n this.responseValidationMode = 'warn';\n } else {\n this.responseValidationMode = modes.responses;\n }\n }\n\n /**\n * Access the governance middleware for direct outcome reporting (async tasks).\n */\n getGovernanceMiddleware(): GovernanceMiddleware | undefined {\n return this.governanceMiddleware;\n }\n\n getRequestParams(taskId: string): Record<string, unknown> | undefined {\n const params = this.activeTasks.get(taskId)?.params;\n return params && typeof params === 'object' && !Array.isArray(params)\n ? (params as Record<string, unknown>)\n : undefined;\n }\n\n /**\n * Run the configured pre-send schema check against the user-facing request\n * shape. Callers invoke this on the unadapted (v3) params before any wire\n * adaptation runs, so the validator sees the same object the caller wrote.\n * Throws in strict, logs to `debugLogs` in warn, no-ops in off.\n */\n validateRequest(taskName: string, params: unknown, debugLogs?: any[]): void {\n validateOutgoingRequest(taskName, params, this.requestValidationMode, debugLogs, this.config.adcpVersion);\n }\n\n /**\n * After `adaptRequestForServerVersion` has rewritten a v3 request into v2\n * wire format, validate the adapted shape against the cached v2.5 schema\n * bundle. Always warn-only — adapter bugs shouldn't break user requests,\n * and the v3 pre-send pass already vouched for the user-facing input.\n * This pass exists to surface drift between what the adapter emits and\n * what a v2.5 server expects on the wire (primarily as CI signal via the\n * adapter-conformance test suite).\n *\n * Skips silently for tasks without a v2.5 schema or when the v2.5 bundle\n * isn't cached. Caller is responsible for gating on `serverVersion === 'v2'`\n * so v3-targeted traffic doesn't pay the validation cost.\n */\n validateAdaptedRequestAgainstV2(taskName: string, adaptedParams: unknown, debugLogs?: any[]): void {\n validateOutgoingRequest(taskName, adaptedParams, 'warn', debugLogs, 'v2.5');\n }\n\n /**\n * Generate webhook URL for protocol-level webhook support\n */\n /**\n * Build TaskResultMetadata, including the idempotency fields. The key is\n * pulled from the tracked task state so every result reports the key that\n * was actually sent (auto-generated or caller-supplied); `replayed` is\n * extracted from the response envelope when a response is available.\n */\n private buildMetadata(args: {\n taskId: string;\n taskName: string;\n agent: AgentConfig | { id: string; name: string; protocol: 'mcp' | 'a2a' };\n startTime?: number;\n responseTimeMs?: number;\n status: TaskStatus;\n clarificationRounds?: number;\n response?: any;\n inputRequest?: InputRequest;\n }): TaskResultMetadata {\n const meta: TaskResultMetadata = {\n taskId: args.taskId,\n taskName: args.taskName,\n agent: { id: args.agent.id, name: args.agent.name, protocol: args.agent.protocol },\n responseTimeMs: args.responseTimeMs ?? (args.startTime !== undefined ? Date.now() - args.startTime : 0),\n timestamp: new Date().toISOString(),\n clarificationRounds: args.clarificationRounds ?? 0,\n status: args.status,\n };\n if (args.inputRequest) meta.inputRequest = args.inputRequest;\n const key = this.activeTasks.get(args.taskId)?.idempotencyKey;\n if (key) meta.idempotency_key = key;\n if (args.response !== undefined) {\n const replayed = this.responseParser.getReplayed(args.response);\n if (replayed !== undefined) meta.replayed = replayed;\n const adcpVersion = this.responseParser.getAdcpVersion(args.response);\n if (adcpVersion) meta.adcpVersion = adcpVersion;\n const serverContextId = this.responseParser.getContextId(args.response);\n if (serverContextId) meta.contextId = serverContextId;\n const serverTaskId = this.responseParser.getTaskId(args.response);\n if (serverTaskId) meta.serverTaskId = serverTaskId;\n }\n return meta;\n }\n\n /**\n * Map a task's structured AdCP error to a typed `ADCPError` subclass when\n * the code has a dedicated class (e.g., `IDEMPOTENCY_CONFLICT` →\n * `IdempotencyConflictError`). The idempotency key is pulled from tracked\n * task state because the server intentionally omits it from error bodies\n * (it's a read-oracle).\n */\n private buildErrorInstance(\n taskId: string,\n adcpError: ReturnType<typeof extractAdcpErrorInfo>\n ): ADCPError | undefined {\n if (!adcpError) return undefined;\n const key = this.activeTasks.get(taskId)?.idempotencyKey;\n return adcpErrorToTypedError(adcpError, key);\n }\n\n private generateWebhookUrl(taskName: string, operationId: string, options?: TaskOptions): string | undefined {\n return resolveWebhookUrl(this.config.webhookUrlTemplate, this.config.agentId, taskName, operationId, options);\n }\n\n /**\n * Execute a task with an agent using PR #78 async patterns\n * Handles: working (keep SSE open), submitted (webhook), input-required (handler), completed\n */\n async executeTask<T = any>(\n agent: AgentConfig,\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n serverVersion?: 'v2' | 'v3'\n ): Promise<TaskResult<T>> {\n if (serverVersion) this.lastKnownServerVersion = serverVersion;\n // The client-minted `taskId` is a local correlation id for tracking this\n // call's lifecycle (activeTasks map, metadata, webhook URL macros). It is\n // NOT the same thing as the A2A `taskId` that the server assigns — that\n // flows in on the response and is surfaced via metadata.serverTaskId.\n // `options.contextId` / `options.taskId` ride on the A2A message envelope\n // and are threaded straight to the protocol adapter below.\n const taskId = randomUUID();\n const startTime = Date.now();\n const workingTimeout = this.config.workingTimeout || 120000; // 120s max per PR #78\n\n // Auto-generate idempotency_key for mutating tasks when the caller didn't\n // supply one. The key lives on TaskState so internal retries reuse it —\n // re-generating on retry defeats the whole point of the envelope.\n // `options.skipIdempotencyAutoInject` disables this for compliance testing\n // that needs to exercise server-side missing-key behavior.\n const idempotencyKey = options.skipIdempotencyAutoInject ? undefined : resolveIdempotencyKey(taskName, params);\n if (idempotencyKey && params && typeof params === 'object' && !params.idempotency_key) {\n params = { ...params, idempotency_key: idempotencyKey };\n }\n\n // Register task in active tasks\n const taskState: TaskState = {\n taskId,\n taskName,\n params,\n status: 'pending',\n messages: [],\n startTime,\n attempt: 0,\n maxAttempts: options.maxClarifications || this.config.defaultMaxClarifications || 3,\n options,\n agent: { id: agent.id, name: agent.name, protocol: agent.protocol },\n idempotencyKey,\n };\n this.activeTasks.set(taskId, taskState);\n\n // Emit task creation event\n this.emitTaskEvent(\n {\n taskId,\n status: 'submitted',\n taskType: taskName,\n createdAt: startTime,\n updatedAt: startTime,\n },\n agent.id\n );\n\n // Start streaming connection\n const debugLogs: any[] = [];\n\n // Generate webhook URL if template is configured\n const webhookUrl = this.generateWebhookUrl(taskName, taskId, options);\n\n // Governance state (scoped outside try so catch can access)\n let governanceCheckId: string | undefined;\n let governanceResult: GovernanceCheckResult | undefined;\n let effectiveParams = params;\n\n try {\n // Emit protocol_request activity. The activity payload is the boundary\n // callers typically pipe into external observability stacks, so redact\n // the idempotency key — it's a retry-pattern oracle within the seller's\n // TTL. Full logging is opt-in via ADCP_LOG_IDEMPOTENCY_KEYS=1.\n await this.config.onActivity?.({\n type: 'protocol_request',\n operation_id: taskId,\n agent_id: agent.id,\n context_id: options.contextId,\n task_id: taskId,\n task_type: taskName,\n status: 'pending',\n payload: { params: redactIdempotencyKeyInArgs(params) },\n timestamp: new Date().toISOString(),\n });\n\n // Run governance check if configured for this tool\n if (this.governanceMiddleware?.requiresCheck(taskName)) {\n const { result: govResult, params: adjustedParams } = await this.governanceMiddleware.checkProposed(\n taskName,\n params,\n debugLogs\n );\n\n // Governance always blocks on denial/unapplied conditions.\n const isBlocking = true;\n\n if (govResult.status === 'denied' && isBlocking) {\n return attachMatch(this.buildGovernanceResult<T>(govResult, taskId, taskName, agent, startTime, debugLogs));\n }\n\n if (govResult.status === 'conditions' && !govResult.conditionsApplied && isBlocking) {\n return attachMatch(this.buildGovernanceResult<T>(govResult, taskId, taskName, agent, startTime, debugLogs));\n }\n\n // Approved, or non-blocking mode (advisory/audit) allows execution to proceed\n governanceCheckId = govResult.checkId;\n governanceResult = govResult;\n effectiveParams = adjustedParams;\n }\n\n // Create initial message (uses effectiveParams which may have governance-applied conditions)\n const initialMessage: Message = {\n id: randomUUID(),\n role: 'user',\n content: { tool: taskName, params: effectiveParams },\n timestamp: new Date().toISOString(),\n metadata: { toolName: taskName, type: 'request' },\n };\n\n // Send initial request and get streaming response with webhook URL.\n // Pass the caller's A2A session ids (contextId for conversation binding,\n // taskId for resuming a non-terminal server-side task). The adapter\n // drops these on the wire for MCP (no session concept there).\n const response = await ProtocolClient.callTool(agent, taskName, effectiveParams, {\n debugLogs,\n webhookUrl,\n webhookSecret: this.config.webhookSecret,\n serverVersion,\n session: { contextId: options.contextId, taskId: options.taskId },\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: options.transport ?? this.config.transport,\n signal: options.signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n operationId: taskId,\n taskId: options.taskId ?? taskId,\n contextId: options.contextId,\n idempotencyKey,\n },\n });\n\n // Emit protocol_response activity\n const respStatus = this.responseParser.getStatus(response) as string | undefined;\n await this.config.onActivity?.({\n type: 'protocol_response',\n operation_id: taskId,\n agent_id: agent.id,\n context_id: options.contextId,\n task_id: taskId,\n task_type: taskName,\n status: respStatus,\n payload: response,\n timestamp: new Date().toISOString(),\n });\n\n // Add initial response message\n const responseMessage: Message = {\n id: randomUUID(),\n role: 'agent',\n content: response,\n timestamp: new Date().toISOString(),\n metadata: { toolName: taskName, type: 'response' },\n };\n\n const messages = [initialMessage, responseMessage];\n\n // Handle response based on status\n const result = await this.handleAsyncResponse<T>(\n agent,\n taskId,\n taskName,\n effectiveParams,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n // Attach governance check result to the task result\n if (governanceResult) {\n result.governance = governanceResult;\n }\n\n // Report governance outcome if we had a governance check.\n // For async tasks (submitted/working), outcome reporting is deferred —\n // the caller reports via client.reportGovernanceOutcome() when the\n // task resolves through polling or webhooks.\n if (governanceCheckId && this.governanceMiddleware) {\n const govCtx = governanceResult?.governanceContext;\n if (result.status === 'completed' && govCtx) {\n result.governanceOutcome = await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'completed',\n result.data as Record<string, unknown> | undefined,\n undefined,\n debugLogs,\n govCtx\n );\n if (!result.governanceOutcome) {\n result.governanceOutcomeError = 'Outcome reporting to governance agent failed';\n }\n } else if (result.error && govCtx) {\n result.governanceOutcome = await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'failed',\n undefined,\n { message: result.error },\n debugLogs,\n govCtx\n );\n if (!result.governanceOutcome) {\n result.governanceOutcomeError = 'Outcome reporting to governance agent failed';\n }\n } else if (result.status === 'submitted' || result.status === 'working') {\n // Attach the check ID so callers can report outcome after async resolution\n result.governance = { ...(result.governance ?? {}), checkId: governanceCheckId } as GovernanceCheckResult;\n }\n }\n\n return attachMatch(result);\n } catch (error) {\n if (isAbortOrTimeoutError(error)) {\n if (idempotencyKey && error && typeof error === 'object') {\n (error as Error & { idempotency_key?: string; idempotencyKey?: string }).idempotency_key = idempotencyKey;\n (error as Error & { idempotency_key?: string; idempotencyKey?: string }).idempotencyKey = idempotencyKey;\n }\n throw error;\n }\n\n // Report failed outcome on error\n if (governanceCheckId && this.governanceMiddleware && governanceResult?.governanceContext) {\n await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'failed',\n undefined,\n { message: (error as Error).message },\n debugLogs,\n governanceResult.governanceContext\n );\n }\n return attachMatch(this.createErrorResult<T>(taskId, agent, error, debugLogs, startTime));\n }\n }\n\n /**\n * Handle agent response based on ADCP status (PR #78)\n */\n private buildGovernanceResult<T>(\n govResult: GovernanceCheckResult,\n taskId: string,\n taskName: string,\n agent: AgentConfig,\n startTime: number,\n debugLogs: any[]\n ): TaskResult<T> {\n return {\n success: false,\n status: 'governance-denied',\n error: govResult.explanation || 'Governance governance-denied',\n governance: govResult,\n metadata: this.buildMetadata({ taskId, taskName, agent, startTime, status: 'governance-denied' }),\n conversation: [],\n debug_logs: debugLogs,\n };\n }\n\n private async handleAsyncResponse<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n response: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n const status = this.responseParser.getStatus(response) as ADCPStatus;\n\n switch (status) {\n case ADCP_STATUS.COMPLETED:\n // Task completed immediately\n const completedData = this.extractResponseData(response, debugLogs, taskName);\n this.updateTaskStatus(taskId, 'completed', completedData);\n\n const operationSuccess = this.isOperationSuccess(completedData, taskName);\n\n // Validate response against AdCP schema - validate extracted data, not protocol wrapper\n const validationResult = this.validateResponseSchema(completedData, taskName, debugLogs);\n\n // In strict mode, schema validation failures cause task to fail\n const finalSuccess = operationSuccess && validationResult.valid;\n const finalError = !finalSuccess\n ? validationResult.errors.length > 0\n ? `Schema validation failed: ${validationResult.errors.join('; ')}`\n : this.extractOperationError(completedData)\n : undefined;\n\n if (finalSuccess) {\n return {\n success: true as const,\n status: 'completed' as const,\n data: completedData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'completed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n const completedAdcpError = extractAdcpErrorInfo(completedData);\n return {\n success: false as const,\n status: 'failed' as const,\n data: completedData,\n error: finalError ?? 'Unknown error',\n adcpError: completedAdcpError,\n errorInstance: this.buildErrorInstance(taskId, completedAdcpError),\n correlationId: extractCorrelationId(completedData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n\n case ADCP_STATUS.WORKING:\n // Server is processing - keep connection open for up to 120s\n return this.waitForWorkingCompletion<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n case ADCP_STATUS.SUBMITTED:\n // Long-running task - set up webhook\n return this.setupSubmittedTask<T>(agent, taskId, taskName, response, messages, options, debugLogs, startTime);\n\n case ADCP_STATUS.INPUT_REQUIRED:\n // Server needs input - handler is mandatory\n return this.handleInputRequired<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n case ADCP_STATUS.FAILED:\n case ADCP_STATUS.REJECTED:\n case ADCP_STATUS.CANCELED: {\n const failedData = this.extractResponseData(response, debugLogs, taskName);\n const adcpErrorInfo = extractAdcpErrorInfo(failedData);\n const hasStructuredError = !!adcpErrorInfo;\n const failedError = hasStructuredError\n ? this.extractOperationError(failedData)\n : response.error || response.message || `Task ${status}`;\n // Preserve failedData whenever the server returned a structured\n // payload — not just when extractAdcpErrorInfo recognizes an\n // `adcp_error`/`errors` envelope. Tool-level error shapes like\n // `comply_test_controller`'s `{ success: false, error: 'UNKNOWN_SCENARIO' }`\n // don't match that extractor but still carry the information\n // storyboard validators read (`success`, `error_code`, etc.).\n // Only drop `data` when there's literally no structured payload —\n // i.e. falsy or an empty object.\n const hasStructuredPayload =\n failedData != null &&\n typeof failedData === 'object' &&\n (Array.isArray(failedData) || Object.keys(failedData).length > 0);\n return {\n success: false as const,\n status: 'failed' as const,\n data: hasStructuredError || hasStructuredPayload ? failedData : undefined,\n error: typeof failedError === 'string' ? failedError : `Task ${status}`,\n adcpError: adcpErrorInfo,\n errorInstance: this.buildErrorInstance(taskId, adcpErrorInfo),\n correlationId: extractCorrelationId(failedData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n default:\n // Unknown status - treat as completed if we have data\n const defaultData = this.extractResponseData(response, debugLogs, taskName);\n if (\n defaultData &&\n (defaultData !== response || response.structuredContent || response.result || response.data)\n ) {\n const defaultSuccess = this.isOperationSuccess(defaultData, taskName);\n\n // Validate response against AdCP schema - validate extracted data, not protocol wrapper\n const defaultValidation = this.validateResponseSchema(defaultData, taskName, debugLogs);\n\n // In strict mode, schema validation failures cause task to fail\n const defaultFinalSuccess = defaultSuccess && defaultValidation.valid;\n const defaultFinalError = !defaultFinalSuccess\n ? defaultValidation.errors.length > 0\n ? `Schema validation failed: ${defaultValidation.errors.join('; ')}`\n : this.extractOperationError(defaultData)\n : undefined;\n\n if (defaultFinalSuccess) {\n return {\n success: true as const,\n status: 'completed' as const,\n data: defaultData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'completed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n const defaultAdcpError = extractAdcpErrorInfo(defaultData);\n return {\n success: false as const,\n status: 'failed' as const,\n data: defaultData,\n error: defaultFinalError!,\n adcpError: defaultAdcpError,\n errorInstance: this.buildErrorInstance(taskId, defaultAdcpError),\n correlationId: extractCorrelationId(defaultData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n } else {\n throw new Error(`Unknown status: ${status || 'undefined'}`);\n }\n }\n }\n\n /**\n * Extract response data from different protocol formats\n *\n * @internal Exposed for testing purposes\n */\n public extractResponseData(response: any, debugLogs?: any[], toolName?: string): any {\n // MCP error responses (isError: true) flow through here — the response unwrapper\n // extracts structured data (adcp_error, context, ext) from structuredContent or text\n\n // Use the shared response unwrapper utility\n // This handles MCP structuredContent, A2A artifacts (including HITL multi-artifact responses),\n // and various edge cases consistently\n try {\n // Log what type of response we're processing BEFORE unwrapping\n // This ensures we have debug visibility even if unwrapping fails\n if (response?.structuredContent) {\n this.logDebug(debugLogs, 'info', 'Processing MCP structuredContent response');\n } else if (response?.result?.artifacts) {\n const artifacts = response.result.artifacts;\n if (artifacts.length === 0) {\n this.logDebug(debugLogs, 'info', 'Processing A2A response with empty artifacts array');\n } else {\n // Calculate total part count across all artifacts\n const totalParts = artifacts.reduce((sum: number, artifact: any) => {\n return sum + (artifact.parts?.length || 0);\n }, 0);\n\n // Extract canonical DataPart keys for debugging.\n const latestDataPart = getLatestA2ADataPartFromResponse(response);\n const dataKeys = latestDataPart?.data ? Object.keys(latestDataPart.data) : [];\n\n this.logDebug(debugLogs, 'info', 'Processing A2A artifact structure', {\n artifactCount: artifacts.length,\n partCount: totalParts,\n extractedFrom: artifacts.length > 1 ? 'multi-artifact (HITL)' : 'single-artifact',\n dataKeys,\n });\n }\n } else if (response?.data) {\n this.logDebug(debugLogs, 'info', 'Processing response.data field');\n } else {\n this.logDebug(debugLogs, 'info', 'Processing response without standard structure', {\n responseKeys: Object.keys(response || {}),\n });\n }\n\n // Now unwrap the response\n const unwrapped = unwrapProtocolResponse(response, toolName, undefined, {\n filterInvalidProducts: this.config.filterInvalidProducts,\n ...(this.responseAdcpVersionForValidation() && {\n responseAdcpVersion: this.responseAdcpVersionForValidation(),\n }),\n });\n\n // Log successful extraction with result details\n if (response?.structuredContent) {\n this.logDebug(debugLogs, 'info', 'Successfully extracted MCP data', {\n dataKeys: Object.keys(unwrapped || {}),\n });\n } else if (response?.result?.artifacts && response.result.artifacts.length > 0) {\n this.logDebug(debugLogs, 'info', 'Successfully extracted A2A data', {\n dataKeys: Object.keys(unwrapped || {}),\n });\n }\n\n return unwrapped;\n } catch (error) {\n this.logDebug(debugLogs, 'warning', 'Response unwrapper failed', {\n error: error instanceof Error ? error.message : String(error),\n toolName,\n responseKeys: Object.keys(response || {}),\n });\n\n // If toolName was provided, schema validation may have caused the failure.\n // Retry without toolName to extract the payload without schema checks.\n if (toolName) {\n try {\n return unwrapProtocolResponse(response);\n } catch {\n // Unwrapping itself failed — fall through to raw response\n }\n }\n\n return response;\n }\n }\n\n /**\n * Check if extracted response data represents a successful operation.\n * Handles singular `error`, plural `errors` (AdCP schema), and `success: false`.\n */\n private isOperationSuccess(data: any, taskName?: string): boolean {\n return data?.success !== false && !data?.error && !data?.adcp_error && !isTerminalAdcpError(data, taskName);\n }\n\n /**\n * Extract a human-readable error message from response data.\n * Handles singular `error`, plural `errors` array, and `message` field.\n */\n private extractOperationError(data: any): string {\n if (data?.adcp_error) {\n const ae = data.adcp_error;\n return ae.message ? `${ae.code}: ${ae.message}` : ae.code;\n }\n return (\n data?.error ||\n (isAdcpError(data) ? data.errors.map((e: any) => e.message || e.code).join('; ') : null) ||\n data?.message ||\n 'Operation failed'\n );\n }\n\n /**\n * Helper to add debug logs safely\n */\n private logDebug(debugLogs: any[] | undefined, type: string, message: string, details?: any) {\n if (debugLogs && Array.isArray(debugLogs)) {\n debugLogs.push({\n type,\n message,\n timestamp: new Date().toISOString(),\n details,\n });\n }\n }\n\n /**\n * Handle 'working' status - return as valid intermediate state\n */\n private async waitForWorkingCompletion<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n initialResponse: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Extract any data that came with the working response\n const partialData = this.extractResponseData(initialResponse, debugLogs, taskName);\n\n // Return working status immediately - this is a valid intermediate state\n // Callers can use the taskId to poll for completion or set up webhooks\n return {\n success: true, // The task is progressing, not failed\n status: 'working',\n data: partialData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'working',\n response: initialResponse,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n /**\n * Set up submitted task with webhook\n */\n private async setupSubmittedTask<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n response: any,\n messages: Message[],\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Extract any data that came with the submitted response\n const partialData = this.extractResponseData(response, debugLogs, taskName);\n\n let webhookUrl = response.webhookUrl;\n\n // If no webhook URL provided by server, generate one. The webhook URL\n // macro path uses the local `taskId` (the runner-side correlation id\n // that doubles as the `{operation_id}` macro value), not the server\n // handle — webhook URLs identify the buyer-side request, not the\n // seller-side task.\n if (!webhookUrl && this.config.webhookManager) {\n webhookUrl = this.config.webhookManager.generateUrl(taskId);\n await this.config.webhookManager.registerWebhook(agent, taskId, webhookUrl);\n }\n\n // Polling and the buyer-facing `SubmittedContinuation.taskId` use the\n // SERVER-assigned task handle, not the runner's local UUID. The local\n // UUID is the `activeTasks` map key and the `{operation_id}` webhook\n // macro value — it never reaches the seller. The server handle comes\n // from `response.task_id` / `response.data.task_id` (AdCP submitted-arm\n // wire fields) or, for A2A responses, the same handle surfaced via\n // metadata (`adcp_task_id` / `serverTaskId`) before falling back to the\n // transport `result.id` / `taskId`. `responseParser.getTaskId` walks these\n // shapes.\n //\n // When the seller violated the spec and didn't include a task handle\n // we fall back to the local UUID so the buyer at least gets a\n // non-undefined `taskId` field. The polling cycle won't be able to\n // locate the work in this state — log an advisory so operators\n // grepping debug logs can pinpoint the seller-side spec violation.\n const extractedServerTaskId = this.responseParser.getTaskId(response);\n const serverTaskId = extractedServerTaskId ?? taskId;\n if (!extractedServerTaskId) {\n debugLogs.push({\n type: 'warning',\n message:\n 'Submitted-arm response omitted task_id (spec violation). Polling will use the runner-side ' +\n 'correlation id as a fallback; the seller will not recognize it. ' +\n 'Expected: response.task_id / response.data.task_id (AdCP), A2A metadata.serverTaskId, ' +\n 'A2A metadata.adcp_task_id, or result.id with kind === \"task\" (A2A wrapped).',\n timestamp: new Date().toISOString(),\n taskName,\n runnerTaskId: taskId,\n });\n }\n\n const submitted: SubmittedContinuation<T> = {\n taskId: serverTaskId,\n webhookUrl,\n track: (transport?: import('../protocols').TransportOptions) =>\n this.getTaskStatus(agent, serverTaskId, transport ?? options.transport),\n waitForCompletion: (pollInterval = 60000, signal?: AbortSignal) =>\n this.pollTaskCompletion<T>(agent, serverTaskId, pollInterval, options.transport, signal),\n };\n\n return {\n success: true, // The task is progressing, not failed\n status: 'submitted',\n submitted,\n data: partialData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'submitted',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n /**\n * Handle input-required status\n *\n * Some agents (like Yahoo) return input-required status. THIS IS TOTALLY VALID AND IS AN INTERMEDIATE STATE.\n * IT SHOULD NOT BE THROWING AN ERROR. IT DOES NOT ALWAYS REQUIRE an input handler.\n * This is common for HITL (human-in-the-loop) workflows where the agent has already processed\n * the request and is just signaling that async approval may be needed.\n */\n private async handleInputRequired<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n response: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n const inputRequest = this.responseParser.parseInputRequest(response);\n\n // If no handler provided, return input-required status as a valid intermediate state\n // This allows callers to handle the input-required state themselves (e.g., HITL workflows)\n if (!inputHandler) {\n // Extract any data that came with the response (some agents include partial results)\n const partialData = this.extractResponseData(response, debugLogs, taskName);\n\n return {\n success: true, // The task is progressing, not failed\n status: 'input-required',\n data: partialData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'input-required',\n response,\n inputRequest,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n // Build context for handler\n const context: ConversationContext = {\n messages,\n inputRequest,\n taskId,\n agent: { id: agent.id, name: agent.name, protocol: agent.protocol },\n attempt: 1,\n maxAttempts: options.maxClarifications || 3,\n deferToHuman: async () => ({ defer: true, token: randomUUID() }),\n abort: reason => {\n throw new Error(reason || 'Task aborted');\n },\n getSummary: () => messages.map(m => `${m.role}: ${JSON.stringify(m.content)}`).join('\\n'),\n wasFieldDiscussed: field =>\n // Check if any agent message requested this field via input-required\n messages.some(\n m =>\n m.role === 'agent' &&\n m.content &&\n typeof m.content === 'object' &&\n 'field' in m.content &&\n (m.content as Record<string, unknown>).field === field\n ),\n getPreviousResponse: field => {\n // Find the agent message that requested this field\n const fieldRequestIndex = messages.findIndex(\n m =>\n m.role === 'agent' &&\n m.content &&\n typeof m.content === 'object' &&\n 'field' in m.content &&\n (m.content as Record<string, unknown>).field === field\n );\n // The response is the next user message after the field request\n if (fieldRequestIndex >= 0) {\n const responseMsg = messages\n .slice(fieldRequestIndex + 1)\n .find(m => m.role === 'user' && m.metadata?.type === 'input_response');\n return responseMsg?.content;\n }\n return undefined;\n },\n };\n\n // Call handler\n const handlerResponse = await inputHandler(context);\n\n // Check if handler wants to defer\n if (isDeferResponse(handlerResponse)) {\n const token = handlerResponse.token;\n\n // Save deferred state for later resumption\n if (this.config.deferredStorage) {\n await this.config.deferredStorage.set(token, {\n taskId,\n contextId: response.contextId || taskId,\n agent,\n taskName,\n params,\n messages,\n createdAt: Date.now(),\n });\n }\n\n const deferred: DeferredContinuation<T> = {\n token,\n question: inputRequest.question,\n resume: input => this.resumeDeferredTask<T>(token, input),\n };\n\n return {\n success: true, // The task is progressing, not failed\n status: 'deferred',\n deferred,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'deferred',\n clarificationRounds: 1,\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n // Handler provided input - continue with the task\n return this.continueTaskWithInput<T>(\n agent,\n taskId,\n taskName,\n params,\n response.contextId,\n handlerResponse,\n messages,\n inputHandler, // Pass handler for multi-round clarification\n options,\n debugLogs,\n startTime\n );\n }\n\n /**\n * List tasks for an agent, preferring MCP Tasks protocol when available.\n */\n private async listTasksForAgent(\n agent: AgentConfig,\n transport?: import('../protocols').TransportOptions\n ): Promise<TaskInfo[]> {\n // Try MCP Tasks protocol method first\n if (agent.protocol === 'mcp') {\n const authToken = getAuthToken(agent);\n try {\n return await listMCPTasks(agent.agent_uri, authToken, undefined, {\n transport: transport ?? this.config.transport,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n agentId: agent.id,\n },\n });\n } catch (err) {\n if (is401Error(err)) throw err;\n // Fall through to tool call if protocol method is not supported\n }\n }\n const response = (await ProtocolClient.callTool(\n agent,\n 'tasks/list',\n {},\n {\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: transport ?? this.config.transport,\n onTransportActivity: this.config.onTransportActivity,\n }\n )) as Record<string, unknown>;\n return (response.tasks as TaskInfo[]) || [];\n }\n\n /**\n * Task tracking methods (PR #78)\n */\n async listTasks(agent: AgentConfig, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]> {\n try {\n return await this.listTasksForAgent(agent, transport);\n } catch {\n // Static message only — CodeQL's taint analysis treats `error` and\n // every property of it as sensitive once it originates from an\n // operation that touched `agent.oauth_client_credentials`. Surfaces\n // the failure occurred; full detail is available via DEBUG=adcp:*.\n console.warn('Failed to list tasks (see DEBUG=adcp:* logs for detail)');\n return [];\n }\n }\n\n private async getTaskStatusWithRawResponse(\n agent: AgentConfig,\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskStatusPollResult> {\n // AdCP `tasks/get` is the cross-protocol work-status interface\n // (`schemas/cache/<v>/bundled/core/tasks-get-{request,response}.json`).\n // MCP tool names cannot contain `/`, so MCP servers advertise the\n // SDK-owned `tasks_get` alias; A2A continues to use the spec slash name.\n //\n // The previous implementation tried MCP's `experimental.tasks.getTask`\n // first for MCP agents and fell through to the AdCP tool path on\n // capability-missing. The native MCP path tracks the TRANSPORT-call\n // lifecycle (MCP analog of A2A `Task.state`) — not AdCP work\n // lifecycle. For submitted-arm polling we need work status; the\n // two interfaces are not substitutes, so we always use the AdCP\n // tool here. MCP sellers that haven't registered `tasks_get` as\n // an AdCP tool will surface a tool-not-found error rather than\n // silently polling the wrong lifecycle.\n //\n // The request param is `task_id` (snake_case per AdCP 3.0); the\n // response is the spec's flat shape, mapped to `TaskInfo` via\n // {@link mapTasksGetResponseToTaskInfo}.\n //\n //\n // Request includes `include_result: true` so spec-conformant\n // sellers (AdCP 3.1.0+) populate the typed `result` field on\n // `completed` responses (per adcontextprotocol/adcp#3126). Older\n // sellers ignore the unknown request field; the response mapper\n // falls back to the informal `additionalProperties` passthrough\n // for those.\n const toolName = agent.protocol === 'mcp' ? 'tasks_get' : 'tasks/get';\n const response = (await ProtocolClient.callTool(\n agent,\n toolName,\n { task_id: taskId, include_result: true },\n {\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: transport ?? this.config.transport,\n signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n taskId,\n },\n }\n )) as Record<string, unknown>;\n // We don't run `extractResponseData` here: that helper's\n // generic AdCP-error-arm detection treats any top-level\n // `error: { code, message }` as an error envelope and shreds the\n // response into `{ errors: [...] }`. For `tasks/get` the `error`\n // block is informational (the failed task's reason, not a\n // request rejection), so we map the raw response directly. The\n // mapper handles the AdCP-spec flat shape, the legacy\n // `{ task: ... }` nested wrapper, and MCP `structuredContent` /\n // A2A latest structured DataPart envelopes.\n return {\n task: mapTasksGetResponseToTaskInfo(response),\n rawResponse: response,\n };\n }\n\n async getTaskStatus(\n agent: AgentConfig,\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskInfo> {\n return (await this.getTaskStatusWithRawResponse(agent, taskId, transport, signal)).task;\n }\n\n async pollTaskCompletion<T>(\n agent: AgentConfig,\n taskId: string,\n pollInterval = 60000,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskResult<T>> {\n const pollStartTime = Date.now();\n while (true) {\n // adcp-client#1612: When the outer storyboard race timer fires, the\n // caller's AbortSignal is already aborted. Exit cleanly rather than\n // continuing to send `tasks/get` requests that nobody is waiting for.\n if (signal?.aborted) {\n const reason =\n signal.reason instanceof Error ? signal.reason.message : String(signal.reason ?? 'polling cancelled');\n // adcp-client#1617: Phase 1 — notify the seller so it can stop doing\n // work for a buyer that has already given up. A2A 0.3.0 §7.4 defines\n // tasks/cancel for exactly this case. Fire-and-forget: cancel failure\n // (TaskNotCancelable, network error, terminal-state race) is non-fatal.\n // TODO(adcp-client#1617-phase2): upgrade to awaited cancel once AdCP\n // spec defines a cross-protocol cancel verb.\n //\n // SECURITY: silent on rejection. The orphan rejection's `Error.message`\n // can carry an echoed transport response body — same trust-boundary\n // concern as `raceWithSignal` in `src/lib/testing/client.ts`. A buyer\n // who has already aborted MUST NOT see seller-controlled text leak\n // into their logs/telemetry. The outer try AND the `.catch(() => {})`\n // are both intentional: a malformed `agent_uri` could throw\n // synchronously from `fetch(...)` before the promise chain catches\n // it, so the try guards the dispatch path; the `.catch()` guards the\n // async settlement path.\n if (agent.protocol === 'a2a' && taskId && agent.agent_uri) {\n try {\n // adcp-client#1617 Phase 2: pass the full agent so cancelA2ATask\n // can sign the POST when agent.request_signing is configured.\n // signed-requests sellers no longer 401 the cancel.\n void cancelA2ATask(agent, taskId, (transport ?? this.config.transport)?.fetchFn).catch(() => {\n /* see SECURITY note above */\n });\n } catch {\n /* see SECURITY note above */\n }\n }\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: `tasks/get polling was cancelled before a terminal state was observed: ${reason}`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n }),\n });\n }\n\n // adcp-client#1585: A2A 0.3.x defines no minimum retention TTL for\n // completed tasks. A seller may evict a task between the buyer\n // observing the working-state response and the first explicit\n // `tasks/get` poll firing — `getTaskStatus` then throws with a\n // \"Task <id> not found\" message. Surface a descriptive `failed`\n // `TaskResult` so the caller sees an actionable error instead of an\n // opaque uncaught exception escaping from the polling loop.\n let status: TaskInfo;\n let rawResponse: Record<string, unknown> | undefined;\n try {\n const pollResult = await this.getTaskStatusWithRawResponse(agent, taskId, transport, signal);\n status = pollResult.task;\n rawResponse = pollResult.rawResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Bounded `\\S{1,128}` task-id segment (no `.*`) keeps the match\n // linear-time on adversarial inputs — CodeQL flags unbounded\n // polynomial regex on uncontrolled error strings.\n if (/\\btask\\s+\\S{1,128}\\s+not found\\b/i.test(msg)) {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: `Task ${taskId} is no longer queryable — it may have been completed and evicted by the seller before this poll arrived. Consider using push notifications (reporting_webhook) instead of polling, or configuring a longer task retention TTL on the seller.`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n }),\n });\n }\n throw err;\n }\n\n if (status.status === ADCP_STATUS.COMPLETED) {\n const pollSuccess = this.isOperationSuccess(status.result, status.taskType);\n\n if (pollSuccess) {\n return attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: status.result,\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'completed',\n response: rawResponse,\n }),\n });\n }\n const asyncResultErr = extractAdcpErrorInfo(status.result);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: status.result,\n error: this.extractOperationError(status.result),\n adcpError: asyncResultErr,\n errorInstance: this.buildErrorInstance(taskId, asyncResultErr),\n correlationId: extractCorrelationId(status.result),\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n if (\n status.status === ADCP_STATUS.FAILED ||\n status.status === ADCP_STATUS.CANCELED ||\n status.status === ADCP_STATUS.REJECTED\n ) {\n const asyncFailedErr = extractAdcpErrorInfo(status.result);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: status.result,\n error: status.error || status.message || `Task ${status.status}`,\n adcpError: asyncFailedErr,\n errorInstance: this.buildErrorInstance(taskId, asyncFailedErr),\n correlationId: extractCorrelationId(status.result),\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n // Paused states: `input-required` and `auth-required`. Polling\n // alone can't advance these — the buyer must satisfy the paused\n // condition (supply input / refresh auth) and retry the\n // original tool call. Return a `TaskResultIntermediate` so the\n // caller can branch on `result.status`; this mirrors the\n // synchronous `handleInputRequired` no-handler path\n // (`success: true` because the task is progressing, not failed).\n // Without this branch the loop would spin until timeout — the\n // paused-state regression class flagged by adcp-client#977.\n if (status.status === ADCP_STATUS.INPUT_REQUIRED || status.status === ADCP_STATUS.AUTH_REQUIRED) {\n return attachMatch({\n success: true as const,\n status: status.status,\n data: status.result as T,\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: status.status,\n response: rawResponse,\n }),\n });\n }\n\n // adcp-client#1612: `status: 'unknown'` means `mapTasksGetResponseToTaskInfo`\n // could not extract a recognizable status string from the response — the\n // seller's `tasks/get` response did not conform to any expected envelope\n // shape (flat AdCP, MCP structuredContent, or A2A DataPart artifact).\n // Continuing to poll would spin forever since the shape won't change.\n // Surface a descriptive failure so the storyboard runner reports the\n // seller's non-conformance rather than burning the outer timeout budget.\n if (status.status === 'unknown') {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error:\n `tasks/get returned an unrecognizable response (parsed status: \"unknown\", taskId: \"${status.taskId}\"). ` +\n `The seller may not implement tasks/get as an AdCP skill, or its response did not match any ` +\n `supported envelope shape (flat AdCP, MCP structuredContent, or A2A DataPart artifact).`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n await this.sleep(pollInterval);\n // Re-check after sleep so a signal that fired mid-sleep exits at the top\n // of the next iteration rather than issuing one more `getTaskStatus` call.\n if (signal?.aborted) continue;\n }\n }\n\n /**\n * Resume a deferred task (client deferral)\n */\n async resumeDeferredTask<T>(token: string, input: any): Promise<TaskResult<T>> {\n if (!this.config.deferredStorage) {\n throw new Error('Deferred storage not configured');\n }\n\n const state = await this.config.deferredStorage.get(token);\n if (!state) {\n throw new Error(`Deferred task not found: ${token}`);\n }\n\n // Continue task with the provided input (no handler for resumed deferred tasks)\n const resumed = await this.continueTaskWithInput<T>(\n state.agent,\n state.taskId,\n state.taskName,\n state.params,\n state.contextId,\n input,\n state.messages,\n undefined // No handler for deferred tasks - input was provided by human\n );\n return attachMatch(resumed);\n }\n\n /**\n * Continue a task after receiving input\n */\n private async continueTaskWithInput<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n contextId: string,\n input: any,\n messages: Message[],\n inputHandler: InputHandler | undefined,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Add user input message\n const inputMessage: Message = {\n id: randomUUID(),\n role: 'user',\n content: input,\n timestamp: new Date().toISOString(),\n metadata: { type: 'input_response' },\n };\n messages.push(inputMessage);\n\n // Continue the task with input\n const response = await ProtocolClient.callTool(\n agent,\n 'continue_task',\n {\n contextId,\n input,\n },\n {\n debugLogs,\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: options.transport ?? this.config.transport,\n signal: options.signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n operationId: taskId,\n taskId,\n contextId,\n },\n }\n );\n\n // Add response message\n const responseMessage: Message = {\n id: randomUUID(),\n role: 'agent',\n content: response,\n timestamp: new Date().toISOString(),\n metadata: { type: 'continued_response' },\n };\n messages.push(responseMessage);\n\n // Handle the continued response (pass inputHandler for multi-round clarification)\n return this.handleAsyncResponse<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n }\n\n /**\n * Utility methods\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private createErrorResult<T>(\n taskId: string,\n agent: AgentConfig,\n error: any,\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): TaskResult<T> {\n // Try to extract structured error info from transport exceptions\n // (e.g., JSON-RPC errors with data.adcp_error)\n const transportData = error?.data || error?.response?.data;\n const adcpErrorInfo = extractAdcpErrorInfo(transportData);\n const correlationId = extractCorrelationId(transportData);\n\n return {\n success: false as const,\n status: 'failed' as const,\n error: error.message || String(error),\n adcpError: adcpErrorInfo,\n errorInstance: this.buildErrorInstance(taskId, adcpErrorInfo),\n correlationId,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime,\n status: 'failed',\n }),\n debug_logs: debugLogs,\n };\n }\n\n /**\n * Legacy methods for backward compatibility\n */\n getConversationHistory(taskId: string): Message[] | undefined {\n return this.conversationStorage?.get(taskId);\n }\n\n clearConversationHistory(taskId: string): void {\n this.conversationStorage?.delete(taskId);\n }\n\n getActiveTasks(): TaskState[] {\n return Array.from(this.activeTasks.values());\n }\n\n // ====== TASK MANAGEMENT & NOTIFICATION METHODS ======\n\n private taskEventListeners = new Map<\n string,\n {\n callback: (task: TaskInfo) => void;\n agentId?: string;\n }[]\n >();\n\n private webhookRegistrations = new Map<\n string,\n {\n agent: AgentConfig;\n webhookUrl: string;\n taskTypes?: string[];\n }\n >();\n\n /**\n * Get task list for a specific agent\n */\n async getTaskList(agentId: string, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]> {\n // First try to get from agent via protocol\n const agent = this.findAgentById(agentId);\n if (agent) {\n try {\n return await this.listTasksForAgent(agent, transport);\n } catch {\n // Static message — see comment on listTasks above.\n console.warn('Failed to get remote task list (see DEBUG=adcp:* logs for detail)');\n }\n }\n\n // Fall back to local active tasks\n return Array.from(this.activeTasks.values())\n .filter(task => task.agent.id === agentId)\n .map(task => ({\n taskId: task.taskId,\n status: task.status,\n taskType: task.taskName,\n createdAt: task.startTime,\n updatedAt: task.startTime, // TODO: track updates\n }));\n }\n\n /**\n * Get detailed information about a specific task\n */\n async getTaskInfo(taskId: string): Promise<TaskInfo | null> {\n const localTask = this.activeTasks.get(taskId);\n if (localTask) {\n return {\n taskId: localTask.taskId,\n status: localTask.status,\n taskType: localTask.taskName,\n createdAt: localTask.startTime,\n updatedAt: localTask.startTime,\n };\n }\n\n // Try to get from agent\n // Note: Would need to know which agent to query\n return null;\n }\n\n /**\n * Subscribe to task updates for a specific agent\n */\n onTaskUpdate(agentId: string, callback: (task: TaskInfo) => void): () => void {\n const listenerId = randomUUID();\n const listeners = this.taskEventListeners.get(listenerId) || [];\n listeners.push({ callback, agentId });\n this.taskEventListeners.set(listenerId, listeners);\n\n return () => {\n this.taskEventListeners.delete(listenerId);\n };\n }\n\n /**\n * Subscribe to task events with detailed callbacks\n */\n onTaskEvents(\n agentId: string,\n callbacks: {\n onTaskCreated?: (task: TaskInfo) => void;\n onTaskUpdated?: (task: TaskInfo) => void;\n onTaskCompleted?: (task: TaskInfo) => void;\n onTaskFailed?: (task: TaskInfo, error: string) => void;\n }\n ): () => void {\n const unsubscribeFns: (() => void)[] = [];\n\n // Create combined handler that routes to specific callbacks\n const handler = (task: TaskInfo) => {\n switch (task.status) {\n case 'submitted':\n case 'working':\n callbacks.onTaskCreated?.(task);\n break;\n case 'input-required':\n callbacks.onTaskUpdated?.(task);\n break;\n case 'completed':\n callbacks.onTaskCompleted?.(task);\n break;\n case 'failed':\n case 'rejected':\n case 'canceled':\n callbacks.onTaskFailed?.(task, task.error || `Task ${task.status}`);\n break;\n default:\n callbacks.onTaskUpdated?.(task);\n }\n };\n\n unsubscribeFns.push(this.onTaskUpdate(agentId, handler));\n\n return () => {\n unsubscribeFns.forEach(fn => fn());\n };\n }\n\n /**\n * Register webhook for task notifications\n */\n async registerWebhook(agent: AgentConfig, webhookUrl: string, taskTypes?: string[]): Promise<void> {\n this.webhookRegistrations.set(agent.id, {\n agent,\n webhookUrl,\n taskTypes,\n });\n\n // TODO: Register with remote agent if it supports webhooks\n console.log(`Webhook registered for agent ${agent.id}: ${webhookUrl}`);\n }\n\n /**\n * Unregister webhook notifications\n */\n async unregisterWebhook(agent: AgentConfig): Promise<void> {\n this.webhookRegistrations.delete(agent.id);\n console.log(`Webhook unregistered for agent ${agent.id}`);\n }\n\n /**\n * Emit task event to listeners\n */\n private emitTaskEvent(task: TaskInfo, agentId?: string): void {\n this.taskEventListeners.forEach(listeners => {\n listeners.forEach(({ callback, agentId: listenerAgentId }) => {\n if (!listenerAgentId || listenerAgentId === agentId) {\n try {\n callback(task);\n } catch (error) {\n console.error('Error in task event callback:', error instanceof Error ? error.message : 'unknown error');\n }\n }\n });\n });\n }\n\n /**\n * Normalize response data for schema validation\n *\n * Converts v2-style responses to v3 format before validation.\n * This ensures validation passes for both v2 and v3 server responses.\n */\n private normalizeResponseForValidation(response: any, taskName: string): any {\n if (!response) return response;\n\n // Strip underscore-prefixed client-side annotations (`_message` is added\n // by the response unwrapper, others may follow). Schemas with\n // `additionalProperties: false` (create-property-list-response, etc.)\n // would otherwise reject every response that reaches the grader's\n // schema check — the annotation is not part of the wire protocol.\n const stripped: Record<string, unknown> = {};\n if (typeof response === 'object' && !Array.isArray(response)) {\n for (const [k, v] of Object.entries(response)) {\n if (!k.startsWith('_')) stripped[k] = v;\n }\n } else {\n return taskName === 'get_products' ? normalizeGetProductsResponse(response) : response;\n }\n\n switch (taskName) {\n case 'get_products':\n return normalizeGetProductsResponse(stripped);\n default:\n return stripped;\n }\n }\n\n /**\n * Validate an incoming response against the bundled AdCP JSON schema for\n * `taskName`. Strict mode fails the task; warn mode logs and returns\n * valid so the caller can continue. Off mode short-circuits before\n * AJV runs.\n */\n private validateResponseSchema(\n response: any,\n taskName: string,\n debugLogs: any[]\n ): { valid: boolean; errors: string[] } {\n const mode = this.responseValidationMode;\n const logViolations = this.config.logSchemaViolations !== false;\n\n try {\n const normalizedResponse = this.normalizeResponseForValidation(response, taskName);\n // Validate against the version the agent actually spoke. Without\n // this, v2.5 sellers (e.g. Wonderstruck) return valid v2.5-shaped\n // responses and the SDK rejects them as malformed v3 — surfaces as\n // `pricing_options must NOT have fewer than 1 items` and similar\n // shape mismatches that don't exist in v2.5. The v3 → v2 path is\n // already correctly version-pinned via lastKnownServerVersion.\n const validationVersion =\n this.lastKnownServerVersion === 'v2'\n ? 'v2.5'\n : (this.responseAdcpVersionForValidation() ?? this.config.adcpVersion);\n const outcome = validateIncomingResponse(taskName, normalizedResponse, mode, debugLogs, validationVersion);\n if (outcome.valid) return { valid: true, errors: [] };\n\n const errorStrings = outcome.issues.map(i => `${i.pointer}: ${i.message}`);\n\n if (logViolations) {\n debugLogs.push({\n timestamp: new Date().toISOString(),\n type: mode === 'strict' ? 'error' : 'warning',\n message: `Schema validation ${mode === 'strict' ? 'failed' : 'warning'} for ${taskName}: ${formatIssues(\n outcome.issues\n )}`,\n errors: errorStrings,\n schemaVariant: outcome.variant,\n mode,\n });\n }\n\n if (mode === 'warn') {\n console.warn(`Schema validation failed for ${taskName} (non-blocking):`, errorStrings);\n return { valid: true, errors: [] };\n }\n\n console.error(`Schema validation failed for ${taskName}:`, errorStrings);\n return { valid: false, errors: errorStrings };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'unknown error';\n console.error('Error during schema validation:', errorMessage);\n return {\n valid: mode !== 'strict',\n errors: mode === 'strict' ? [`Validation error: ${errorMessage}`] : [],\n };\n }\n }\n\n private responseAdcpVersionForValidation(): string | undefined {\n if (this.config.versionEnvelope === 'major-only') return '3.0';\n return undefined;\n }\n\n /**\n * Update task status and emit events\n */\n private updateTaskStatus(taskId: string, status: TaskStatus, result?: any, error?: string): void {\n const task = this.activeTasks.get(taskId);\n if (task) {\n const previousStatus = task.status;\n task.status = status;\n\n const taskInfo: TaskInfo = {\n taskId: task.taskId,\n status: status,\n taskType: task.taskName,\n createdAt: task.startTime,\n updatedAt: Date.now(),\n result,\n error,\n };\n\n this.emitTaskEvent(taskInfo, task.agent.id);\n\n this.config.onActivity?.({\n type: 'status_change',\n operation_id: task.taskId,\n agent_id: task.agent.id,\n context_id: undefined,\n task_id: task.taskId,\n task_type: task.taskName,\n status: status,\n payload: result ?? (error ? { error } : undefined),\n timestamp: new Date().toISOString(),\n });\n\n // If task is finished, remove from active tasks after a delay.\n // unref() ensures this timer doesn't prevent the process from exiting.\n if (['completed', 'failed', 'rejected', 'canceled'].includes(status)) {\n setTimeout(() => {\n this.activeTasks.delete(taskId);\n }, 30000).unref(); // Keep for 30 seconds for final status checks\n }\n }\n }\n\n /**\n * Helper to find agent config by ID\n */\n private findAgentById(agentId: string): AgentConfig | undefined {\n // This would ideally be passed in or stored in the executor\n // For now, return undefined and fall back to local tasks\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/core/TaskExecutor.ts"],"sourcesContent":["// Core task execution engine for ADCP conversation flow\n// Implements PR #78 async patterns: working/submitted/input-required/completed\n\nimport { randomUUID } from 'crypto';\nimport type { AgentConfig } from '../types';\nimport { ProtocolClient } from '../protocols';\nimport { listMCPTasks } from '../protocols/mcp-tasks';\nimport { getAuthToken } from '../auth';\nimport { is401Error, adcpErrorToTypedError } from '../errors';\nimport type { ADCPError } from '../errors';\nimport type { Storage } from '../storage/interfaces';\nimport {\n validateOutgoingRequest,\n validateIncomingResponse,\n resolveValidationModes,\n type ValidationHookConfig,\n type ValidationMode,\n} from '../validation/client-hooks';\nimport { formatIssues } from '../validation/schema-validator';\nimport { unwrapProtocolResponse, isAdcpError, isTerminalAdcpError } from '../utils/response-unwrapper';\nimport { extractAdcpErrorInfo, extractCorrelationId } from '../utils/error-extraction';\nimport { generateIdempotencyKey, isMutatingTask, redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { normalizeGetProductsResponse } from '../utils/pricing-adapter';\nimport { normalizeLegacyMediaBuyStatusForReturn } from '../utils/envelope-status-compat';\nimport { getLatestA2ADataPartFromResponse } from '../utils/a2a-artifacts';\nimport { cancelA2ATask } from '../protocols/a2a';\nimport { isAbortOrTimeoutError } from '../protocols/abort';\nimport type {\n Message,\n InputRequest,\n InputHandler,\n ConversationContext,\n TaskOptions,\n TaskResult,\n TaskResultMetadata,\n TaskState,\n TaskStatus,\n TaskInfo,\n DeferredContinuation,\n SubmittedContinuation,\n WebhookUrlTemplate,\n} from './ConversationTypes';\nimport { normalizeHandlerResponse, isDeferResponse, isAbortResponse } from '../handlers/types';\nimport { ProtocolResponseParser, ADCP_STATUS, type ADCPStatus } from './ProtocolResponseParser';\nimport type { Activity } from './AsyncHandler';\nimport { GovernanceMiddleware } from './GovernanceMiddleware';\nimport type { GovernanceConfig, GovernanceCheckResult } from './GovernanceTypes';\nimport { attachMatch } from './match';\nimport { resolveWebhookUrl } from './webhook-url';\n/**\n * Custom errors for task execution\n */\nexport class TaskTimeoutError extends Error {\n constructor(taskId: string, timeout: number) {\n super(`Task ${taskId} timed out after ${timeout}ms`);\n this.name = 'TaskTimeoutError';\n }\n}\n\nexport class MaxClarificationError extends Error {\n constructor(taskId: string, maxAttempts: number) {\n super(`Task ${taskId} exceeded maximum clarification attempts: ${maxAttempts}`);\n this.name = 'MaxClarificationError';\n }\n}\n\nexport class DeferredTaskError extends Error {\n constructor(public token: string) {\n super(`Task deferred with token: ${token}`);\n this.name = 'DeferredTaskError';\n }\n}\n\nexport class InputRequiredError extends Error {\n constructor(question: string) {\n super(`Server requires input but no handler provided. Question: ${question}`);\n this.name = 'InputRequiredError';\n }\n}\n\n/**\n * Map an AdCP `tasks/get` response (post-unwrap) to the SDK's internal\n * `TaskInfo` shape. The AdCP 3.0 schema\n * (`schemas/cache/3.0.0/bundled/core/tasks-get-response.json`) is flat\n * snake_case: `{ task_id, task_type, protocol, status, created_at,\n * updated_at, error?, progress?, history?, completed_at?, has_webhook?,\n * context?, ext? }`. The internal `TaskInfo` is camelCase with a\n * superset of legacy fields some pre-3.0 sellers still emit.\n *\n * **Result-data extraction.** AdCP 3.1.0 defines a typed `result`\n * field on `tasks/get` responses (per adcontextprotocol/adcp#3126,\n * which closed adcp#3123). Sellers populate it when the buyer's\n * request set `include_result: true` and the task reached\n * `completed`. The mapper reads it directly into `TaskInfo.result`\n * so `pollTaskCompletion` surfaces it on the resolved\n * `TaskResult.data`. Pre-3.1.0 sellers that emitted `result` via\n * `additionalProperties: true` continue to work — the typed and\n * informal paths share the same field name.\n *\n * **Legacy nested shape.** Some pre-3.0 sellers and existing test\n * mocks emit `{ task: { ...TaskInfo } }` — a non-spec wrapper. We\n * unwrap it before the spec-shape mapping so the SDK stays\n * compatible with both surfaces during the transition.\n */\nfunction mapTasksGetResponseToTaskInfo(payload: unknown): TaskInfo {\n if (payload == null || typeof payload !== 'object') {\n return { taskId: '', status: 'unknown', taskType: 'unknown', createdAt: Date.now(), updatedAt: Date.now() };\n }\n const obj = payload as Record<string, unknown>;\n // Walk the transport-level wrappers in priority order:\n // 1. MCP `structuredContent` — the typed AdCP payload from `tools/call`\n // 2. A2A latest structured DataPart — the AdCP payload\n // surfaced via the artifact (per #899)\n // 3. Legacy nested `{ task: TaskInfo }` — pre-3.0 sellers and\n // existing test mocks\n // 4. Flat AdCP-spec shape — what AdCP 3.0 sellers emit directly\n const flat = unwrapTasksGetEnvelope(obj);\n const errorRaw = flat.error;\n const errorMessage =\n typeof errorRaw === 'string'\n ? errorRaw\n : errorRaw != null &&\n typeof errorRaw === 'object' &&\n typeof (errorRaw as { message?: unknown }).message === 'string'\n ? (errorRaw as { message: string }).message\n : undefined;\n const taskInfo: TaskInfo = {\n taskId: stringField(flat.task_id) ?? stringField(flat.taskId) ?? '',\n status: stringField(flat.status) ?? 'unknown',\n taskType: stringField(flat.task_type) ?? stringField(flat.taskType) ?? 'unknown',\n createdAt: parseTimestamp(flat.created_at ?? flat.createdAt),\n updatedAt: parseTimestamp(flat.updated_at ?? flat.updatedAt),\n };\n if (errorMessage !== undefined) taskInfo.error = errorMessage;\n // Top-level `message` field: the AdCP envelope's human-readable\n // status descriptor (advisory string accompanying any status —\n // e.g. \"Budget cap exceeded — task not started\" on a `rejected`\n // task). `pollTaskCompletion` falls back to this when the\n // `error.message` block is absent on a terminal failure. Distinct\n // from `error.message` (which lives under the structured `error`\n // object).\n const messageField = stringField(flat.message);\n if (messageField !== undefined) taskInfo.message = messageField;\n // Result extraction — see JSDoc. AdCP 3.1.0 defines `result` as\n // the canonical typed field; pre-3.1.0 sellers using\n // `additionalProperties: true` shared the same field name, so the\n // mapping is unchanged across versions.\n if (flat.result !== undefined) {\n taskInfo.result =\n flat.result != null && typeof flat.result === 'object' && !Array.isArray(flat.result)\n ? normalizeLegacyMediaBuyStatusForReturn(flat.result as Record<string, unknown>, {\n toolName: taskInfo.taskType,\n })\n : flat.result;\n }\n return taskInfo;\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Cap on the wrapper-unwrap recursion depth. Real-world responses\n * have at most two layers (MCP `structuredContent` OR A2A JSON-RPC →\n * Task → artifact → DataPart). The cap is a defense against a\n * malformed or hostile seller emitting a deeply-nested wrapper that\n * would otherwise stack-overflow the buyer.\n */\nconst TASKS_GET_UNWRAP_MAX_DEPTH = 8;\n\nfunction unwrapTasksGetEnvelope(obj: Record<string, unknown>, depth = 0, allowRawData = true): Record<string, unknown> {\n if (depth >= TASKS_GET_UNWRAP_MAX_DEPTH) return obj;\n // MCP: `tools/call` response carries the typed payload at\n // `structuredContent`.\n const sc = obj.structuredContent;\n if (sc != null && typeof sc === 'object' && !Array.isArray(sc)) {\n return unwrapTasksGetEnvelope(sc as Record<string, unknown>, depth + 1, false);\n }\n // A2A: `message/send` response is a JSON-RPC envelope wrapping a\n // Task; the AdCP payload sits on the latest structured DataPart.\n const result = obj.result;\n if (result != null && typeof result === 'object' && !Array.isArray(result)) {\n const r = result as Record<string, unknown>;\n if (r.kind === 'task') {\n const extracted = getLatestA2ADataPartFromResponse(obj);\n if (extracted) {\n return unwrapTasksGetEnvelope(extracted.data, depth + 1, false);\n }\n // adcp-client#1612: When the A2A Task has no DataPart artifacts (e.g. the\n // seller returns an A2A transport-level state without an AdCP DataPart\n // payload), surface the transport-layer status as a last-resort hint so\n // `mapTasksGetResponseToTaskInfo` can map terminal states to `failed` /\n // `completed` rather than falling through to `'unknown'`. The transport\n // state overlaps with AdCP status strings for all A2A-native values\n // (`completed`, `failed`, `rejected`, `canceled`, `working`, `submitted`).\n // Note: `auth-required` is an AdCP-layer concept; it won't surface via\n // this path (no A2A-native transport state carries that label) — those\n // responses reach the `unknown` exit branch instead. Also include the A2A\n // task handle (`result.id`) so polling error messages carry the real id.\n const transportStatus = (r.status as Record<string, unknown> | undefined)?.state;\n if (typeof transportStatus === 'string') {\n return { status: transportStatus, task_id: typeof r.id === 'string' ? r.id : undefined };\n }\n }\n }\n // Raw/in-process MCP wrappers sometimes carry the AdCP payload under\n // `data` rather than the official CallToolResult `structuredContent`.\n // Unwrap only when it looks like a task envelope and no official payload\n // has already been selected.\n const data = obj.data;\n if (allowRawData && data != null && typeof data === 'object' && !Array.isArray(data)) {\n const d = data as Record<string, unknown>;\n if ('status' in d || 'task_id' in d || 'taskId' in d) {\n return unwrapTasksGetEnvelope(d, depth + 1, true);\n }\n }\n // Legacy nested wrapper from pre-3.0 sellers and existing mocks.\n // TODO(adcp-client#967): remove once mock fixtures in\n // `test/lib/task-executor*.test.js` migrate to the AdCP-spec flat\n // shape. No real seller emits this; verified at PR review time.\n if (obj.task != null && typeof obj.task === 'object' && !Array.isArray(obj.task)) {\n return obj.task as Record<string, unknown>;\n }\n // Flat AdCP-spec shape — return as-is.\n return obj;\n}\n\nfunction parseTimestamp(value: unknown): number {\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return Date.now();\n}\n\n/**\n * Return the idempotency_key this task should use: the caller's value if\n * present, otherwise a fresh UUID v4 for mutating tasks, otherwise undefined.\n */\nfunction resolveIdempotencyKey(taskName: string, params: any): string | undefined {\n const callerSupplied =\n params && typeof params === 'object' && typeof params.idempotency_key === 'string'\n ? params.idempotency_key\n : undefined;\n if (callerSupplied) return callerSupplied;\n if (isMutatingTask(taskName)) return generateIdempotencyKey();\n return undefined;\n}\n\n/**\n * Webhook manager for submitted tasks\n */\ninterface WebhookManager {\n generateUrl(taskId: string): string;\n registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;\n processWebhook(token: string, body: any): Promise<void>;\n}\n\n/**\n * Deferred task storage for client deferrals\n */\ninterface DeferredTaskState {\n taskId: string;\n contextId: string;\n agent: AgentConfig;\n taskName: string;\n params: any;\n messages: Message[];\n createdAt: number;\n}\n\ninterface TaskStatusPollResult {\n task: TaskInfo;\n rawResponse: Record<string, unknown>;\n}\n\nconst COMPACTED_TASK_STATE_LIMIT = 10_000;\n\n/**\n * Core task execution engine that handles the conversation loop with agents\n */\nexport class TaskExecutor {\n private responseParser: ProtocolResponseParser;\n private activeTasks = new Map<string, TaskState>();\n private compactedTaskIds = new Map<string, true>();\n private conversationStorage?: Map<string, Message[]>;\n private governanceMiddleware?: GovernanceMiddleware;\n private lastKnownServerVersion?: 'v2' | 'v3';\n private requestValidationMode!: ValidationMode;\n private responseValidationMode!: ValidationMode;\n\n constructor(\n private config: {\n /** Default timeout for 'working' status (max 120s per PR #78) */\n workingTimeout?: number;\n /** Polling interval for 'working' status in milliseconds (default: 2000ms) */\n pollingInterval?: number;\n /** Default max clarification attempts */\n defaultMaxClarifications?: number;\n /** Enable conversation storage */\n enableConversationStorage?: boolean;\n /** Webhook manager for submitted tasks */\n webhookManager?: WebhookManager;\n /** Storage for deferred task state */\n deferredStorage?: Storage<DeferredTaskState>;\n /** Webhook URL template for protocol-level webhook support */\n webhookUrlTemplate?: WebhookUrlTemplate;\n /** Agent ID for webhook URL generation */\n agentId?: string;\n /** Webhook secret for HMAC authentication (min 32 chars) */\n webhookSecret?: string;\n /** Fail tasks when response schema validation fails (default: true) */\n strictSchemaValidation?: boolean;\n /** Log all schema validation violations to debug logs (default: true) */\n logSchemaViolations?: boolean;\n /**\n * Schema-driven validation using the bundled AdCP JSON schemas.\n * Controls outgoing request and incoming response checks independently.\n * Defaults: strict in dev/test, warn in prod. Set a mode to `off` to\n * skip the validator entirely on that side (zero overhead).\n */\n validation?: ValidationHookConfig;\n /** Filter out invalid products from get_products responses instead of rejecting the entire response (default: false) */\n filterInvalidProducts?: boolean;\n /** Global activity callback for observability */\n onActivity?: (activity: Activity) => void | Promise<void>;\n /** Transport-level diagnostics callback for outbound HTTP requests. */\n onTransportActivity?: import('../protocols').TransportActivityHandler;\n /** Governance configuration for buyer-side campaign governance */\n governance?: GovernanceConfig;\n /**\n * AdCP version this executor speaks. Selects which schema bundle\n * `validateIncomingResponse` / `validateOutgoingRequest` validate\n * against, and which `adcp_major_version` value goes on the wire.\n * Defaults to the SDK-pinned `ADCP_VERSION` when omitted.\n *\n * Plumbed from `SingleAgentClient.resolvedAdcpVersion` so the\n * client/agent's `getAdcpVersion()` value is the single source of\n * truth for both validation and wire-level major.\n */\n adcpVersion?: string;\n wireAdcpVersion?: string;\n versionEnvelope?: import('../protocols').VersionEnvelopeMode;\n /**\n * Transport-level safeguards applied to every call this executor\n * dispatches. Per-call options can override individual fields.\n */\n transport?: import('../protocols').TransportOptions;\n } = {}\n ) {\n this.responseParser = new ProtocolResponseParser();\n if (config.enableConversationStorage) {\n this.conversationStorage = new Map();\n }\n if (config.governance) {\n this.governanceMiddleware = new GovernanceMiddleware(\n config.governance,\n config.onActivity,\n config.adcpVersion,\n config.versionEnvelope,\n config.onTransportActivity\n );\n }\n const modes = resolveValidationModes(config.validation);\n this.requestValidationMode = modes.requests;\n // Legacy `strictSchemaValidation: false` flips response-side enforcement\n // to warn mode — preserve that behaviour unless `validation.responses`\n // was set explicitly.\n if (config.validation?.responses !== undefined) {\n this.responseValidationMode = config.validation.responses;\n } else if (config.strictSchemaValidation === false) {\n this.responseValidationMode = 'warn';\n } else {\n this.responseValidationMode = modes.responses;\n }\n }\n\n /**\n * Access the governance middleware for direct outcome reporting (async tasks).\n */\n getGovernanceMiddleware(): GovernanceMiddleware | undefined {\n return this.governanceMiddleware;\n }\n\n getRequestParams(taskId: string): Record<string, unknown> | undefined {\n const params = this.activeTasks.get(taskId)?.params;\n return params && typeof params === 'object' && !Array.isArray(params)\n ? (params as Record<string, unknown>)\n : undefined;\n }\n\n /**\n * Reconcile a push-delivered terminal status with the local runner task.\n * Submitted task state is already compacted after dispatch; this schedules\n * the same short final-status retention used by synchronous completions.\n *\n * @internal\n */\n observeExternalTaskStatus(taskId: string, status: TaskStatus, result?: unknown): void {\n if (!['completed', 'failed', 'rejected', 'canceled'].includes(status)) return;\n this.updateTaskStatus(taskId, status, result);\n }\n\n /**\n * Run the configured pre-send schema check against the user-facing request\n * shape. Callers invoke this on the unadapted (v3) params before any wire\n * adaptation runs, so the validator sees the same object the caller wrote.\n * Throws in strict, logs to `debugLogs` in warn, no-ops in off.\n */\n validateRequest(taskName: string, params: unknown, debugLogs?: any[]): void {\n validateOutgoingRequest(taskName, params, this.requestValidationMode, debugLogs, this.config.adcpVersion);\n }\n\n /**\n * After `adaptRequestForServerVersion` has rewritten a v3 request into v2\n * wire format, validate the adapted shape against the cached v2.5 schema\n * bundle. Always warn-only — adapter bugs shouldn't break user requests,\n * and the v3 pre-send pass already vouched for the user-facing input.\n * This pass exists to surface drift between what the adapter emits and\n * what a v2.5 server expects on the wire (primarily as CI signal via the\n * adapter-conformance test suite).\n *\n * Skips silently for tasks without a v2.5 schema or when the v2.5 bundle\n * isn't cached. Caller is responsible for gating on `serverVersion === 'v2'`\n * so v3-targeted traffic doesn't pay the validation cost.\n */\n validateAdaptedRequestAgainstV2(taskName: string, adaptedParams: unknown, debugLogs?: any[]): void {\n validateOutgoingRequest(taskName, adaptedParams, 'warn', debugLogs, 'v2.5');\n }\n\n /**\n * Generate webhook URL for protocol-level webhook support\n */\n /**\n * Build TaskResultMetadata, including the idempotency fields. The key is\n * pulled from the tracked task state so every result reports the key that\n * was actually sent (auto-generated or caller-supplied); `replayed` is\n * extracted from the response envelope when a response is available.\n */\n private buildMetadata(args: {\n taskId: string;\n taskName: string;\n agent: AgentConfig | { id: string; name: string; protocol: 'mcp' | 'a2a' };\n startTime?: number;\n responseTimeMs?: number;\n status: TaskStatus;\n clarificationRounds?: number;\n response?: any;\n inputRequest?: InputRequest;\n }): TaskResultMetadata {\n const meta: TaskResultMetadata = {\n taskId: args.taskId,\n taskName: args.taskName,\n agent: { id: args.agent.id, name: args.agent.name, protocol: args.agent.protocol },\n responseTimeMs: args.responseTimeMs ?? (args.startTime !== undefined ? Date.now() - args.startTime : 0),\n timestamp: new Date().toISOString(),\n clarificationRounds: args.clarificationRounds ?? 0,\n status: args.status,\n };\n if (args.inputRequest) meta.inputRequest = args.inputRequest;\n const key = this.activeTasks.get(args.taskId)?.idempotencyKey;\n if (key) meta.idempotency_key = key;\n if (args.response !== undefined) {\n const replayed = this.responseParser.getReplayed(args.response);\n if (replayed !== undefined) meta.replayed = replayed;\n const adcpVersion = this.responseParser.getAdcpVersion(args.response);\n if (adcpVersion) meta.adcpVersion = adcpVersion;\n const serverContextId = this.responseParser.getContextId(args.response);\n if (serverContextId) meta.contextId = serverContextId;\n const serverTaskId = this.responseParser.getTaskId(args.response);\n if (serverTaskId) meta.serverTaskId = serverTaskId;\n }\n return meta;\n }\n\n /**\n * Map a task's structured AdCP error to a typed `ADCPError` subclass when\n * the code has a dedicated class (e.g., `IDEMPOTENCY_CONFLICT` →\n * `IdempotencyConflictError`). The idempotency key is pulled from tracked\n * task state because the server intentionally omits it from error bodies\n * (it's a read-oracle).\n */\n private buildErrorInstance(\n taskId: string,\n adcpError: ReturnType<typeof extractAdcpErrorInfo>\n ): ADCPError | undefined {\n if (!adcpError) return undefined;\n const key = this.activeTasks.get(taskId)?.idempotencyKey;\n return adcpErrorToTypedError(adcpError, key);\n }\n\n private generateWebhookUrl(taskName: string, operationId: string, options?: TaskOptions): string | undefined {\n return resolveWebhookUrl(this.config.webhookUrlTemplate, this.config.agentId, taskName, operationId, options);\n }\n\n /**\n * Execute a task with an agent using PR #78 async patterns\n * Handles: working (keep SSE open), submitted (webhook), input-required (handler), completed\n */\n async executeTask<T = any>(\n agent: AgentConfig,\n taskName: string,\n params: any,\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n serverVersion?: 'v2' | 'v3'\n ): Promise<TaskResult<T>> {\n if (serverVersion) this.lastKnownServerVersion = serverVersion;\n // The client-minted `taskId` is a local correlation id for tracking this\n // call's lifecycle (activeTasks map, metadata, webhook URL macros). It is\n // NOT the same thing as the A2A `taskId` that the server assigns — that\n // flows in on the response and is surfaced via metadata.serverTaskId.\n // `options.contextId` / `options.taskId` ride on the A2A message envelope\n // and are threaded straight to the protocol adapter below.\n const taskId = randomUUID();\n const startTime = Date.now();\n const workingTimeout = this.config.workingTimeout || 120000; // 120s max per PR #78\n\n // Auto-generate idempotency_key for mutating tasks when the caller didn't\n // supply one. The key lives on TaskState so internal retries reuse it —\n // re-generating on retry defeats the whole point of the envelope.\n // `options.skipIdempotencyAutoInject` disables this for compliance testing\n // that needs to exercise server-side missing-key behavior.\n const idempotencyKey = options.skipIdempotencyAutoInject ? undefined : resolveIdempotencyKey(taskName, params);\n if (idempotencyKey && params && typeof params === 'object' && !params.idempotency_key) {\n params = { ...params, idempotency_key: idempotencyKey };\n }\n\n // Register task in active tasks\n const taskState: TaskState = {\n taskId,\n taskName,\n params,\n status: 'pending',\n messages: [],\n startTime,\n attempt: 0,\n maxAttempts: options.maxClarifications || this.config.defaultMaxClarifications || 3,\n options,\n agent: { id: agent.id, name: agent.name, protocol: agent.protocol },\n idempotencyKey,\n };\n this.activeTasks.set(taskId, taskState);\n\n // Emit task creation event\n this.emitTaskEvent(\n {\n taskId,\n status: 'submitted',\n taskType: taskName,\n createdAt: startTime,\n updatedAt: startTime,\n },\n agent.id\n );\n\n // Start streaming connection\n const debugLogs: any[] = [];\n\n // Generate webhook URL if template is configured\n const webhookUrl = this.generateWebhookUrl(taskName, taskId, options);\n\n // Governance state (scoped outside try so catch can access)\n let governanceCheckId: string | undefined;\n let governanceResult: GovernanceCheckResult | undefined;\n let effectiveParams = params;\n\n try {\n // Emit protocol_request activity. The activity payload is the boundary\n // callers typically pipe into external observability stacks, so redact\n // the idempotency key — it's a retry-pattern oracle within the seller's\n // TTL. Full logging is opt-in via ADCP_LOG_IDEMPOTENCY_KEYS=1.\n await this.config.onActivity?.({\n type: 'protocol_request',\n operation_id: taskId,\n agent_id: agent.id,\n context_id: options.contextId,\n task_id: taskId,\n task_type: taskName,\n status: 'pending',\n payload: { params: redactIdempotencyKeyInArgs(params) },\n timestamp: new Date().toISOString(),\n });\n\n // Run governance check if configured for this tool\n if (this.governanceMiddleware?.requiresCheck(taskName)) {\n const { result: govResult, params: adjustedParams } = await this.governanceMiddleware.checkProposed(\n taskName,\n params,\n debugLogs\n );\n\n // Governance always blocks on denial/unapplied conditions.\n const isBlocking = true;\n\n if (govResult.status === 'denied' && isBlocking) {\n const denied = this.buildGovernanceResult<T>(govResult, taskId, taskName, agent, startTime, debugLogs);\n this.updateTaskStatus(taskId, 'governance-denied', undefined, denied.error);\n return attachMatch(denied);\n }\n\n if (govResult.status === 'conditions' && !govResult.conditionsApplied && isBlocking) {\n const denied = this.buildGovernanceResult<T>(govResult, taskId, taskName, agent, startTime, debugLogs);\n this.updateTaskStatus(taskId, 'governance-denied', undefined, denied.error);\n return attachMatch(denied);\n }\n\n // Approved, or non-blocking mode (advisory/audit) allows execution to proceed\n governanceCheckId = govResult.checkId;\n governanceResult = govResult;\n effectiveParams = adjustedParams;\n }\n\n // Create initial message (uses effectiveParams which may have governance-applied conditions)\n const initialMessage: Message = {\n id: randomUUID(),\n role: 'user',\n content: { tool: taskName, params: effectiveParams },\n timestamp: new Date().toISOString(),\n metadata: { toolName: taskName, type: 'request' },\n };\n\n // Send initial request and get streaming response with webhook URL.\n // Pass the caller's A2A session ids (contextId for conversation binding,\n // taskId for resuming a non-terminal server-side task). The adapter\n // drops these on the wire for MCP (no session concept there).\n const response = await ProtocolClient.callTool(agent, taskName, effectiveParams, {\n debugLogs,\n webhookUrl,\n webhookSecret: this.config.webhookSecret,\n serverVersion,\n session: { contextId: options.contextId, taskId: options.taskId },\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: options.transport ?? this.config.transport,\n signal: options.signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n operationId: taskId,\n taskId: options.taskId ?? taskId,\n contextId: options.contextId,\n idempotencyKey,\n },\n });\n\n // Emit protocol_response activity\n const respStatus = this.responseParser.getStatus(response) as string | undefined;\n await this.config.onActivity?.({\n type: 'protocol_response',\n operation_id: taskId,\n agent_id: agent.id,\n context_id: options.contextId,\n task_id: taskId,\n task_type: taskName,\n status: respStatus,\n payload: response,\n timestamp: new Date().toISOString(),\n });\n\n // Add initial response message\n const responseMessage: Message = {\n id: randomUUID(),\n role: 'agent',\n content: response,\n timestamp: new Date().toISOString(),\n metadata: { toolName: taskName, type: 'response' },\n };\n\n const messages = [initialMessage, responseMessage];\n\n // Handle response based on status\n const result = await this.handleAsyncResponse<T>(\n agent,\n taskId,\n taskName,\n effectiveParams,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n // Attach governance check result to the task result\n if (governanceResult) {\n result.governance = governanceResult;\n }\n\n // Report governance outcome if we had a governance check.\n // For async tasks (submitted/working), outcome reporting is deferred —\n // the caller reports via client.reportGovernanceOutcome() when the\n // task resolves through polling or webhooks.\n if (governanceCheckId && this.governanceMiddleware) {\n const govCtx = governanceResult?.governanceContext;\n if (result.status === 'completed' && govCtx) {\n result.governanceOutcome = await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'completed',\n result.data as Record<string, unknown> | undefined,\n undefined,\n debugLogs,\n govCtx\n );\n if (!result.governanceOutcome) {\n result.governanceOutcomeError = 'Outcome reporting to governance agent failed';\n }\n } else if (result.error && govCtx) {\n result.governanceOutcome = await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'failed',\n undefined,\n { message: result.error },\n debugLogs,\n govCtx\n );\n if (!result.governanceOutcome) {\n result.governanceOutcomeError = 'Outcome reporting to governance agent failed';\n }\n } else if (result.status === 'submitted' || result.status === 'working') {\n // Attach the check ID so callers can report outcome after async resolution\n result.governance = { ...(result.governance ?? {}), checkId: governanceCheckId } as GovernanceCheckResult;\n }\n }\n\n if (\n ['completed', 'failed', 'rejected', 'canceled', 'governance-denied', 'aborted'].includes(result.status) &&\n this.activeTasks.get(taskId)?.status !== result.status\n ) {\n this.updateTaskStatus(taskId, result.status as TaskStatus, result.data, result.error);\n }\n return attachMatch(result);\n } catch (error) {\n if (isAbortOrTimeoutError(error)) {\n if (idempotencyKey && error && typeof error === 'object') {\n (error as Error & { idempotency_key?: string; idempotencyKey?: string }).idempotency_key = idempotencyKey;\n (error as Error & { idempotency_key?: string; idempotencyKey?: string }).idempotencyKey = idempotencyKey;\n }\n this.updateTaskStatus(taskId, 'aborted', undefined, error instanceof Error ? error.message : String(error));\n throw error;\n }\n\n // Report failed outcome on error\n if (governanceCheckId && this.governanceMiddleware && governanceResult?.governanceContext) {\n await this.governanceMiddleware.reportOutcome(\n governanceCheckId,\n 'failed',\n undefined,\n { message: (error as Error).message },\n debugLogs,\n governanceResult.governanceContext\n );\n }\n const failed = this.createErrorResult<T>(taskId, agent, error, debugLogs, startTime);\n this.updateTaskStatus(taskId, 'failed', undefined, failed.error);\n return attachMatch(failed);\n }\n }\n\n /**\n * Handle agent response based on ADCP status (PR #78)\n */\n private buildGovernanceResult<T>(\n govResult: GovernanceCheckResult,\n taskId: string,\n taskName: string,\n agent: AgentConfig,\n startTime: number,\n debugLogs: any[]\n ): TaskResult<T> {\n return {\n success: false,\n status: 'governance-denied',\n error: govResult.explanation || 'Governance governance-denied',\n governance: govResult,\n metadata: this.buildMetadata({ taskId, taskName, agent, startTime, status: 'governance-denied' }),\n conversation: [],\n debug_logs: debugLogs,\n };\n }\n\n private async handleAsyncResponse<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n response: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n const status = this.responseParser.getStatus(response) as ADCPStatus;\n\n switch (status) {\n case ADCP_STATUS.COMPLETED:\n // Task completed immediately\n const completedData = this.extractResponseData(response, debugLogs, taskName);\n this.updateTaskStatus(taskId, 'completed', completedData);\n\n const operationSuccess = this.isOperationSuccess(completedData, taskName);\n\n // Validate response against AdCP schema - validate extracted data, not protocol wrapper\n const validationResult = this.validateResponseSchema(completedData, taskName, debugLogs);\n\n // In strict mode, schema validation failures cause task to fail\n const finalSuccess = operationSuccess && validationResult.valid;\n const finalError = !finalSuccess\n ? validationResult.errors.length > 0\n ? `Schema validation failed: ${validationResult.errors.join('; ')}`\n : this.extractOperationError(completedData)\n : undefined;\n\n if (finalSuccess) {\n return {\n success: true as const,\n status: 'completed' as const,\n data: completedData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'completed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n const completedAdcpError = extractAdcpErrorInfo(completedData);\n return {\n success: false as const,\n status: 'failed' as const,\n data: completedData,\n error: finalError ?? 'Unknown error',\n adcpError: completedAdcpError,\n errorInstance: this.buildErrorInstance(taskId, completedAdcpError),\n correlationId: extractCorrelationId(completedData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n\n case ADCP_STATUS.WORKING:\n // Server is processing - keep connection open for up to 120s\n return this.waitForWorkingCompletion<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n case ADCP_STATUS.SUBMITTED:\n // Long-running task - set up webhook\n return this.setupSubmittedTask<T>(agent, taskId, taskName, response, messages, options, debugLogs, startTime);\n\n case ADCP_STATUS.INPUT_REQUIRED:\n // Server needs input - handler is mandatory\n return this.handleInputRequired<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n\n case ADCP_STATUS.FAILED:\n case ADCP_STATUS.REJECTED:\n case ADCP_STATUS.CANCELED: {\n const failedData = this.extractResponseData(response, debugLogs, taskName);\n const adcpErrorInfo = extractAdcpErrorInfo(failedData);\n const hasStructuredError = !!adcpErrorInfo;\n const failedError = hasStructuredError\n ? this.extractOperationError(failedData)\n : response.error || response.message || `Task ${status}`;\n // Preserve failedData whenever the server returned a structured\n // payload — not just when extractAdcpErrorInfo recognizes an\n // `adcp_error`/`errors` envelope. Tool-level error shapes like\n // `comply_test_controller`'s `{ success: false, error: 'UNKNOWN_SCENARIO' }`\n // don't match that extractor but still carry the information\n // storyboard validators read (`success`, `error_code`, etc.).\n // Only drop `data` when there's literally no structured payload —\n // i.e. falsy or an empty object.\n const hasStructuredPayload =\n failedData != null &&\n typeof failedData === 'object' &&\n (Array.isArray(failedData) || Object.keys(failedData).length > 0);\n return {\n success: false as const,\n status: 'failed' as const,\n data: hasStructuredError || hasStructuredPayload ? failedData : undefined,\n error: typeof failedError === 'string' ? failedError : `Task ${status}`,\n adcpError: adcpErrorInfo,\n errorInstance: this.buildErrorInstance(taskId, adcpErrorInfo),\n correlationId: extractCorrelationId(failedData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n default:\n // Unknown status - treat as completed if we have data\n const defaultData = this.extractResponseData(response, debugLogs, taskName);\n if (\n defaultData &&\n (defaultData !== response || response.structuredContent || response.result || response.data)\n ) {\n const defaultSuccess = this.isOperationSuccess(defaultData, taskName);\n\n // Validate response against AdCP schema - validate extracted data, not protocol wrapper\n const defaultValidation = this.validateResponseSchema(defaultData, taskName, debugLogs);\n\n // In strict mode, schema validation failures cause task to fail\n const defaultFinalSuccess = defaultSuccess && defaultValidation.valid;\n const defaultFinalError = !defaultFinalSuccess\n ? defaultValidation.errors.length > 0\n ? `Schema validation failed: ${defaultValidation.errors.join('; ')}`\n : this.extractOperationError(defaultData)\n : undefined;\n\n if (defaultFinalSuccess) {\n return {\n success: true as const,\n status: 'completed' as const,\n data: defaultData,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'completed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n const defaultAdcpError = extractAdcpErrorInfo(defaultData);\n return {\n success: false as const,\n status: 'failed' as const,\n data: defaultData,\n error: defaultFinalError!,\n adcpError: defaultAdcpError,\n errorInstance: this.buildErrorInstance(taskId, defaultAdcpError),\n correlationId: extractCorrelationId(defaultData),\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'failed',\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n } else {\n throw new Error(`Unknown status: ${status || 'undefined'}`);\n }\n }\n }\n\n /**\n * Extract response data from different protocol formats\n *\n * @internal Exposed for testing purposes\n */\n public extractResponseData(response: any, debugLogs?: any[], toolName?: string): any {\n // MCP error responses (isError: true) flow through here — the response unwrapper\n // extracts structured data (adcp_error, context, ext) from structuredContent or text\n\n // Use the shared response unwrapper utility\n // This handles MCP structuredContent, A2A artifacts (including HITL multi-artifact responses),\n // and various edge cases consistently\n try {\n // Log what type of response we're processing BEFORE unwrapping\n // This ensures we have debug visibility even if unwrapping fails\n if (response?.structuredContent) {\n this.logDebug(debugLogs, 'info', 'Processing MCP structuredContent response');\n } else if (response?.result?.artifacts) {\n const artifacts = response.result.artifacts;\n if (artifacts.length === 0) {\n this.logDebug(debugLogs, 'info', 'Processing A2A response with empty artifacts array');\n } else {\n // Calculate total part count across all artifacts\n const totalParts = artifacts.reduce((sum: number, artifact: any) => {\n return sum + (artifact.parts?.length || 0);\n }, 0);\n\n // Extract canonical DataPart keys for debugging.\n const latestDataPart = getLatestA2ADataPartFromResponse(response);\n const dataKeys = latestDataPart?.data ? Object.keys(latestDataPart.data) : [];\n\n this.logDebug(debugLogs, 'info', 'Processing A2A artifact structure', {\n artifactCount: artifacts.length,\n partCount: totalParts,\n extractedFrom: artifacts.length > 1 ? 'multi-artifact (HITL)' : 'single-artifact',\n dataKeys,\n });\n }\n } else if (response?.data) {\n this.logDebug(debugLogs, 'info', 'Processing response.data field');\n } else {\n this.logDebug(debugLogs, 'info', 'Processing response without standard structure', {\n responseKeys: Object.keys(response || {}),\n });\n }\n\n // Now unwrap the response\n const unwrapped = unwrapProtocolResponse(response, toolName, undefined, {\n filterInvalidProducts: this.config.filterInvalidProducts,\n ...(this.responseAdcpVersionForValidation() && {\n responseAdcpVersion: this.responseAdcpVersionForValidation(),\n }),\n });\n\n // Log successful extraction with result details\n if (response?.structuredContent) {\n this.logDebug(debugLogs, 'info', 'Successfully extracted MCP data', {\n dataKeys: Object.keys(unwrapped || {}),\n });\n } else if (response?.result?.artifacts && response.result.artifacts.length > 0) {\n this.logDebug(debugLogs, 'info', 'Successfully extracted A2A data', {\n dataKeys: Object.keys(unwrapped || {}),\n });\n }\n\n return unwrapped;\n } catch (error) {\n this.logDebug(debugLogs, 'warning', 'Response unwrapper failed', {\n error: error instanceof Error ? error.message : String(error),\n toolName,\n responseKeys: Object.keys(response || {}),\n });\n\n // If toolName was provided, schema validation may have caused the failure.\n // Retry without toolName to extract the payload without schema checks.\n if (toolName) {\n try {\n return unwrapProtocolResponse(response);\n } catch {\n // Unwrapping itself failed — fall through to raw response\n }\n }\n\n return response;\n }\n }\n\n /**\n * Check if extracted response data represents a successful operation.\n * Handles singular `error`, plural `errors` (AdCP schema), and `success: false`.\n */\n private isOperationSuccess(data: any, taskName?: string): boolean {\n return data?.success !== false && !data?.error && !data?.adcp_error && !isTerminalAdcpError(data, taskName);\n }\n\n /**\n * Extract a human-readable error message from response data.\n * Handles singular `error`, plural `errors` array, and `message` field.\n */\n private extractOperationError(data: any): string {\n if (data?.adcp_error) {\n const ae = data.adcp_error;\n return ae.message ? `${ae.code}: ${ae.message}` : ae.code;\n }\n return (\n data?.error ||\n (isAdcpError(data) ? data.errors.map((e: any) => e.message || e.code).join('; ') : null) ||\n data?.message ||\n 'Operation failed'\n );\n }\n\n /**\n * Helper to add debug logs safely\n */\n private logDebug(debugLogs: any[] | undefined, type: string, message: string, details?: any) {\n if (debugLogs && Array.isArray(debugLogs)) {\n debugLogs.push({\n type,\n message,\n timestamp: new Date().toISOString(),\n details,\n });\n }\n }\n\n /**\n * Handle 'working' status - return as valid intermediate state\n */\n private async waitForWorkingCompletion<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n initialResponse: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Extract any data that came with the working response\n const partialData = this.extractResponseData(initialResponse, debugLogs, taskName);\n const metadata = this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'working',\n response: initialResponse,\n });\n this.compactIntermediateTaskState(taskId, 'working');\n\n // Return working status immediately - this is a valid intermediate state\n // Callers can use the taskId to poll for completion or set up webhooks\n return {\n success: true, // The task is progressing, not failed\n status: 'working',\n data: partialData,\n metadata,\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n /**\n * Set up submitted task with webhook\n */\n private async setupSubmittedTask<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n response: any,\n messages: Message[],\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Extract any data that came with the submitted response\n const partialData = this.extractResponseData(response, debugLogs, taskName);\n\n let webhookUrl = response.webhookUrl;\n\n // If no webhook URL provided by server, generate one. The webhook URL\n // macro path uses the local `taskId` (the runner-side correlation id\n // that doubles as the `{operation_id}` macro value), not the server\n // handle — webhook URLs identify the buyer-side request, not the\n // seller-side task.\n if (!webhookUrl && this.config.webhookManager) {\n webhookUrl = this.config.webhookManager.generateUrl(taskId);\n await this.config.webhookManager.registerWebhook(agent, taskId, webhookUrl);\n }\n\n // Polling and the buyer-facing `SubmittedContinuation.taskId` use the\n // SERVER-assigned task handle, not the runner's local UUID. The local\n // UUID is the `activeTasks` map key and the `{operation_id}` webhook\n // macro value — it never reaches the seller. The server handle comes\n // from `response.task_id` / `response.data.task_id` (AdCP submitted-arm\n // wire fields) or, for A2A responses, the same handle surfaced via\n // metadata (`adcp_task_id` / `serverTaskId`) before falling back to the\n // transport `result.id` / `taskId`. `responseParser.getTaskId` walks these\n // shapes.\n //\n // When the seller violated the spec and didn't include a task handle\n // we fall back to the local UUID so the buyer at least gets a\n // non-undefined `taskId` field. The polling cycle won't be able to\n // locate the work in this state — log an advisory so operators\n // grepping debug logs can pinpoint the seller-side spec violation.\n const extractedServerTaskId = this.responseParser.getTaskId(response);\n const serverTaskId = extractedServerTaskId ?? taskId;\n // Snapshot only what continuations need. Referencing `options.transport`\n // inside either closure would retain the entire per-call options object,\n // including unrelated adopter metadata, for as long as the continuation\n // remains reachable.\n const pollingTransport = options.transport;\n if (!extractedServerTaskId) {\n debugLogs.push({\n type: 'warning',\n message:\n 'Submitted-arm response omitted task_id (spec violation). Polling will use the runner-side ' +\n 'correlation id as a fallback; the seller will not recognize it. ' +\n 'Expected: response.task_id / response.data.task_id (AdCP), A2A metadata.serverTaskId, ' +\n 'A2A metadata.adcp_task_id, or result.id with kind === \"task\" (A2A wrapped).',\n timestamp: new Date().toISOString(),\n taskName,\n runnerTaskId: taskId,\n });\n }\n\n const submitted: SubmittedContinuation<T> = {\n taskId: serverTaskId,\n webhookUrl,\n track: async (transport?: import('../protocols').TransportOptions) => {\n const task = await this.getTaskStatus(agent, serverTaskId, transport ?? pollingTransport);\n if (['completed', 'failed', 'rejected', 'canceled'].includes(task.status)) {\n this.updateTaskStatus(taskId, task.status as TaskStatus, task.result, task.error);\n }\n return task;\n },\n waitForCompletion: async (pollInterval = 60000, signal?: AbortSignal) => {\n const completed = await this.pollTaskCompletion<T>(agent, serverTaskId, pollInterval, pollingTransport, signal);\n // `pollTaskCompletion` also returns paused input-required/auth-required\n // states. Preserve that status so callers can resume the seller task;\n // only genuinely terminal statuses trigger delayed state eviction.\n this.updateTaskStatus(taskId, completed.status as TaskStatus, completed.data, completed.error);\n return completed;\n },\n };\n\n const metadata = this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'submitted',\n response,\n });\n this.compactIntermediateTaskState(taskId, 'submitted');\n\n return {\n success: true, // The task is progressing, not failed\n status: 'submitted',\n submitted,\n data: partialData,\n metadata,\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n /**\n * A working/submitted response carries everything needed to poll externally.\n * Keeping the original request in activeTasks after dispatch would pin\n * inline assets, webhook credentials, conversation payloads, and per-call\n * options for an unbounded amount of time while the seller works. Retain\n * only lifecycle metadata and the separately tracked idempotency key.\n */\n private compactIntermediateTaskState(\n taskId: string,\n status: 'working' | 'submitted' | 'input-required' | 'auth-required' | 'deferred'\n ): void {\n const task = this.activeTasks.get(taskId);\n if (!task) return;\n task.status = status;\n task.params = undefined;\n task.messages = [];\n task.options = {};\n delete task.pendingInput;\n this.compactedTaskIds.delete(taskId);\n this.compactedTaskIds.set(taskId, true);\n while (this.compactedTaskIds.size > COMPACTED_TASK_STATE_LIMIT) {\n const oldest = this.compactedTaskIds.keys().next().value;\n if (oldest === undefined) break;\n this.compactedTaskIds.delete(oldest);\n this.activeTasks.delete(oldest);\n }\n }\n\n /**\n * Handle input-required status\n *\n * Some agents (like Yahoo) return input-required status. THIS IS TOTALLY VALID AND IS AN INTERMEDIATE STATE.\n * IT SHOULD NOT BE THROWING AN ERROR. IT DOES NOT ALWAYS REQUIRE an input handler.\n * This is common for HITL (human-in-the-loop) workflows where the agent has already processed\n * the request and is just signaling that async approval may be needed.\n */\n private async handleInputRequired<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n response: any,\n messages: Message[],\n inputHandler?: InputHandler,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n const inputRequest = this.responseParser.parseInputRequest(response);\n\n // If no handler provided, return input-required status as a valid intermediate state\n // This allows callers to handle the input-required state themselves (e.g., HITL workflows)\n if (!inputHandler) {\n // Extract any data that came with the response (some agents include partial results)\n const partialData = this.extractResponseData(response, debugLogs, taskName);\n const metadata = this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'input-required',\n response,\n inputRequest,\n });\n this.compactIntermediateTaskState(taskId, 'input-required');\n\n return {\n success: true, // The task is progressing, not failed\n status: 'input-required',\n data: partialData,\n metadata,\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n // Build context for handler\n const context: ConversationContext = {\n messages,\n inputRequest,\n taskId,\n agent: { id: agent.id, name: agent.name, protocol: agent.protocol },\n attempt: 1,\n maxAttempts: options.maxClarifications || 3,\n deferToHuman: async () => ({ defer: true, token: randomUUID() }),\n abort: reason => {\n throw new Error(reason || 'Task aborted');\n },\n getSummary: () => messages.map(m => `${m.role}: ${JSON.stringify(m.content)}`).join('\\n'),\n wasFieldDiscussed: field =>\n // Check if any agent message requested this field via input-required\n messages.some(\n m =>\n m.role === 'agent' &&\n m.content &&\n typeof m.content === 'object' &&\n 'field' in m.content &&\n (m.content as Record<string, unknown>).field === field\n ),\n getPreviousResponse: field => {\n // Find the agent message that requested this field\n const fieldRequestIndex = messages.findIndex(\n m =>\n m.role === 'agent' &&\n m.content &&\n typeof m.content === 'object' &&\n 'field' in m.content &&\n (m.content as Record<string, unknown>).field === field\n );\n // The response is the next user message after the field request\n if (fieldRequestIndex >= 0) {\n const responseMsg = messages\n .slice(fieldRequestIndex + 1)\n .find(m => m.role === 'user' && m.metadata?.type === 'input_response');\n return responseMsg?.content;\n }\n return undefined;\n },\n };\n\n // Call handler\n const handlerResponse = await inputHandler(context);\n\n // Check if handler wants to defer\n if (isDeferResponse(handlerResponse)) {\n const token = handlerResponse.token;\n\n // Save deferred state for later resumption\n if (this.config.deferredStorage) {\n await this.config.deferredStorage.set(token, {\n taskId,\n contextId: response.contextId || taskId,\n agent,\n taskName,\n params,\n messages,\n createdAt: Date.now(),\n });\n }\n // Deferred storage is the resume source of truth. Avoid retaining a\n // duplicate full request (including assets/credentials) in activeTasks.\n this.compactIntermediateTaskState(taskId, 'deferred');\n\n const deferred: DeferredContinuation<T> = {\n token,\n question: inputRequest.question,\n resume: input => this.resumeDeferredTask<T>(token, input),\n };\n\n return {\n success: true, // The task is progressing, not failed\n status: 'deferred',\n deferred,\n metadata: this.buildMetadata({\n taskId,\n taskName,\n agent,\n startTime,\n status: 'deferred',\n clarificationRounds: 1,\n response,\n }),\n conversation: messages,\n debug_logs: debugLogs,\n };\n }\n\n // Handler provided input - continue with the task\n return this.continueTaskWithInput<T>(\n agent,\n taskId,\n taskName,\n params,\n response.contextId,\n handlerResponse,\n messages,\n inputHandler, // Pass handler for multi-round clarification\n options,\n debugLogs,\n startTime\n );\n }\n\n /**\n * List tasks for an agent, preferring MCP Tasks protocol when available.\n */\n private async listTasksForAgent(\n agent: AgentConfig,\n transport?: import('../protocols').TransportOptions\n ): Promise<TaskInfo[]> {\n // Try MCP Tasks protocol method first\n if (agent.protocol === 'mcp') {\n const authToken = getAuthToken(agent);\n try {\n return await listMCPTasks(agent.agent_uri, authToken, undefined, {\n transport: transport ?? this.config.transport,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n agentId: agent.id,\n },\n });\n } catch (err) {\n if (is401Error(err)) throw err;\n // Fall through to tool call if protocol method is not supported\n }\n }\n const response = (await ProtocolClient.callTool(\n agent,\n 'tasks/list',\n {},\n {\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: transport ?? this.config.transport,\n onTransportActivity: this.config.onTransportActivity,\n }\n )) as Record<string, unknown>;\n return (response.tasks as TaskInfo[]) || [];\n }\n\n /**\n * Task tracking methods (PR #78)\n */\n async listTasks(agent: AgentConfig, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]> {\n try {\n return await this.listTasksForAgent(agent, transport);\n } catch {\n // Static message only — CodeQL's taint analysis treats `error` and\n // every property of it as sensitive once it originates from an\n // operation that touched `agent.oauth_client_credentials`. Surfaces\n // the failure occurred; full detail is available via DEBUG=adcp:*.\n console.warn('Failed to list tasks (see DEBUG=adcp:* logs for detail)');\n return [];\n }\n }\n\n private async getTaskStatusWithRawResponse(\n agent: AgentConfig,\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskStatusPollResult> {\n // AdCP `tasks/get` is the cross-protocol work-status interface\n // (`schemas/cache/<v>/bundled/core/tasks-get-{request,response}.json`).\n // MCP tool names cannot contain `/`, so MCP servers advertise the\n // SDK-owned `tasks_get` alias; A2A continues to use the spec slash name.\n //\n // The previous implementation tried MCP's `experimental.tasks.getTask`\n // first for MCP agents and fell through to the AdCP tool path on\n // capability-missing. The native MCP path tracks the TRANSPORT-call\n // lifecycle (MCP analog of A2A `Task.state`) — not AdCP work\n // lifecycle. For submitted-arm polling we need work status; the\n // two interfaces are not substitutes, so we always use the AdCP\n // tool here. MCP sellers that haven't registered `tasks_get` as\n // an AdCP tool will surface a tool-not-found error rather than\n // silently polling the wrong lifecycle.\n //\n // The request param is `task_id` (snake_case per AdCP 3.0); the\n // response is the spec's flat shape, mapped to `TaskInfo` via\n // {@link mapTasksGetResponseToTaskInfo}.\n //\n //\n // Request includes `include_result: true` so spec-conformant\n // sellers (AdCP 3.1.0+) populate the typed `result` field on\n // `completed` responses (per adcontextprotocol/adcp#3126). Older\n // sellers ignore the unknown request field; the response mapper\n // falls back to the informal `additionalProperties` passthrough\n // for those.\n const toolName = agent.protocol === 'mcp' ? 'tasks_get' : 'tasks/get';\n const response = (await ProtocolClient.callTool(\n agent,\n toolName,\n { task_id: taskId, include_result: true },\n {\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: transport ?? this.config.transport,\n signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n taskId,\n },\n }\n )) as Record<string, unknown>;\n // We don't run `extractResponseData` here: that helper's\n // generic AdCP-error-arm detection treats any top-level\n // `error: { code, message }` as an error envelope and shreds the\n // response into `{ errors: [...] }`. For `tasks/get` the `error`\n // block is informational (the failed task's reason, not a\n // request rejection), so we map the raw response directly. The\n // mapper handles the AdCP-spec flat shape, the legacy\n // `{ task: ... }` nested wrapper, and MCP `structuredContent` /\n // A2A latest structured DataPart envelopes.\n return {\n task: mapTasksGetResponseToTaskInfo(response),\n rawResponse: response,\n };\n }\n\n async getTaskStatus(\n agent: AgentConfig,\n taskId: string,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskInfo> {\n return (await this.getTaskStatusWithRawResponse(agent, taskId, transport, signal)).task;\n }\n\n async pollTaskCompletion<T>(\n agent: AgentConfig,\n taskId: string,\n pollInterval = 60000,\n transport?: import('../protocols').TransportOptions,\n signal?: AbortSignal\n ): Promise<TaskResult<T>> {\n const pollStartTime = Date.now();\n while (true) {\n // adcp-client#1612: When the outer storyboard race timer fires, the\n // caller's AbortSignal is already aborted. Exit cleanly rather than\n // continuing to send `tasks/get` requests that nobody is waiting for.\n if (signal?.aborted) {\n const reason =\n signal.reason instanceof Error ? signal.reason.message : String(signal.reason ?? 'polling cancelled');\n // adcp-client#1617: Phase 1 — notify the seller so it can stop doing\n // work for a buyer that has already given up. A2A 0.3.0 §7.4 defines\n // tasks/cancel for exactly this case. Fire-and-forget: cancel failure\n // (TaskNotCancelable, network error, terminal-state race) is non-fatal.\n // TODO(adcp-client#1617-phase2): upgrade to awaited cancel once AdCP\n // spec defines a cross-protocol cancel verb.\n //\n // SECURITY: silent on rejection. The orphan rejection's `Error.message`\n // can carry an echoed transport response body — same trust-boundary\n // concern as `raceWithSignal` in `src/lib/testing/client.ts`. A buyer\n // who has already aborted MUST NOT see seller-controlled text leak\n // into their logs/telemetry. The outer try AND the `.catch(() => {})`\n // are both intentional: a malformed `agent_uri` could throw\n // synchronously from `fetch(...)` before the promise chain catches\n // it, so the try guards the dispatch path; the `.catch()` guards the\n // async settlement path.\n if (agent.protocol === 'a2a' && taskId && agent.agent_uri) {\n try {\n // adcp-client#1617 Phase 2: pass the full agent so cancelA2ATask\n // can sign the POST when agent.request_signing is configured.\n // signed-requests sellers no longer 401 the cancel.\n void cancelA2ATask(agent, taskId, (transport ?? this.config.transport)?.fetchFn).catch(() => {\n /* see SECURITY note above */\n });\n } catch {\n /* see SECURITY note above */\n }\n }\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: `tasks/get polling was cancelled before a terminal state was observed: ${reason}`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n }),\n });\n }\n\n // adcp-client#1585: A2A 0.3.x defines no minimum retention TTL for\n // completed tasks. A seller may evict a task between the buyer\n // observing the working-state response and the first explicit\n // `tasks/get` poll firing — `getTaskStatus` then throws with a\n // \"Task <id> not found\" message. Surface a descriptive `failed`\n // `TaskResult` so the caller sees an actionable error instead of an\n // opaque uncaught exception escaping from the polling loop.\n let status: TaskInfo;\n let rawResponse: Record<string, unknown> | undefined;\n try {\n const pollResult = await this.getTaskStatusWithRawResponse(agent, taskId, transport, signal);\n status = pollResult.task;\n rawResponse = pollResult.rawResponse;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Bounded `\\S{1,128}` task-id segment (no `.*`) keeps the match\n // linear-time on adversarial inputs — CodeQL flags unbounded\n // polynomial regex on uncontrolled error strings.\n if (/\\btask\\s+\\S{1,128}\\s+not found\\b/i.test(msg)) {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error: `Task ${taskId} is no longer queryable — it may have been completed and evicted by the seller before this poll arrived. Consider using push notifications (reporting_webhook) instead of polling, or configuring a longer task retention TTL on the seller.`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n }),\n });\n }\n throw err;\n }\n\n if (status.status === ADCP_STATUS.COMPLETED) {\n const pollSuccess = this.isOperationSuccess(status.result, status.taskType);\n\n if (pollSuccess) {\n return attachMatch({\n success: true as const,\n status: 'completed' as const,\n data: status.result,\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'completed',\n response: rawResponse,\n }),\n });\n }\n const asyncResultErr = extractAdcpErrorInfo(status.result);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: status.result,\n error: this.extractOperationError(status.result),\n adcpError: asyncResultErr,\n errorInstance: this.buildErrorInstance(taskId, asyncResultErr),\n correlationId: extractCorrelationId(status.result),\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n if (\n status.status === ADCP_STATUS.FAILED ||\n status.status === ADCP_STATUS.CANCELED ||\n status.status === ADCP_STATUS.REJECTED\n ) {\n const asyncFailedErr = extractAdcpErrorInfo(status.result);\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n data: status.result,\n error: status.error || status.message || `Task ${status.status}`,\n adcpError: asyncFailedErr,\n errorInstance: this.buildErrorInstance(taskId, asyncFailedErr),\n correlationId: extractCorrelationId(status.result),\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n // Paused states: `input-required` and `auth-required`. Polling\n // alone can't advance these — the buyer must satisfy the paused\n // condition (supply input / refresh auth) and retry the\n // original tool call. Return a `TaskResultIntermediate` so the\n // caller can branch on `result.status`; this mirrors the\n // synchronous `handleInputRequired` no-handler path\n // (`success: true` because the task is progressing, not failed).\n // Without this branch the loop would spin until timeout — the\n // paused-state regression class flagged by adcp-client#977.\n if (status.status === ADCP_STATUS.INPUT_REQUIRED || status.status === ADCP_STATUS.AUTH_REQUIRED) {\n return attachMatch({\n success: true as const,\n status: status.status,\n data: status.result as T,\n metadata: this.buildMetadata({\n taskId,\n taskName: status.taskType,\n agent,\n responseTimeMs: Date.now() - status.createdAt,\n status: status.status,\n response: rawResponse,\n }),\n });\n }\n\n // adcp-client#1612: `status: 'unknown'` means `mapTasksGetResponseToTaskInfo`\n // could not extract a recognizable status string from the response — the\n // seller's `tasks/get` response did not conform to any expected envelope\n // shape (flat AdCP, MCP structuredContent, or A2A DataPart artifact).\n // Continuing to poll would spin forever since the shape won't change.\n // Surface a descriptive failure so the storyboard runner reports the\n // seller's non-conformance rather than burning the outer timeout budget.\n if (status.status === 'unknown') {\n return attachMatch({\n success: false as const,\n status: 'failed' as const,\n error:\n `tasks/get returned an unrecognizable response (parsed status: \"unknown\", taskId: \"${status.taskId}\"). ` +\n `The seller may not implement tasks/get as an AdCP skill, or its response did not match any ` +\n `supported envelope shape (flat AdCP, MCP structuredContent, or A2A DataPart artifact).`,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime: pollStartTime,\n status: 'failed',\n response: rawResponse,\n }),\n });\n }\n\n await this.sleep(pollInterval);\n // Re-check after sleep so a signal that fired mid-sleep exits at the top\n // of the next iteration rather than issuing one more `getTaskStatus` call.\n if (signal?.aborted) continue;\n }\n }\n\n /**\n * Resume a deferred task (client deferral)\n */\n async resumeDeferredTask<T>(token: string, input: any): Promise<TaskResult<T>> {\n if (!this.config.deferredStorage) {\n throw new Error('Deferred storage not configured');\n }\n\n const state = await this.config.deferredStorage.get(token);\n if (!state) {\n throw new Error(`Deferred task not found: ${token}`);\n }\n\n try {\n // Continue task with the provided input (no handler for resumed deferred tasks)\n const resumed = await this.continueTaskWithInput<T>(\n state.agent,\n state.taskId,\n state.taskName,\n state.params,\n state.contextId,\n input,\n state.messages,\n undefined // No handler for deferred tasks - input was provided by human\n );\n const remainsPaused = ['input-required', 'auth-required', 'deferred'].includes(resumed.status);\n if (\n ['completed', 'failed', 'rejected', 'canceled', 'governance-denied', 'aborted'].includes(resumed.status) &&\n this.activeTasks.get(state.taskId)?.status !== resumed.status\n ) {\n this.updateTaskStatus(state.taskId, resumed.status as TaskStatus, resumed.data, resumed.error);\n }\n if (!remainsPaused) {\n await this.config.deferredStorage.delete(token);\n }\n return attachMatch(resumed);\n } catch (error) {\n // A thrown continuation failure is terminal for this deferred token.\n // Release both persistence and the in-memory request payload before the\n // error escapes to the caller.\n this.updateTaskStatus(state.taskId, 'failed', undefined, error instanceof Error ? error.message : String(error));\n try {\n await this.config.deferredStorage.delete(token);\n } catch {\n // Local request compaction above is the safety boundary. Preserve the\n // original continuation/delete error if external cleanup also fails.\n }\n throw error;\n }\n }\n\n /**\n * Continue a task after receiving input\n */\n private async continueTaskWithInput<T>(\n agent: AgentConfig,\n taskId: string,\n taskName: string,\n params: any,\n contextId: string,\n input: any,\n messages: Message[],\n inputHandler: InputHandler | undefined,\n options: TaskOptions = {},\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): Promise<TaskResult<T>> {\n // Add user input message\n const inputMessage: Message = {\n id: randomUUID(),\n role: 'user',\n content: input,\n timestamp: new Date().toISOString(),\n metadata: { type: 'input_response' },\n };\n messages.push(inputMessage);\n\n // Continue the task with input\n const response = await ProtocolClient.callTool(\n agent,\n 'continue_task',\n {\n contextId,\n input,\n },\n {\n debugLogs,\n serverVersion: this.lastKnownServerVersion,\n adcpVersion: this.config.adcpVersion,\n ...(this.config.wireAdcpVersion !== undefined && { wireAdcpVersion: this.config.wireAdcpVersion }),\n ...(this.config.versionEnvelope !== undefined && { versionEnvelope: this.config.versionEnvelope }),\n transport: options.transport ?? this.config.transport,\n signal: options.signal,\n onTransportActivity: this.config.onTransportActivity,\n transportActivityContext: {\n operationId: taskId,\n taskId,\n contextId,\n },\n }\n );\n\n // Add response message\n const responseMessage: Message = {\n id: randomUUID(),\n role: 'agent',\n content: response,\n timestamp: new Date().toISOString(),\n metadata: { type: 'continued_response' },\n };\n messages.push(responseMessage);\n\n // Handle the continued response (pass inputHandler for multi-round clarification)\n return this.handleAsyncResponse<T>(\n agent,\n taskId,\n taskName,\n params,\n response,\n messages,\n inputHandler,\n options,\n debugLogs,\n startTime\n );\n }\n\n /**\n * Utility methods\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private createErrorResult<T>(\n taskId: string,\n agent: AgentConfig,\n error: any,\n debugLogs: any[] = [],\n startTime: number = Date.now()\n ): TaskResult<T> {\n // Try to extract structured error info from transport exceptions\n // (e.g., JSON-RPC errors with data.adcp_error)\n const transportData = error?.data || error?.response?.data;\n const adcpErrorInfo = extractAdcpErrorInfo(transportData);\n const correlationId = extractCorrelationId(transportData);\n\n return {\n success: false as const,\n status: 'failed' as const,\n error: error.message || String(error),\n adcpError: adcpErrorInfo,\n errorInstance: this.buildErrorInstance(taskId, adcpErrorInfo),\n correlationId,\n metadata: this.buildMetadata({\n taskId,\n taskName: 'unknown',\n agent,\n startTime,\n status: 'failed',\n }),\n debug_logs: debugLogs,\n };\n }\n\n /**\n * Legacy methods for backward compatibility\n */\n getConversationHistory(taskId: string): Message[] | undefined {\n return this.conversationStorage?.get(taskId);\n }\n\n clearConversationHistory(taskId: string): void {\n this.conversationStorage?.delete(taskId);\n }\n\n getActiveTasks(): TaskState[] {\n return Array.from(this.activeTasks.values());\n }\n\n // ====== TASK MANAGEMENT & NOTIFICATION METHODS ======\n\n private taskEventListeners = new Map<\n string,\n {\n callback: (task: TaskInfo) => void;\n agentId?: string;\n }[]\n >();\n\n private webhookRegistrations = new Map<\n string,\n {\n agent: AgentConfig;\n webhookUrl: string;\n taskTypes?: string[];\n }\n >();\n\n /**\n * Get task list for a specific agent\n */\n async getTaskList(agentId: string, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]> {\n // First try to get from agent via protocol\n const agent = this.findAgentById(agentId);\n if (agent) {\n try {\n return await this.listTasksForAgent(agent, transport);\n } catch {\n // Static message — see comment on listTasks above.\n console.warn('Failed to get remote task list (see DEBUG=adcp:* logs for detail)');\n }\n }\n\n // Fall back to local active tasks\n return Array.from(this.activeTasks.values())\n .filter(task => task.agent.id === agentId)\n .map(task => ({\n taskId: task.taskId,\n status: task.status,\n taskType: task.taskName,\n createdAt: task.startTime,\n updatedAt: task.startTime, // TODO: track updates\n }));\n }\n\n /**\n * Get detailed information about a specific task\n */\n async getTaskInfo(taskId: string): Promise<TaskInfo | null> {\n const localTask = this.activeTasks.get(taskId);\n if (localTask) {\n if (this.compactedTaskIds.has(taskId)) {\n this.compactedTaskIds.delete(taskId);\n this.compactedTaskIds.set(taskId, true);\n }\n return {\n taskId: localTask.taskId,\n status: localTask.status,\n taskType: localTask.taskName,\n createdAt: localTask.startTime,\n updatedAt: localTask.startTime,\n };\n }\n\n // Try to get from agent\n // Note: Would need to know which agent to query\n return null;\n }\n\n /**\n * Subscribe to task updates for a specific agent\n */\n onTaskUpdate(agentId: string, callback: (task: TaskInfo) => void): () => void {\n const listenerId = randomUUID();\n const listeners = this.taskEventListeners.get(listenerId) || [];\n listeners.push({ callback, agentId });\n this.taskEventListeners.set(listenerId, listeners);\n\n return () => {\n this.taskEventListeners.delete(listenerId);\n };\n }\n\n /**\n * Subscribe to task events with detailed callbacks\n */\n onTaskEvents(\n agentId: string,\n callbacks: {\n onTaskCreated?: (task: TaskInfo) => void;\n onTaskUpdated?: (task: TaskInfo) => void;\n onTaskCompleted?: (task: TaskInfo) => void;\n onTaskFailed?: (task: TaskInfo, error: string) => void;\n }\n ): () => void {\n const unsubscribeFns: (() => void)[] = [];\n\n // Create combined handler that routes to specific callbacks\n const handler = (task: TaskInfo) => {\n switch (task.status) {\n case 'submitted':\n case 'working':\n callbacks.onTaskCreated?.(task);\n break;\n case 'input-required':\n callbacks.onTaskUpdated?.(task);\n break;\n case 'completed':\n callbacks.onTaskCompleted?.(task);\n break;\n case 'failed':\n case 'rejected':\n case 'canceled':\n callbacks.onTaskFailed?.(task, task.error || `Task ${task.status}`);\n break;\n default:\n callbacks.onTaskUpdated?.(task);\n }\n };\n\n unsubscribeFns.push(this.onTaskUpdate(agentId, handler));\n\n return () => {\n unsubscribeFns.forEach(fn => fn());\n };\n }\n\n /**\n * Register webhook for task notifications\n */\n async registerWebhook(agent: AgentConfig, webhookUrl: string, taskTypes?: string[]): Promise<void> {\n this.webhookRegistrations.set(agent.id, {\n agent,\n webhookUrl,\n taskTypes,\n });\n\n // TODO: Register with remote agent if it supports webhooks\n console.log(`Webhook registered for agent ${agent.id}: ${webhookUrl}`);\n }\n\n /**\n * Unregister webhook notifications\n */\n async unregisterWebhook(agent: AgentConfig): Promise<void> {\n this.webhookRegistrations.delete(agent.id);\n console.log(`Webhook unregistered for agent ${agent.id}`);\n }\n\n /**\n * Emit task event to listeners\n */\n private emitTaskEvent(task: TaskInfo, agentId?: string): void {\n this.taskEventListeners.forEach(listeners => {\n listeners.forEach(({ callback, agentId: listenerAgentId }) => {\n if (!listenerAgentId || listenerAgentId === agentId) {\n try {\n callback(task);\n } catch (error) {\n console.error('Error in task event callback:', error instanceof Error ? error.message : 'unknown error');\n }\n }\n });\n });\n }\n\n /**\n * Normalize response data for schema validation\n *\n * Converts v2-style responses to v3 format before validation.\n * This ensures validation passes for both v2 and v3 server responses.\n */\n private normalizeResponseForValidation(response: any, taskName: string): any {\n if (!response) return response;\n\n // Strip underscore-prefixed client-side annotations (`_message` is added\n // by the response unwrapper, others may follow). Schemas with\n // `additionalProperties: false` (create-property-list-response, etc.)\n // would otherwise reject every response that reaches the grader's\n // schema check — the annotation is not part of the wire protocol.\n const stripped: Record<string, unknown> = {};\n if (typeof response === 'object' && !Array.isArray(response)) {\n for (const [k, v] of Object.entries(response)) {\n if (!k.startsWith('_')) stripped[k] = v;\n }\n } else {\n return taskName === 'get_products' ? normalizeGetProductsResponse(response) : response;\n }\n\n switch (taskName) {\n case 'get_products':\n return normalizeGetProductsResponse(stripped);\n default:\n return stripped;\n }\n }\n\n /**\n * Validate an incoming response against the bundled AdCP JSON schema for\n * `taskName`. Strict mode fails the task; warn mode logs and returns\n * valid so the caller can continue. Off mode short-circuits before\n * AJV runs.\n */\n private validateResponseSchema(\n response: any,\n taskName: string,\n debugLogs: any[]\n ): { valid: boolean; errors: string[] } {\n const mode = this.responseValidationMode;\n const logViolations = this.config.logSchemaViolations !== false;\n\n try {\n const normalizedResponse = this.normalizeResponseForValidation(response, taskName);\n // Validate against the version the agent actually spoke. Without\n // this, v2.5 sellers (e.g. Wonderstruck) return valid v2.5-shaped\n // responses and the SDK rejects them as malformed v3 — surfaces as\n // `pricing_options must NOT have fewer than 1 items` and similar\n // shape mismatches that don't exist in v2.5. The v3 → v2 path is\n // already correctly version-pinned via lastKnownServerVersion.\n const validationVersion =\n this.lastKnownServerVersion === 'v2'\n ? 'v2.5'\n : (this.responseAdcpVersionForValidation() ?? this.config.adcpVersion);\n const outcome = validateIncomingResponse(taskName, normalizedResponse, mode, debugLogs, validationVersion);\n if (outcome.valid) return { valid: true, errors: [] };\n\n const errorStrings = outcome.issues.map(i => `${i.pointer}: ${i.message}`);\n\n if (logViolations) {\n debugLogs.push({\n timestamp: new Date().toISOString(),\n type: mode === 'strict' ? 'error' : 'warning',\n message: `Schema validation ${mode === 'strict' ? 'failed' : 'warning'} for ${taskName}: ${formatIssues(\n outcome.issues\n )}`,\n errors: errorStrings,\n schemaVariant: outcome.variant,\n mode,\n });\n }\n\n if (mode === 'warn') {\n console.warn(`Schema validation failed for ${taskName} (non-blocking):`, errorStrings);\n return { valid: true, errors: [] };\n }\n\n console.error(`Schema validation failed for ${taskName}:`, errorStrings);\n return { valid: false, errors: errorStrings };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'unknown error';\n console.error('Error during schema validation:', errorMessage);\n return {\n valid: mode !== 'strict',\n errors: mode === 'strict' ? [`Validation error: ${errorMessage}`] : [],\n };\n }\n }\n\n private responseAdcpVersionForValidation(): string | undefined {\n if (this.config.versionEnvelope === 'major-only') return '3.0';\n return undefined;\n }\n\n /**\n * Update task status and emit events\n */\n private updateTaskStatus(taskId: string, status: TaskStatus, result?: any, error?: string): void {\n const task = this.activeTasks.get(taskId);\n if (task) {\n const previousStatus = task.status;\n task.status = status;\n\n const taskInfo: TaskInfo = {\n taskId: task.taskId,\n status: status,\n taskType: task.taskName,\n createdAt: task.startTime,\n updatedAt: Date.now(),\n result,\n error,\n };\n\n this.emitTaskEvent(taskInfo, task.agent.id);\n\n this.config.onActivity?.({\n type: 'status_change',\n operation_id: task.taskId,\n agent_id: task.agent.id,\n context_id: undefined,\n task_id: task.taskId,\n task_type: task.taskName,\n status: status,\n payload: result ?? (error ? { error } : undefined),\n timestamp: new Date().toISOString(),\n });\n\n if (status === 'input-required' || status === 'auth-required') {\n this.compactIntermediateTaskState(taskId, status);\n }\n\n // If task is finished, remove from active tasks after a delay.\n // unref() ensures this timer doesn't prevent the process from exiting.\n if (['completed', 'failed', 'rejected', 'canceled', 'governance-denied', 'aborted'].includes(status)) {\n // Keep lifecycle metadata briefly for status inspection, but release\n // request/conversation/options immediately. These may contain inline\n // creative assets and webhook or transport credentials.\n task.params = undefined;\n task.messages = [];\n task.options = {};\n delete task.pendingInput;\n setTimeout(() => {\n this.activeTasks.delete(taskId);\n this.compactedTaskIds.delete(taskId);\n }, 30000).unref(); // Keep for 30 seconds for final status checks\n }\n }\n }\n\n /**\n * Helper to find agent config by ID\n */\n private findAgentById(agentId: string): AgentConfig | undefined {\n // This would ideally be passed in or stored in the executor\n // For now, return undefined and fall back to local tasks\n return undefined;\n }\n}\n"],"mappings":"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","names":[]}
|