@adcp/sdk 15.9.0 → 16.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adcp-identity.js +74 -0
- package/bin/adcp.js +2 -0
- package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
- package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
- package/dist/lib/adapters/keyed-account-backend.js +121 -0
- package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
- package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
- package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
- package/dist/lib/adapters/keyed-account-store.js +227 -0
- package/dist/lib/adapters/keyed-account-store.mjs +203 -0
- package/dist/lib/core/SingleAgentClient.d.mts +16 -2
- package/dist/lib/core/SingleAgentClient.d.ts +16 -2
- package/dist/lib/core/SingleAgentClient.js +259 -62
- package/dist/lib/core/SingleAgentClient.mjs +261 -57
- package/dist/lib/core/TaskExecutor.d.mts +6 -0
- package/dist/lib/core/TaskExecutor.d.ts +6 -0
- package/dist/lib/core/TaskExecutor.js +66 -5
- package/dist/lib/core/TaskExecutor.mjs +71 -5
- package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
- package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
- package/dist/lib/core/redis-webhook-registration-store.js +23 -1
- package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
- package/dist/lib/core/webhook-registration.d.mts +7 -1
- package/dist/lib/core/webhook-registration.d.ts +7 -1
- package/dist/lib/core/webhook-registration.js +24 -2
- package/dist/lib/core/webhook-registration.mjs +23 -2
- package/dist/lib/identity-3.3/index.d.mts +10 -0
- package/dist/lib/identity-3.3/index.d.ts +10 -0
- package/dist/lib/identity-3.3/index.js +75 -0
- package/dist/lib/identity-3.3/index.mjs +46 -0
- package/dist/lib/identity-3.3/lifecycle.d.mts +113 -0
- package/dist/lib/identity-3.3/lifecycle.d.ts +113 -0
- package/dist/lib/identity-3.3/lifecycle.js +267 -0
- package/dist/lib/identity-3.3/lifecycle.mjs +240 -0
- package/dist/lib/identity-3.3/revocation.d.mts +50 -0
- package/dist/lib/identity-3.3/revocation.d.ts +50 -0
- package/dist/lib/identity-3.3/revocation.js +238 -0
- package/dist/lib/identity-3.3/revocation.mjs +216 -0
- package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
- package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
- package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
- package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
- package/dist/lib/identity-3.3/server.d.mts +34 -0
- package/dist/lib/identity-3.3/server.d.ts +34 -0
- package/dist/lib/identity-3.3/server.js +219 -0
- package/dist/lib/identity-3.3/server.mjs +194 -0
- package/dist/lib/identity-3.3/store.d.mts +24 -0
- package/dist/lib/identity-3.3/store.d.ts +24 -0
- package/dist/lib/identity-3.3/store.js +191 -0
- package/dist/lib/identity-3.3/store.mjs +169 -0
- package/dist/lib/identity-3.3/trust.d.mts +94 -0
- package/dist/lib/identity-3.3/trust.d.ts +94 -0
- package/dist/lib/identity-3.3/trust.js +278 -0
- package/dist/lib/identity-3.3/trust.mjs +239 -0
- package/dist/lib/identity-3.3/types.d.mts +127 -0
- package/dist/lib/identity-3.3/types.d.ts +127 -0
- package/dist/lib/identity-3.3/types.js +16 -0
- package/dist/lib/identity-3.3/types.mjs +0 -0
- package/dist/lib/identity-3.3/validation.d.mts +2 -0
- package/dist/lib/identity-3.3/validation.d.ts +2 -0
- package/dist/lib/identity-3.3/validation.js +125 -0
- package/dist/lib/identity-3.3/validation.mjs +91 -0
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/reporting/azure/index.d.mts +5 -0
- package/dist/lib/reporting/azure/index.d.ts +5 -0
- package/dist/lib/reporting/azure/index.js +26 -7
- package/dist/lib/reporting/azure/index.mjs +26 -7
- package/dist/lib/reporting/bigquery/index.d.mts +80 -25
- package/dist/lib/reporting/bigquery/index.d.ts +80 -25
- package/dist/lib/reporting/bigquery/index.js +184 -81
- package/dist/lib/reporting/bigquery/index.mjs +182 -80
- package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
- package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
- package/dist/lib/reporting/gcs/errors.d.mts +6 -0
- package/dist/lib/reporting/gcs/errors.d.ts +6 -0
- package/dist/lib/reporting/gcs/fence.d.mts +5 -0
- package/dist/lib/reporting/gcs/fence.d.ts +5 -0
- package/dist/lib/reporting/gcs/index.d.mts +9 -0
- package/dist/lib/reporting/gcs/index.d.ts +9 -0
- package/dist/lib/reporting/gcs/reader.d.mts +27 -3
- package/dist/lib/reporting/gcs/reader.d.ts +27 -3
- package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
- package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
- package/dist/lib/reporting/gcs/row-provider.js +34 -14
- package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
- package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
- package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
- package/dist/lib/reporting/ledger/index.d.mts +11 -0
- package/dist/lib/reporting/ledger/index.d.ts +11 -0
- package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
- package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
- package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
- package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
- package/dist/lib/reporting/ledger/managed.d.mts +86 -6
- package/dist/lib/reporting/ledger/managed.d.ts +86 -6
- package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
- package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
- package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
- package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
- package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
- package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
- package/dist/lib/reporting/ledger/postgres.js +43 -27
- package/dist/lib/reporting/ledger/postgres.mjs +43 -27
- package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
- package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
- package/dist/lib/reporting/ledger/row-encoding.js +8 -4
- package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
- package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
- package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
- package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
- package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
- package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
- package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
- package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
- package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
- package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
- package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
- package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
- package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
- package/dist/lib/reporting/ledger/row-storage.js +126 -66
- package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
- package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
- package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
- package/dist/lib/reporting/ledger/schedule.js +24 -0
- package/dist/lib/reporting/ledger/schedule.mjs +23 -0
- package/dist/lib/reporting/ledger/types.d.mts +23 -1
- package/dist/lib/reporting/ledger/types.d.ts +23 -1
- package/dist/lib/reporting/s3/index.d.mts +5 -0
- package/dist/lib/reporting/s3/index.d.ts +5 -0
- package/dist/lib/reporting/s3/index.js +37 -14
- package/dist/lib/reporting/s3/index.mjs +37 -14
- package/dist/lib/reporting/service/index.d.mts +10 -0
- package/dist/lib/reporting/service/index.d.ts +10 -0
- package/dist/lib/reporting/service/maintenance.d.mts +28 -2
- package/dist/lib/reporting/service/maintenance.d.ts +28 -2
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-sync-contract.d.mts +14 -0
- package/dist/lib/server/account-sync-contract.d.ts +14 -0
- package/dist/lib/server/account-sync-contract.js +225 -0
- package/dist/lib/server/account-sync-contract.mjs +197 -0
- package/dist/lib/server/adcp-server.js +5 -0
- package/dist/lib/server/adcp-server.mjs +10 -0
- package/dist/lib/server/auth-signature.d.mts +10 -0
- package/dist/lib/server/auth-signature.d.ts +10 -0
- package/dist/lib/server/auth-signature.js +61 -2
- package/dist/lib/server/auth-signature.mjs +65 -2
- package/dist/lib/server/auth.d.mts +6 -0
- package/dist/lib/server/auth.d.ts +6 -0
- package/dist/lib/server/auth.js +6 -0
- package/dist/lib/server/auth.mjs +6 -0
- package/dist/lib/server/create-adcp-server.d.mts +19 -5
- package/dist/lib/server/create-adcp-server.d.ts +19 -5
- package/dist/lib/server/create-adcp-server.js +238 -19
- package/dist/lib/server/create-adcp-server.mjs +240 -10
- package/dist/lib/server/decisioning/account.d.mts +24 -1
- package/dist/lib/server/decisioning/account.d.ts +24 -1
- package/dist/lib/server/decisioning/index.d.mts +1 -1
- package/dist/lib/server/decisioning/index.d.ts +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
- package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
- package/dist/lib/server/index.d.mts +2 -0
- package/dist/lib/server/index.d.ts +2 -0
- package/dist/lib/server/index.js +12 -0
- package/dist/lib/server/index.mjs +12 -0
- package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
- package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
- package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
- package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
- package/dist/lib/server/principal/types.d.mts +1 -1
- package/dist/lib/server/principal/types.d.ts +1 -1
- package/dist/lib/server/serve.js +5 -0
- package/dist/lib/server/serve.mjs +5 -0
- package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
- package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
- package/dist/lib/server/webhook-delivery/recovery.js +4 -0
- package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
- package/dist/lib/server/webhook-emitter.d.mts +10 -0
- package/dist/lib/server/webhook-emitter.d.ts +10 -0
- package/dist/lib/server/webhook-emitter.js +22 -0
- package/dist/lib/server/webhook-emitter.mjs +22 -0
- package/dist/lib/signing/agent-context.d.mts +0 -5
- package/dist/lib/signing/agent-context.d.ts +0 -5
- package/dist/lib/signing/agent-context.js +9 -1
- package/dist/lib/signing/agent-context.mjs +9 -1
- package/dist/lib/signing/agent-fetch.js +27 -2
- package/dist/lib/signing/agent-fetch.mjs +32 -2
- package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
- package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
- package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
- package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
- package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
- package/dist/lib/signing/agent-resolver/index.js +5 -0
- package/dist/lib/signing/agent-resolver/index.mjs +3 -0
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
- package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
- package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
- package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
- package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
- package/dist/lib/signing/brand-jwks.d.mts +2 -2
- package/dist/lib/signing/brand-jwks.d.ts +2 -2
- package/dist/lib/signing/brand-jwks.js +4 -4
- package/dist/lib/signing/brand-jwks.mjs +4 -4
- package/dist/lib/signing/client.d.mts +1 -0
- package/dist/lib/signing/client.d.ts +1 -0
- package/dist/lib/signing/client.js +5 -0
- package/dist/lib/signing/client.mjs +3 -0
- package/dist/lib/signing/jwks-https.d.mts +1 -1
- package/dist/lib/signing/jwks-https.d.ts +1 -1
- package/dist/lib/signing/jwks-https.js +1 -1
- package/dist/lib/signing/jwks-https.mjs +1 -1
- package/dist/lib/signing/jwks.d.mts +11 -3
- package/dist/lib/signing/jwks.d.ts +11 -3
- package/dist/lib/signing/jwks.js +1 -1
- package/dist/lib/signing/jwks.mjs +1 -1
- package/dist/lib/signing/parser.d.mts +1 -1
- package/dist/lib/signing/parser.d.ts +1 -1
- package/dist/lib/signing/parser.js +5 -3
- package/dist/lib/signing/parser.mjs +6 -4
- package/dist/lib/signing/revocation.d.mts +4 -1
- package/dist/lib/signing/revocation.d.ts +4 -1
- package/dist/lib/signing/revocation.js +33 -3
- package/dist/lib/signing/revocation.mjs +31 -2
- package/dist/lib/signing/server.d.mts +1 -1
- package/dist/lib/signing/server.d.ts +1 -1
- package/dist/lib/signing/server.js +4 -0
- package/dist/lib/signing/server.mjs +4 -0
- package/dist/lib/signing/types.d.mts +3 -0
- package/dist/lib/signing/types.d.ts +3 -0
- package/dist/lib/signing/web-bot-auth.d.mts +117 -0
- package/dist/lib/signing/web-bot-auth.d.ts +117 -0
- package/dist/lib/signing/web-bot-auth.js +660 -0
- package/dist/lib/signing/web-bot-auth.mjs +624 -0
- package/dist/lib/testing/client.d.mts +1 -4
- package/dist/lib/testing/client.d.ts +1 -4
- package/dist/lib/testing/client.js +141 -20
- package/dist/lib/testing/client.mjs +137 -19
- package/dist/lib/testing/compliance/comply.js +29 -10
- package/dist/lib/testing/compliance/comply.mjs +37 -11
- package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
- package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
- package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
- package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
- package/dist/lib/testing/storyboard/default-invariants.js +2 -0
- package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
- package/dist/lib/testing/storyboard/runner.js +23 -8
- package/dist/lib/testing/storyboard/runner.mjs +24 -8
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/types/adcp.d.mts +4 -0
- package/dist/lib/types/adcp.d.ts +4 -0
- package/dist/lib/types/schemas.generated.d.ts +6 -6
- package/dist/lib/utils/capabilities.d.mts +1 -0
- package/dist/lib/utils/capabilities.d.ts +1 -0
- package/dist/lib/utils/capabilities.js +5 -0
- package/dist/lib/utils/capabilities.mjs +5 -0
- package/dist/lib/v2/projection/creative-delivery.d.mts +3 -1
- package/dist/lib/v2/projection/creative-delivery.d.ts +3 -1
- package/dist/lib/v2/projection/creative-delivery.js +26 -10
- package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
- package/dist/lib/v2/projection/index.d.mts +1 -1
- package/dist/lib/v2/projection/index.d.ts +1 -1
- package/dist/lib/v2/projection/legacy-routes.d.mts +24 -2
- package/dist/lib/v2/projection/legacy-routes.d.ts +24 -2
- package/dist/lib/v2/projection/legacy-routes.js +28 -2
- package/dist/lib/v2/projection/legacy-routes.mjs +26 -2
- package/dist/lib/validation/schema-loader.d.mts +2 -0
- package/dist/lib/validation/schema-loader.d.ts +2 -0
- package/dist/lib/validation/schema-loader.js +43 -4
- package/dist/lib/validation/schema-loader.mjs +39 -3
- 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/docs/TYPE-SUMMARY.md +2 -2
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
- package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
- package/docs/guides/REPORTING-LEDGER.md +132 -46
- package/docs/guides/REPORTING-OPERATIONS.md +25 -4
- package/docs/guides/REPORTING-STABILITY.md +76 -0
- package/docs/guides/account-resolution.md +101 -0
- package/docs/llms.txt +3 -2
- package/docs/migration-12-to-13.md +7 -0
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-agent-identity-3.3.md +355 -0
- package/docs/migration-agent-resolution-3.3.md +5 -0
- package/docs/migration-reporting-row-storage-alignment.md +137 -0
- package/examples/storyboards/account-sync-contract.yaml +57 -0
- package/package.json +15 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthPrincipal } from '../server/auth.mjs';
|
|
2
|
+
import type { HandlerContext, ProtocolHandlers } from '../server/create-adcp-server.mjs';
|
|
3
|
+
import { type VerifiedWebBotSigner } from '../signing/web-bot-auth.mjs';
|
|
4
|
+
import type { ResolvedOperation } from '../signing/operation-resolution.mjs';
|
|
5
|
+
import type { OriginIdentityLifecycle } from './lifecycle.mjs';
|
|
6
|
+
import { type DemandGrantClaim, type DemandGrantOptions } from './trust.mjs';
|
|
7
|
+
export declare function isIdentity33UnboundContext(ctx: HandlerContext<unknown>): boolean;
|
|
8
|
+
/** Maps only audited bindings. An unknown origin remains in anonymous scope. */
|
|
9
|
+
export declare function createIdentity33PrincipalResolver(options: {
|
|
10
|
+
lifecycle: OriginIdentityLifecycle;
|
|
11
|
+
anonymousPrincipal?: string;
|
|
12
|
+
anonymousTools?: readonly string[];
|
|
13
|
+
}): (signers: readonly VerifiedWebBotSigner[], operation: ResolvedOperation) => Promise<AuthPrincipal>;
|
|
14
|
+
/** Pass to createAdcpServer.identity33.authorize; framework runs it before its replay cache. */
|
|
15
|
+
export declare function createIdentity33Authorization<TAccount>(options: {
|
|
16
|
+
lifecycle: OriginIdentityLifecycle;
|
|
17
|
+
/** Explicitly declared custom read tools still re-check identity membership. */
|
|
18
|
+
readOnlyTools?: readonly string[];
|
|
19
|
+
anonymousTools?: readonly string[];
|
|
20
|
+
grants: DemandGrantOptions;
|
|
21
|
+
/** Runs before account resolution: look up existing seller accounts read-only. sync_accounts includes all proposed rows. Never trust request reassignment or provision here. */
|
|
22
|
+
resolveClaims: (ctx: HandlerContext<TAccount>, tool: string, params: unknown) => Promise<readonly (Omit<DemandGrantClaim, 'signerOrigin'> & {
|
|
23
|
+
sandbox?: boolean;
|
|
24
|
+
billing?: 'operator' | 'agent' | 'advertiser';
|
|
25
|
+
})[]>;
|
|
26
|
+
}): (ctx: HandlerContext<TAccount>, tool: string, params: unknown) => Promise<void>;
|
|
27
|
+
/** Adds caller-only relationship readback; unknown reads never run the durable principal runtime. */
|
|
28
|
+
export declare function withIdentity33PrincipalHandlers<TAccount>(base: ProtocolHandlers<TAccount>, lifecycle: OriginIdentityLifecycle): ProtocolHandlers<TAccount>;
|
|
29
|
+
/** Use as createPrincipalLifecycle.resolvePrincipal to keep the configuration record on the audited binding. */
|
|
30
|
+
export declare function createIdentity33PrincipalScopeResolver<TAccount>(options: {
|
|
31
|
+
lifecycle: OriginIdentityLifecycle;
|
|
32
|
+
tenantId: string;
|
|
33
|
+
legacy?: (ctx: HandlerContext<TAccount>) => Promise<import('../server/principal/types.mjs').ResolvedPrincipalScope>;
|
|
34
|
+
}): (ctx: HandlerContext<TAccount>) => Promise<import('../server/principal/types.mjs').ResolvedPrincipalScope>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthPrincipal } from '../server/auth';
|
|
2
|
+
import type { HandlerContext, ProtocolHandlers } from '../server/create-adcp-server';
|
|
3
|
+
import { type VerifiedWebBotSigner } from '../signing/web-bot-auth';
|
|
4
|
+
import type { ResolvedOperation } from '../signing/operation-resolution';
|
|
5
|
+
import type { OriginIdentityLifecycle } from './lifecycle';
|
|
6
|
+
import { type DemandGrantClaim, type DemandGrantOptions } from './trust';
|
|
7
|
+
export declare function isIdentity33UnboundContext(ctx: HandlerContext<unknown>): boolean;
|
|
8
|
+
/** Maps only audited bindings. An unknown origin remains in anonymous scope. */
|
|
9
|
+
export declare function createIdentity33PrincipalResolver(options: {
|
|
10
|
+
lifecycle: OriginIdentityLifecycle;
|
|
11
|
+
anonymousPrincipal?: string;
|
|
12
|
+
anonymousTools?: readonly string[];
|
|
13
|
+
}): (signers: readonly VerifiedWebBotSigner[], operation: ResolvedOperation) => Promise<AuthPrincipal>;
|
|
14
|
+
/** Pass to createAdcpServer.identity33.authorize; framework runs it before its replay cache. */
|
|
15
|
+
export declare function createIdentity33Authorization<TAccount>(options: {
|
|
16
|
+
lifecycle: OriginIdentityLifecycle;
|
|
17
|
+
/** Explicitly declared custom read tools still re-check identity membership. */
|
|
18
|
+
readOnlyTools?: readonly string[];
|
|
19
|
+
anonymousTools?: readonly string[];
|
|
20
|
+
grants: DemandGrantOptions;
|
|
21
|
+
/** Runs before account resolution: look up existing seller accounts read-only. sync_accounts includes all proposed rows. Never trust request reassignment or provision here. */
|
|
22
|
+
resolveClaims: (ctx: HandlerContext<TAccount>, tool: string, params: unknown) => Promise<readonly (Omit<DemandGrantClaim, 'signerOrigin'> & {
|
|
23
|
+
sandbox?: boolean;
|
|
24
|
+
billing?: 'operator' | 'agent' | 'advertiser';
|
|
25
|
+
})[]>;
|
|
26
|
+
}): (ctx: HandlerContext<TAccount>, tool: string, params: unknown) => Promise<void>;
|
|
27
|
+
/** Adds caller-only relationship readback; unknown reads never run the durable principal runtime. */
|
|
28
|
+
export declare function withIdentity33PrincipalHandlers<TAccount>(base: ProtocolHandlers<TAccount>, lifecycle: OriginIdentityLifecycle): ProtocolHandlers<TAccount>;
|
|
29
|
+
/** Use as createPrincipalLifecycle.resolvePrincipal to keep the configuration record on the audited binding. */
|
|
30
|
+
export declare function createIdentity33PrincipalScopeResolver<TAccount>(options: {
|
|
31
|
+
lifecycle: OriginIdentityLifecycle;
|
|
32
|
+
tenantId: string;
|
|
33
|
+
legacy?: (ctx: HandlerContext<TAccount>) => Promise<import('../server/principal/types').ResolvedPrincipalScope>;
|
|
34
|
+
}): (ctx: HandlerContext<TAccount>) => Promise<import('../server/principal/types').ResolvedPrincipalScope>;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var server_exports = {};
|
|
20
|
+
__export(server_exports, {
|
|
21
|
+
createIdentity33Authorization: () => createIdentity33Authorization,
|
|
22
|
+
createIdentity33PrincipalResolver: () => createIdentity33PrincipalResolver,
|
|
23
|
+
createIdentity33PrincipalScopeResolver: () => createIdentity33PrincipalScopeResolver,
|
|
24
|
+
isIdentity33UnboundContext: () => isIdentity33UnboundContext,
|
|
25
|
+
withIdentity33PrincipalHandlers: () => withIdentity33PrincipalHandlers
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(server_exports);
|
|
28
|
+
var import_crypto = require("crypto");
|
|
29
|
+
var import_web_bot_auth = require('../signing/web-bot-auth.js');
|
|
30
|
+
var import_errors = require('../signing/errors.js');
|
|
31
|
+
var import_enums = require('../types/enums.generated.js');
|
|
32
|
+
var import_async_outcome = require('../server/decisioning/async-outcome.js');
|
|
33
|
+
var import_web_bot_auth2 = require('../signing/web-bot-auth.js');
|
|
34
|
+
var import_buyer_agent = require('../server/decisioning/buyer-agent.js');
|
|
35
|
+
var import_web_bot_auth3 = require('../signing/web-bot-auth.js');
|
|
36
|
+
var import_trust = require('./trust.js');
|
|
37
|
+
var import_idempotency = require('../utils/idempotency.js');
|
|
38
|
+
const IDENTITY_ADMIN_TOOLS = /* @__PURE__ */ new Set(["sync_principal", "sync_agent_notification_configs"]);
|
|
39
|
+
const KNOWN_TOOLS = /* @__PURE__ */ new Set([...import_enums.TaskTypeValues, "get_task_status", "list_tasks", "tasks_get"]);
|
|
40
|
+
const SPEND_TOOLS = new Set([...import_idempotency.MUTATING_TASKS].filter((tool) => !IDENTITY_ADMIN_TOOLS.has(tool)));
|
|
41
|
+
function needsSpendAuthorization(tool, params) {
|
|
42
|
+
if (SPEND_TOOLS.has(tool) || !KNOWN_TOOLS.has(tool)) return true;
|
|
43
|
+
if (tool !== "get_products" || !params || typeof params !== "object") return false;
|
|
44
|
+
const refine = params.refine;
|
|
45
|
+
return (Array.isArray(refine) ? refine : [refine]).some(
|
|
46
|
+
(entry) => entry && typeof entry === "object" && entry.action === "finalize"
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
function claimFromContext(ctx) {
|
|
50
|
+
const claim = ctx.authInfo?.extra?.identity33;
|
|
51
|
+
return claim && (0, import_web_bot_auth3.isVerifiedWebBotSigner)(claim.signer) ? claim : void 0;
|
|
52
|
+
}
|
|
53
|
+
function isIdentity33UnboundContext(ctx) {
|
|
54
|
+
return claimFromContext(ctx)?.state === "identity-established";
|
|
55
|
+
}
|
|
56
|
+
function createIdentity33PrincipalResolver(options) {
|
|
57
|
+
const anonymousTools = new Set(
|
|
58
|
+
options.anonymousTools ?? [
|
|
59
|
+
"get_adcp_capabilities",
|
|
60
|
+
"get_principal",
|
|
61
|
+
"sync_principal",
|
|
62
|
+
"list_creative_formats",
|
|
63
|
+
"get_products"
|
|
64
|
+
]
|
|
65
|
+
);
|
|
66
|
+
const resolver = async (signers, operation) => {
|
|
67
|
+
if (!signers.length || signers.some((s) => !(0, import_web_bot_auth3.isVerifiedWebBotSigner)(s)))
|
|
68
|
+
throw new import_web_bot_auth3.WebBotAuthError(403, "unverified_identity");
|
|
69
|
+
const signer = signers[signers.length - 1];
|
|
70
|
+
const revoked = signers.find((s) => s.authorizationFailure);
|
|
71
|
+
const { binding } = revoked ? { binding: void 0 } : await options.lifecycle.getPrincipal(signer.origin);
|
|
72
|
+
if (!binding && operation !== void 0 && typeof operation !== "string")
|
|
73
|
+
throw new import_web_bot_auth3.WebBotAuthError(400, "operation");
|
|
74
|
+
const authorizationFailure = revoked?.authorizationFailure ?? (!binding && typeof operation === "string" && !anonymousTools.has(operation) ? (0, import_web_bot_auth2.createWebBotAuthAuthorizationFailure)("identity_not_bound") : void 0);
|
|
75
|
+
return {
|
|
76
|
+
principal: binding?.principalId ?? `${options.anonymousPrincipal ?? "anonymous"}:${(0, import_crypto.createHash)("sha256").update(signer.origin).digest("hex")}`,
|
|
77
|
+
extra: {
|
|
78
|
+
identity33: {
|
|
79
|
+
state: binding ? "bound" : "identity-established",
|
|
80
|
+
signer: revoked ?? signer,
|
|
81
|
+
...authorizationFailure && { authorizationFailure }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
...binding ? {
|
|
85
|
+
credential: (0, import_buyer_agent.markVerifiedHttpSig)({
|
|
86
|
+
kind: "http_sig",
|
|
87
|
+
keyid: signer.keyid,
|
|
88
|
+
agent_url: signer.origin,
|
|
89
|
+
verified_at: signer.verified_at
|
|
90
|
+
})
|
|
91
|
+
} : {}
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
(0, import_web_bot_auth.registerWebBotAuthLegacyOriginGate)(resolver, async (origin) => {
|
|
95
|
+
if ((await options.lifecycle.getPrincipal(origin)).binding)
|
|
96
|
+
throw new import_errors.RequestSignatureError(
|
|
97
|
+
"request_signature_key_unknown",
|
|
98
|
+
7,
|
|
99
|
+
"Origin-bound principals require Web Bot Auth"
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
return resolver;
|
|
103
|
+
}
|
|
104
|
+
function createIdentity33Authorization(options) {
|
|
105
|
+
return async (ctx, tool, params) => {
|
|
106
|
+
const identity = claimFromContext(ctx);
|
|
107
|
+
const failure = (0, import_web_bot_auth2.getWebBotAuthAuthorizationFailure)(ctx.authInfo?.extra);
|
|
108
|
+
if (failure) throw new import_async_outcome.AdcpError(failure.code, failure);
|
|
109
|
+
if (!identity) {
|
|
110
|
+
const verified = ctx.authInfo?.extra?.webBotAuthAuthorization;
|
|
111
|
+
if ((0, import_web_bot_auth3.isVerifiedWebBotSigner)(verified?.signer))
|
|
112
|
+
throw new import_async_outcome.AdcpError("PERMISSION_DENIED", {
|
|
113
|
+
message: "Web Bot Auth resolver did not supply an audited identity claim"
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (identity.state === "identity-established") {
|
|
118
|
+
if (tool === "sync_principal") {
|
|
119
|
+
const dryRun = !!params && typeof params === "object" && params.dry_run === true;
|
|
120
|
+
const binding = await options.lifecycle.syncOpen(identity.signer.origin, { dryRun });
|
|
121
|
+
if (dryRun) return;
|
|
122
|
+
if (!ctx.authInfo) throw new import_trust.IdentityAuthorizationError();
|
|
123
|
+
ctx.authInfo.clientId = binding.principalId;
|
|
124
|
+
ctx.authInfo.credential = (0, import_buyer_agent.markVerifiedHttpSig)({
|
|
125
|
+
kind: "http_sig",
|
|
126
|
+
keyid: identity.signer.keyid,
|
|
127
|
+
agent_url: identity.signer.origin,
|
|
128
|
+
verified_at: identity.signer.verified_at
|
|
129
|
+
});
|
|
130
|
+
ctx.authInfo.extra = {
|
|
131
|
+
...ctx.authInfo.extra,
|
|
132
|
+
credential: ctx.authInfo.credential,
|
|
133
|
+
identity33: { ...identity, state: "bound" }
|
|
134
|
+
};
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if ((options.anonymousTools ?? ["get_principal", "get_adcp_capabilities", "list_creative_formats", "get_products"]).includes(tool) && !needsSpendAuthorization(tool, params))
|
|
138
|
+
return;
|
|
139
|
+
throw new import_async_outcome.AdcpError("PERMISSION_DENIED", { message: "Agent identity is not onboarded for this operation" });
|
|
140
|
+
}
|
|
141
|
+
const origin = identity.signer.origin;
|
|
142
|
+
if (IDENTITY_ADMIN_TOOLS.has(tool)) {
|
|
143
|
+
await options.lifecycle.authorizeBound(origin, { identityConfiguration: true });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (!needsSpendAuthorization(tool, params) || !KNOWN_TOOLS.has(tool) && options.readOnlyTools?.includes(tool)) {
|
|
147
|
+
await options.lifecycle.authorizeBound(origin, { readOnly: true });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const claims = await options.resolveClaims(ctx, tool, params);
|
|
151
|
+
if (!claims.length) throw new import_trust.IdentityAuthorizationError();
|
|
152
|
+
for (const claim of claims) {
|
|
153
|
+
await options.lifecycle.authorizeBound(origin, {
|
|
154
|
+
sandbox: claim.sandbox,
|
|
155
|
+
billing: claim.billing,
|
|
156
|
+
brandDomain: claim.brand.domain
|
|
157
|
+
});
|
|
158
|
+
await (0, import_trust.authorizeDemandGrant)({ ...claim, signerOrigin: origin }, options.grants);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function withIdentity33PrincipalHandlers(base, lifecycle) {
|
|
163
|
+
return {
|
|
164
|
+
...base,
|
|
165
|
+
async syncPrincipal(params, ctx) {
|
|
166
|
+
const identity = claimFromContext(ctx);
|
|
167
|
+
if (identity?.state === "identity-established" && params.dry_run === true)
|
|
168
|
+
return { result: { kind: "validated", action: "would_update", dry_run: true } };
|
|
169
|
+
if (!base.syncPrincipal) throw new import_trust.IdentityAuthorizationError();
|
|
170
|
+
return base.syncPrincipal(params, ctx);
|
|
171
|
+
},
|
|
172
|
+
async getPrincipal(params, ctx) {
|
|
173
|
+
const identity = claimFromContext(ctx);
|
|
174
|
+
if (!identity) {
|
|
175
|
+
if (!base.getPrincipal) throw new import_trust.IdentityAuthorizationError();
|
|
176
|
+
return base.getPrincipal(params, ctx);
|
|
177
|
+
}
|
|
178
|
+
const read = await lifecycle.getPrincipal(identity.signer.origin);
|
|
179
|
+
if (!read.binding) return { result: read.result };
|
|
180
|
+
if (!base.getPrincipal) return { result: read.result };
|
|
181
|
+
const response = await base.getPrincipal(params, ctx);
|
|
182
|
+
if (read.result.relationship && response && typeof response === "object") {
|
|
183
|
+
const boxed = "structuredContent" in response;
|
|
184
|
+
const payload = boxed ? response.structuredContent : response;
|
|
185
|
+
if (payload?.result && ["current", "recognized", "unconfigured"].includes(payload.result.kind ?? "")) {
|
|
186
|
+
const augmented = { ...payload, result: { ...payload.result, relationship: read.result.relationship } };
|
|
187
|
+
return boxed ? { ...response, structuredContent: augmented } : augmented;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return response;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function createIdentity33PrincipalScopeResolver(options) {
|
|
195
|
+
if (!options.tenantId) throw new TypeError("Principal scope requires a trusted tenant id");
|
|
196
|
+
return async (ctx) => {
|
|
197
|
+
const identity = claimFromContext(ctx);
|
|
198
|
+
if (!identity) {
|
|
199
|
+
if (!options.legacy) throw new import_trust.IdentityAuthorizationError();
|
|
200
|
+
return options.legacy(ctx);
|
|
201
|
+
}
|
|
202
|
+
const { binding } = await options.lifecycle.getPrincipal(identity.signer.origin);
|
|
203
|
+
if (!binding) throw new import_trust.IdentityAuthorizationError();
|
|
204
|
+
return {
|
|
205
|
+
tenant_id: options.tenantId,
|
|
206
|
+
principal_id: binding.principalId,
|
|
207
|
+
principal_record_id: binding.principalId,
|
|
208
|
+
principal_kind: binding.principalKind ?? "buyer_agent"
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
createIdentity33Authorization,
|
|
215
|
+
createIdentity33PrincipalResolver,
|
|
216
|
+
createIdentity33PrincipalScopeResolver,
|
|
217
|
+
isIdentity33UnboundContext,
|
|
218
|
+
withIdentity33PrincipalHandlers
|
|
219
|
+
});
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createHash } from "crypto";
|
|
2
|
+
import { registerWebBotAuthLegacyOriginGate } from "../signing/web-bot-auth.mjs";
|
|
3
|
+
import { RequestSignatureError } from "../signing/errors.mjs";
|
|
4
|
+
import { TaskTypeValues } from "../types/enums.generated.mjs";
|
|
5
|
+
import { AdcpError } from "../server/decisioning/async-outcome.mjs";
|
|
6
|
+
import { createWebBotAuthAuthorizationFailure, getWebBotAuthAuthorizationFailure } from "../signing/web-bot-auth.mjs";
|
|
7
|
+
import { markVerifiedHttpSig } from "../server/decisioning/buyer-agent.mjs";
|
|
8
|
+
import { isVerifiedWebBotSigner, WebBotAuthError } from "../signing/web-bot-auth.mjs";
|
|
9
|
+
import {
|
|
10
|
+
authorizeDemandGrant,
|
|
11
|
+
IdentityAuthorizationError
|
|
12
|
+
} from "./trust.mjs";
|
|
13
|
+
import { MUTATING_TASKS } from "../utils/idempotency.mjs";
|
|
14
|
+
const IDENTITY_ADMIN_TOOLS = /* @__PURE__ */ new Set(["sync_principal", "sync_agent_notification_configs"]);
|
|
15
|
+
const KNOWN_TOOLS = /* @__PURE__ */ new Set([...TaskTypeValues, "get_task_status", "list_tasks", "tasks_get"]);
|
|
16
|
+
const SPEND_TOOLS = new Set([...MUTATING_TASKS].filter((tool) => !IDENTITY_ADMIN_TOOLS.has(tool)));
|
|
17
|
+
function needsSpendAuthorization(tool, params) {
|
|
18
|
+
if (SPEND_TOOLS.has(tool) || !KNOWN_TOOLS.has(tool)) return true;
|
|
19
|
+
if (tool !== "get_products" || !params || typeof params !== "object") return false;
|
|
20
|
+
const refine = params.refine;
|
|
21
|
+
return (Array.isArray(refine) ? refine : [refine]).some(
|
|
22
|
+
(entry) => entry && typeof entry === "object" && entry.action === "finalize"
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
function claimFromContext(ctx) {
|
|
26
|
+
const claim = ctx.authInfo?.extra?.identity33;
|
|
27
|
+
return claim && isVerifiedWebBotSigner(claim.signer) ? claim : void 0;
|
|
28
|
+
}
|
|
29
|
+
function isIdentity33UnboundContext(ctx) {
|
|
30
|
+
return claimFromContext(ctx)?.state === "identity-established";
|
|
31
|
+
}
|
|
32
|
+
function createIdentity33PrincipalResolver(options) {
|
|
33
|
+
const anonymousTools = new Set(
|
|
34
|
+
options.anonymousTools ?? [
|
|
35
|
+
"get_adcp_capabilities",
|
|
36
|
+
"get_principal",
|
|
37
|
+
"sync_principal",
|
|
38
|
+
"list_creative_formats",
|
|
39
|
+
"get_products"
|
|
40
|
+
]
|
|
41
|
+
);
|
|
42
|
+
const resolver = async (signers, operation) => {
|
|
43
|
+
if (!signers.length || signers.some((s) => !isVerifiedWebBotSigner(s)))
|
|
44
|
+
throw new WebBotAuthError(403, "unverified_identity");
|
|
45
|
+
const signer = signers[signers.length - 1];
|
|
46
|
+
const revoked = signers.find((s) => s.authorizationFailure);
|
|
47
|
+
const { binding } = revoked ? { binding: void 0 } : await options.lifecycle.getPrincipal(signer.origin);
|
|
48
|
+
if (!binding && operation !== void 0 && typeof operation !== "string")
|
|
49
|
+
throw new WebBotAuthError(400, "operation");
|
|
50
|
+
const authorizationFailure = revoked?.authorizationFailure ?? (!binding && typeof operation === "string" && !anonymousTools.has(operation) ? createWebBotAuthAuthorizationFailure("identity_not_bound") : void 0);
|
|
51
|
+
return {
|
|
52
|
+
principal: binding?.principalId ?? `${options.anonymousPrincipal ?? "anonymous"}:${createHash("sha256").update(signer.origin).digest("hex")}`,
|
|
53
|
+
extra: {
|
|
54
|
+
identity33: {
|
|
55
|
+
state: binding ? "bound" : "identity-established",
|
|
56
|
+
signer: revoked ?? signer,
|
|
57
|
+
...authorizationFailure && { authorizationFailure }
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
...binding ? {
|
|
61
|
+
credential: markVerifiedHttpSig({
|
|
62
|
+
kind: "http_sig",
|
|
63
|
+
keyid: signer.keyid,
|
|
64
|
+
agent_url: signer.origin,
|
|
65
|
+
verified_at: signer.verified_at
|
|
66
|
+
})
|
|
67
|
+
} : {}
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
registerWebBotAuthLegacyOriginGate(resolver, async (origin) => {
|
|
71
|
+
if ((await options.lifecycle.getPrincipal(origin)).binding)
|
|
72
|
+
throw new RequestSignatureError(
|
|
73
|
+
"request_signature_key_unknown",
|
|
74
|
+
7,
|
|
75
|
+
"Origin-bound principals require Web Bot Auth"
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
return resolver;
|
|
79
|
+
}
|
|
80
|
+
function createIdentity33Authorization(options) {
|
|
81
|
+
return async (ctx, tool, params) => {
|
|
82
|
+
const identity = claimFromContext(ctx);
|
|
83
|
+
const failure = getWebBotAuthAuthorizationFailure(ctx.authInfo?.extra);
|
|
84
|
+
if (failure) throw new AdcpError(failure.code, failure);
|
|
85
|
+
if (!identity) {
|
|
86
|
+
const verified = ctx.authInfo?.extra?.webBotAuthAuthorization;
|
|
87
|
+
if (isVerifiedWebBotSigner(verified?.signer))
|
|
88
|
+
throw new AdcpError("PERMISSION_DENIED", {
|
|
89
|
+
message: "Web Bot Auth resolver did not supply an audited identity claim"
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (identity.state === "identity-established") {
|
|
94
|
+
if (tool === "sync_principal") {
|
|
95
|
+
const dryRun = !!params && typeof params === "object" && params.dry_run === true;
|
|
96
|
+
const binding = await options.lifecycle.syncOpen(identity.signer.origin, { dryRun });
|
|
97
|
+
if (dryRun) return;
|
|
98
|
+
if (!ctx.authInfo) throw new IdentityAuthorizationError();
|
|
99
|
+
ctx.authInfo.clientId = binding.principalId;
|
|
100
|
+
ctx.authInfo.credential = markVerifiedHttpSig({
|
|
101
|
+
kind: "http_sig",
|
|
102
|
+
keyid: identity.signer.keyid,
|
|
103
|
+
agent_url: identity.signer.origin,
|
|
104
|
+
verified_at: identity.signer.verified_at
|
|
105
|
+
});
|
|
106
|
+
ctx.authInfo.extra = {
|
|
107
|
+
...ctx.authInfo.extra,
|
|
108
|
+
credential: ctx.authInfo.credential,
|
|
109
|
+
identity33: { ...identity, state: "bound" }
|
|
110
|
+
};
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if ((options.anonymousTools ?? ["get_principal", "get_adcp_capabilities", "list_creative_formats", "get_products"]).includes(tool) && !needsSpendAuthorization(tool, params))
|
|
114
|
+
return;
|
|
115
|
+
throw new AdcpError("PERMISSION_DENIED", { message: "Agent identity is not onboarded for this operation" });
|
|
116
|
+
}
|
|
117
|
+
const origin = identity.signer.origin;
|
|
118
|
+
if (IDENTITY_ADMIN_TOOLS.has(tool)) {
|
|
119
|
+
await options.lifecycle.authorizeBound(origin, { identityConfiguration: true });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!needsSpendAuthorization(tool, params) || !KNOWN_TOOLS.has(tool) && options.readOnlyTools?.includes(tool)) {
|
|
123
|
+
await options.lifecycle.authorizeBound(origin, { readOnly: true });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const claims = await options.resolveClaims(ctx, tool, params);
|
|
127
|
+
if (!claims.length) throw new IdentityAuthorizationError();
|
|
128
|
+
for (const claim of claims) {
|
|
129
|
+
await options.lifecycle.authorizeBound(origin, {
|
|
130
|
+
sandbox: claim.sandbox,
|
|
131
|
+
billing: claim.billing,
|
|
132
|
+
brandDomain: claim.brand.domain
|
|
133
|
+
});
|
|
134
|
+
await authorizeDemandGrant({ ...claim, signerOrigin: origin }, options.grants);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function withIdentity33PrincipalHandlers(base, lifecycle) {
|
|
139
|
+
return {
|
|
140
|
+
...base,
|
|
141
|
+
async syncPrincipal(params, ctx) {
|
|
142
|
+
const identity = claimFromContext(ctx);
|
|
143
|
+
if (identity?.state === "identity-established" && params.dry_run === true)
|
|
144
|
+
return { result: { kind: "validated", action: "would_update", dry_run: true } };
|
|
145
|
+
if (!base.syncPrincipal) throw new IdentityAuthorizationError();
|
|
146
|
+
return base.syncPrincipal(params, ctx);
|
|
147
|
+
},
|
|
148
|
+
async getPrincipal(params, ctx) {
|
|
149
|
+
const identity = claimFromContext(ctx);
|
|
150
|
+
if (!identity) {
|
|
151
|
+
if (!base.getPrincipal) throw new IdentityAuthorizationError();
|
|
152
|
+
return base.getPrincipal(params, ctx);
|
|
153
|
+
}
|
|
154
|
+
const read = await lifecycle.getPrincipal(identity.signer.origin);
|
|
155
|
+
if (!read.binding) return { result: read.result };
|
|
156
|
+
if (!base.getPrincipal) return { result: read.result };
|
|
157
|
+
const response = await base.getPrincipal(params, ctx);
|
|
158
|
+
if (read.result.relationship && response && typeof response === "object") {
|
|
159
|
+
const boxed = "structuredContent" in response;
|
|
160
|
+
const payload = boxed ? response.structuredContent : response;
|
|
161
|
+
if (payload?.result && ["current", "recognized", "unconfigured"].includes(payload.result.kind ?? "")) {
|
|
162
|
+
const augmented = { ...payload, result: { ...payload.result, relationship: read.result.relationship } };
|
|
163
|
+
return boxed ? { ...response, structuredContent: augmented } : augmented;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return response;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function createIdentity33PrincipalScopeResolver(options) {
|
|
171
|
+
if (!options.tenantId) throw new TypeError("Principal scope requires a trusted tenant id");
|
|
172
|
+
return async (ctx) => {
|
|
173
|
+
const identity = claimFromContext(ctx);
|
|
174
|
+
if (!identity) {
|
|
175
|
+
if (!options.legacy) throw new IdentityAuthorizationError();
|
|
176
|
+
return options.legacy(ctx);
|
|
177
|
+
}
|
|
178
|
+
const { binding } = await options.lifecycle.getPrincipal(identity.signer.origin);
|
|
179
|
+
if (!binding) throw new IdentityAuthorizationError();
|
|
180
|
+
return {
|
|
181
|
+
tenant_id: options.tenantId,
|
|
182
|
+
principal_id: binding.principalId,
|
|
183
|
+
principal_record_id: binding.principalId,
|
|
184
|
+
principal_kind: binding.principalKind ?? "buyer_agent"
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export {
|
|
189
|
+
createIdentity33Authorization,
|
|
190
|
+
createIdentity33PrincipalResolver,
|
|
191
|
+
createIdentity33PrincipalScopeResolver,
|
|
192
|
+
isIdentity33UnboundContext,
|
|
193
|
+
withIdentity33PrincipalHandlers
|
|
194
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AdcpStateStore } from '../server/state-store.mjs';
|
|
2
|
+
import { type MonotonicOriginRevocationStore } from './revocation.mjs';
|
|
3
|
+
import type { OriginIdentityStore } from './lifecycle.mjs';
|
|
4
|
+
/** CAS-backed stores work with the SDK's PostgresStateStore and custom shared backends. */
|
|
5
|
+
export declare function createIdentity33StateStores(options: {
|
|
6
|
+
store: AdcpStateStore;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
collection?: string;
|
|
9
|
+
/** Separate capacity for bound and unbound origins. Raising limits preserves every existing fact. */
|
|
10
|
+
revocationLimits?: {
|
|
11
|
+
keys?: number;
|
|
12
|
+
origins?: number;
|
|
13
|
+
operatorKeys?: number;
|
|
14
|
+
operatorOrigins?: number;
|
|
15
|
+
originKeys?: number;
|
|
16
|
+
};
|
|
17
|
+
}): {
|
|
18
|
+
identity: OriginIdentityStore;
|
|
19
|
+
authorityHistory: {
|
|
20
|
+
has(operator: string): Promise<boolean>;
|
|
21
|
+
mark(operator: string): Promise<void>;
|
|
22
|
+
};
|
|
23
|
+
revocations: MonotonicOriginRevocationStore;
|
|
24
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AdcpStateStore } from '../server/state-store';
|
|
2
|
+
import { type MonotonicOriginRevocationStore } from './revocation';
|
|
3
|
+
import type { OriginIdentityStore } from './lifecycle';
|
|
4
|
+
/** CAS-backed stores work with the SDK's PostgresStateStore and custom shared backends. */
|
|
5
|
+
export declare function createIdentity33StateStores(options: {
|
|
6
|
+
store: AdcpStateStore;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
collection?: string;
|
|
9
|
+
/** Separate capacity for bound and unbound origins. Raising limits preserves every existing fact. */
|
|
10
|
+
revocationLimits?: {
|
|
11
|
+
keys?: number;
|
|
12
|
+
origins?: number;
|
|
13
|
+
operatorKeys?: number;
|
|
14
|
+
operatorOrigins?: number;
|
|
15
|
+
originKeys?: number;
|
|
16
|
+
};
|
|
17
|
+
}): {
|
|
18
|
+
identity: OriginIdentityStore;
|
|
19
|
+
authorityHistory: {
|
|
20
|
+
has(operator: string): Promise<boolean>;
|
|
21
|
+
mark(operator: string): Promise<void>;
|
|
22
|
+
};
|
|
23
|
+
revocations: MonotonicOriginRevocationStore;
|
|
24
|
+
};
|