@adcp/sdk 5.25.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -7
- package/dist/lib/compliance-fixtures/index.d.ts +1 -1
- package/dist/lib/compliance-fixtures/index.js +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +15 -0
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/core/TaskExecutor.d.ts +7 -0
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +9 -2
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +7 -8
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas/index.d.ts +1 -1
- package/dist/lib/schemas/index.js +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +129 -11
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +112 -2
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/ctx-metadata/backends/memory.d.ts +27 -0
- package/dist/lib/server/ctx-metadata/backends/memory.d.ts.map +1 -0
- package/dist/lib/server/ctx-metadata/backends/memory.js +72 -0
- package/dist/lib/server/ctx-metadata/backends/memory.js.map +1 -0
- package/dist/lib/server/ctx-metadata/backends/pg.d.ts +62 -0
- package/dist/lib/server/ctx-metadata/backends/pg.d.ts.map +1 -0
- package/dist/lib/server/ctx-metadata/backends/pg.js +145 -0
- package/dist/lib/server/ctx-metadata/backends/pg.js.map +1 -0
- package/dist/lib/server/ctx-metadata/index.d.ts +15 -0
- package/dist/lib/server/ctx-metadata/index.d.ts.map +1 -0
- package/dist/lib/server/ctx-metadata/index.js +28 -0
- package/dist/lib/server/ctx-metadata/index.js.map +1 -0
- package/dist/lib/server/ctx-metadata/store.d.ts +177 -0
- package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -0
- package/dist/lib/server/ctx-metadata/store.js +327 -0
- package/dist/lib/server/ctx-metadata/store.js.map +1 -0
- package/dist/lib/server/ctx-metadata/wire-shape.d.ts +55 -0
- package/dist/lib/server/ctx-metadata/wire-shape.d.ts.map +1 -0
- package/dist/lib/server/ctx-metadata/wire-shape.js +121 -0
- package/dist/lib/server/ctx-metadata/wire-shape.js.map +1 -0
- package/dist/lib/server/decisioning/account.d.ts +309 -0
- package/dist/lib/server/decisioning/account.d.ts.map +1 -0
- package/dist/lib/server/decisioning/account.js +102 -0
- package/dist/lib/server/decisioning/account.js.map +1 -0
- package/dist/lib/server/decisioning/admin-router.d.ts +75 -0
- package/dist/lib/server/decisioning/admin-router.d.ts.map +1 -0
- package/dist/lib/server/decisioning/admin-router.js +120 -0
- package/dist/lib/server/decisioning/admin-router.js.map +1 -0
- package/dist/lib/server/decisioning/assembly-helpers.d.ts +204 -0
- package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -0
- package/dist/lib/server/decisioning/assembly-helpers.js +173 -0
- package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts +154 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -0
- package/dist/lib/server/decisioning/async-outcome.js +239 -0
- package/dist/lib/server/decisioning/async-outcome.js.map +1 -0
- package/dist/lib/server/decisioning/capabilities.d.ts +251 -0
- package/dist/lib/server/decisioning/capabilities.d.ts.map +1 -0
- package/dist/lib/server/decisioning/capabilities.js +16 -0
- package/dist/lib/server/decisioning/capabilities.js.map +1 -0
- package/dist/lib/server/decisioning/context.d.ts +212 -0
- package/dist/lib/server/decisioning/context.d.ts.map +1 -0
- package/dist/lib/server/decisioning/context.js +26 -0
- package/dist/lib/server/decisioning/context.js.map +1 -0
- package/dist/lib/server/decisioning/errors-typed.d.ts +104 -0
- package/dist/lib/server/decisioning/errors-typed.d.ts.map +1 -0
- package/dist/lib/server/decisioning/errors-typed.js +304 -0
- package/dist/lib/server/decisioning/errors-typed.js.map +1 -0
- package/dist/lib/server/decisioning/helpers.d.ts +131 -0
- package/dist/lib/server/decisioning/helpers.d.ts.map +1 -0
- package/dist/lib/server/decisioning/helpers.js +134 -0
- package/dist/lib/server/decisioning/helpers.js.map +1 -0
- package/dist/lib/server/decisioning/index.d.ts +46 -0
- package/dist/lib/server/decisioning/index.d.ts.map +1 -0
- package/dist/lib/server/decisioning/index.js +120 -0
- package/dist/lib/server/decisioning/index.js.map +1 -0
- package/dist/lib/server/decisioning/list-helpers.d.ts +53 -0
- package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -0
- package/dist/lib/server/decisioning/list-helpers.js +96 -0
- package/dist/lib/server/decisioning/list-helpers.js.map +1 -0
- package/dist/lib/server/decisioning/manifest-helpers.d.ts +56 -0
- package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -0
- package/dist/lib/server/decisioning/manifest-helpers.js +78 -0
- package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -0
- package/dist/lib/server/decisioning/pagination.d.ts +21 -0
- package/dist/lib/server/decisioning/pagination.d.ts.map +1 -0
- package/dist/lib/server/decisioning/pagination.js +12 -0
- package/dist/lib/server/decisioning/pagination.js.map +1 -0
- package/dist/lib/server/decisioning/platform.d.ts +188 -0
- package/dist/lib/server/decisioning/platform.d.ts.map +1 -0
- package/dist/lib/server/decisioning/platform.js +19 -0
- package/dist/lib/server/decisioning/platform.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +510 -0
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/from-platform.js +2196 -0
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts +114 -0
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +247 -0
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts +32 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +127 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts +105 -0
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/task-registry.js +96 -0
- package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/to-context.d.ts +54 -0
- package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/to-context.js +166 -0
- package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/validate-platform.d.ts +20 -0
- package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/validate-platform.js +93 -0
- package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/audiences.d.ts +72 -0
- package/dist/lib/server/decisioning/specialisms/audiences.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/audiences.js +15 -0
- package/dist/lib/server/decisioning/specialisms/audiences.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +92 -0
- package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/brand-rights.js +28 -0
- package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts +67 -0
- package/dist/lib/server/decisioning/specialisms/campaign-governance.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/campaign-governance.js +31 -0
- package/dist/lib/server/decisioning/specialisms/campaign-governance.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +78 -0
- package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/content-standards.js +35 -0
- package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +81 -0
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.js +28 -0
- package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/creative.d.ts +144 -0
- package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/creative.js +19 -0
- package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/lists.d.ts +61 -0
- package/dist/lib/server/decisioning/specialisms/lists.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/lists.js +30 -0
- package/dist/lib/server/decisioning/specialisms/lists.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/sales.d.ts +163 -0
- package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/sales.js +64 -0
- package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -0
- package/dist/lib/server/decisioning/specialisms/signals.d.ts +64 -0
- package/dist/lib/server/decisioning/specialisms/signals.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/signals.js +28 -0
- package/dist/lib/server/decisioning/specialisms/signals.js.map +1 -0
- package/dist/lib/server/decisioning/start-time.d.ts +76 -0
- package/dist/lib/server/decisioning/start-time.d.ts.map +1 -0
- package/dist/lib/server/decisioning/start-time.js +81 -0
- package/dist/lib/server/decisioning/start-time.js.map +1 -0
- package/dist/lib/server/decisioning/status-changes.d.ts +165 -0
- package/dist/lib/server/decisioning/status-changes.d.ts.map +1 -0
- package/dist/lib/server/decisioning/status-changes.js +131 -0
- package/dist/lib/server/decisioning/status-changes.js.map +1 -0
- package/dist/lib/server/decisioning/status-mappers.d.ts +46 -0
- package/dist/lib/server/decisioning/status-mappers.d.ts.map +1 -0
- package/dist/lib/server/decisioning/status-mappers.js +46 -0
- package/dist/lib/server/decisioning/status-mappers.js.map +1 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts +289 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -0
- package/dist/lib/server/decisioning/tenant-registry.js +503 -0
- package/dist/lib/server/decisioning/tenant-registry.js.map +1 -0
- package/dist/lib/server/express-adapter.d.ts +1 -1
- package/dist/lib/server/express-adapter.js +1 -1
- package/dist/lib/server/governance.d.ts +1 -1
- package/dist/lib/server/governance.js +1 -1
- package/dist/lib/server/idempotency/store.d.ts +1 -1
- package/dist/lib/server/idempotency/store.js +1 -1
- package/dist/lib/server/index.d.ts +9 -2
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +79 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.ts +38 -0
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -0
- package/dist/lib/server/legacy/v5/index.js +60 -0
- package/dist/lib/server/legacy/v5/index.js.map +1 -0
- package/dist/lib/server/normalize-errors.d.ts +88 -0
- package/dist/lib/server/normalize-errors.d.ts.map +1 -0
- package/dist/lib/server/normalize-errors.js +146 -0
- package/dist/lib/server/normalize-errors.js.map +1 -0
- package/dist/lib/server/pick-safe-details.d.ts +90 -0
- package/dist/lib/server/pick-safe-details.d.ts.map +1 -0
- package/dist/lib/server/pick-safe-details.js +148 -0
- package/dist/lib/server/pick-safe-details.js.map +1 -0
- package/dist/lib/server/postgres-state-store.d.ts +1 -1
- package/dist/lib/server/postgres-state-store.js +1 -1
- package/dist/lib/server/responses.d.ts +38 -0
- package/dist/lib/server/responses.d.ts.map +1 -1
- package/dist/lib/server/responses.js +38 -0
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/state-store.d.ts +1 -1
- package/dist/lib/server/state-store.js +1 -1
- package/dist/lib/server/test-controller.d.ts +10 -3
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +10 -3
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/testing/comply-controller.d.ts +47 -1
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js +11 -4
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/personas/index.d.ts +143 -0
- package/dist/lib/testing/personas/index.d.ts.map +1 -0
- package/dist/lib/testing/personas/index.js +190 -0
- package/dist/lib/testing/personas/index.js.map +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +1 -1
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +3 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts +13 -0
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +179 -7
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/types/asset-instances.d.ts +1 -0
- package/dist/lib/types/asset-instances.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +203 -98
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +599 -159
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +175 -94
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +315 -46
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +1 -1
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +6 -0
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/validation/schema-validator.d.ts +13 -0
- package/dist/lib/validation/schema-validator.d.ts.map +1 -1
- package/dist/lib/validation/schema-validator.js +240 -3
- package/dist/lib/validation/schema-validator.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/docs/guides/BUILD-AN-AGENT.md +30 -5
- package/docs/llms.txt +28 -17
- package/examples/README.md +3 -1
- package/examples/decisioning-platform-broadcast-tv.ts +300 -0
- package/examples/decisioning-platform-identity-graph.ts +214 -0
- package/examples/decisioning-platform-mock-seller.ts +332 -0
- package/examples/decisioning-platform-multi-tenant.ts +128 -0
- package/examples/decisioning-platform-programmatic.ts +254 -0
- package/examples/signals-agent.ts +1 -1
- package/package.json +13 -2
- package/skills/build-brand-rights-agent/SKILL.md +10 -3
- package/skills/build-creative-agent/SKILL.md +94 -64
- package/skills/build-decisioning-creative-template/SKILL.md +554 -0
- package/skills/build-decisioning-platform/SKILL.md +304 -0
- package/skills/build-decisioning-platform/advanced/BRAND-RIGHTS.md +25 -0
- package/skills/build-decisioning-platform/advanced/COMPLIANCE.md +23 -0
- package/skills/build-decisioning-platform/advanced/GOVERNANCE.md +24 -0
- package/skills/build-decisioning-platform/advanced/HITL.md +34 -0
- package/skills/build-decisioning-platform/advanced/IDEMPOTENCY.md +52 -0
- package/skills/build-decisioning-platform/advanced/MULTI-TENANT.md +47 -0
- package/skills/build-decisioning-platform/advanced/OAUTH.md +22 -0
- package/skills/build-decisioning-platform/advanced/REFERENCE.md +991 -0
- package/skills/build-decisioning-platform/advanced/SANDBOX.md +24 -0
- package/skills/build-decisioning-platform/advanced/STATE-MACHINE.md +52 -0
- package/skills/build-decisioning-signal-marketplace/SKILL.md +269 -0
- package/skills/build-generative-seller-agent/SKILL.md +89 -53
- package/skills/build-governance-agent/SKILL.md +76 -45
- package/skills/build-retail-media-agent/SKILL.md +87 -62
- package/skills/build-seller-agent/SKILL.md +384 -255
- package/skills/build-seller-agent/deployment.md +5 -3
- package/skills/build-seller-agent/specialisms/audience-sync.md +0 -2
- package/skills/build-seller-agent/specialisms/sales-broadcast-tv.md +0 -2
- package/skills/build-seller-agent/specialisms/sales-guaranteed.md +0 -2
- package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +0 -2
- package/skills/build-seller-agent/specialisms/sales-proposal-mode.md +0 -2
- package/skills/build-seller-agent/specialisms/sales-social.md +0 -2
- package/skills/build-seller-agent/specialisms/signed-requests.md +0 -2
- package/skills/build-si-agent/SKILL.md +40 -32
- package/skills/build-signals-agent/SKILL.md +139 -92
- package/skills/call-adcp-agent.previous/SKILL.md +5 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestContext — what the framework passes to every decision-point method.
|
|
3
|
+
*
|
|
4
|
+
* - `account` — resolved tenant for this request (from `accounts.resolve()`)
|
|
5
|
+
* - `state.*` — sync state reads (workflow steps, governance context, proposal lookups)
|
|
6
|
+
* - `resolve.*` — async framework-mediated fetches (property lists, formats)
|
|
7
|
+
*
|
|
8
|
+
* Async patterns:
|
|
9
|
+
* - **Sync**: adopter implements `xxx(req, ctx) => Promise<T>`. Framework
|
|
10
|
+
* awaits in foreground; projects to wire success arm.
|
|
11
|
+
* - **HITL**: adopter implements `xxxTask(taskId, req, ctx) => Promise<T>`.
|
|
12
|
+
* Framework returns submitted envelope to buyer first, then runs the
|
|
13
|
+
* task method in background; return value becomes terminal task state.
|
|
14
|
+
* - **Status changes**: adopter calls `publishStatusChange(...)` (event bus)
|
|
15
|
+
* from anywhere — webhook handler, cron, in-process worker. Framework
|
|
16
|
+
* records the change and projects to subscribers / per-resource reads.
|
|
17
|
+
*
|
|
18
|
+
* Platform reads only; framework writes only. Adopters never mutate the context.
|
|
19
|
+
*
|
|
20
|
+
* Status: Preview / 6.0.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
import type { Account } from './account';
|
|
25
|
+
import type { Format, FormatReferenceStructuredObject, PropertyList, CollectionList } from '../../types/tools.generated';
|
|
26
|
+
import type { TaskHandoff, TaskHandoffContext } from './async-outcome';
|
|
27
|
+
import type { CtxMetadataRef, ResourceKind } from '../ctx-metadata';
|
|
28
|
+
export interface RequestContext<TAccount = Account> {
|
|
29
|
+
/** Resolved account for this request. */
|
|
30
|
+
account: TAccount;
|
|
31
|
+
/** Sync reads of in-flight state. */
|
|
32
|
+
state: WorkflowStateReader;
|
|
33
|
+
/** Async framework-mediated resolvers. */
|
|
34
|
+
resolve: ResourceResolver;
|
|
35
|
+
/**
|
|
36
|
+
* Ctx-metadata accessor — opaque-blob round-trip cache for adapter-internal
|
|
37
|
+
* state (GAM `ad_unit_ids` per product, `gam_order_id` per media buy, etc.).
|
|
38
|
+
*
|
|
39
|
+
* **Present only when `createAdcpServerFromPlatform({ ctxMetadata })` was
|
|
40
|
+
* wired with a `CtxMetadataStore`.** Adopters who don't wire a store see
|
|
41
|
+
* `undefined` here — branch defensively.
|
|
42
|
+
*
|
|
43
|
+
* The accessor is account-scoped automatically (uses `ctx.account.id` as
|
|
44
|
+
* the tenant boundary). Pass `kind + id`, get an opaque blob the publisher
|
|
45
|
+
* stashed during a prior call's response. Returns `undefined` on miss —
|
|
46
|
+
* fall through to your own DB.
|
|
47
|
+
*
|
|
48
|
+
* @example Read a product's ctx_metadata in createMediaBuy
|
|
49
|
+
* ```ts
|
|
50
|
+
* createMediaBuy: async (req, ctx) => {
|
|
51
|
+
* for (const pkg of req.packages) {
|
|
52
|
+
* const meta = await ctx.ctxMetadata?.product(pkg.product_id);
|
|
53
|
+
* if (meta?.gam?.ad_unit_ids) {
|
|
54
|
+
* await this.gam.createLineItem(pkg, meta.gam.ad_unit_ids);
|
|
55
|
+
* }
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @example Persist platform IDs from createMediaBuy
|
|
61
|
+
* ```ts
|
|
62
|
+
* createMediaBuy: async (req, ctx) => {
|
|
63
|
+
* const order = await this.gam.createOrder(req);
|
|
64
|
+
* await ctx.ctxMetadata?.set('media_buy', order.id, { gam_order_id: order.id });
|
|
65
|
+
* for (const li of order.lineItems) {
|
|
66
|
+
* await ctx.ctxMetadata?.set('package', li.id, { gam_line_item_id: li.id });
|
|
67
|
+
* }
|
|
68
|
+
* return { media_buy_id: order.id, status: 'pending_creatives', packages: ... };
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @public
|
|
73
|
+
*/
|
|
74
|
+
ctxMetadata?: CtxMetadataAccessor;
|
|
75
|
+
/**
|
|
76
|
+
* Hand off the call to a background task. Returns a `TaskHandoff<T>`
|
|
77
|
+
* marker — return that from your method to signal the framework should
|
|
78
|
+
* project the spec-defined `Submitted` envelope to the buyer and run
|
|
79
|
+
* `fn` asynchronously. `fn` receives a `TaskHandoffContext` with the
|
|
80
|
+
* framework-issued `id` plus `update`/`heartbeat` affordances; its
|
|
81
|
+
* return value becomes the task's terminal artifact.
|
|
82
|
+
*
|
|
83
|
+
* Use this for hybrid sellers — the same tool serves both fast
|
|
84
|
+
* (programmatic remnant, instant `media_buy_id`) and slow (guaranteed
|
|
85
|
+
* inventory, trafficker review) inventory. Branch in your method body
|
|
86
|
+
* on whatever signal determines the path (product type, buyer
|
|
87
|
+
* pre-approval, etc.). Buyers pattern-match on the wire response shape
|
|
88
|
+
* (`media_buy_id` → sync; `task_id` → submitted) — predictable per
|
|
89
|
+
* request, dynamic per call.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* createMediaBuy: async (req, ctx) => {
|
|
94
|
+
* if (this.requiresHITL(req)) {
|
|
95
|
+
* return ctx.handoffToTask(async (taskCtx) => {
|
|
96
|
+
* await taskCtx.update({ message: 'Awaiting trafficker' });
|
|
97
|
+
* return await this.runHITL(req);
|
|
98
|
+
* });
|
|
99
|
+
* }
|
|
100
|
+
* return await this.commitSync(req);
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
handoffToTask<TResult>(fn: (taskCtx: TaskHandoffContext) => Promise<TResult>): TaskHandoff<TResult>;
|
|
105
|
+
}
|
|
106
|
+
export interface WorkflowStateReader {
|
|
107
|
+
/**
|
|
108
|
+
* Workflow steps that touched a given object. Object types: 'media_buy',
|
|
109
|
+
* 'creative', 'product', 'plan', 'audience', 'rights_grant', 'task'.
|
|
110
|
+
* Returns chronological steps. Used for "what's happened to this buy?"
|
|
111
|
+
* queries without re-fetching from the platform.
|
|
112
|
+
*/
|
|
113
|
+
findByObject(type: WorkflowObjectType, id: string): readonly WorkflowStep[];
|
|
114
|
+
/**
|
|
115
|
+
* Resolve a proposal_id to its proposal context. Threaded by the framework
|
|
116
|
+
* across get_products → refine → create_media_buy without platform code.
|
|
117
|
+
* Returns null if the framework doesn't recognize the id.
|
|
118
|
+
*/
|
|
119
|
+
findProposalById(proposalId: string): Proposal | null;
|
|
120
|
+
/**
|
|
121
|
+
* Currently in-flight verified governance context for the call. Returns
|
|
122
|
+
* the JWS string for downstream checks (or null for non-governance flows).
|
|
123
|
+
* Framework verifies signature, plan-binding, seller-binding, and
|
|
124
|
+
* phase-binding before exposing — platform can trust the value.
|
|
125
|
+
*/
|
|
126
|
+
governanceContext(): GovernanceContextJWS | null;
|
|
127
|
+
/** Chronological steps for this request's account. Useful for audit reads. */
|
|
128
|
+
workflowSteps(): readonly WorkflowStep[];
|
|
129
|
+
}
|
|
130
|
+
export interface ResourceResolver {
|
|
131
|
+
/**
|
|
132
|
+
* Fetch a property list by id. Framework validates the id exists in the
|
|
133
|
+
* seller's declared lists before returning; consumers can trust the result.
|
|
134
|
+
*/
|
|
135
|
+
propertyList(listId: string): Promise<PropertyList>;
|
|
136
|
+
/** Same for collection lists. */
|
|
137
|
+
collectionList(listId: string): Promise<CollectionList>;
|
|
138
|
+
/**
|
|
139
|
+
* Fetch a creative format definition. Framework routes through the
|
|
140
|
+
* `capabilities.creative_agents` declaration with a 1h cache; self-hosted
|
|
141
|
+
* formats hit the local CreativePlatform.listFormats(). Returns the
|
|
142
|
+
* resolved Format with full asset slot definitions.
|
|
143
|
+
*/
|
|
144
|
+
creativeFormat(formatId: FormatReferenceStructuredObject): Promise<Format>;
|
|
145
|
+
}
|
|
146
|
+
export type WorkflowObjectType = 'media_buy' | 'creative' | 'product' | 'plan' | 'audience' | 'rights_grant' | 'task';
|
|
147
|
+
export interface WorkflowStep {
|
|
148
|
+
/** Stable step identifier. */
|
|
149
|
+
id: string;
|
|
150
|
+
/** Object that this step touched. */
|
|
151
|
+
object: {
|
|
152
|
+
type: WorkflowObjectType;
|
|
153
|
+
id: string;
|
|
154
|
+
};
|
|
155
|
+
/** Tool that was called (wire verb). */
|
|
156
|
+
tool: string;
|
|
157
|
+
/** ISO 8601 timestamp. */
|
|
158
|
+
at: string;
|
|
159
|
+
/** Caller principal. */
|
|
160
|
+
actor: {
|
|
161
|
+
agent_url?: string;
|
|
162
|
+
principal?: string;
|
|
163
|
+
};
|
|
164
|
+
/** Outcome: 'submitted' / 'completed' / 'failed' / 'progress'. */
|
|
165
|
+
status: 'submitted' | 'completed' | 'failed' | 'progress';
|
|
166
|
+
}
|
|
167
|
+
export interface Proposal {
|
|
168
|
+
proposal_id: string;
|
|
169
|
+
/** Products in this proposal. */
|
|
170
|
+
product_ids: string[];
|
|
171
|
+
/** When the proposal was generated. */
|
|
172
|
+
issued_at: string;
|
|
173
|
+
/** When the proposal expires. */
|
|
174
|
+
expires_at?: string;
|
|
175
|
+
/** Account this proposal was issued to. */
|
|
176
|
+
account_id: string;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* JWS-signed governance context. The framework returns the verified token;
|
|
180
|
+
* platform can re-pass to downstream calls (e.g., report_usage) and the
|
|
181
|
+
* framework will validate consistency. Don't unwrap or modify.
|
|
182
|
+
*/
|
|
183
|
+
export type GovernanceContextJWS = string;
|
|
184
|
+
/**
|
|
185
|
+
* Account-scoped ctx-metadata accessor. The framework binds this to the
|
|
186
|
+
* resolved `ctx.account.id` per request — adopters never pass account.
|
|
187
|
+
*
|
|
188
|
+
* Generic `get`/`set`/`bulkGet` carry a `ResourceKind` discriminator;
|
|
189
|
+
* per-kind shorthand methods (`product(id)`, `mediaBuy(id)`, etc.) map to
|
|
190
|
+
* `get(kind, id)` for ergonomic call sites.
|
|
191
|
+
*/
|
|
192
|
+
export interface CtxMetadataAccessor {
|
|
193
|
+
/** Look up by kind + id. Returns `undefined` on miss. */
|
|
194
|
+
get(kind: ResourceKind, id: string): Promise<unknown | undefined>;
|
|
195
|
+
/** Bulk lookup. Result Map keyed by `${kind}:${id}`. Misses absent from Map. */
|
|
196
|
+
bulkGet(refs: readonly CtxMetadataRef[]): Promise<ReadonlyMap<string, unknown>>;
|
|
197
|
+
/**
|
|
198
|
+
* Persist a blob under (account, kind, id). Throws `CTX_METADATA_TOO_LARGE`
|
|
199
|
+
* if serialized size exceeds the configured cap (16KB default).
|
|
200
|
+
*/
|
|
201
|
+
set(kind: ResourceKind, id: string, value: unknown, ttlSeconds?: number): Promise<void>;
|
|
202
|
+
/** Delete a single entry. */
|
|
203
|
+
delete(kind: ResourceKind, id: string): Promise<void>;
|
|
204
|
+
account(id: string): Promise<unknown | undefined>;
|
|
205
|
+
product(id: string): Promise<unknown | undefined>;
|
|
206
|
+
mediaBuy(id: string): Promise<unknown | undefined>;
|
|
207
|
+
package(id: string): Promise<unknown | undefined>;
|
|
208
|
+
creative(id: string): Promise<unknown | undefined>;
|
|
209
|
+
audience(id: string): Promise<unknown | undefined>;
|
|
210
|
+
signal(id: string): Promise<unknown | undefined>;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/decisioning/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RequestContext — what the framework passes to every decision-point method.
|
|
4
|
+
*
|
|
5
|
+
* - `account` — resolved tenant for this request (from `accounts.resolve()`)
|
|
6
|
+
* - `state.*` — sync state reads (workflow steps, governance context, proposal lookups)
|
|
7
|
+
* - `resolve.*` — async framework-mediated fetches (property lists, formats)
|
|
8
|
+
*
|
|
9
|
+
* Async patterns:
|
|
10
|
+
* - **Sync**: adopter implements `xxx(req, ctx) => Promise<T>`. Framework
|
|
11
|
+
* awaits in foreground; projects to wire success arm.
|
|
12
|
+
* - **HITL**: adopter implements `xxxTask(taskId, req, ctx) => Promise<T>`.
|
|
13
|
+
* Framework returns submitted envelope to buyer first, then runs the
|
|
14
|
+
* task method in background; return value becomes terminal task state.
|
|
15
|
+
* - **Status changes**: adopter calls `publishStatusChange(...)` (event bus)
|
|
16
|
+
* from anywhere — webhook handler, cron, in-process worker. Framework
|
|
17
|
+
* records the change and projects to subscribers / per-resource reads.
|
|
18
|
+
*
|
|
19
|
+
* Platform reads only; framework writes only. Adopters never mutate the context.
|
|
20
|
+
*
|
|
21
|
+
* Status: Preview / 6.0.
|
|
22
|
+
*
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/lib/server/decisioning/context.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed `AdcpError` subclasses. Adopters pick from a closed set of class
|
|
3
|
+
* imports rather than memorizing string codes + recovery semantics.
|
|
4
|
+
*
|
|
5
|
+
* Each class encodes the canonical `code` / `recovery` / `field` /
|
|
6
|
+
* `suggestion` shape for its scenario. LLM-generated platforms get
|
|
7
|
+
* autocomplete on the import; humans skim the list to find the right
|
|
8
|
+
* class for their case.
|
|
9
|
+
*
|
|
10
|
+
* Empirical baseline (Emma matrix v17, 2026-04-30): LLM-generated
|
|
11
|
+
* sellers throw generic `Error` because the AdcpError code catalog
|
|
12
|
+
* isn't visible at the throw site. Framework auto-maps generic throws
|
|
13
|
+
* to `SERVICE_UNAVAILABLE`, which storyboards reject because (e.g.)
|
|
14
|
+
* the right code for "package_id doesn't exist" is `PACKAGE_NOT_FOUND`.
|
|
15
|
+
* Typed classes close the gap: the LLM imports `PackageNotFoundError`
|
|
16
|
+
* and the right code is implicit.
|
|
17
|
+
*
|
|
18
|
+
* **Coverage**: the ~20 highest-traffic codes from the v3 spec. Adopters
|
|
19
|
+
* needing a code not in this list still construct `AdcpError(code, ...)`
|
|
20
|
+
* directly with the full code vocabulary; this module is a convenience
|
|
21
|
+
* over the typed-class subset.
|
|
22
|
+
*
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
import { AdcpError } from './async-outcome';
|
|
26
|
+
interface CommonOpts {
|
|
27
|
+
/** Override the default message. Most callers use the default. */
|
|
28
|
+
message?: string;
|
|
29
|
+
/** Suggested fix surfaced to the buyer. */
|
|
30
|
+
suggestion?: string;
|
|
31
|
+
/** Additional structured context. */
|
|
32
|
+
details?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
export declare class PackageNotFoundError extends AdcpError {
|
|
35
|
+
constructor(packageId: string, opts?: CommonOpts);
|
|
36
|
+
}
|
|
37
|
+
export declare class MediaBuyNotFoundError extends AdcpError {
|
|
38
|
+
constructor(mediaBuyId: string, opts?: CommonOpts);
|
|
39
|
+
}
|
|
40
|
+
export declare class ProductNotFoundError extends AdcpError {
|
|
41
|
+
constructor(productId: string, opts?: CommonOpts);
|
|
42
|
+
}
|
|
43
|
+
export declare class CreativeNotFoundError extends AdcpError {
|
|
44
|
+
constructor(creativeId: string, opts?: CommonOpts);
|
|
45
|
+
}
|
|
46
|
+
export declare class ProductUnavailableError extends AdcpError {
|
|
47
|
+
constructor(productId: string, opts?: CommonOpts);
|
|
48
|
+
}
|
|
49
|
+
export declare class CreativeRejectedError extends AdcpError {
|
|
50
|
+
constructor(creativeId: string, reason: string, opts?: CommonOpts);
|
|
51
|
+
}
|
|
52
|
+
export declare class BudgetTooLowError extends AdcpError {
|
|
53
|
+
constructor(opts?: CommonOpts & {
|
|
54
|
+
floor?: number;
|
|
55
|
+
currency?: string;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export declare class BudgetExhaustedError extends AdcpError {
|
|
59
|
+
constructor(opts?: CommonOpts);
|
|
60
|
+
}
|
|
61
|
+
export declare class IdempotencyConflictError extends AdcpError {
|
|
62
|
+
constructor(opts?: CommonOpts);
|
|
63
|
+
}
|
|
64
|
+
export declare class InvalidRequestError extends AdcpError {
|
|
65
|
+
constructor(field: string, message: string, opts?: CommonOpts);
|
|
66
|
+
}
|
|
67
|
+
export declare class InvalidStateError extends AdcpError {
|
|
68
|
+
constructor(field: string, message: string, opts?: CommonOpts);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convenience for the common `start_time >= end_time` case. Use
|
|
72
|
+
* `InvalidRequestError` for arbitrary field-level validation.
|
|
73
|
+
*/
|
|
74
|
+
export declare class BackwardsTimeRangeError extends AdcpError {
|
|
75
|
+
constructor(opts?: CommonOpts);
|
|
76
|
+
}
|
|
77
|
+
export declare class AuthRequiredError extends AdcpError {
|
|
78
|
+
constructor(opts?: CommonOpts);
|
|
79
|
+
}
|
|
80
|
+
export declare class PermissionDeniedError extends AdcpError {
|
|
81
|
+
constructor(action: string, opts?: CommonOpts);
|
|
82
|
+
}
|
|
83
|
+
export declare class RateLimitedError extends AdcpError {
|
|
84
|
+
constructor(retryAfterSeconds: number, opts?: CommonOpts);
|
|
85
|
+
}
|
|
86
|
+
export declare class ServiceUnavailableError extends AdcpError {
|
|
87
|
+
constructor(opts?: CommonOpts & {
|
|
88
|
+
retryAfterSeconds?: number;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export declare class UnsupportedFeatureError extends AdcpError {
|
|
92
|
+
constructor(feature: string, opts?: CommonOpts);
|
|
93
|
+
}
|
|
94
|
+
export declare class ComplianceUnsatisfiedError extends AdcpError {
|
|
95
|
+
constructor(reason: string, opts?: CommonOpts);
|
|
96
|
+
}
|
|
97
|
+
export declare class GovernanceDeniedError extends AdcpError {
|
|
98
|
+
constructor(reason: string, opts?: CommonOpts);
|
|
99
|
+
}
|
|
100
|
+
export declare class PolicyViolationError extends AdcpError {
|
|
101
|
+
constructor(policy: string, opts?: CommonOpts);
|
|
102
|
+
}
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=errors-typed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-typed.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/decisioning/errors-typed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,UAAU,UAAU;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAOD,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CASrD;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAStD;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CASrD;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAStD;AAcD,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CASrD;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAStE;AAMD,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,IAAI,GAAE,UAAU,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;CAe1E;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,IAAI,GAAE,UAAe;CASlC;AAMD,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,IAAI,GAAE,UAAe;CASlC;AAMD,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CASlE;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CASlE;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,IAAI,GAAE,UAAe;CASlC;AAMD,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,IAAI,GAAE,UAAe;CAQlC;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAQlD;AAMD,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,iBAAiB,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAS7D;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,IAAI,GAAE,UAAU,GAAG;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAO;CAUnE;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAQnD;AAMD,qBAAa,0BAA2B,SAAQ,SAAS;gBAC3C,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAQlD;AAED,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAQlD;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe;CAQlD"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Typed `AdcpError` subclasses. Adopters pick from a closed set of class
|
|
4
|
+
* imports rather than memorizing string codes + recovery semantics.
|
|
5
|
+
*
|
|
6
|
+
* Each class encodes the canonical `code` / `recovery` / `field` /
|
|
7
|
+
* `suggestion` shape for its scenario. LLM-generated platforms get
|
|
8
|
+
* autocomplete on the import; humans skim the list to find the right
|
|
9
|
+
* class for their case.
|
|
10
|
+
*
|
|
11
|
+
* Empirical baseline (Emma matrix v17, 2026-04-30): LLM-generated
|
|
12
|
+
* sellers throw generic `Error` because the AdcpError code catalog
|
|
13
|
+
* isn't visible at the throw site. Framework auto-maps generic throws
|
|
14
|
+
* to `SERVICE_UNAVAILABLE`, which storyboards reject because (e.g.)
|
|
15
|
+
* the right code for "package_id doesn't exist" is `PACKAGE_NOT_FOUND`.
|
|
16
|
+
* Typed classes close the gap: the LLM imports `PackageNotFoundError`
|
|
17
|
+
* and the right code is implicit.
|
|
18
|
+
*
|
|
19
|
+
* **Coverage**: the ~20 highest-traffic codes from the v3 spec. Adopters
|
|
20
|
+
* needing a code not in this list still construct `AdcpError(code, ...)`
|
|
21
|
+
* directly with the full code vocabulary; this module is a convenience
|
|
22
|
+
* over the typed-class subset.
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.PolicyViolationError = exports.GovernanceDeniedError = exports.ComplianceUnsatisfiedError = exports.UnsupportedFeatureError = exports.ServiceUnavailableError = exports.RateLimitedError = exports.PermissionDeniedError = exports.AuthRequiredError = exports.BackwardsTimeRangeError = exports.InvalidStateError = exports.InvalidRequestError = exports.IdempotencyConflictError = exports.BudgetExhaustedError = exports.BudgetTooLowError = exports.CreativeRejectedError = exports.ProductUnavailableError = exports.CreativeNotFoundError = exports.ProductNotFoundError = exports.MediaBuyNotFoundError = exports.PackageNotFoundError = void 0;
|
|
28
|
+
const async_outcome_1 = require("./async-outcome");
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Resource-not-found family — `recovery: 'terminal'`. ID is wrong; retry
|
|
31
|
+
// with the same ID can't succeed. Buyer must fetch a fresh ID.
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
class PackageNotFoundError extends async_outcome_1.AdcpError {
|
|
34
|
+
constructor(packageId, opts = {}) {
|
|
35
|
+
super('PACKAGE_NOT_FOUND', {
|
|
36
|
+
recovery: 'terminal',
|
|
37
|
+
message: opts.message ?? `Package not found: ${packageId}`,
|
|
38
|
+
field: 'package_id',
|
|
39
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
40
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.PackageNotFoundError = PackageNotFoundError;
|
|
45
|
+
class MediaBuyNotFoundError extends async_outcome_1.AdcpError {
|
|
46
|
+
constructor(mediaBuyId, opts = {}) {
|
|
47
|
+
super('MEDIA_BUY_NOT_FOUND', {
|
|
48
|
+
recovery: 'terminal',
|
|
49
|
+
message: opts.message ?? `Media buy not found: ${mediaBuyId}`,
|
|
50
|
+
field: 'media_buy_id',
|
|
51
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
52
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.MediaBuyNotFoundError = MediaBuyNotFoundError;
|
|
57
|
+
class ProductNotFoundError extends async_outcome_1.AdcpError {
|
|
58
|
+
constructor(productId, opts = {}) {
|
|
59
|
+
super('PRODUCT_NOT_FOUND', {
|
|
60
|
+
recovery: 'terminal',
|
|
61
|
+
message: opts.message ?? `Product not found: ${productId}`,
|
|
62
|
+
field: 'product_id',
|
|
63
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
64
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ProductNotFoundError = ProductNotFoundError;
|
|
69
|
+
class CreativeNotFoundError extends async_outcome_1.AdcpError {
|
|
70
|
+
constructor(creativeId, opts = {}) {
|
|
71
|
+
super('CREATIVE_NOT_FOUND', {
|
|
72
|
+
recovery: 'terminal',
|
|
73
|
+
message: opts.message ?? `Creative not found: ${creativeId}`,
|
|
74
|
+
field: 'creative_id',
|
|
75
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
76
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.CreativeNotFoundError = CreativeNotFoundError;
|
|
81
|
+
// Note: an `AccountNotFoundError` already exists in `./account` as a plain
|
|
82
|
+
// `Error` subclass for the framework's `accounts.resolve()` path (caught
|
|
83
|
+
// and translated internally). Adopters who need the wire-facing
|
|
84
|
+
// `ACCOUNT_NOT_FOUND` error code throw `new AdcpError('ACCOUNT_NOT_FOUND',
|
|
85
|
+
// { recovery: 'terminal', message: '...', field: 'account.id' })` directly.
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Resource-unavailable family — id is right but state precludes use.
|
|
88
|
+
// `recovery: 'terminal'` for sold-out / unavailable; buyer needs to choose
|
|
89
|
+
// something else.
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
class ProductUnavailableError extends async_outcome_1.AdcpError {
|
|
92
|
+
constructor(productId, opts = {}) {
|
|
93
|
+
super('PRODUCT_UNAVAILABLE', {
|
|
94
|
+
recovery: 'terminal',
|
|
95
|
+
message: opts.message ?? `Product unavailable (sold out / no inventory): ${productId}`,
|
|
96
|
+
field: 'product_id',
|
|
97
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
98
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.ProductUnavailableError = ProductUnavailableError;
|
|
103
|
+
class CreativeRejectedError extends async_outcome_1.AdcpError {
|
|
104
|
+
constructor(creativeId, reason, opts = {}) {
|
|
105
|
+
super('CREATIVE_REJECTED', {
|
|
106
|
+
recovery: 'terminal',
|
|
107
|
+
message: opts.message ?? `Creative ${creativeId} rejected: ${reason}`,
|
|
108
|
+
field: 'creative_id',
|
|
109
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
110
|
+
details: { ...(opts.details ?? {}), reason },
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.CreativeRejectedError = CreativeRejectedError;
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Budget family
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
class BudgetTooLowError extends async_outcome_1.AdcpError {
|
|
119
|
+
constructor(opts = {}) {
|
|
120
|
+
const floorStr = opts.floor != null && opts.currency != null
|
|
121
|
+
? `Floor is ${opts.floor} ${opts.currency}.`
|
|
122
|
+
: opts.floor != null
|
|
123
|
+
? `Floor is ${opts.floor}.`
|
|
124
|
+
: 'Budget below required floor.';
|
|
125
|
+
super('BUDGET_TOO_LOW', {
|
|
126
|
+
recovery: 'correctable',
|
|
127
|
+
message: opts.message ?? floorStr,
|
|
128
|
+
field: 'total_budget',
|
|
129
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
130
|
+
...(opts.floor != null && { details: { ...(opts.details ?? {}), floor: opts.floor, currency: opts.currency } }),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.BudgetTooLowError = BudgetTooLowError;
|
|
135
|
+
class BudgetExhaustedError extends async_outcome_1.AdcpError {
|
|
136
|
+
constructor(opts = {}) {
|
|
137
|
+
super('BUDGET_EXHAUSTED', {
|
|
138
|
+
recovery: 'terminal',
|
|
139
|
+
message: opts.message ?? 'Budget exhausted.',
|
|
140
|
+
field: 'total_budget',
|
|
141
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
142
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.BudgetExhaustedError = BudgetExhaustedError;
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Idempotency family
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
class IdempotencyConflictError extends async_outcome_1.AdcpError {
|
|
151
|
+
constructor(opts = {}) {
|
|
152
|
+
super('IDEMPOTENCY_CONFLICT', {
|
|
153
|
+
recovery: 'terminal',
|
|
154
|
+
message: opts.message ?? 'Same idempotency_key with different payload.',
|
|
155
|
+
field: 'idempotency_key',
|
|
156
|
+
suggestion: opts.suggestion ?? 'Use a fresh idempotency_key for the new payload.',
|
|
157
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.IdempotencyConflictError = IdempotencyConflictError;
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Validation / state family
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
class InvalidRequestError extends async_outcome_1.AdcpError {
|
|
166
|
+
constructor(field, message, opts = {}) {
|
|
167
|
+
super('INVALID_REQUEST', {
|
|
168
|
+
recovery: 'correctable',
|
|
169
|
+
message,
|
|
170
|
+
field,
|
|
171
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
172
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.InvalidRequestError = InvalidRequestError;
|
|
177
|
+
class InvalidStateError extends async_outcome_1.AdcpError {
|
|
178
|
+
constructor(field, message, opts = {}) {
|
|
179
|
+
super('INVALID_STATE', {
|
|
180
|
+
recovery: 'terminal',
|
|
181
|
+
message,
|
|
182
|
+
field,
|
|
183
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
184
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.InvalidStateError = InvalidStateError;
|
|
189
|
+
/**
|
|
190
|
+
* Convenience for the common `start_time >= end_time` case. Use
|
|
191
|
+
* `InvalidRequestError` for arbitrary field-level validation.
|
|
192
|
+
*/
|
|
193
|
+
class BackwardsTimeRangeError extends async_outcome_1.AdcpError {
|
|
194
|
+
constructor(opts = {}) {
|
|
195
|
+
super('INVALID_REQUEST', {
|
|
196
|
+
recovery: 'correctable',
|
|
197
|
+
message: opts.message ?? 'start_time must be before end_time.',
|
|
198
|
+
field: 'start_time',
|
|
199
|
+
suggestion: opts.suggestion ?? 'Verify the buyer-provided campaign window.',
|
|
200
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.BackwardsTimeRangeError = BackwardsTimeRangeError;
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Auth / permission family
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
class AuthRequiredError extends async_outcome_1.AdcpError {
|
|
209
|
+
constructor(opts = {}) {
|
|
210
|
+
super('AUTH_REQUIRED', {
|
|
211
|
+
recovery: 'terminal',
|
|
212
|
+
message: opts.message ?? 'Authentication required.',
|
|
213
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
214
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.AuthRequiredError = AuthRequiredError;
|
|
219
|
+
class PermissionDeniedError extends async_outcome_1.AdcpError {
|
|
220
|
+
constructor(action, opts = {}) {
|
|
221
|
+
super('PERMISSION_DENIED', {
|
|
222
|
+
recovery: 'terminal',
|
|
223
|
+
message: opts.message ?? `Permission denied for ${action}.`,
|
|
224
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
225
|
+
details: { ...(opts.details ?? {}), action },
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
exports.PermissionDeniedError = PermissionDeniedError;
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Throttling / availability family
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
class RateLimitedError extends async_outcome_1.AdcpError {
|
|
234
|
+
constructor(retryAfterSeconds, opts = {}) {
|
|
235
|
+
super('RATE_LIMITED', {
|
|
236
|
+
recovery: 'transient',
|
|
237
|
+
message: opts.message ?? `Rate limited. Retry after ${retryAfterSeconds}s.`,
|
|
238
|
+
retry_after: Math.max(1, Math.min(3600, Math.floor(retryAfterSeconds))),
|
|
239
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
240
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.RateLimitedError = RateLimitedError;
|
|
245
|
+
class ServiceUnavailableError extends async_outcome_1.AdcpError {
|
|
246
|
+
constructor(opts = {}) {
|
|
247
|
+
super('SERVICE_UNAVAILABLE', {
|
|
248
|
+
recovery: 'transient',
|
|
249
|
+
message: opts.message ?? 'Service temporarily unavailable.',
|
|
250
|
+
retry_after: opts.retryAfterSeconds != null ? Math.max(1, Math.min(3600, Math.floor(opts.retryAfterSeconds))) : 60,
|
|
251
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
252
|
+
...(opts.details !== undefined && { details: opts.details }),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.ServiceUnavailableError = ServiceUnavailableError;
|
|
257
|
+
class UnsupportedFeatureError extends async_outcome_1.AdcpError {
|
|
258
|
+
constructor(feature, opts = {}) {
|
|
259
|
+
super('UNSUPPORTED_FEATURE', {
|
|
260
|
+
recovery: 'terminal',
|
|
261
|
+
message: opts.message ?? `Feature not supported: ${feature}.`,
|
|
262
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
263
|
+
details: { ...(opts.details ?? {}), feature },
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.UnsupportedFeatureError = UnsupportedFeatureError;
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// Compliance / governance family
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
class ComplianceUnsatisfiedError extends async_outcome_1.AdcpError {
|
|
272
|
+
constructor(reason, opts = {}) {
|
|
273
|
+
super('COMPLIANCE_UNSATISFIED', {
|
|
274
|
+
recovery: 'terminal',
|
|
275
|
+
message: opts.message ?? `Compliance not satisfied: ${reason}`,
|
|
276
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
277
|
+
details: { ...(opts.details ?? {}), reason },
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
exports.ComplianceUnsatisfiedError = ComplianceUnsatisfiedError;
|
|
282
|
+
class GovernanceDeniedError extends async_outcome_1.AdcpError {
|
|
283
|
+
constructor(reason, opts = {}) {
|
|
284
|
+
super('GOVERNANCE_DENIED', {
|
|
285
|
+
recovery: 'terminal',
|
|
286
|
+
message: opts.message ?? `Governance denied: ${reason}`,
|
|
287
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
288
|
+
details: { ...(opts.details ?? {}), reason },
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.GovernanceDeniedError = GovernanceDeniedError;
|
|
293
|
+
class PolicyViolationError extends async_outcome_1.AdcpError {
|
|
294
|
+
constructor(policy, opts = {}) {
|
|
295
|
+
super('POLICY_VIOLATION', {
|
|
296
|
+
recovery: 'terminal',
|
|
297
|
+
message: opts.message ?? `Policy violation: ${policy}`,
|
|
298
|
+
...(opts.suggestion !== undefined && { suggestion: opts.suggestion }),
|
|
299
|
+
details: { ...(opts.details ?? {}), policy },
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
exports.PolicyViolationError = PolicyViolationError;
|
|
304
|
+
//# sourceMappingURL=errors-typed.js.map
|