@adcp/sdk 17.0.0-beta.1 → 17.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/adapters/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/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 +34 -21
- package/dist/lib/identity-3.3/trust.mjs +34 -21
- 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/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/create-adcp-server.js +33 -20
- package/dist/lib/server/create-adcp-server.mjs +36 -12
- 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/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/storyboard/canonical-format-satisfaction.js +60 -14
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +60 -14
- 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/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/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- 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 +191 -14
- package/docs/migration-6.6-to-6.7.md +14 -0
- package/docs/migration-account-change-feed.md +15 -0
- package/docs/recipes/verifying-inbound-webhooks.md +18 -2
- package/package.json +2 -2
|
@@ -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) {
|
|
@@ -335,13 +335,16 @@ function authorityGroup(operator) {
|
|
|
335
335
|
const provider = (0, import_tldts.parse)(operator).domain;
|
|
336
336
|
return `private:${provider ?? operator}`;
|
|
337
337
|
}
|
|
338
|
+
const INTERMEDIARY_FETCH_CONCURRENCY = 8;
|
|
338
339
|
function grantsScope(grant, scope) {
|
|
339
340
|
return grant.scopes.some(
|
|
340
341
|
(granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
|
|
341
342
|
);
|
|
342
343
|
}
|
|
343
344
|
function grantMatches(grant, target, claim, now) {
|
|
344
|
-
|
|
345
|
+
return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
|
|
346
|
+
}
|
|
347
|
+
function grantCovers(grant, claim, now) {
|
|
345
348
|
if (!grantsScope(grant, claim.scope)) return false;
|
|
346
349
|
if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === (0, import_canonicalize.canonicalAgentOrigin)(claim.signerOrigin)))
|
|
347
350
|
return false;
|
|
@@ -367,7 +370,6 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
367
370
|
...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
|
|
368
371
|
});
|
|
369
372
|
if (brand === operator && account === operator) return result("implicit", [brand]);
|
|
370
|
-
if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
|
|
371
373
|
let house;
|
|
372
374
|
try {
|
|
373
375
|
house = await options.resolveBrandHouse?.(claim.brand);
|
|
@@ -377,33 +379,44 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
377
379
|
unavailable(cause);
|
|
378
380
|
}
|
|
379
381
|
const authoritativeBrand = house ? (0, import_etld.eTldPlusOne)(house.domain) : brand;
|
|
380
|
-
|
|
382
|
+
const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
|
|
383
|
+
if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
|
|
381
384
|
const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
|
|
382
385
|
const record = await options.evaluator.get(authoritativeBrand);
|
|
383
386
|
if (record.status === "absent") {
|
|
384
387
|
if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
|
|
385
388
|
throw new IdentityAuthorizationError("grant_absent");
|
|
386
389
|
}
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
if (
|
|
390
|
+
const firsts = [];
|
|
391
|
+
for (const grant of record.record.grants ?? []) {
|
|
392
|
+
const grantee = registrableGrantee(grant.grantee);
|
|
393
|
+
if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
|
|
394
|
+
if (!self.has(account) && account !== grantee) continue;
|
|
395
|
+
if (grantee === operator) return result("trust", [brand, operator], [grant]);
|
|
396
|
+
firsts.push({ grant, grantee });
|
|
397
|
+
}
|
|
398
|
+
const grantees = [...new Set(firsts.map((f) => f.grantee))];
|
|
399
|
+
const records = /* @__PURE__ */ new Map();
|
|
400
|
+
for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
|
|
401
|
+
const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
|
|
402
|
+
const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
|
|
403
|
+
settled.forEach(
|
|
404
|
+
(outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
|
|
405
|
+
);
|
|
393
406
|
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
407
|
+
let outage;
|
|
408
|
+
for (const { grant: first, grantee } of firsts) {
|
|
409
|
+
const intermediary = records.get(grantee);
|
|
410
|
+
if ("failed" in intermediary) {
|
|
411
|
+
outage ??= intermediary.failed;
|
|
412
|
+
continue;
|
|
399
413
|
}
|
|
414
|
+
if (intermediary.status !== "present") continue;
|
|
415
|
+
const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
|
|
416
|
+
if (second) return result("trust", [brand, grantee, operator], [first, second]);
|
|
400
417
|
}
|
|
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))
|
|
418
|
+
if (outage !== void 0) throw outage;
|
|
419
|
+
if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
|
|
407
420
|
return result("seller", [brand, account, operator]);
|
|
408
421
|
throw new IdentityAuthorizationError("grant_absent");
|
|
409
422
|
}
|
|
@@ -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) {
|
|
@@ -294,13 +294,16 @@ function authorityGroup(operator) {
|
|
|
294
294
|
const provider = parseDomain(operator).domain;
|
|
295
295
|
return `private:${provider ?? operator}`;
|
|
296
296
|
}
|
|
297
|
+
const INTERMEDIARY_FETCH_CONCURRENCY = 8;
|
|
297
298
|
function grantsScope(grant, scope) {
|
|
298
299
|
return grant.scopes.some(
|
|
299
300
|
(granted) => granted === "*" || granted === scope || granted === "adcp:all" && scope.startsWith("adcp:")
|
|
300
301
|
);
|
|
301
302
|
}
|
|
302
303
|
function grantMatches(grant, target, claim, now) {
|
|
303
|
-
|
|
304
|
+
return registrableGrantee(grant.grantee) === target && grantCovers(grant, claim, now);
|
|
305
|
+
}
|
|
306
|
+
function grantCovers(grant, claim, now) {
|
|
304
307
|
if (!grantsScope(grant, claim.scope)) return false;
|
|
305
308
|
if (grant.agents && !grant.agents.some((agent) => grantAgentOrigin(agent.url) === canonicalAgentOrigin(claim.signerOrigin)))
|
|
306
309
|
return false;
|
|
@@ -326,7 +329,6 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
326
329
|
...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
|
|
327
330
|
});
|
|
328
331
|
if (brand === operator && account === operator) return result("implicit", [brand]);
|
|
329
|
-
if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
|
|
330
332
|
let house;
|
|
331
333
|
try {
|
|
332
334
|
house = await options.resolveBrandHouse?.(claim.brand);
|
|
@@ -336,33 +338,44 @@ async function authorizeDemandGrant(claim, options) {
|
|
|
336
338
|
unavailable(cause);
|
|
337
339
|
}
|
|
338
340
|
const authoritativeBrand = house ? eTldPlusOne(house.domain) : brand;
|
|
339
|
-
|
|
341
|
+
const self = /* @__PURE__ */ new Set([brand, authoritativeBrand]);
|
|
342
|
+
if (self.has(account) && self.has(operator)) return result("implicit", [.../* @__PURE__ */ new Set([brand, account, operator])]);
|
|
340
343
|
const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
|
|
341
344
|
const record = await options.evaluator.get(authoritativeBrand);
|
|
342
345
|
if (record.status === "absent") {
|
|
343
346
|
if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
|
|
344
347
|
throw new IdentityAuthorizationError("grant_absent");
|
|
345
348
|
}
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (
|
|
349
|
+
const firsts = [];
|
|
350
|
+
for (const grant of record.record.grants ?? []) {
|
|
351
|
+
const grantee = registrableGrantee(grant.grantee);
|
|
352
|
+
if (grantee === void 0 || !grantCovers(grant, grantClaim, now)) continue;
|
|
353
|
+
if (!self.has(account) && account !== grantee) continue;
|
|
354
|
+
if (grantee === operator) return result("trust", [brand, operator], [grant]);
|
|
355
|
+
firsts.push({ grant, grantee });
|
|
356
|
+
}
|
|
357
|
+
const grantees = [...new Set(firsts.map((f) => f.grantee))];
|
|
358
|
+
const records = /* @__PURE__ */ new Map();
|
|
359
|
+
for (let i = 0; i < grantees.length; i += INTERMEDIARY_FETCH_CONCURRENCY) {
|
|
360
|
+
const batch = grantees.slice(i, i + INTERMEDIARY_FETCH_CONCURRENCY);
|
|
361
|
+
const settled = await Promise.allSettled(batch.map((grantee) => options.evaluator.get(grantee)));
|
|
362
|
+
settled.forEach(
|
|
363
|
+
(outcome, j) => records.set(batch[j], outcome.status === "fulfilled" ? outcome.value : { failed: outcome.reason })
|
|
364
|
+
);
|
|
352
365
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
366
|
+
let outage;
|
|
367
|
+
for (const { grant: first, grantee } of firsts) {
|
|
368
|
+
const intermediary = records.get(grantee);
|
|
369
|
+
if ("failed" in intermediary) {
|
|
370
|
+
outage ??= intermediary.failed;
|
|
371
|
+
continue;
|
|
358
372
|
}
|
|
373
|
+
if (intermediary.status !== "present") continue;
|
|
374
|
+
const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
|
|
375
|
+
if (second) return result("trust", [brand, grantee, operator], [first, second]);
|
|
359
376
|
}
|
|
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))
|
|
377
|
+
if (outage !== void 0) throw outage;
|
|
378
|
+
if (record.record.exclusive_grants !== true && await options.sellerAuthorization?.(claim))
|
|
366
379
|
return result("seller", [brand, account, operator]);
|
|
367
380
|
throw new IdentityAuthorizationError("grant_absent");
|
|
368
381
|
}
|
|
@@ -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;
|