@adcp/sdk 5.25.0 → 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/conformance/runners.d.ts.map +1 -1
- package/dist/lib/conformance/runners.js +13 -1
- package/dist/lib/conformance/runners.js.map +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/protocols/index.d.ts +3 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +23 -14
- package/dist/lib/protocols/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 +142 -11
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +211 -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/adcp.d.ts.map +1 -1
- package/dist/lib/types/adcp.js +1 -0
- package/dist/lib/types/adcp.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,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical buyer personas — typed, immutable test fixtures every
|
|
4
|
+
* adopter would otherwise rewrite. Each persona carries enough identity
|
|
5
|
+
* (brand domain, account_id, promoted_offering, brief) to drive the
|
|
6
|
+
* common AdCP request shapes without surface-area surprises.
|
|
7
|
+
*
|
|
8
|
+
* Use when you want a deterministic buyer to drive an integration test
|
|
9
|
+
* against your seller / signal / creative agent. Pair with the builder
|
|
10
|
+
* helpers below to construct wire-shaped requests in one line.
|
|
11
|
+
*
|
|
12
|
+
* The four shipped personas span the verticals and budget classes most
|
|
13
|
+
* sellers see: enterprise CTV, performance social, premium B2B, and
|
|
14
|
+
* geo-targeted local. Adopters who need richer coverage extend the
|
|
15
|
+
* pattern; this set intentionally stays small to keep the surface
|
|
16
|
+
* stable through preview.
|
|
17
|
+
*
|
|
18
|
+
* Status: Preview / 6.0.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { dtcSkincareBuyer, buildGetProductsRequest } from '@adcp/sdk/testing/personas';
|
|
23
|
+
*
|
|
24
|
+
* const result = await server.dispatchTestRequest({
|
|
25
|
+
* method: 'tools/call',
|
|
26
|
+
* params: {
|
|
27
|
+
* name: 'get_products',
|
|
28
|
+
* arguments: buildGetProductsRequest(dtcSkincareBuyer),
|
|
29
|
+
* },
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ALL_PERSONAS = exports.restaurantLocalBuyer = exports.b2bSaasBuyer = exports.luxuryAutoBuyer = exports.dtcSkincareBuyer = void 0;
|
|
37
|
+
exports.getPersonaById = getPersonaById;
|
|
38
|
+
exports.buildAccountReference = buildAccountReference;
|
|
39
|
+
exports.buildBrandReference = buildBrandReference;
|
|
40
|
+
exports.buildGetProductsRequest = buildGetProductsRequest;
|
|
41
|
+
/**
|
|
42
|
+
* DTC ecommerce on a tight performance budget. Social-first, Gen-Z
|
|
43
|
+
* audience, $50K test budget, performance pricing models preferred.
|
|
44
|
+
* Mirrors the `dtc_skincare_genZ` SampleBrief.
|
|
45
|
+
*
|
|
46
|
+
* @public
|
|
47
|
+
*/
|
|
48
|
+
exports.dtcSkincareBuyer = {
|
|
49
|
+
id: 'dtc_skincare_buyer',
|
|
50
|
+
name: 'Glow Lab — DTC Skincare',
|
|
51
|
+
vertical: 'Beauty & Personal Care',
|
|
52
|
+
brand: { domain: 'glowlab.example.com', name: 'Glow Lab' },
|
|
53
|
+
account_id: 'acc_glowlab',
|
|
54
|
+
promoted_offering: 'Glow Lab Vitamin C Serum + first-time-buyer 20% off',
|
|
55
|
+
brief: 'Direct-to-consumer skincare brand targeting Gen Z females (18-25). ' +
|
|
56
|
+
'Social-first campaign with UGC-style creative preferred. ' +
|
|
57
|
+
'Goal is driving trial purchases through a 20% off promo code. ' +
|
|
58
|
+
'Performance-oriented: need clear CPA/CPC pricing.',
|
|
59
|
+
budget: { amount: 50_000, currency: 'USD' },
|
|
60
|
+
channels: ['social', 'display'],
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Luxury automotive launch. High-impact video + premium display, $500K
|
|
64
|
+
* Q3 flight, brand safety critical. Mirrors the `luxury_auto_ev`
|
|
65
|
+
* SampleBrief.
|
|
66
|
+
*
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
exports.luxuryAutoBuyer = {
|
|
70
|
+
id: 'luxury_auto_buyer',
|
|
71
|
+
name: 'Velara Motors — EV Launch',
|
|
72
|
+
vertical: 'Automotive',
|
|
73
|
+
brand: { domain: 'velaramotors.example.com', name: 'Velara Motors' },
|
|
74
|
+
account_id: 'acc_velara',
|
|
75
|
+
promoted_offering: 'Velara V1 — luxury electric crossover SUV',
|
|
76
|
+
brief: 'Luxury automotive brand launching a new electric crossover SUV. ' +
|
|
77
|
+
'Targeting high-income households ($150K+ HHI), ages 30-55, in major US metros. ' +
|
|
78
|
+
'Need high-impact video and premium display placements. ' +
|
|
79
|
+
'Q3 flight (July-September). Key message: "The future of luxury driving." ' +
|
|
80
|
+
'Brand safety is critical — no UGC or controversial adjacency.',
|
|
81
|
+
budget: { amount: 500_000, currency: 'USD' },
|
|
82
|
+
channels: ['olv', 'ctv', 'display'],
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Enterprise B2B SaaS awareness — premium publisher placements,
|
|
86
|
+
* viewability benchmarks, $200K over six weeks. Mirrors the
|
|
87
|
+
* `b2b_saas_awareness` SampleBrief.
|
|
88
|
+
*
|
|
89
|
+
* @public
|
|
90
|
+
*/
|
|
91
|
+
exports.b2bSaasBuyer = {
|
|
92
|
+
id: 'b2b_saas_buyer',
|
|
93
|
+
name: 'Threadline — Workflow Platform',
|
|
94
|
+
vertical: 'Technology / B2B',
|
|
95
|
+
brand: { domain: 'threadline.example.com', name: 'Threadline' },
|
|
96
|
+
account_id: 'acc_threadline',
|
|
97
|
+
promoted_offering: 'Threadline workflow platform — annual enterprise plan',
|
|
98
|
+
brief: 'Enterprise SaaS company building brand awareness among IT decision-makers and C-suite executives. ' +
|
|
99
|
+
'Looking for premium editorial environments — business, technology, and finance publishers. ' +
|
|
100
|
+
'Display and native content placements preferred. CTV is acceptable if targeting is precise. ' +
|
|
101
|
+
'Viewability benchmarks are important — need 70%+ viewability guarantee.',
|
|
102
|
+
budget: { amount: 200_000, currency: 'USD' },
|
|
103
|
+
channels: ['display', 'ctv'],
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Regional QSR / restaurant chain — geo-targeted mobile + display
|
|
107
|
+
* within radius, foot-traffic attribution. Mirrors the
|
|
108
|
+
* `restaurant_local` SampleBrief.
|
|
109
|
+
*
|
|
110
|
+
* @public
|
|
111
|
+
*/
|
|
112
|
+
exports.restaurantLocalBuyer = {
|
|
113
|
+
id: 'restaurant_local_buyer',
|
|
114
|
+
name: 'Anchor & Oak — Regional Chain',
|
|
115
|
+
vertical: 'QSR / Restaurant',
|
|
116
|
+
brand: { domain: 'anchorandoak.example.com', name: 'Anchor & Oak' },
|
|
117
|
+
account_id: 'acc_anchoroak',
|
|
118
|
+
promoted_offering: 'Anchor & Oak summer menu — promoted across 15 metros',
|
|
119
|
+
brief: 'Regional restaurant chain promoting a new menu launch across 15 metro areas. ' +
|
|
120
|
+
'Need geo-targeted mobile and display ads within 5-mile radius of each location. ' +
|
|
121
|
+
'Audio/podcast ads are also interesting if available. ' +
|
|
122
|
+
'Performance tracking: need foot traffic attribution or store visit metrics.',
|
|
123
|
+
budget: { amount: 75_000, currency: 'USD' },
|
|
124
|
+
channels: ['display', 'audio'],
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* All shipped personas, in stable order. Adopters iterate this array
|
|
128
|
+
* to run a scenario across every canonical buyer in one loop.
|
|
129
|
+
*
|
|
130
|
+
* @public
|
|
131
|
+
*/
|
|
132
|
+
exports.ALL_PERSONAS = [
|
|
133
|
+
exports.dtcSkincareBuyer,
|
|
134
|
+
exports.luxuryAutoBuyer,
|
|
135
|
+
exports.b2bSaasBuyer,
|
|
136
|
+
exports.restaurantLocalBuyer,
|
|
137
|
+
];
|
|
138
|
+
/**
|
|
139
|
+
* Look up a persona by `id`. Returns `undefined` for unknown IDs —
|
|
140
|
+
* test code asserting on a specific persona should narrow with a
|
|
141
|
+
* non-null check.
|
|
142
|
+
*
|
|
143
|
+
* @public
|
|
144
|
+
*/
|
|
145
|
+
function getPersonaById(id) {
|
|
146
|
+
return exports.ALL_PERSONAS.find(p => p.id === id);
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Wire-shape builders
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* Build an {@link AccountReference} pointing at the persona's account.
|
|
153
|
+
* Discriminated-union narrowing concern: the wire shape allows
|
|
154
|
+
* `account_id`, `brand`, or `brand + operator`. This builder always
|
|
155
|
+
* returns the `account_id` arm — adopters who need the brand-arm shape
|
|
156
|
+
* should compose `buildBrandReference(persona)` with their own operator.
|
|
157
|
+
*
|
|
158
|
+
* @public
|
|
159
|
+
*/
|
|
160
|
+
function buildAccountReference(persona) {
|
|
161
|
+
return { account_id: persona.account_id };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Build a {@link BrandReference} from the persona's brand identity.
|
|
165
|
+
* Domain is the canonical field; name is dropped (the wire spec doesn't
|
|
166
|
+
* carry it on `BrandReference` — sellers resolve via brand.json).
|
|
167
|
+
*
|
|
168
|
+
* @public
|
|
169
|
+
*/
|
|
170
|
+
function buildBrandReference(persona) {
|
|
171
|
+
return { domain: persona.brand.domain };
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Build a wire-shaped {@link GetProductsRequest} keyed to this persona —
|
|
175
|
+
* `buying_mode: 'brief'`, the persona's `brief` text, brand reference,
|
|
176
|
+
* and account reference. Pass `overrides` to add `filters`,
|
|
177
|
+
* `preferred_delivery_types`, `time_budget`, etc.
|
|
178
|
+
*
|
|
179
|
+
* @public
|
|
180
|
+
*/
|
|
181
|
+
function buildGetProductsRequest(persona, overrides) {
|
|
182
|
+
return {
|
|
183
|
+
buying_mode: 'brief',
|
|
184
|
+
brief: persona.brief,
|
|
185
|
+
brand: buildBrandReference(persona),
|
|
186
|
+
account: buildAccountReference(persona),
|
|
187
|
+
...overrides,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/personas/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export type { CapturedWebhook, CreateWebhookReceiverOptions, RetryReplayPolicy,
|
|
|
16
16
|
export { createRunnerVariables } from './context';
|
|
17
17
|
export type { RunnerVariables } from './context';
|
|
18
18
|
export { WEBHOOK_ASSERTION_TASKS } from './webhook-assertions';
|
|
19
|
-
export { runStoryboard, runStoryboardStep, getFirstStepPreview, summarizeStrictValidation, listStrictOnlyFailures, resolveCapabilityPath, } from './runner';
|
|
19
|
+
export { runStoryboard, runStoryboardStep, getFirstStepPreview, summarizeStrictValidation, listStrictOnlyFailures, resolveCapabilityPath, buildDiscoveryFailedResult, } from './runner';
|
|
20
20
|
export { parseStoryboard, loadStoryboardFile } from './loader';
|
|
21
21
|
export { getComplianceCacheDir, loadComplianceIndex, listBundles, loadBundleStoryboards, listAllComplianceStoryboards, getComplianceStoryboardById, findBundleById, resolveBundleOrStoryboard, resolveStoryboardsForCapabilities, CapabilityResolutionError, PROTOCOL_TO_PATH, } from './compliance';
|
|
22
22
|
export type { AgentCapabilities, BundleKind, BundleRef, CapabilityResolutionCode, ComplianceIndex, ComplianceIndexProtocol, ComplianceIndexSpecialism, NotApplicableStoryboard, ResolveOptions, ResolvedBundle, ResolvedStoryboards, } from './compliance';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,sBAAsB,CAAC;AAG9B,YAAY,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAG1D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAG9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* and is pulled into `compliance/cache/{version}/` via `npm run sync-schemas`.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.
|
|
12
|
-
exports.clearSandboxCache = exports.isSandboxDomain = exports.getSandboxBrand = exports.getSandboxBrands = exports.getSandboxEntities = void 0;
|
|
11
|
+
exports.BrandJsonSchema = exports.PROBE_TASK_ALLOWLIST = exports.TestKitValidationError = exports.validateTestKit = exports.runValidations = exports.hasRequestBuilder = exports.buildRequest = exports.detectContextRejectionHints = exports.applyContextInputs = exports.applyContextOutputsWithProvenance = exports.applyContextOutputs = exports.injectContext = exports.extractContextWithProvenance = exports.extractContext = exports.CONTEXT_EXTRACTORS = exports.setPath = exports.resolvePath = exports.parsePath = exports.executeStoryboardTask = exports.TASK_TO_METHOD = exports.PROTOCOL_TO_PATH = exports.CapabilityResolutionError = exports.resolveStoryboardsForCapabilities = exports.resolveBundleOrStoryboard = exports.findBundleById = exports.getComplianceStoryboardById = exports.listAllComplianceStoryboards = exports.loadBundleStoryboards = exports.listBundles = exports.loadComplianceIndex = exports.getComplianceCacheDir = exports.loadStoryboardFile = exports.parseStoryboard = exports.buildDiscoveryFailedResult = exports.resolveCapabilityPath = exports.listStrictOnlyFailures = exports.summarizeStrictValidation = exports.getFirstStepPreview = exports.runStoryboardStep = exports.runStoryboard = exports.WEBHOOK_ASSERTION_TASKS = exports.createRunnerVariables = exports.createWebhookReceiver = exports.resolveAssertions = exports.clearAssertionRegistry = exports.listDefaultAssertions = exports.listAssertions = exports.getAssertion = exports.registerAssertion = exports.WEBHOOK_IDEMPOTENCY_KEY_PATTERN = void 0;
|
|
12
|
+
exports.clearSandboxCache = exports.isSandboxDomain = exports.getSandboxBrand = exports.getSandboxBrands = exports.getSandboxEntities = exports.AdagentsJsonSchema = void 0;
|
|
13
13
|
// Side-effect import: registers the default cross-step assertions that
|
|
14
14
|
// upstream storyboards reference by id (idempotency.conflict_no_payload_leak,
|
|
15
15
|
// context.no_secret_echo, governance.denial_blocks_mutation). Without this
|
|
@@ -44,6 +44,7 @@ Object.defineProperty(exports, "getFirstStepPreview", { enumerable: true, get: f
|
|
|
44
44
|
Object.defineProperty(exports, "summarizeStrictValidation", { enumerable: true, get: function () { return runner_1.summarizeStrictValidation; } });
|
|
45
45
|
Object.defineProperty(exports, "listStrictOnlyFailures", { enumerable: true, get: function () { return runner_1.listStrictOnlyFailures; } });
|
|
46
46
|
Object.defineProperty(exports, "resolveCapabilityPath", { enumerable: true, get: function () { return runner_1.resolveCapabilityPath; } });
|
|
47
|
+
Object.defineProperty(exports, "buildDiscoveryFailedResult", { enumerable: true, get: function () { return runner_1.buildDiscoveryFailedResult; } });
|
|
47
48
|
// Parser (single-file load for spec evolution / targeted testing)
|
|
48
49
|
var loader_1 = require("./loader");
|
|
49
50
|
Object.defineProperty(exports, "parseStoryboard", { enumerable: true, get: function () { return loader_1.parseStoryboard; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;AAEH,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,qEAAqE;AACrE,gCAA8B;AAqC9B,iCAA0D;AAAjD,wHAAA,+BAA+B,OAAA;AAExC,8DAA8D;AAC9D,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,0GAAA,YAAY,OAAA;AACZ,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,oHAAA,sBAAsB,OAAA;AACtB,+GAAA,iBAAiB,OAAA;AAInB,0FAA0F;AAC1F,uDAA2D;AAAlD,yHAAA,qBAAqB,OAAA;AAU9B,kFAAkF;AAClF,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAG9B,iCAAiC;AACjC,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAEhC,SAAS;AACT,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;AAEH,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,qEAAqE;AACrE,gCAA8B;AAqC9B,iCAA0D;AAAjD,wHAAA,+BAA+B,OAAA;AAExC,8DAA8D;AAC9D,2CAOsB;AANpB,+GAAA,iBAAiB,OAAA;AACjB,0GAAA,YAAY,OAAA;AACZ,4GAAA,cAAc,OAAA;AACd,mHAAA,qBAAqB,OAAA;AACrB,oHAAA,sBAAsB,OAAA;AACtB,+GAAA,iBAAiB,OAAA;AAInB,0FAA0F;AAC1F,uDAA2D;AAAlD,yHAAA,qBAAqB,OAAA;AAU9B,kFAAkF;AAClF,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAG9B,iCAAiC;AACjC,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAEhC,SAAS;AACT,mCAQkB;AAPhB,uGAAA,aAAa,OAAA;AACb,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AACnB,mHAAA,yBAAyB,OAAA;AACzB,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AACrB,oHAAA,0BAA0B,OAAA;AAG5B,kEAAkE;AAClE,mCAA+D;AAAtD,yGAAA,eAAe,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAE5C,iDAAiD;AACjD,2CAYsB;AAXpB,mHAAA,qBAAqB,OAAA;AACrB,iHAAA,mBAAmB,OAAA;AACnB,yGAAA,WAAW,OAAA;AACX,mHAAA,qBAAqB,OAAA;AACrB,0HAAA,4BAA4B,OAAA;AAC5B,yHAAA,2BAA2B,OAAA;AAC3B,4GAAA,cAAc,OAAA;AACd,uHAAA,yBAAyB,OAAA;AACzB,+HAAA,iCAAiC,OAAA;AACjC,uHAAA,yBAAyB,OAAA;AACzB,8GAAA,gBAAgB,OAAA;AAgBlB,eAAe;AACf,uCAAmE;AAA1D,0GAAA,cAAc,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAE9C,iBAAiB;AACjB,+BAAyD;AAAhD,iGAAA,SAAS,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,+FAAA,OAAO,OAAA;AAExC,UAAU;AACV,qCAQmB;AAPjB,6GAAA,kBAAkB,OAAA;AAClB,yGAAA,cAAc,OAAA;AACd,uHAAA,4BAA4B,OAAA;AAC5B,wGAAA,aAAa,OAAA;AACb,8GAAA,mBAAmB,OAAA;AACnB,4HAAA,iCAAiC,OAAA;AACjC,6GAAA,kBAAkB,OAAA;AAIpB,wCAAwC;AACxC,qDAAgE;AAAvD,8HAAA,2BAA2B,OAAA;AAEpC,kBAAkB;AAClB,qDAAoE;AAA3D,+GAAA,YAAY,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAExC,cAAc;AACd,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAEvB,iEAAiE;AACjE,wEAAwE;AACxE,qEAAqE;AACrE,qEAAqE;AAErE,6BAA6B;AAC7B,uCAA2F;AAAlF,2GAAA,eAAe,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAItE,uFAA8F;AAArF,8HAAA,eAAe,OAAA;AAAE,iIAAA,kBAAkB,OAAA;AAE5C,uDAM4B;AAL1B,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,mHAAA,eAAe,OAAA;AACf,mHAAA,eAAe,OAAA;AACf,qHAAA,iBAAiB,OAAA"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* - runStoryboardStep(): run a single step (stateless, LLM-friendly)
|
|
7
7
|
*/
|
|
8
8
|
import type { Storyboard, StoryboardStep, StoryboardContext, StoryboardRunOptions, StoryboardResult, StoryboardPhaseResult, StoryboardStepResult, StoryboardStepPreview, StrictValidationSummary, SchemaValidationError } from './types';
|
|
9
|
+
import type { TestStepResult } from '../types';
|
|
9
10
|
/**
|
|
10
11
|
* Walk a dotted key path (e.g. `"adcp.idempotency.supported"`) through a
|
|
11
12
|
* nested object. Returns `undefined` when any segment is missing or the
|
|
@@ -34,6 +35,18 @@ export declare function __defaultAuthHeadersForRawProbeForTest(options: Storyboa
|
|
|
34
35
|
* empty on instance B.
|
|
35
36
|
*/
|
|
36
37
|
export declare function runStoryboard(agentUrlOrUrls: string | string[], storyboard: Storyboard, options?: StoryboardRunOptions): Promise<StoryboardResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Build a hard-failure StoryboardResult for when agent capability
|
|
40
|
+
* discovery (`get_agent_info` / MCP `tools/list`) failed. Surfacing
|
|
41
|
+
* discovery errors as a hard storyboard failure prevents the silent
|
|
42
|
+
* "X/X clean, 100% skipped" failure mode where transport / auth
|
|
43
|
+
* misconfiguration produced an empty `agentTools: []` and every step
|
|
44
|
+
* skipped with `missing_tool`.
|
|
45
|
+
*
|
|
46
|
+
* @public — exported for direct testing of the failure-result shape;
|
|
47
|
+
* called from `runStoryboard` when discovery throws.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildDiscoveryFailedResult(agentUrls: string[], storyboard: Storyboard, discoveryStep: TestStepResult): StoryboardResult;
|
|
37
50
|
/**
|
|
38
51
|
* Walk every response_schema validation and aggregate the strict/lenient
|
|
39
52
|
* delta. Always returns a summary; `observable: false` signals "run had
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,OAAO,KAAK,EAYV,UAAU,EACV,cAAc,EAEd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAEhB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAA4B,cAAc,EAAE,MAAM,UAAU,CAAC;AAwCzE;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQ/E;AAwJD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAED,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEpC;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,EACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AA4DD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,cAAc,GAC5B,gBAAgB,CA6ClB;AAizBD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,CA0B9G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,CA4BlG;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAsE/B;AA89BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AA8OD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,iBAAsB,GAC9B,qBAAqB,GAAG,SAAS,CAgBnC"}
|
|
@@ -12,6 +12,7 @@ exports.__redactSecretsForTest = __redactSecretsForTest;
|
|
|
12
12
|
exports.__filterResponseHeadersForTest = __filterResponseHeadersForTest;
|
|
13
13
|
exports.__defaultAuthHeadersForRawProbeForTest = __defaultAuthHeadersForRawProbeForTest;
|
|
14
14
|
exports.runStoryboard = runStoryboard;
|
|
15
|
+
exports.buildDiscoveryFailedResult = buildDiscoveryFailedResult;
|
|
15
16
|
exports.listStrictOnlyFailures = listStrictOnlyFailures;
|
|
16
17
|
exports.summarizeStrictValidation = summarizeStrictValidation;
|
|
17
18
|
exports.runStoryboardStep = runStoryboardStep;
|
|
@@ -88,6 +89,17 @@ function resolveCapabilityPath(raw, dottedPath) {
|
|
|
88
89
|
function buildSkip(reason, detail) {
|
|
89
90
|
return { reason, detail: detail ?? SKIP_DETAILS[reason] };
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* True for skip reasons that imply the step's state never materialized —
|
|
94
|
+
* the runner treats these as equivalent to a failed stateful step for
|
|
95
|
+
* cascade-skip purposes. Benign skips (peer branch took, OAuth wasn't
|
|
96
|
+
* advertised, controller seeding cascaded — all handled elsewhere) don't
|
|
97
|
+
* appear here. Accepts both the canonical `RunnerSkipReason` and the
|
|
98
|
+
* detailed variant so callers don't need to narrow before checking.
|
|
99
|
+
*/
|
|
100
|
+
function isMissingStateSkipReason(reason) {
|
|
101
|
+
return reason === 'missing_tool' || reason === 'missing_test_controller' || reason === 'not_applicable';
|
|
102
|
+
}
|
|
91
103
|
/**
|
|
92
104
|
* Resolve each phase's branch-set membership, combining explicit
|
|
93
105
|
* `branch_set: { id, semantics }` declarations with the implicit detection
|
|
@@ -383,6 +395,63 @@ function buildCapabilityUnsupportedResult(agentUrls, storyboard, detail) {
|
|
|
383
395
|
},
|
|
384
396
|
};
|
|
385
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Build a hard-failure StoryboardResult for when agent capability
|
|
400
|
+
* discovery (`get_agent_info` / MCP `tools/list`) failed. Surfacing
|
|
401
|
+
* discovery errors as a hard storyboard failure prevents the silent
|
|
402
|
+
* "X/X clean, 100% skipped" failure mode where transport / auth
|
|
403
|
+
* misconfiguration produced an empty `agentTools: []` and every step
|
|
404
|
+
* skipped with `missing_tool`.
|
|
405
|
+
*
|
|
406
|
+
* @public — exported for direct testing of the failure-result shape;
|
|
407
|
+
* called from `runStoryboard` when discovery throws.
|
|
408
|
+
*/
|
|
409
|
+
function buildDiscoveryFailedResult(agentUrls, storyboard, discoveryStep) {
|
|
410
|
+
const detail = discoveryStep.error ?? 'Discovery failed (no agent tools advertised).';
|
|
411
|
+
const syntheticStep = {
|
|
412
|
+
storyboard_id: storyboard.id,
|
|
413
|
+
step_id: 'discovery_failed',
|
|
414
|
+
phase_id: 'discovery_failed',
|
|
415
|
+
title: 'Storyboard failed: agent capability discovery did not succeed',
|
|
416
|
+
task: '',
|
|
417
|
+
passed: false,
|
|
418
|
+
skipped: false,
|
|
419
|
+
duration_ms: discoveryStep.duration_ms,
|
|
420
|
+
validations: [],
|
|
421
|
+
context: {},
|
|
422
|
+
error: `Discovery failure: ${detail}. The runner refuses to proceed with empty agentTools — that mode produces silent "all clean" reports when the underlying transport / auth / network policy is broken. Fix the discovery error before re-running.`,
|
|
423
|
+
extraction: { path: 'none' },
|
|
424
|
+
};
|
|
425
|
+
return {
|
|
426
|
+
storyboard_id: storyboard.id,
|
|
427
|
+
storyboard_title: storyboard.title,
|
|
428
|
+
agent_url: agentUrls[0],
|
|
429
|
+
overall_passed: false,
|
|
430
|
+
phases: [
|
|
431
|
+
{
|
|
432
|
+
phase_id: 'discovery_failed',
|
|
433
|
+
phase_title: 'Discovery failed',
|
|
434
|
+
passed: false,
|
|
435
|
+
steps: [syntheticStep],
|
|
436
|
+
duration_ms: discoveryStep.duration_ms,
|
|
437
|
+
},
|
|
438
|
+
],
|
|
439
|
+
context: {},
|
|
440
|
+
total_duration_ms: discoveryStep.duration_ms,
|
|
441
|
+
passed_count: 0,
|
|
442
|
+
failed_count: 1,
|
|
443
|
+
skipped_count: 0,
|
|
444
|
+
tested_at: new Date().toISOString(),
|
|
445
|
+
strict_validation_summary: {
|
|
446
|
+
observable: false,
|
|
447
|
+
checked: 0,
|
|
448
|
+
passed: 0,
|
|
449
|
+
failed: 0,
|
|
450
|
+
strict_only_failures: 0,
|
|
451
|
+
lenient_also_failed: 0,
|
|
452
|
+
},
|
|
453
|
+
};
|
|
454
|
+
}
|
|
386
455
|
/**
|
|
387
456
|
* Build a minimal StoryboardResult for a storyboard skipped because the agent
|
|
388
457
|
* does not advertise any of the tools listed in `required_tools`. The result
|
|
@@ -460,10 +529,26 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
460
529
|
let profile;
|
|
461
530
|
if (!options._client) {
|
|
462
531
|
const discovered = await (0, client_1.getOrDiscoverProfile)(clients[0], options);
|
|
532
|
+
// Discovery failure must surface as a HARD STORYBOARD FAILURE, not a
|
|
533
|
+
// silent empty `agentTools: []` that lets every step skip with
|
|
534
|
+
// `missing_tool`. The latter mode produces "X/X clean" summaries with
|
|
535
|
+
// 100% skipped — invisible CI failure when transport setup is broken
|
|
536
|
+
// (auth misconfig, MCP transport-fallback bugs, network policy, etc.).
|
|
537
|
+
// See: https://github.com/adcontextprotocol/adcp-client/issues/...
|
|
538
|
+
if (discovered.step.passed === false) {
|
|
539
|
+
if (!options._client)
|
|
540
|
+
await (0, protocols_1.closeConnections)(options.protocol);
|
|
541
|
+
return buildDiscoveryFailedResult(agentUrls, storyboard, discovered.step);
|
|
542
|
+
}
|
|
463
543
|
profile = discovered.profile;
|
|
464
|
-
// Populate agentTools from discovered profile if not already set
|
|
544
|
+
// Populate agentTools and _profile from discovered profile if not already set.
|
|
545
|
+
// _profile is threaded into executeStep so capability-based skip gates
|
|
546
|
+
// (e.g. account-mode branching) can read raw_capabilities at step time.
|
|
465
547
|
if (!options.agentTools && profile?.tools) {
|
|
466
|
-
options = { ...options, agentTools: profile.tools };
|
|
548
|
+
options = { ...options, agentTools: profile.tools, _profile: profile };
|
|
549
|
+
}
|
|
550
|
+
else if (profile && !options._profile) {
|
|
551
|
+
options = { ...options, _profile: profile };
|
|
467
552
|
}
|
|
468
553
|
}
|
|
469
554
|
else {
|
|
@@ -533,6 +618,14 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
533
618
|
let passedCount = 0;
|
|
534
619
|
let failedCount = 0;
|
|
535
620
|
let skippedCount = 0;
|
|
621
|
+
// Stateful-cascade flags live at storyboard scope, NOT phase scope —
|
|
622
|
+
// cross-phase storyboards (e.g. signal_marketplace/governance_denied:
|
|
623
|
+
// setup in phases 1-2, consumption in phase 3) need the cascade to
|
|
624
|
+
// survive phase boundaries. Once a stateful step in any phase failed
|
|
625
|
+
// or skipped to materialize state, every downstream stateful step
|
|
626
|
+
// stays cascade-skipped regardless of which phase it lives in.
|
|
627
|
+
let statefulFailed = false;
|
|
628
|
+
let statefulSkipTrigger = null;
|
|
536
629
|
// Step results whose failures the main loop added to failedCount. The
|
|
537
630
|
// branch-set post-pass decrements only for entries that were actually
|
|
538
631
|
// counted, so an optional phase that hit `presenceDetected` (a PRM 2xx
|
|
@@ -681,7 +774,10 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
681
774
|
const phaseStart = Date.now();
|
|
682
775
|
const stepResults = [];
|
|
683
776
|
let phasePassed = true;
|
|
684
|
-
|
|
777
|
+
// `statefulFailed` and `statefulSkipTrigger` live at storyboard
|
|
778
|
+
// scope (declared above the phase loop) so the cascade survives
|
|
779
|
+
// cross-phase setup → assertion patterns. See declaration site for
|
|
780
|
+
// the rationale (signal_marketplace/governance_denied story).
|
|
685
781
|
// PRM presence-probe state (adcp-client#677). `phaseAbsent` flips when
|
|
686
782
|
// /.well-known/oauth-protected-resource returns 404 — subsequent steps
|
|
687
783
|
// in this phase cascade-skip instead of failing their http_status:200
|
|
@@ -767,9 +863,15 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
767
863
|
skippedCount++;
|
|
768
864
|
continue;
|
|
769
865
|
}
|
|
770
|
-
// Skip remaining steps if a stateful dependency failed
|
|
866
|
+
// Skip remaining steps if a stateful dependency failed (or
|
|
867
|
+
// skipped for a missing-state reason). The detail message
|
|
868
|
+
// distinguishes the two so adopters reading the cascade know
|
|
869
|
+
// whether to look at a real failure or a structural mismatch
|
|
870
|
+
// (storyboard step requires a tool the agent doesn't advertise).
|
|
771
871
|
if (statefulFailed && step.stateful) {
|
|
772
|
-
const detail =
|
|
872
|
+
const detail = statefulSkipTrigger
|
|
873
|
+
? `Skipped: prior stateful step "${statefulSkipTrigger.stepId}" skipped (${statefulSkipTrigger.reason}); state never materialized.`
|
|
874
|
+
: 'Skipped: prior stateful step failed.';
|
|
773
875
|
stepResults.push({
|
|
774
876
|
storyboard_id: storyboard.id,
|
|
775
877
|
step_id: step.id,
|
|
@@ -874,6 +976,26 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
874
976
|
if (result.skipped) {
|
|
875
977
|
skippedCount++;
|
|
876
978
|
context = result.context;
|
|
979
|
+
// Cascade-skip extension: a stateful step that SKIPS for a
|
|
980
|
+
// missing-state reason (`missing_tool`, `missing_test_controller`,
|
|
981
|
+
// `not_applicable`) is morally equivalent to a stateful step that
|
|
982
|
+
// failed — the state downstream steps depend on never
|
|
983
|
+
// materialized. Without this trip, a follow-up stateful step
|
|
984
|
+
// runs against absent state and surfaces a misleading
|
|
985
|
+
// assertion failure. Skips that imply state DID materialize via
|
|
986
|
+
// another path (`peer_branch_taken`, `controller_seeding_failed`
|
|
987
|
+
// — already handled by phase-level cascade, `oauth_not_advertised`
|
|
988
|
+
// — phase-absent path) deliberately don't trip the flag.
|
|
989
|
+
if (step.stateful && isMissingStateSkipReason(result.skip_reason)) {
|
|
990
|
+
statefulFailed = true;
|
|
991
|
+
// Record provenance for the cascade detail message. First trip
|
|
992
|
+
// wins — subsequent triggers don't overwrite, since the cascade
|
|
993
|
+
// text references the originating diagnostic (the leftmost
|
|
994
|
+
// missing-state stateful step in the phase).
|
|
995
|
+
if (statefulSkipTrigger === null) {
|
|
996
|
+
statefulSkipTrigger = { stepId: step.id, reason: result.skip_reason ?? 'missing_tool' };
|
|
997
|
+
}
|
|
998
|
+
}
|
|
877
999
|
}
|
|
878
1000
|
else if (result.passed) {
|
|
879
1001
|
context = result.context;
|
|
@@ -891,8 +1013,15 @@ async function executeStoryboardPass(agentUrls, storyboard, options, dispatchOff
|
|
|
891
1013
|
failedCount++;
|
|
892
1014
|
countedAsFailed.add(result);
|
|
893
1015
|
}
|
|
894
|
-
if (step.stateful)
|
|
1016
|
+
if (step.stateful) {
|
|
895
1017
|
statefulFailed = true;
|
|
1018
|
+
// Real failure takes precedence over a prior skip-trigger in
|
|
1019
|
+
// the cascade detail message — failures are the worse
|
|
1020
|
+
// diagnostic, so downstream cascade-skipped steps should
|
|
1021
|
+
// reference the failure rather than the earlier benign-ish
|
|
1022
|
+
// missing-state skip.
|
|
1023
|
+
statefulSkipTrigger = null;
|
|
1024
|
+
}
|
|
896
1025
|
// In multi-instance mode, annotate the failure with the cross-instance
|
|
897
1026
|
// attribution block so CI readers pattern-match it as a deployment bug.
|
|
898
1027
|
if (isMultiInstance) {
|
|
@@ -1198,11 +1327,16 @@ async function runStoryboardStep(agentUrl, storyboard, stepId, options = {}) {
|
|
|
1198
1327
|
const client = (0, client_1.getOrCreateClient)(agentUrl, options);
|
|
1199
1328
|
// Discover agent profile for standalone step execution. Captured so the
|
|
1200
1329
|
// executeStep call below can thread `library_version` through to
|
|
1201
|
-
// shape-drift hint detection (issue #850).
|
|
1330
|
+
// shape-drift hint detection (issue #850). Also threads _profile into
|
|
1331
|
+
// options so capability-based skip gates in executeStep (e.g. account-mode
|
|
1332
|
+
// branching) can read raw_capabilities, mirroring executeStoryboardPass.
|
|
1202
1333
|
let profile;
|
|
1203
1334
|
if (!options._client) {
|
|
1204
1335
|
const discovered = await (0, client_1.getOrDiscoverProfile)(client, options);
|
|
1205
1336
|
profile = discovered.profile;
|
|
1337
|
+
if (profile && !options._profile) {
|
|
1338
|
+
options = { ...options, _profile: profile };
|
|
1339
|
+
}
|
|
1206
1340
|
}
|
|
1207
1341
|
else {
|
|
1208
1342
|
profile = options._profile;
|
|
@@ -1315,6 +1449,44 @@ client, step, phaseId, context, allSteps, options, state) {
|
|
|
1315
1449
|
extraction: { path: 'none' },
|
|
1316
1450
|
};
|
|
1317
1451
|
}
|
|
1452
|
+
// Account-mode capability gate: sync_accounts is exclusive to implicit mode
|
|
1453
|
+
// (require_operator_auth: false). When the seller declared explicit mode
|
|
1454
|
+
// (require_operator_auth: true), sync_accounts does not apply — grade
|
|
1455
|
+
// not_applicable rather than missing_tool so adopters can distinguish
|
|
1456
|
+
// "your capability declaration says this path isn't yours" from "you forgot
|
|
1457
|
+
// to implement a required tool."
|
|
1458
|
+
//
|
|
1459
|
+
// list_accounts is NOT gated here: it appears in audience_sync and other
|
|
1460
|
+
// storyboard flows regardless of account mode, so it is always applicable.
|
|
1461
|
+
//
|
|
1462
|
+
// Requires _profile threaded from the discovery block in
|
|
1463
|
+
// executeStoryboardPass or runStoryboardStep.
|
|
1464
|
+
if (effectiveStep.task === 'sync_accounts') {
|
|
1465
|
+
const rawCaps = options._profile?.raw_capabilities;
|
|
1466
|
+
if (rawCaps !== undefined) {
|
|
1467
|
+
const requireOperatorAuth = resolveCapabilityPath(rawCaps, 'account.require_operator_auth');
|
|
1468
|
+
if (requireOperatorAuth === true) {
|
|
1469
|
+
const detail = `Agent declared explicit account mode (require_operator_auth: true); ` +
|
|
1470
|
+
`sync_accounts is not applicable — list_accounts is the correct tool for this account shape.`;
|
|
1471
|
+
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
1472
|
+
return {
|
|
1473
|
+
step_id: step.id,
|
|
1474
|
+
phase_id: phaseId,
|
|
1475
|
+
title: step.title,
|
|
1476
|
+
task: step.task,
|
|
1477
|
+
passed: true,
|
|
1478
|
+
skipped: true,
|
|
1479
|
+
skip_reason: 'not_applicable',
|
|
1480
|
+
skip: buildSkip('not_applicable', detail),
|
|
1481
|
+
duration_ms: 0,
|
|
1482
|
+
validations: [],
|
|
1483
|
+
context,
|
|
1484
|
+
next,
|
|
1485
|
+
extraction: { path: 'none' },
|
|
1486
|
+
};
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1318
1490
|
// Skip if agent doesn't implement the tool this step calls.
|
|
1319
1491
|
if (options.agentTools && !options.agentTools.includes(effectiveStep.task)) {
|
|
1320
1492
|
const next = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|