@adcp/sdk 17.0.0-beta.1 → 17.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/keyed-account-store.js +1 -1
- package/dist/lib/adapters/keyed-account-store.mjs +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.d.mts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
- package/dist/lib/adapters/version/3.0/index.js +6 -0
- package/dist/lib/adapters/version/3.0/index.mjs +7 -1
- package/dist/lib/adapters/version/index.d.mts +9 -0
- package/dist/lib/adapters/version/index.d.ts +9 -0
- package/dist/lib/adapters/version/index.js +20 -6
- package/dist/lib/adapters/version/index.mjs +15 -2
- package/dist/lib/adapters/version/types.d.mts +5 -0
- package/dist/lib/adapters/version/types.d.ts +5 -0
- package/dist/lib/canonical-references/index.js +2 -0
- package/dist/lib/canonical-references/index.mjs +2 -0
- package/dist/lib/client/account-changes.d.mts +3 -1
- package/dist/lib/client/account-changes.d.ts +3 -1
- package/dist/lib/client/account-changes.js +22 -2
- package/dist/lib/client/account-changes.mjs +22 -2
- package/dist/lib/conformance/oracle.js +3 -2
- package/dist/lib/conformance/oracle.mjs +3 -2
- package/dist/lib/core/AgentClient.d.mts +165 -1
- package/dist/lib/core/AgentClient.d.ts +165 -1
- package/dist/lib/core/AgentClient.js +446 -8
- package/dist/lib/core/AgentClient.mjs +446 -8
- package/dist/lib/core/ConversationTypes.d.mts +8 -0
- package/dist/lib/core/ConversationTypes.d.ts +8 -0
- package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
- package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
- package/dist/lib/core/ProtocolResponseParser.js +28 -18
- package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
- package/dist/lib/core/SingleAgentClient.d.mts +115 -2
- package/dist/lib/core/SingleAgentClient.d.ts +115 -2
- package/dist/lib/core/SingleAgentClient.js +547 -67
- package/dist/lib/core/SingleAgentClient.mjs +534 -54
- package/dist/lib/core/TaskExecutor.d.mts +7 -0
- package/dist/lib/core/TaskExecutor.d.ts +7 -0
- package/dist/lib/core/TaskExecutor.js +18 -5
- package/dist/lib/core/TaskExecutor.mjs +18 -5
- package/dist/lib/core/task-status.d.mts +2 -0
- package/dist/lib/core/task-status.d.ts +2 -0
- package/dist/lib/core/task-status.js +11 -2
- package/dist/lib/core/task-status.mjs +9 -1
- package/dist/lib/identity-3.3/trust.d.mts +1 -4
- package/dist/lib/identity-3.3/trust.d.ts +1 -4
- package/dist/lib/identity-3.3/trust.js +43 -23
- package/dist/lib/identity-3.3/trust.mjs +43 -23
- package/dist/lib/identity-3.3/validation.js +5 -3
- package/dist/lib/identity-3.3/validation.mjs +6 -4
- package/dist/lib/index.d.mts +6 -52
- package/dist/lib/index.d.ts +6 -52
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/media-buy/compatibility.js +6 -1
- package/dist/lib/media-buy/compatibility.mjs +6 -1
- package/dist/lib/protocols/mcp-scope.d.mts +3 -0
- package/dist/lib/protocols/mcp-scope.d.ts +3 -0
- package/dist/lib/protocols/mcp-scope.js +8 -3
- package/dist/lib/protocols/mcp-scope.mjs +8 -3
- package/dist/lib/reporting/inspection.js +1 -0
- package/dist/lib/reporting/inspection.mjs +1 -0
- package/dist/lib/reporting/ledger/coverage.d.mts +5 -0
- package/dist/lib/reporting/ledger/coverage.d.ts +5 -0
- package/dist/lib/reporting/ledger/coverage.js +37 -3
- package/dist/lib/reporting/ledger/coverage.mjs +36 -3
- package/dist/lib/reporting/ledger/handler.js +7 -4
- package/dist/lib/reporting/ledger/handler.mjs +7 -4
- package/dist/lib/reporting/ledger/producer.js +215 -69
- package/dist/lib/reporting/ledger/producer.mjs +217 -70
- package/dist/lib/reporting/ledger/schedule.d.mts +2 -2
- package/dist/lib/reporting/ledger/schedule.d.ts +2 -2
- package/dist/lib/reporting/ledger/schedule.js +8 -5
- package/dist/lib/reporting/ledger/schedule.mjs +8 -5
- package/dist/lib/reporting/ledger/status-ingest.d.mts +1 -1
- package/dist/lib/reporting/ledger/status-ingest.d.ts +1 -1
- package/dist/lib/reporting/ledger/status-ingest.js +4 -3
- package/dist/lib/reporting/ledger/status-ingest.mjs +4 -3
- package/dist/lib/reporting/ledger/types.d.mts +36 -1
- package/dist/lib/reporting/ledger/types.d.ts +36 -1
- package/dist/lib/reporting/service/index.d.mts +14 -1
- package/dist/lib/reporting/service/index.d.ts +14 -1
- package/dist/lib/reporting/service/index.js +24 -12
- package/dist/lib/reporting/service/index.mjs +24 -12
- package/dist/lib/schemas/browser.d.mts +2 -0
- package/dist/lib/schemas/browser.d.ts +2 -0
- package/dist/lib/schemas/browser.js +3 -0
- package/dist/lib/schemas/browser.mjs +2 -0
- package/dist/lib/schemas/index.d.mts +5 -3
- package/dist/lib/schemas/index.d.ts +5 -3
- package/dist/lib/schemas/index.js +5 -0
- package/dist/lib/schemas/index.mjs +4 -0
- package/dist/lib/server/a2a-adapter.js +2 -1
- package/dist/lib/server/a2a-adapter.mjs +2 -1
- package/dist/lib/server/account-response-identity.d.mts +17 -0
- package/dist/lib/server/account-response-identity.d.ts +17 -0
- package/dist/lib/server/account-response-identity.js +52 -0
- package/dist/lib/server/account-response-identity.mjs +28 -0
- package/dist/lib/server/account-sync-contract.js +2 -2
- package/dist/lib/server/account-sync-contract.mjs +2 -2
- package/dist/lib/server/auth-signature.d.mts +2 -2
- package/dist/lib/server/auth-signature.d.ts +2 -2
- package/dist/lib/server/auth-signature.js +3 -0
- package/dist/lib/server/auth-signature.mjs +3 -0
- package/dist/lib/server/create-adcp-server.d.mts +2 -2
- package/dist/lib/server/create-adcp-server.d.ts +2 -2
- package/dist/lib/server/create-adcp-server.js +58 -23
- package/dist/lib/server/create-adcp-server.mjs +61 -15
- package/dist/lib/server/decisioning/account.d.mts +36 -10
- package/dist/lib/server/decisioning/account.d.ts +36 -10
- package/dist/lib/server/decisioning/account.js +33 -14
- package/dist/lib/server/decisioning/account.mjs +33 -14
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.js +4 -4
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -4
- package/dist/lib/server/media-buy-store.d.mts +26 -12
- package/dist/lib/server/media-buy-store.d.ts +26 -12
- package/dist/lib/server/media-buy-store.js +69 -21
- package/dist/lib/server/media-buy-store.mjs +69 -21
- package/dist/lib/server/notification-subscriptions/runtime.d.mts +1 -1
- package/dist/lib/server/notification-subscriptions/runtime.d.ts +1 -1
- package/dist/lib/server/notification-subscriptions/runtime.js +4 -0
- package/dist/lib/server/notification-subscriptions/runtime.mjs +4 -0
- package/dist/lib/server/responses.js +9 -1
- package/dist/lib/server/responses.mjs +9 -1
- package/dist/lib/server/serve.js +3 -1
- package/dist/lib/server/serve.mjs +3 -1
- package/dist/lib/server/signed-request-transport.d.mts +1 -0
- package/dist/lib/server/signed-request-transport.d.ts +1 -0
- package/dist/lib/server/signed-request-transport.js +46 -0
- package/dist/lib/server/signed-request-transport.mjs +20 -0
- package/dist/lib/server/test-controller.d.mts +1 -0
- package/dist/lib/server/test-controller.d.ts +1 -0
- package/dist/lib/server/test-controller.js +5 -1
- package/dist/lib/server/test-controller.mjs +5 -1
- package/dist/lib/signing/agent-fetch.d.mts +1 -1
- package/dist/lib/signing/agent-fetch.d.ts +1 -1
- package/dist/lib/signing/agent-fetch.js +3 -3
- package/dist/lib/signing/agent-fetch.mjs +3 -3
- package/dist/lib/testing/index.d.mts +1 -0
- package/dist/lib/testing/index.d.ts +1 -0
- package/dist/lib/testing/index.js +3 -0
- package/dist/lib/testing/index.mjs +2 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +61 -29
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +61 -29
- package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
- package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
- package/dist/lib/testing/storyboard/compliance.js +62 -13
- package/dist/lib/testing/storyboard/compliance.mjs +63 -14
- package/dist/lib/testing/storyboard/index.d.mts +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +1 -0
- package/dist/lib/testing/storyboard/index.js +3 -0
- package/dist/lib/testing/storyboard/index.mjs +2 -0
- package/dist/lib/testing/storyboard/loader.js +7 -0
- package/dist/lib/testing/storyboard/loader.mjs +7 -0
- package/dist/lib/testing/storyboard/request-builder.js +9 -6
- package/dist/lib/testing/storyboard/request-builder.mjs +9 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
- package/dist/lib/testing/storyboard/runner.js +59 -6
- package/dist/lib/testing/storyboard/runner.mjs +59 -6
- package/dist/lib/testing/storyboard/types.d.mts +18 -0
- package/dist/lib/testing/storyboard/types.d.ts +18 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/web-bot-auth.d.mts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.d.ts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.js +80 -0
- package/dist/lib/testing/storyboard/web-bot-auth.mjs +56 -0
- package/dist/lib/types/accept-proposal.d.ts +20 -28
- package/dist/lib/types/asset-instances.d.mts +1 -1
- package/dist/lib/types/asset-instances.d.ts +1 -1
- package/dist/lib/types/buy-products.d.ts +20 -28
- package/dist/lib/types/check-governance.d.ts +20 -28
- package/dist/lib/types/comply-test-controller.d.ts +20 -28
- package/dist/lib/types/control-media-buy.d.ts +20 -28
- package/dist/lib/types/core.generated.d.mts +273 -184
- package/dist/lib/types/core.generated.d.ts +273 -184
- package/dist/lib/types/create-media-buy.d.ts +20 -28
- package/dist/lib/types/get-media-buys.d.ts +20 -28
- package/dist/lib/types/get-products.d.ts +20 -28
- package/dist/lib/types/index.d.mts +6 -1
- package/dist/lib/types/index.d.ts +6 -1
- package/dist/lib/types/index.js +6 -1
- package/dist/lib/types/index.mjs +4 -1
- package/dist/lib/types/inline-enums.generated.d.mts +30 -4
- package/dist/lib/types/inline-enums.generated.d.ts +30 -4
- package/dist/lib/types/inline-enums.generated.js +41 -2
- package/dist/lib/types/inline-enums.generated.mjs +28 -2
- package/dist/lib/types/list-products.d.ts +20 -28
- package/dist/lib/types/list-proposals.d.ts +20 -28
- package/dist/lib/types/media-buy-delivery-report.d.mts +6 -0
- package/dist/lib/types/media-buy-delivery-report.d.ts +6 -0
- package/dist/lib/types/media-buy-delivery-report.js +16 -0
- package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
- package/dist/lib/types/refine-proposals.d.ts +20 -28
- package/dist/lib/types/request-proposals.d.ts +20 -28
- package/dist/lib/types/schemas.generated.d.ts +63113 -127273
- package/dist/lib/types/schemas.generated.js +759 -770
- package/dist/lib/types/schemas.generated.mjs +759 -770
- package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
- package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
- package/dist/lib/types/targeting-keys.generated.js +109 -0
- package/dist/lib/types/targeting-keys.generated.mjs +84 -0
- package/dist/lib/types/tools.generated.d.mts +2 -68
- package/dist/lib/types/tools.generated.d.ts +2 -68
- package/dist/lib/types/update-media-buy.d.ts +20 -28
- package/dist/lib/utils/adcp-version-config.js +5 -2
- package/dist/lib/utils/adcp-version-config.mjs +5 -2
- package/dist/lib/utils/response-unwrapper.js +6 -1
- package/dist/lib/utils/response-unwrapper.mjs +6 -1
- package/dist/lib/v2/format-schema/resolver.js +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +1 -1
- package/dist/lib/v2/projection/creative-delivery.js +104 -29
- package/dist/lib/v2/projection/creative-delivery.mjs +108 -29
- package/dist/lib/v2/projection/index.d.mts +1 -0
- package/dist/lib/v2/projection/index.d.ts +1 -0
- package/dist/lib/v2/projection/index.js +3 -0
- package/dist/lib/v2/projection/index.mjs +2 -0
- package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.js +91 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
- package/dist/lib/v2/projection/v1-to-v2.d.mts +1 -1
- package/dist/lib/v2/projection/v1-to-v2.d.ts +1 -1
- package/dist/lib/v2/projection/v1-to-v2.js +12 -9
- package/dist/lib/v2/projection/v1-to-v2.mjs +12 -9
- package/dist/lib/validation/budget-allocation.d.mts +3 -3
- package/dist/lib/validation/budget-allocation.d.ts +3 -3
- package/dist/lib/validation/compact-schema.d.mts +27 -0
- package/dist/lib/validation/compact-schema.d.ts +27 -0
- package/dist/lib/validation/compact-schema.js +276 -0
- package/dist/lib/validation/compact-schema.mjs +250 -0
- package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.js +31 -0
- package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
- package/dist/lib/validation/nonempty-array.d.mts +15 -0
- package/dist/lib/validation/nonempty-array.d.ts +15 -0
- package/dist/lib/validation/nonempty-array.js +41 -0
- package/dist/lib/validation/nonempty-array.mjs +7 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
- package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
- package/dist/lib/validation/schema-loader.js +86 -16
- package/dist/lib/validation/schema-loader.mjs +82 -16
- package/dist/lib/validation/schema-validator.d.mts +10 -19
- package/dist/lib/validation/schema-validator.d.ts +10 -19
- package/dist/lib/validation/schema-validator.js +135 -42
- package/dist/lib/validation/schema-validator.mjs +139 -43
- package/dist/lib/validation/sync-creatives.d.mts +22 -22
- package/dist/lib/validation/sync-creatives.d.ts +22 -22
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/webhooks/index.d.mts +3 -0
- package/dist/lib/webhooks/index.d.ts +3 -0
- package/dist/lib/webhooks/index.js +3 -0
- package/dist/lib/webhooks/index.mjs +2 -0
- package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.js +119 -0
- package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +142 -0
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +15 -0
- package/docs/guides/REPORTING-LEDGER.md +93 -0
- package/docs/guides/REPORTING-STABILITY.md +1 -1
- package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
- package/docs/llms.txt +2 -2
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-16-to-17.md +218 -14
- package/docs/migration-6.6-to-6.7.md +14 -0
- package/docs/migration-account-change-feed.md +15 -0
- package/docs/migration-agent-identity-3.3.md +106 -4
- package/docs/recipes/verifying-inbound-webhooks.md +18 -2
- package/package.json +16 -3
|
@@ -95,6 +95,7 @@ interface WebhookManager {
|
|
|
95
95
|
registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;
|
|
96
96
|
processWebhook(token: string, body: any): Promise<void>;
|
|
97
97
|
}
|
|
98
|
+
type AdcpTaskStatusTool = 'get_task_status' | 'tasks_get' | 'tasks/get';
|
|
98
99
|
/**
|
|
99
100
|
* Core task execution engine that handles the conversation loop with agents
|
|
100
101
|
*/
|
|
@@ -210,6 +211,11 @@ export declare class TaskExecutor {
|
|
|
210
211
|
* dispatches. Per-call options can override individual fields.
|
|
211
212
|
*/
|
|
212
213
|
transport?: import('../protocols/index.mjs').TransportOptions;
|
|
214
|
+
/** Resolve the advertised AdCP work-status tool using the client's scoped discovery evidence. */
|
|
215
|
+
resolveTaskStatusTool?: (agent: AgentConfig, options: {
|
|
216
|
+
transport?: import('../protocols/index.mjs').TransportOptions;
|
|
217
|
+
signal?: AbortSignal;
|
|
218
|
+
}) => Promise<AdcpTaskStatusTool>;
|
|
213
219
|
});
|
|
214
220
|
/**
|
|
215
221
|
* Access the governance middleware for direct outcome reporting (async tasks).
|
|
@@ -328,6 +334,7 @@ export declare class TaskExecutor {
|
|
|
328
334
|
* Task tracking methods (PR #78)
|
|
329
335
|
*/
|
|
330
336
|
listTasks(agent: AgentConfig, transport?: import('../protocols/index.mjs').TransportOptions): Promise<TaskInfo[]>;
|
|
337
|
+
private resolveTaskStatusTool;
|
|
331
338
|
private getTaskStatusWithRawResponse;
|
|
332
339
|
getTaskStatus(agent: AgentConfig, taskId: string, transport?: import('../protocols/index.mjs').TransportOptions, signal?: AbortSignal, wireOptions?: {
|
|
333
340
|
wireAdcpVersion?: string;
|
|
@@ -95,6 +95,7 @@ interface WebhookManager {
|
|
|
95
95
|
registerWebhook(agent: AgentConfig, taskId: string, webhookUrl: string): Promise<void>;
|
|
96
96
|
processWebhook(token: string, body: any): Promise<void>;
|
|
97
97
|
}
|
|
98
|
+
type AdcpTaskStatusTool = 'get_task_status' | 'tasks_get' | 'tasks/get';
|
|
98
99
|
/**
|
|
99
100
|
* Core task execution engine that handles the conversation loop with agents
|
|
100
101
|
*/
|
|
@@ -210,6 +211,11 @@ export declare class TaskExecutor {
|
|
|
210
211
|
* dispatches. Per-call options can override individual fields.
|
|
211
212
|
*/
|
|
212
213
|
transport?: import('../protocols').TransportOptions;
|
|
214
|
+
/** Resolve the advertised AdCP work-status tool using the client's scoped discovery evidence. */
|
|
215
|
+
resolveTaskStatusTool?: (agent: AgentConfig, options: {
|
|
216
|
+
transport?: import('../protocols').TransportOptions;
|
|
217
|
+
signal?: AbortSignal;
|
|
218
|
+
}) => Promise<AdcpTaskStatusTool>;
|
|
213
219
|
});
|
|
214
220
|
/**
|
|
215
221
|
* Access the governance middleware for direct outcome reporting (async tasks).
|
|
@@ -328,6 +334,7 @@ export declare class TaskExecutor {
|
|
|
328
334
|
* Task tracking methods (PR #78)
|
|
329
335
|
*/
|
|
330
336
|
listTasks(agent: AgentConfig, transport?: import('../protocols').TransportOptions): Promise<TaskInfo[]>;
|
|
337
|
+
private resolveTaskStatusTool;
|
|
331
338
|
private getTaskStatusWithRawResponse;
|
|
332
339
|
getTaskStatus(agent: AgentConfig, taskId: string, transport?: import('../protocols').TransportOptions, signal?: AbortSignal, wireOptions?: {
|
|
333
340
|
wireAdcpVersion?: string;
|
|
@@ -733,6 +733,8 @@ class TaskExecutor {
|
|
|
733
733
|
status: args.status
|
|
734
734
|
};
|
|
735
735
|
const taskState = this.activeTasks.get(args.taskId);
|
|
736
|
+
const wireAdcpVersion = taskState?.wireAdcpVersion ?? this.config.wireAdcpVersion;
|
|
737
|
+
if (wireAdcpVersion !== void 0) meta.wireAdcpVersion = wireAdcpVersion;
|
|
736
738
|
if (taskState?.serverVersion !== void 0) meta.serverVersion = taskState.serverVersion;
|
|
737
739
|
if (taskState?.serverVersionSynthetic !== void 0) {
|
|
738
740
|
meta.serverVersionSynthetic = taskState.serverVersionSynthetic;
|
|
@@ -826,6 +828,7 @@ class TaskExecutor {
|
|
|
826
828
|
}
|
|
827
829
|
const taskState = {
|
|
828
830
|
taskId,
|
|
831
|
+
wireAdcpVersion: wireAdcpVersion ?? options.negotiatedAdcpVersion ?? options.selectedAdcpVersion,
|
|
829
832
|
taskName,
|
|
830
833
|
params,
|
|
831
834
|
status: "pending",
|
|
@@ -1096,7 +1099,7 @@ class TaskExecutor {
|
|
|
1096
1099
|
() => import_protocols.ProtocolClient.callTool(agent, taskName, dispatchParams, callOptions)
|
|
1097
1100
|
);
|
|
1098
1101
|
(0, import_abort.throwIfAborted)(postDispatchOptions.signal);
|
|
1099
|
-
const respStatus = this.responseParser.getStatus(response);
|
|
1102
|
+
const respStatus = this.responseParser.getStatus(response, taskName);
|
|
1100
1103
|
taskState.serverTaskId = this.responseParser.getTaskId(response);
|
|
1101
1104
|
await this.config.onActivity?.({
|
|
1102
1105
|
type: "protocol_response",
|
|
@@ -1279,7 +1282,7 @@ class TaskExecutor {
|
|
|
1279
1282
|
};
|
|
1280
1283
|
}
|
|
1281
1284
|
async handleAsyncResponse(agent, taskId, taskName, params, response, messages, inputHandler, options = {}, debugLogs = [], startTime = Date.now(), deferTerminalTaskStatus = false, persistPausedContinuation = true, serverVersion = "v3", deferredClientContext, requireDeferredSettlementResumeAuthorization = false, refinementServedVersion) {
|
|
1282
|
-
const status = this.responseParser.getStatus(response);
|
|
1285
|
+
const status = this.responseParser.getStatus(response, taskName);
|
|
1283
1286
|
const serverTaskId = this.responseParser.getTaskId(response);
|
|
1284
1287
|
const task = this.activeTasks.get(taskId);
|
|
1285
1288
|
if (task && serverTaskId) task.serverTaskId = serverTaskId;
|
|
@@ -2531,8 +2534,15 @@ class TaskExecutor {
|
|
|
2531
2534
|
}
|
|
2532
2535
|
});
|
|
2533
2536
|
}
|
|
2534
|
-
async
|
|
2535
|
-
|
|
2537
|
+
async resolveTaskStatusTool(agent, transport, signal) {
|
|
2538
|
+
if (this.config.resolveTaskStatusTool) {
|
|
2539
|
+
return this.config.resolveTaskStatusTool(agent, { transport: transport ?? this.config.transport, signal });
|
|
2540
|
+
}
|
|
2541
|
+
return agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
|
|
2542
|
+
}
|
|
2543
|
+
async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId, pollingTool) {
|
|
2544
|
+
const toolName = pollingTool ?? await this.resolveTaskStatusTool(agent, transport, signal);
|
|
2545
|
+
(0, import_abort.throwIfAborted)(signal);
|
|
2536
2546
|
const response = await import_protocols.ProtocolClient.callTool(
|
|
2537
2547
|
agent,
|
|
2538
2548
|
toolName,
|
|
@@ -2591,6 +2601,7 @@ class TaskExecutor {
|
|
|
2591
2601
|
}
|
|
2592
2602
|
const pollStartTime = Date.now();
|
|
2593
2603
|
const correlationId = metadataTaskId ?? taskId;
|
|
2604
|
+
let pollingTool;
|
|
2594
2605
|
const withServerTaskId = (metadata) => ({
|
|
2595
2606
|
...metadata,
|
|
2596
2607
|
serverTaskId: taskId
|
|
@@ -2631,6 +2642,7 @@ class TaskExecutor {
|
|
|
2631
2642
|
let status;
|
|
2632
2643
|
let rawResponse;
|
|
2633
2644
|
try {
|
|
2645
|
+
pollingTool ??= await this.resolveTaskStatusTool(agent, transportSnapshot, signal);
|
|
2634
2646
|
const pollResult = await this.getTaskStatusWithRawResponse(
|
|
2635
2647
|
agent,
|
|
2636
2648
|
taskId,
|
|
@@ -2640,7 +2652,8 @@ class TaskExecutor {
|
|
|
2640
2652
|
serverVersion,
|
|
2641
2653
|
wireAdcpVersion,
|
|
2642
2654
|
versionEnvelope,
|
|
2643
|
-
metadataTaskId
|
|
2655
|
+
metadataTaskId,
|
|
2656
|
+
pollingTool
|
|
2644
2657
|
);
|
|
2645
2658
|
status = pollResult.task;
|
|
2646
2659
|
rawResponse = pollResult.rawResponse;
|
|
@@ -719,6 +719,8 @@ class TaskExecutor {
|
|
|
719
719
|
status: args.status
|
|
720
720
|
};
|
|
721
721
|
const taskState = this.activeTasks.get(args.taskId);
|
|
722
|
+
const wireAdcpVersion = taskState?.wireAdcpVersion ?? this.config.wireAdcpVersion;
|
|
723
|
+
if (wireAdcpVersion !== void 0) meta.wireAdcpVersion = wireAdcpVersion;
|
|
722
724
|
if (taskState?.serverVersion !== void 0) meta.serverVersion = taskState.serverVersion;
|
|
723
725
|
if (taskState?.serverVersionSynthetic !== void 0) {
|
|
724
726
|
meta.serverVersionSynthetic = taskState.serverVersionSynthetic;
|
|
@@ -812,6 +814,7 @@ class TaskExecutor {
|
|
|
812
814
|
}
|
|
813
815
|
const taskState = {
|
|
814
816
|
taskId,
|
|
817
|
+
wireAdcpVersion: wireAdcpVersion ?? options.negotiatedAdcpVersion ?? options.selectedAdcpVersion,
|
|
815
818
|
taskName,
|
|
816
819
|
params,
|
|
817
820
|
status: "pending",
|
|
@@ -1082,7 +1085,7 @@ class TaskExecutor {
|
|
|
1082
1085
|
() => ProtocolClient.callTool(agent, taskName, dispatchParams, callOptions)
|
|
1083
1086
|
);
|
|
1084
1087
|
throwIfAborted(postDispatchOptions.signal);
|
|
1085
|
-
const respStatus = this.responseParser.getStatus(response);
|
|
1088
|
+
const respStatus = this.responseParser.getStatus(response, taskName);
|
|
1086
1089
|
taskState.serverTaskId = this.responseParser.getTaskId(response);
|
|
1087
1090
|
await this.config.onActivity?.({
|
|
1088
1091
|
type: "protocol_response",
|
|
@@ -1265,7 +1268,7 @@ class TaskExecutor {
|
|
|
1265
1268
|
};
|
|
1266
1269
|
}
|
|
1267
1270
|
async handleAsyncResponse(agent, taskId, taskName, params, response, messages, inputHandler, options = {}, debugLogs = [], startTime = Date.now(), deferTerminalTaskStatus = false, persistPausedContinuation = true, serverVersion = "v3", deferredClientContext, requireDeferredSettlementResumeAuthorization = false, refinementServedVersion) {
|
|
1268
|
-
const status = this.responseParser.getStatus(response);
|
|
1271
|
+
const status = this.responseParser.getStatus(response, taskName);
|
|
1269
1272
|
const serverTaskId = this.responseParser.getTaskId(response);
|
|
1270
1273
|
const task = this.activeTasks.get(taskId);
|
|
1271
1274
|
if (task && serverTaskId) task.serverTaskId = serverTaskId;
|
|
@@ -2517,8 +2520,15 @@ class TaskExecutor {
|
|
|
2517
2520
|
}
|
|
2518
2521
|
});
|
|
2519
2522
|
}
|
|
2520
|
-
async
|
|
2521
|
-
|
|
2523
|
+
async resolveTaskStatusTool(agent, transport, signal) {
|
|
2524
|
+
if (this.config.resolveTaskStatusTool) {
|
|
2525
|
+
return this.config.resolveTaskStatusTool(agent, { transport: transport ?? this.config.transport, signal });
|
|
2526
|
+
}
|
|
2527
|
+
return agent.protocol === "mcp" ? "tasks_get" : "tasks/get";
|
|
2528
|
+
}
|
|
2529
|
+
async getTaskStatusWithRawResponse(agent, taskId, transport, signal, expectedTaskType, serverVersion, wireAdcpVersion, versionEnvelope, operationId, pollingTool) {
|
|
2530
|
+
const toolName = pollingTool ?? await this.resolveTaskStatusTool(agent, transport, signal);
|
|
2531
|
+
throwIfAborted(signal);
|
|
2522
2532
|
const response = await ProtocolClient.callTool(
|
|
2523
2533
|
agent,
|
|
2524
2534
|
toolName,
|
|
@@ -2577,6 +2587,7 @@ class TaskExecutor {
|
|
|
2577
2587
|
}
|
|
2578
2588
|
const pollStartTime = Date.now();
|
|
2579
2589
|
const correlationId = metadataTaskId ?? taskId;
|
|
2590
|
+
let pollingTool;
|
|
2580
2591
|
const withServerTaskId = (metadata) => ({
|
|
2581
2592
|
...metadata,
|
|
2582
2593
|
serverTaskId: taskId
|
|
@@ -2617,6 +2628,7 @@ class TaskExecutor {
|
|
|
2617
2628
|
let status;
|
|
2618
2629
|
let rawResponse;
|
|
2619
2630
|
try {
|
|
2631
|
+
pollingTool ??= await this.resolveTaskStatusTool(agent, transportSnapshot, signal);
|
|
2620
2632
|
const pollResult = await this.getTaskStatusWithRawResponse(
|
|
2621
2633
|
agent,
|
|
2622
2634
|
taskId,
|
|
@@ -2626,7 +2638,8 @@ class TaskExecutor {
|
|
|
2626
2638
|
serverVersion,
|
|
2627
2639
|
wireAdcpVersion,
|
|
2628
2640
|
versionEnvelope,
|
|
2629
|
-
metadataTaskId
|
|
2641
|
+
metadataTaskId,
|
|
2642
|
+
pollingTool
|
|
2630
2643
|
);
|
|
2631
2644
|
status = pollResult.task;
|
|
2632
2645
|
rawResponse = pollResult.rawResponse;
|
|
@@ -31,3 +31,5 @@ export declare function extractAdcpTaskStatusFromPayload(payload: unknown): ADCP
|
|
|
31
31
|
* back to the transport-layer status.
|
|
32
32
|
*/
|
|
33
33
|
export declare function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined;
|
|
34
|
+
/** A status query describes another task; its status/error are data, not the query's lifecycle. */
|
|
35
|
+
export declare function isTaskStatusResponse(value: unknown, toolName?: string): boolean;
|
|
@@ -31,3 +31,5 @@ export declare function extractAdcpTaskStatusFromPayload(payload: unknown): ADCP
|
|
|
31
31
|
* back to the transport-layer status.
|
|
32
32
|
*/
|
|
33
33
|
export declare function extractAdcpStatusFromA2aTaskResult(result: unknown): ADCPStatus | undefined;
|
|
34
|
+
/** A status query describes another task; its status/error are data, not the query's lifecycle. */
|
|
35
|
+
export declare function isTaskStatusResponse(value: unknown, toolName?: string): boolean;
|
|
@@ -22,7 +22,8 @@ __export(task_status_exports, {
|
|
|
22
22
|
TASK_ENVELOPE_FIELDS: () => TASK_ENVELOPE_FIELDS,
|
|
23
23
|
extractAdcpStatusFromA2aTaskResult: () => extractAdcpStatusFromA2aTaskResult,
|
|
24
24
|
extractAdcpTaskStatusFromPayload: () => extractAdcpTaskStatusFromPayload,
|
|
25
|
-
isAdcpStatus: () => isAdcpStatus
|
|
25
|
+
isAdcpStatus: () => isAdcpStatus,
|
|
26
|
+
isTaskStatusResponse: () => isTaskStatusResponse
|
|
26
27
|
});
|
|
27
28
|
module.exports = __toCommonJS(task_status_exports);
|
|
28
29
|
var import_a2a_artifacts = require('../utils/a2a-artifacts.js');
|
|
@@ -80,11 +81,19 @@ function extractAdcpStatusFromA2aTaskResult(result) {
|
|
|
80
81
|
const extracted = (0, import_a2a_artifacts.getLatestA2ADataPartFromTask)(result);
|
|
81
82
|
return extractAdcpTaskStatusFromPayload(extracted?.data);
|
|
82
83
|
}
|
|
84
|
+
function isTaskStatusResponse(value, toolName) {
|
|
85
|
+
if (toolName !== "get_task_status" || !value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
86
|
+
const record = value;
|
|
87
|
+
return ["task_id", "task_type", "protocol", "status", "created_at", "updated_at"].every(
|
|
88
|
+
(field) => typeof record[field] === "string"
|
|
89
|
+
) && record.adcp_error === void 0 && record.errors === void 0;
|
|
90
|
+
}
|
|
83
91
|
// Annotate the CommonJS export names for ESM import in node:
|
|
84
92
|
0 && (module.exports = {
|
|
85
93
|
ADCP_STATUS,
|
|
86
94
|
TASK_ENVELOPE_FIELDS,
|
|
87
95
|
extractAdcpStatusFromA2aTaskResult,
|
|
88
96
|
extractAdcpTaskStatusFromPayload,
|
|
89
|
-
isAdcpStatus
|
|
97
|
+
isAdcpStatus,
|
|
98
|
+
isTaskStatusResponse
|
|
90
99
|
});
|
|
@@ -53,10 +53,18 @@ function extractAdcpStatusFromA2aTaskResult(result) {
|
|
|
53
53
|
const extracted = getLatestA2ADataPartFromTask(result);
|
|
54
54
|
return extractAdcpTaskStatusFromPayload(extracted?.data);
|
|
55
55
|
}
|
|
56
|
+
function isTaskStatusResponse(value, toolName) {
|
|
57
|
+
if (toolName !== "get_task_status" || !value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
58
|
+
const record = value;
|
|
59
|
+
return ["task_id", "task_type", "protocol", "status", "created_at", "updated_at"].every(
|
|
60
|
+
(field) => typeof record[field] === "string"
|
|
61
|
+
) && record.adcp_error === void 0 && record.errors === void 0;
|
|
62
|
+
}
|
|
56
63
|
export {
|
|
57
64
|
ADCP_STATUS,
|
|
58
65
|
TASK_ENVELOPE_FIELDS,
|
|
59
66
|
extractAdcpStatusFromA2aTaskResult,
|
|
60
67
|
extractAdcpTaskStatusFromPayload,
|
|
61
|
-
isAdcpStatus
|
|
68
|
+
isAdcpStatus,
|
|
69
|
+
isTaskStatusResponse
|
|
62
70
|
};
|
|
@@ -149,10 +149,7 @@ export interface DemandGrantAuthorization {
|
|
|
149
149
|
export interface DemandGrantOptions {
|
|
150
150
|
evaluator: TrustEvaluator;
|
|
151
151
|
now?: () => number;
|
|
152
|
-
/**
|
|
153
|
-
* Only evaluated for uncovered claims, never fetch failures, and never for a scope an
|
|
154
|
-
* `exclusive_grants: true` record names in any grant.
|
|
155
|
-
*/
|
|
152
|
+
/** Only evaluated for uncovered claims against a record without `exclusive_grants: true`; never fetch failures. */
|
|
156
153
|
sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
|
|
157
154
|
/** Only for authoritative absence; never after a 200 or an exclusive record. */
|
|
158
155
|
legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
|
|
@@ -149,10 +149,7 @@ export interface DemandGrantAuthorization {
|
|
|
149
149
|
export interface DemandGrantOptions {
|
|
150
150
|
evaluator: TrustEvaluator;
|
|
151
151
|
now?: () => number;
|
|
152
|
-
/**
|
|
153
|
-
* Only evaluated for uncovered claims, never fetch failures, and never for a scope an
|
|
154
|
-
* `exclusive_grants: true` record names in any grant.
|
|
155
|
-
*/
|
|
152
|
+
/** Only evaluated for uncovered claims against a record without `exclusive_grants: true`; never fetch failures. */
|
|
156
153
|
sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
|
|
157
154
|
/** Only for authoritative absence; never after a 200 or an exclusive record. */
|
|
158
155
|
legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
|
|
@@ -47,7 +47,7 @@ var import_etld = require('../signing/agent-resolver/etld.js');
|
|
|
47
47
|
var import_strict_json = require('../signing/agent-resolver/strict-json.js');
|
|
48
48
|
var import_tldts = require("tldts");
|
|
49
49
|
var import_schemas = __toESM(require('./schemas.draft.js'));
|
|
50
|
-
const ajv = new import_ajv.default({ strict: false, allErrors: false });
|
|
50
|
+
const ajv = new import_ajv.default({ inlineRefs: false, strict: false, allErrors: false });
|
|
51
51
|
(0, import_ajv_formats.default)(ajv);
|
|
52
52
|
for (const schema of import_schemas.default) ajv.addSchema(schema);
|
|
53
53
|
function validateIdentity33Schema(id, value) {
|
|
@@ -100,6 +100,13 @@ function failure(cause) {
|
|
|
100
100
|
if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
|
|
101
101
|
throw error;
|
|
102
102
|
}
|
|
103
|
+
function claimRegistrableDomain(domain) {
|
|
104
|
+
try {
|
|
105
|
+
return (0, import_etld.eTldPlusOne)(domain);
|
|
106
|
+
} catch (cause) {
|
|
107
|
+
return failure(cause);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
103
110
|
function validateTrustRecord(value) {
|
|
104
111
|
if (!validateIdentity33Schema("trust/v1/trust", value)) failure();
|
|
105
112
|
const record = value;
|
|
@@ -335,13 +342,16 @@ function authorityGroup(operator) {
|
|
|
335
342
|
const provider = (0, import_tldts.parse)(operator).domain;
|
|
336
343
|
return `private:${provider ?? operator}`;
|
|
337
344
|
}
|
|
345
|
+
const INTERMEDIARY_FETCH_CONCURRENCY = 8;
|
|
338
346
|
function grantsScope(grant, scope) {
|
|
339
347
|
return grant.scopes.some(
|
|
340
348
|
(granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
|
|
341
349
|
);
|
|
342
350
|
}
|
|
343
351
|
function grantMatches(grant, target, claim, now) {
|
|
344
|
-
|
|
352
|
+
return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
|
|
353
|
+
}
|
|
354
|
+
function grantCovers(grant, claim, now) {
|
|
345
355
|
if (!grantsScope(grant, claim.scope)) return false;
|
|
346
356
|
if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === (0, import_canonicalize.canonicalAgentOrigin)(claim.signerOrigin)))
|
|
347
357
|
return false;
|
|
@@ -358,7 +368,7 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
358
368
|
const now = (options.now ?? (() => Date.now() / 1e3))();
|
|
359
369
|
const signer = await options.evaluator.match(claim.signerOrigin, "adcp:buying", claim.brand.countries);
|
|
360
370
|
if (signer.agent.countries && !claim.brand.countries?.length) failure();
|
|
361
|
-
const brand = (
|
|
371
|
+
const brand = claimRegistrableDomain(claim.brand.domain), account = claimRegistrableDomain(claim.accountOperator), operator = signer.operator;
|
|
362
372
|
const result = (source, chain, grants = []) => ({
|
|
363
373
|
source,
|
|
364
374
|
chain,
|
|
@@ -367,7 +377,6 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
367
377
|
...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
|
|
368
378
|
});
|
|
369
379
|
if (brand === operator && account === operator) return result("implicit", [brand]);
|
|
370
|
-
if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
|
|
371
380
|
let house;
|
|
372
381
|
try {
|
|
373
382
|
house = await options.resolveBrandHouse?.(claim.brand);
|
|
@@ -376,34 +385,45 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
376
385
|
throw cause;
|
|
377
386
|
unavailable(cause);
|
|
378
387
|
}
|
|
379
|
-
const authoritativeBrand = house ? (
|
|
380
|
-
|
|
388
|
+
const authoritativeBrand = house ? claimRegistrableDomain(house.domain) : brand;
|
|
389
|
+
const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
|
|
390
|
+
if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
|
|
381
391
|
const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
|
|
382
392
|
const record = await options.evaluator.get(authoritativeBrand);
|
|
383
393
|
if (record.status === "absent") {
|
|
384
394
|
if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
|
|
385
395
|
throw new IdentityAuthorizationError("grant_absent");
|
|
386
396
|
}
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
if (
|
|
397
|
+
const firsts = [];
|
|
398
|
+
for (const grant of record.record.grants ?? []) {
|
|
399
|
+
const grantee = registrableGrantee(grant.grantee);
|
|
400
|
+
if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
|
|
401
|
+
if (!self.has(account) && account !== grantee) continue;
|
|
402
|
+
if (grantee === operator) return result("trust", [brand, operator], [grant]);
|
|
403
|
+
firsts.push({ grant, grantee });
|
|
404
|
+
}
|
|
405
|
+
const grantees = [...new Set(firsts.map((f) => f.grantee))];
|
|
406
|
+
const records = /* @__PURE__ */ new Map();
|
|
407
|
+
for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
|
|
408
|
+
const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
|
|
409
|
+
const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
|
|
410
|
+
settled.forEach(
|
|
411
|
+
(outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
|
|
412
|
+
);
|
|
393
413
|
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
414
|
+
let outage;
|
|
415
|
+
for (const { grant: first, grantee } of firsts) {
|
|
416
|
+
const intermediary = records.get(grantee);
|
|
417
|
+
if ("failed" in intermediary) {
|
|
418
|
+
outage ??= intermediary.failed;
|
|
419
|
+
continue;
|
|
399
420
|
}
|
|
421
|
+
if (intermediary.status !== "present") continue;
|
|
422
|
+
const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
|
|
423
|
+
if (second) return result("trust", [brand, grantee, operator], [first, second]);
|
|
400
424
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
return grantee !== void 0 && (grantee === account || selfOperated && grantee === operator) && grantsScope(g, claim.scope);
|
|
404
|
-
});
|
|
405
|
-
const exclusive = record.record.exclusive_grants === true && (record.record.grants ?? []).some((g) => grantsScope(g, claim.scope));
|
|
406
|
-
if (!covered && !exclusive && await options.sellerAuthorization?.(claim))
|
|
425
|
+
if (outage !== void 0) throw outage;
|
|
426
|
+
if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
|
|
407
427
|
return result("seller", [brand, account, operator]);
|
|
408
428
|
throw new IdentityAuthorizationError("grant_absent");
|
|
409
429
|
}
|
|
@@ -6,7 +6,7 @@ import { eTldPlusOne } from "../signing/agent-resolver/etld.mjs";
|
|
|
6
6
|
import { parseStrictJson } from "../signing/agent-resolver/strict-json.mjs";
|
|
7
7
|
import { parse as parseDomain } from "tldts";
|
|
8
8
|
import schemas from "./schemas.draft.mjs";
|
|
9
|
-
const ajv = new Ajv({ strict: false, allErrors: false });
|
|
9
|
+
const ajv = new Ajv({ inlineRefs: false, strict: false, allErrors: false });
|
|
10
10
|
addFormats(ajv);
|
|
11
11
|
for (const schema of schemas) ajv.addSchema(schema);
|
|
12
12
|
function validateIdentity33Schema(id, value) {
|
|
@@ -59,6 +59,13 @@ function failure(cause) {
|
|
|
59
59
|
if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
|
|
60
60
|
throw error;
|
|
61
61
|
}
|
|
62
|
+
function claimRegistrableDomain(domain) {
|
|
63
|
+
try {
|
|
64
|
+
return eTldPlusOne(domain);
|
|
65
|
+
} catch (cause) {
|
|
66
|
+
return failure(cause);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
62
69
|
function validateTrustRecord(value) {
|
|
63
70
|
if (!validateIdentity33Schema("trust/v1/trust", value)) failure();
|
|
64
71
|
const record = value;
|
|
@@ -294,13 +301,16 @@ function authorityGroup(operator) {
|
|
|
294
301
|
const provider = parseDomain(operator).domain;
|
|
295
302
|
return `private:${provider ?? operator}`;
|
|
296
303
|
}
|
|
304
|
+
const INTERMEDIARY_FETCH_CONCURRENCY = 8;
|
|
297
305
|
function grantsScope(grant, scope) {
|
|
298
306
|
return grant.scopes.some(
|
|
299
307
|
(granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
|
|
300
308
|
);
|
|
301
309
|
}
|
|
302
310
|
function grantMatches(grant, target, claim, now) {
|
|
303
|
-
|
|
311
|
+
return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
|
|
312
|
+
}
|
|
313
|
+
function grantCovers(grant, claim, now) {
|
|
304
314
|
if (!grantsScope(grant, claim.scope)) return false;
|
|
305
315
|
if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === canonicalAgentOrigin(claim.signerOrigin)))
|
|
306
316
|
return false;
|
|
@@ -317,7 +327,7 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
317
327
|
const now = (options.now ?? (() => Date.now() / 1e3))();
|
|
318
328
|
const signer = await options.evaluator.match(claim.signerOrigin, "adcp:buying", claim.brand.countries);
|
|
319
329
|
if (signer.agent.countries && !claim.brand.countries?.length) failure();
|
|
320
|
-
const brand =
|
|
330
|
+
const brand = claimRegistrableDomain(claim.brand.domain), account = claimRegistrableDomain(claim.accountOperator), operator = signer.operator;
|
|
321
331
|
const result = (source, chain, grants = []) => ({
|
|
322
332
|
source,
|
|
323
333
|
chain,
|
|
@@ -326,7 +336,6 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
326
336
|
...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
|
|
327
337
|
});
|
|
328
338
|
if (brand === operator && account === operator) return result("implicit", [brand]);
|
|
329
|
-
if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
|
|
330
339
|
let house;
|
|
331
340
|
try {
|
|
332
341
|
house = await options.resolveBrandHouse?.(claim.brand);
|
|
@@ -335,34 +344,45 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
335
344
|
throw cause;
|
|
336
345
|
unavailable(cause);
|
|
337
346
|
}
|
|
338
|
-
const authoritativeBrand = house ?
|
|
339
|
-
|
|
347
|
+
const authoritativeBrand = house ? claimRegistrableDomain(house.domain) : brand;
|
|
348
|
+
const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
|
|
349
|
+
if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
|
|
340
350
|
const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
|
|
341
351
|
const record = await options.evaluator.get(authoritativeBrand);
|
|
342
352
|
if (record.status === "absent") {
|
|
343
353
|
if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
|
|
344
354
|
throw new IdentityAuthorizationError("grant_absent");
|
|
345
355
|
}
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (
|
|
356
|
+
const firsts = [];
|
|
357
|
+
for (const grant of record.record.grants ?? []) {
|
|
358
|
+
const grantee = registrableGrantee(grant.grantee);
|
|
359
|
+
if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
|
|
360
|
+
if (!self.has(account) && account !== grantee) continue;
|
|
361
|
+
if (grantee === operator) return result("trust", [brand, operator], [grant]);
|
|
362
|
+
firsts.push({ grant, grantee });
|
|
363
|
+
}
|
|
364
|
+
const grantees = [...new Set(firsts.map((f) => f.grantee))];
|
|
365
|
+
const records = /* @__PURE__ */ new Map();
|
|
366
|
+
for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
|
|
367
|
+
const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
|
|
368
|
+
const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
|
|
369
|
+
settled.forEach(
|
|
370
|
+
(outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
|
|
371
|
+
);
|
|
352
372
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
373
|
+
let outage;
|
|
374
|
+
for (const { grant: first, grantee } of firsts) {
|
|
375
|
+
const intermediary = records.get(grantee);
|
|
376
|
+
if ("failed" in intermediary) {
|
|
377
|
+
outage ??= intermediary.failed;
|
|
378
|
+
continue;
|
|
358
379
|
}
|
|
380
|
+
if (intermediary.status !== "present") continue;
|
|
381
|
+
const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
|
|
382
|
+
if (second) return result("trust", [brand, grantee, operator], [first, second]);
|
|
359
383
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
return grantee !== void 0 && (grantee === account || selfOperated && grantee === operator) && grantsScope(g, claim.scope);
|
|
363
|
-
});
|
|
364
|
-
const exclusive = record.record.exclusive_grants === true && (record.record.grants ?? []).some((g) => grantsScope(g, claim.scope));
|
|
365
|
-
if (!covered && !exclusive && await options.sellerAuthorization?.(claim))
|
|
384
|
+
if (outage !== void 0) throw outage;
|
|
385
|
+
if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
|
|
366
386
|
return result("seller", [brand, account, operator]);
|
|
367
387
|
throw new IdentityAuthorizationError("grant_absent");
|
|
368
388
|
}
|
|
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(validation_exports);
|
|
|
34
34
|
var import_ajv = __toESM(require("ajv"));
|
|
35
35
|
var import_ajv_formats = __toESM(require("ajv-formats"));
|
|
36
36
|
var import_schema_loader = require('../validation/schema-loader.js');
|
|
37
|
+
var import_compact_schema = require('../validation/compact-schema.js');
|
|
37
38
|
var import_schemas = __toESM(require('./schemas.draft.js'));
|
|
38
39
|
const validators = /* @__PURE__ */ new WeakMap();
|
|
39
40
|
function validateIdentity33Payload(tool, direction, payload, version) {
|
|
@@ -79,14 +80,15 @@ function validateIdentity33Payload(tool, direction, payload, version) {
|
|
|
79
80
|
for (const [k, value] of Object.entries(object)) if (k !== "$id") walk2(value, k);
|
|
80
81
|
};
|
|
81
82
|
var walk = walk2;
|
|
82
|
-
const
|
|
83
|
+
const document = (0, import_schema_loader.getToolSchemaDocument)(tool, direction === "request" ? "request" : "sync", version)?.schema ?? stable.schema;
|
|
84
|
+
const schema = structuredClone(direction === "response" ? (0, import_schema_loader.relaxResponseRoot)(document) : document);
|
|
83
85
|
const relationship = import_schemas.default.find((s) => s.$id === "/schemas/core/principal-relationship.json");
|
|
84
86
|
const onboarding = import_schemas.default.find((s) => s.$id === "/schemas/core/agent-onboarding.json");
|
|
85
87
|
walk2(schema);
|
|
86
|
-
const ajv = new import_ajv.default({ strict: false, allErrors: true });
|
|
88
|
+
const ajv = new import_ajv.default({ inlineRefs: false, strict: false, allErrors: true });
|
|
87
89
|
(0, import_ajv_formats.default)(ajv);
|
|
88
90
|
for (const draft of import_schemas.default) ajv.addSchema({ ...draft, $id: "https://adcontextprotocol.org" + draft.$id });
|
|
89
|
-
validator = ajv.compile(schema);
|
|
91
|
+
validator = ajv.compile((0, import_compact_schema.compactSchemaForValidation)(schema));
|
|
90
92
|
cache.set(key, validator);
|
|
91
93
|
}
|
|
92
94
|
let valid = validator(payload) === true;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Ajv from "ajv";
|
|
2
2
|
import addFormats from "ajv-formats";
|
|
3
|
-
import { getValidator } from "../validation/schema-loader.mjs";
|
|
3
|
+
import { getValidator, getToolSchemaDocument, relaxResponseRoot } from "../validation/schema-loader.mjs";
|
|
4
|
+
import { compactSchemaForValidation } from "../validation/compact-schema.mjs";
|
|
4
5
|
import schemas from "./schemas.draft.mjs";
|
|
5
6
|
const validators = /* @__PURE__ */ new WeakMap();
|
|
6
7
|
function validateIdentity33Payload(tool, direction, payload, version) {
|
|
@@ -46,14 +47,15 @@ function validateIdentity33Payload(tool, direction, payload, version) {
|
|
|
46
47
|
for (const [k, value] of Object.entries(object)) if (k !== "$id") walk2(value, k);
|
|
47
48
|
};
|
|
48
49
|
var walk = walk2;
|
|
49
|
-
const
|
|
50
|
+
const document = getToolSchemaDocument(tool, direction === "request" ? "request" : "sync", version)?.schema ?? stable.schema;
|
|
51
|
+
const schema = structuredClone(direction === "response" ? relaxResponseRoot(document) : document);
|
|
50
52
|
const relationship = schemas.find((s) => s.$id === "/schemas/core/principal-relationship.json");
|
|
51
53
|
const onboarding = schemas.find((s) => s.$id === "/schemas/core/agent-onboarding.json");
|
|
52
54
|
walk2(schema);
|
|
53
|
-
const ajv = new Ajv({ strict: false, allErrors: true });
|
|
55
|
+
const ajv = new Ajv({ inlineRefs: false, strict: false, allErrors: true });
|
|
54
56
|
addFormats(ajv);
|
|
55
57
|
for (const draft of schemas) ajv.addSchema({ ...draft, $id: "https://adcontextprotocol.org" + draft.$id });
|
|
56
|
-
validator = ajv.compile(schema);
|
|
58
|
+
validator = ajv.compile(compactSchemaForValidation(schema));
|
|
57
59
|
cache.set(key, validator);
|
|
58
60
|
}
|
|
59
61
|
let valid = validator(payload) === true;
|