@adcp/sdk 7.7.0 → 7.8.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/dist/lib/errors/index.d.ts +54 -0
- package/dist/lib/errors/index.d.ts.map +1 -1
- package/dist/lib/errors/index.js +132 -1
- package/dist/lib/errors/index.js.map +1 -1
- package/dist/lib/index.d.ts +4 -2
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +38 -9
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/media-buy/available-actions.d.ts +60 -0
- package/dist/lib/media-buy/available-actions.d.ts.map +1 -0
- package/dist/lib/media-buy/available-actions.js +112 -0
- package/dist/lib/media-buy/available-actions.js.map +1 -0
- package/dist/lib/media-buy/index.d.ts +9 -0
- package/dist/lib/media-buy/index.d.ts.map +1 -0
- package/dist/lib/media-buy/index.js +36 -0
- package/dist/lib/media-buy/index.js.map +1 -0
- package/dist/lib/media-buy/preflight.d.ts +118 -0
- package/dist/lib/media-buy/preflight.d.ts.map +1 -0
- package/dist/lib/media-buy/preflight.js +376 -0
- package/dist/lib/media-buy/preflight.js.map +1 -0
- package/dist/lib/media-buy/types.d.ts +113 -0
- package/dist/lib/media-buy/types.d.ts.map +1 -0
- package/dist/lib/media-buy/types.js +25 -0
- package/dist/lib/media-buy/types.js.map +1 -0
- package/dist/lib/media-buy/update-fields.generated.d.ts +14 -0
- package/dist/lib/media-buy/update-fields.generated.d.ts.map +1 -0
- package/dist/lib/media-buy/update-fields.generated.js +137 -0
- package/dist/lib/media-buy/update-fields.generated.js.map +1 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/decisioning/account.d.ts +27 -0
- package/dist/lib/server/decisioning/account.d.ts.map +1 -1
- package/dist/lib/server/decisioning/account.js.map +1 -1
- package/dist/lib/server/decisioning/context.d.ts +65 -0
- package/dist/lib/server/decisioning/context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +59 -58
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.d.ts +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.js +2 -1
- package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
- package/dist/lib/signing/jwks-helpers.d.ts +8 -1
- package/dist/lib/signing/jwks-helpers.d.ts.map +1 -1
- package/dist/lib/signing/jwks-helpers.js.map +1 -1
- package/dist/lib/signing/signer.d.ts +22 -1
- package/dist/lib/signing/signer.d.ts.map +1 -1
- package/dist/lib/signing/signer.js +5 -16
- package/dist/lib/signing/signer.js.map +1 -1
- package/dist/lib/signing/testing.d.ts +4 -3
- package/dist/lib/signing/testing.d.ts.map +1 -1
- package/dist/lib/signing/testing.js +6 -1
- package/dist/lib/signing/testing.js.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.d.ts +20 -3
- package/dist/lib/testing/storyboard/agent-routing.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/agent-routing.js +60 -10
- package/dist/lib/testing/storyboard/agent-routing.js.map +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +111 -59
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts +24 -10
- package/dist/lib/testing/storyboard/request-signing/grader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/grader.js +123 -29
- package/dist/lib/testing/storyboard/request-signing/grader.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +13 -0
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +85 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +41 -22
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -15,18 +15,6 @@ const content_digest_1 = require("./content-digest");
|
|
|
15
15
|
const errors_1 = require("./errors");
|
|
16
16
|
const types_1 = require("./types");
|
|
17
17
|
const webhook_verifier_1 = require("./webhook-verifier");
|
|
18
|
-
/**
|
|
19
|
-
* Step-8-equivalent purpose-binding gate on the signer side. The verifier
|
|
20
|
-
* already enforces `jwk.adcp_use === expected` at step 8 (see verifier.ts
|
|
21
|
-
* for request signing; webhook-verifier.ts for webhooks). Replicating the
|
|
22
|
-
* check on the signer side prevents the more common operator footgun:
|
|
23
|
-
* passing a wrong-purpose key into the helper, producing a wire-conformant
|
|
24
|
-
* signature that the downstream verifier then rejects, surfacing the
|
|
25
|
-
* misconfiguration at the wrong end of the connection.
|
|
26
|
-
*
|
|
27
|
-
* Errors emit the same code the verifier uses for that direction so log
|
|
28
|
-
* scrapers across signer / verifier see consistent vocabulary.
|
|
29
|
-
*/
|
|
30
18
|
function assertKeyPurpose(key, expected) {
|
|
31
19
|
throwIfPurposeMismatch(key.keyid, key.privateKey.adcp_use, expected);
|
|
32
20
|
}
|
|
@@ -60,11 +48,12 @@ function throwIfPurposeMismatch(keyid, actual, expected) {
|
|
|
60
48
|
case 'response-signing':
|
|
61
49
|
throw new errors_1.ResponseSignatureError('response_signature_key_purpose_invalid', 8, message);
|
|
62
50
|
default: {
|
|
63
|
-
// Compile-time exhaustiveness: a future
|
|
64
|
-
//
|
|
65
|
-
//
|
|
51
|
+
// Compile-time exhaustiveness: a future widening of `Rfc9421AdcpUse`
|
|
52
|
+
// (typically because `AdcpUse` grew an RFC-9421 member) must add a
|
|
53
|
+
// case arm here. Trips `tsc --noEmit` if the union grows without an
|
|
54
|
+
// explicit gate decision for the new member.
|
|
66
55
|
const _exhaustive = expected;
|
|
67
|
-
throw new Error(`unreachable: unhandled
|
|
56
|
+
throw new Error(`unreachable: unhandled Rfc9421AdcpUse '${_exhaustive}'`);
|
|
68
57
|
}
|
|
69
58
|
}
|
|
70
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/lib/signing/signer.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/lib/signing/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -80,9 +80,10 @@ export interface MintEphemeralEd25519KeyOptions {
|
|
|
80
80
|
*/
|
|
81
81
|
kid?: string;
|
|
82
82
|
/**
|
|
83
|
-
* AdCP purpose binding tagged on both JWKs.
|
|
84
|
-
*
|
|
85
|
-
* - `'request-signing'`
|
|
83
|
+
* AdCP purpose binding tagged on both JWKs. Accepts every member of
|
|
84
|
+
* {@link AdcpUse} — see that type for the canonical list (currently
|
|
85
|
+
* `'webhook-signing'`, `'request-signing'`, `'response-signing'`,
|
|
86
|
+
* `'governance-signing'`). Defaults to `'webhook-signing'`.
|
|
86
87
|
*
|
|
87
88
|
* For production request-signing keys use `pemToAdcpJwk()` or a KMS-backed
|
|
88
89
|
* `SigningProvider` instead.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/lib/signing/testing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/lib/signing/testing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;AAYxE,MAAM,WAAW,8BAA8B;IAC7C,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,EAAE,WAAW,CAAC;IACvB,4CAA4C;IAC5C,UAAU,EAAE,cAAc,CAAC;IAC3B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,OAAO,EAAE,8BAA8B;IAoC7C,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAQrD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,eAAe,CAMnE;AAED,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,SAAS,EAAE,WAAW,CAAC;IACvB,kFAAkF;IAClF,SAAS,EAAE,cAAc,CAAC;IAC1B;;;;OAIG;IACH,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoCjH"}
|
|
@@ -44,7 +44,12 @@ const node_crypto_1 = require("node:crypto");
|
|
|
44
44
|
* production-time guard.
|
|
45
45
|
*/
|
|
46
46
|
exports.ALLOW_IN_MEMORY_SIGNER_ENV = 'ADCP_ALLOW_IN_MEMORY_SIGNER';
|
|
47
|
-
const ADCP_USE_VALUES = new Set([
|
|
47
|
+
const ADCP_USE_VALUES = new Set([
|
|
48
|
+
'request-signing',
|
|
49
|
+
'webhook-signing',
|
|
50
|
+
'response-signing',
|
|
51
|
+
'governance-signing',
|
|
52
|
+
]);
|
|
48
53
|
function isAdcpUse(value) {
|
|
49
54
|
return typeof value === 'string' && ADCP_USE_VALUES.has(value);
|
|
50
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../src/lib/signing/testing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../src/lib/signing/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,15 @@ export interface AgentRoutingContext {
|
|
|
53
53
|
protocolIndex: Map<AdcpProtocol, string[]>;
|
|
54
54
|
/** Resolved (key → URL) for echo on the storyboard result. */
|
|
55
55
|
agentMap: Record<string, string>;
|
|
56
|
+
/**
|
|
57
|
+
* Agents whose discovery failed when `discovery_resilient: true` was set.
|
|
58
|
+
* Empty in the default (hard-failure) mode — if any agent failed and
|
|
59
|
+
* resilient mode is off, `buildRoutingContext` throws `DiscoveryFailure`
|
|
60
|
+
* instead of returning. The runner echoes this list onto
|
|
61
|
+
* `StoryboardResult.discovery_failures` so operators see the topology
|
|
62
|
+
* breakage even when the storyboard otherwise completes.
|
|
63
|
+
*/
|
|
64
|
+
discoveryFailures: DiscoveryFailure[];
|
|
56
65
|
}
|
|
57
66
|
export declare class RoutingError extends Error {
|
|
58
67
|
readonly task: string;
|
|
@@ -69,10 +78,18 @@ export declare class DiscoveryFailure extends Error {
|
|
|
69
78
|
* Discover every agent in the map in parallel and build the routing index.
|
|
70
79
|
*
|
|
71
80
|
* Failure modes:
|
|
72
|
-
* -
|
|
73
|
-
*
|
|
81
|
+
* - default (`options.discovery_resilient !== true`): any agent's
|
|
82
|
+
* discovery failure → throw `DiscoveryFailure` (caller surfaces as a
|
|
83
|
+
* hard storyboard failure, never a per-step skip). Correct for
|
|
84
|
+
* production multi-tenant flows where every tenant is load-bearing.
|
|
85
|
+
* - resilient (`options.discovery_resilient === true`, #1367): failed
|
|
86
|
+
* agents are excluded from `profiles` + `protocolIndex` and reported
|
|
87
|
+
* on `AgentRoutingContext.discoveryFailures`. Per-step routing then
|
|
88
|
+
* surfaces failures only for storyboards that actually need the
|
|
89
|
+
* broken tenant — unrelated storyboards complete normally.
|
|
74
90
|
* - protocol claimed by 2+ agents AND ≥1 storyboard step that needs it
|
|
75
|
-
* lacks `step.agent` → `RoutingError` (conflict)
|
|
91
|
+
* lacks `step.agent` → `RoutingError` (conflict). Independent of
|
|
92
|
+
* resilient mode.
|
|
76
93
|
*/
|
|
77
94
|
export declare function buildRoutingContext(storyboard: Storyboard, options: StoryboardRunOptions): Promise<AgentRoutingContext>;
|
|
78
95
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-routing.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/agent-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAc,UAAU,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAwE5F,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,qEAAqE;IACrE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+CAA+C;IAC/C,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-routing.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/agent-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAc,UAAU,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAwE5F,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,qEAAqE;IACrE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+CAA+C;IAC/C,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;;;OAOG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED,qBAAa,YAAa,SAAQ,KAAK;aAGnB,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,MAAM;gBAF5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,QAAQ,EAAE,MAAM;aAChB,GAAG,EAAE,MAAM;aACX,UAAU,EAAE,MAAM;gBAHlC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM;CAKrC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAmE9B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAClC,mBAAmB,CAUrB;AAwFD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,mBAAmB,GACvB,MAAM,CAkER"}
|
|
@@ -101,14 +101,23 @@ exports.DiscoveryFailure = DiscoveryFailure;
|
|
|
101
101
|
* Discover every agent in the map in parallel and build the routing index.
|
|
102
102
|
*
|
|
103
103
|
* Failure modes:
|
|
104
|
-
* -
|
|
105
|
-
*
|
|
104
|
+
* - default (`options.discovery_resilient !== true`): any agent's
|
|
105
|
+
* discovery failure → throw `DiscoveryFailure` (caller surfaces as a
|
|
106
|
+
* hard storyboard failure, never a per-step skip). Correct for
|
|
107
|
+
* production multi-tenant flows where every tenant is load-bearing.
|
|
108
|
+
* - resilient (`options.discovery_resilient === true`, #1367): failed
|
|
109
|
+
* agents are excluded from `profiles` + `protocolIndex` and reported
|
|
110
|
+
* on `AgentRoutingContext.discoveryFailures`. Per-step routing then
|
|
111
|
+
* surfaces failures only for storyboards that actually need the
|
|
112
|
+
* broken tenant — unrelated storyboards complete normally.
|
|
106
113
|
* - protocol claimed by 2+ agents AND ≥1 storyboard step that needs it
|
|
107
|
-
* lacks `step.agent` → `RoutingError` (conflict)
|
|
114
|
+
* lacks `step.agent` → `RoutingError` (conflict). Independent of
|
|
115
|
+
* resilient mode.
|
|
108
116
|
*/
|
|
109
117
|
async function buildRoutingContext(storyboard, options) {
|
|
110
118
|
const agents = options.agents;
|
|
111
119
|
const entries = Object.entries(agents);
|
|
120
|
+
const resilient = options.discovery_resilient === true;
|
|
112
121
|
const clients = new Map();
|
|
113
122
|
const agentMap = {};
|
|
114
123
|
for (const [key, entry] of entries) {
|
|
@@ -118,6 +127,7 @@ async function buildRoutingContext(storyboard, options) {
|
|
|
118
127
|
}
|
|
119
128
|
// Parallel discovery — one tenant's slowness does not block another.
|
|
120
129
|
const profiles = new Map();
|
|
130
|
+
const discoveryFailures = [];
|
|
121
131
|
const discoveryResults = await Promise.all(entries.map(async ([key, entry]) => {
|
|
122
132
|
const perAgentOptions = buildAgentOptions(entry, options);
|
|
123
133
|
try {
|
|
@@ -138,14 +148,35 @@ async function buildRoutingContext(storyboard, options) {
|
|
|
138
148
|
}));
|
|
139
149
|
for (const r of discoveryResults) {
|
|
140
150
|
if (!r.profile || r.step.passed === false) {
|
|
141
|
-
|
|
142
|
-
|
|
151
|
+
// Bound the attacker-influenced upstream string. A malicious agent
|
|
152
|
+
// could return an arbitrarily large error body during the discovery
|
|
153
|
+
// probe; the unbounded string would flow into
|
|
154
|
+
// `StoryboardResult.discovery_failures[].error` where downstream
|
|
155
|
+
// dashboards / LLM contexts ingest it. 512 chars is enough for a
|
|
156
|
+
// human to read the failure and grep logs for more.
|
|
157
|
+
const rawDetail = scrubAuthSecrets(r.step.error ?? 'Discovery returned no profile.');
|
|
158
|
+
const detail = rawDetail.length > 512 ? `${rawDetail.slice(0, 512)} …(truncated)` : rawDetail;
|
|
159
|
+
// Default mode appends a signposted escape hatch so CI operators
|
|
160
|
+
// discover the resilient flag without grep'ing the JSDoc. Suppressed
|
|
161
|
+
// in resilient mode (the operator already opted in) so the hint
|
|
162
|
+
// doesn't appear in every per-agent failure attached to the result.
|
|
163
|
+
const baseMessage = `Discovery failed for agent "${r.key}" (${agents[r.key].url}): ${detail}`;
|
|
164
|
+
const message = resilient
|
|
165
|
+
? baseMessage
|
|
166
|
+
: `${baseMessage}\n\nIf this is hello-cluster / exploratory CI and you want unrelated storyboards to complete despite this failure, ` +
|
|
167
|
+
`set \`StoryboardRunOptions.discovery_resilient: true\`. Do NOT set it in production — a topology with a broken tenant ` +
|
|
168
|
+
`is a hard misconfiguration there.`;
|
|
169
|
+
const failure = new DiscoveryFailure(message, r.key, agents[r.key].url, detail);
|
|
170
|
+
if (!resilient)
|
|
171
|
+
throw failure;
|
|
172
|
+
discoveryFailures.push(failure);
|
|
173
|
+
continue;
|
|
143
174
|
}
|
|
144
175
|
profiles.set(r.key, r.profile);
|
|
145
176
|
}
|
|
146
177
|
const protocolIndex = buildProtocolIndex(profiles);
|
|
147
178
|
detectMultiClaimConflicts(storyboard, protocolIndex);
|
|
148
|
-
return { clients, profiles, protocolIndex, agentMap };
|
|
179
|
+
return { clients, profiles, protocolIndex, agentMap, discoveryFailures };
|
|
149
180
|
}
|
|
150
181
|
/**
|
|
151
182
|
* Test seam: build a routing context from pre-baked profiles instead of
|
|
@@ -163,7 +194,7 @@ function buildRoutingContextFromProfiles(storyboard, options, profiles) {
|
|
|
163
194
|
const protocolIndex = buildProtocolIndex(profiles);
|
|
164
195
|
detectMultiClaimConflicts(storyboard, protocolIndex);
|
|
165
196
|
// Empty client map — callers that only test routing shouldn't dispatch.
|
|
166
|
-
return { clients: new Map(), profiles, protocolIndex, agentMap };
|
|
197
|
+
return { clients: new Map(), profiles, protocolIndex, agentMap, discoveryFailures: [] };
|
|
167
198
|
}
|
|
168
199
|
/**
|
|
169
200
|
* Reverse-index `AgentProfile.supported_protocols` so routing can pick an
|
|
@@ -256,7 +287,20 @@ function primaryProtocolFor(task) {
|
|
|
256
287
|
*/
|
|
257
288
|
function resolveAgentForStep(step, options, ctx) {
|
|
258
289
|
if (step.agent !== undefined) {
|
|
259
|
-
//
|
|
290
|
+
// If the override targets an agent whose discovery failed under
|
|
291
|
+
// resilient mode, surface that explicitly rather than handing
|
|
292
|
+
// dispatch a transport client to a broken tenant (which would
|
|
293
|
+
// otherwise fail at the wire layer with a misleading transport
|
|
294
|
+
// error). Only meaningful when `discoveryFailures` is non-empty;
|
|
295
|
+
// under default (hard-failure) mode `buildRoutingContext` throws
|
|
296
|
+
// before we reach this branch.
|
|
297
|
+
const failed = ctx.discoveryFailures.find(f => f.agentKey === step.agent);
|
|
298
|
+
if (failed) {
|
|
299
|
+
throw new RoutingError(`Step "${step.id}" targets agent "${step.agent}" via \`step.agent\` override, ` +
|
|
300
|
+
`but that agent's discovery failed: ${failed.underlying} ` +
|
|
301
|
+
`(${failed.url}). Either remove the override, fix the agent, or ` +
|
|
302
|
+
`route the step to a healthy agent.`, step.task, `agent "${step.agent}" failed discovery`);
|
|
303
|
+
}
|
|
260
304
|
return step.agent;
|
|
261
305
|
}
|
|
262
306
|
const protocol = primaryProtocolFor(step.task);
|
|
@@ -275,10 +319,16 @@ function resolveAgentForStep(step, options, ctx) {
|
|
|
275
319
|
// Zero candidates — no agent in the map claims this protocol.
|
|
276
320
|
if (options.default_agent)
|
|
277
321
|
return options.default_agent;
|
|
322
|
+
// Under `discovery_resilient`, an agent that was supposed to claim
|
|
323
|
+
// this protocol may have been excluded by a failed probe. Suffix the
|
|
324
|
+
// error so the operator sees the connection without correlating logs.
|
|
325
|
+
const failedHint = ctx.discoveryFailures.length > 0
|
|
326
|
+
? ` Discovery failed for: ${ctx.discoveryFailures.map(f => `${f.agentKey} (${f.url})`).join(', ')}.`
|
|
327
|
+
: '';
|
|
278
328
|
throw new RoutingError(`No agent in the map claims protocol "${protocol}" required by tool ` +
|
|
279
329
|
`"${step.task}" (step "${step.id}"). Available agents: ` +
|
|
280
|
-
`${[...ctx.profiles.keys()].join(', ')
|
|
281
|
-
|
|
330
|
+
`${[...ctx.profiles.keys()].join(', ') || '(none — every agent failed discovery)'}.${failedHint} ` +
|
|
331
|
+
`Add an agent that supports ${protocol}, or set \`default_agent\` to fall back.`, step.task, `protocol ${protocol} unclaimed`);
|
|
282
332
|
}
|
|
283
333
|
// Tool not in TASK_FEATURE_MAP (e.g., sync_creatives, comply_test_controller,
|
|
284
334
|
// get_adcp_capabilities post-discovery, future tasks).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-routing.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/agent-routing.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"agent-routing.js","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/agent-routing.ts"],"names":[],"mappings":";;;AAkLA,kDAsEC;AASD,0EAcC;AA6FD,kDAsEC;AAvYD,sCAAoE;AAEpE,2DAA+E;AAG/E,2EAA2E;AAC3E,wDAAwD;AACxD,kEAAkE;AAClE,sEAAsE;AACtE,sEAAsE;AACtE,6DAA6D;AAC7D,yEAAyE;AACzE,iBAAiB;AACjB,MAAM,eAAe,GAA8B,IAAI,GAAG,CAAC;IACzD,WAAW;IACX,SAAS;IACT,YAAY;IACZ,UAAU;IACV,wBAAwB;IACxB,eAAe;IACf,oBAAoB;IACpB,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,oEAAoE;IACpE,sEAAsE;IACtE,+DAA+D;IAC/D,WAAW;IACX,OAAO,IAAI;SACR,OAAO,CAAC,sDAAsD,EAAE,cAAc,CAAC,CAAC,WAAW;SAC3F,OAAO,CAAC,kCAAkC,EAAE,mBAAmB,CAAC,CAAC,WAAW;SAC5E,OAAO,CAAC,mCAAmC,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW;AAC9E,CAAC;AAED,6EAA6E;AAC7E,SAAS,iBAAiB,CAAC,KAAiB,EAAE,OAA6B;IACzE,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;QAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ;QAC7C,oEAAoE;QACpE,qEAAqE;QACrE,yEAAyE;QACzE,oEAAoE;QACpE,6DAA6D;QAC7D,gEAAgE;QAChE,mEAAmE;QACnE,cAAc;QACd,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC;AAsBD,MAAa,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AATD,oCASC;AAED,MAAa,gBAAiB,SAAQ,KAAK;IAGvB;IACA;IACA;IAJlB,YACE,OAAe,EACC,QAAgB,EAChB,GAAW,EACX,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,QAAG,GAAH,GAAG,CAAQ;QACX,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAVD,4CAUC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,UAAU,mBAAmB,CACvC,UAAsB,EACtB,OAA6B;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAO,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,KAAK,IAAI,CAAC;IAEvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAA,0BAAiB,EAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC5B,CAAC;IAED,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,MAAM,iBAAiB,GAAuB,EAAE,CAAC;IACjD,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACjC,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,6BAAoB,EAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,eAAe,CAAC,CAAC;YACzF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE;oBACJ,IAAI,EAAE,6BAA6B;oBACnC,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,gBAAgB,CAAE,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;iBAChE;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1C,mEAAmE;YACnE,oEAAoE;YACpE,8CAA8C;YAC9C,iEAAiE;YACjE,iEAAiE;YACjE,oDAAoD;YACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAC;YACrF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9F,iEAAiE;YACjE,qEAAqE;YACrE,gEAAgE;YAChE,oEAAoE;YACpE,MAAM,WAAW,GAAG,+BAA+B,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;YAC/F,MAAM,OAAO,GAAG,SAAS;gBACvB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,GAAG,WAAW,qHAAqH;oBACnI,wHAAwH;oBACxH,mCAAmC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACjF,IAAI,CAAC,SAAS;gBAAE,MAAM,OAAO,CAAC;YAC9B,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnD,yBAAyB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAErD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAC3E,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,UAAsB,EACtB,OAA6B,EAC7B,QAAmC;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAO,CAAC;IAC/B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC5B,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnD,yBAAyB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACrD,wEAAwE;IACxE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;AAC1F,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,QAAmC;IAC7D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAiB,CAAC;gBAAE,SAAS;YACtD,MAAM,KAAK,GAAG,CAAiB,CAAC;YAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAAC,UAAsB,EAAE,aAA0C;IACnG,MAAM,SAAS,GAAyF,EAAE,CAAC;IAC3G,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS;YACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACtF,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ;oBACR,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,CACF,aAAa,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,QAAQ,oBAAoB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACvF,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC,CAC9E,CAAC;IACF,MAAM,IAAI,YAAY,CACpB,+EAA+E;QAC7E,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC/C,wEAAwE;QACxE,yCAAyC,EAC3C,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAClB,uBAAuB,SAAS,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,+BAAgB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,eAAe,CAAC,GAAG,CAAC,CAAiB,CAAC;YAAE,OAAO,CAAiB,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CACjC,IAAoB,EACpB,OAA6B,EAC7B,GAAwB;IAExB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,gEAAgE;QAChE,8DAA8D;QAC9D,8DAA8D;QAC9D,+DAA+D;QAC/D,iEAAiE;QACjE,iEAAiE;QACjE,+BAA+B;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,YAAY,CACpB,SAAS,IAAI,CAAC,EAAE,oBAAoB,IAAI,CAAC,KAAK,iCAAiC;gBAC7E,sCAAsC,MAAM,CAAC,UAAU,GAAG;gBAC1D,IAAI,MAAM,CAAC,GAAG,mDAAmD;gBACjE,oCAAoC,EACtC,IAAI,CAAC,IAAI,EACT,UAAU,IAAI,CAAC,KAAK,oBAAoB,CACzC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC,CAAC,CAAE,CAAC;QACnD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,+DAA+D;YAC/D,mEAAmE;YACnE,kCAAkC;YAClC,MAAM,IAAI,YAAY,CACpB,mBAAmB,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,IAAI,qBAAqB;gBACjE,IAAI,QAAQ,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B;gBAC/E,6DAA6D,EAC/D,IAAI,CAAC,IAAI,EACT,WAAW,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnC,CAAC;QACJ,CAAC;QACD,8DAA8D;QAC9D,IAAI,OAAO,CAAC,aAAa;YAAE,OAAO,OAAO,CAAC,aAAa,CAAC;QACxD,mEAAmE;QACnE,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,UAAU,GACd,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,0BAA0B,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACpG,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,YAAY,CACpB,wCAAwC,QAAQ,qBAAqB;YACnE,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,wBAAwB;YACxD,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uCAAuC,IAAI,UAAU,GAAG;YAClG,8BAA8B,QAAQ,0CAA0C,EAClF,IAAI,CAAC,IAAI,EACT,YAAY,QAAQ,YAAY,CACjC,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,uDAAuD;IACvD,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC,aAAa,CAAC;IACxD,MAAM,IAAI,YAAY,CACpB,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,+BAA+B;QAClE,wEAAwE;QACxE,2DAA2D,EAC7D,IAAI,CAAC,IAAI,EACT,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
|
|
@@ -937,13 +937,19 @@ const NON_TERMINAL_MEDIA_BUY_STATUSES = new Set([
|
|
|
937
937
|
* Resource families the inverse rule does NOT yet grade — the buy-side
|
|
938
938
|
* reference shape for these in `media_buy.packages` isn't stable in the
|
|
939
939
|
* cached schema, so we can't reliably tell which buys reference which
|
|
940
|
-
* resources.
|
|
941
|
-
*
|
|
942
|
-
*
|
|
943
|
-
*
|
|
944
|
-
*
|
|
940
|
+
* resources. Listed here so the onEnd summary can emit a runtime
|
|
941
|
+
* "partial inverse coverage" signal when the run actually observed
|
|
942
|
+
* offline resources in one of these families — making the deferral
|
|
943
|
+
* visible to storyboard authors and reviewers rather than burying it in
|
|
944
|
+
* PR prose and JSDoc.
|
|
945
|
+
*
|
|
946
|
+
* `audience` is graded — the buy-side reference lives at
|
|
947
|
+
* `packages[*].targeting_overlay.audience_include[]` and is extracted in
|
|
948
|
+
* `readBuySnapshot`. `catalog_item` and `event_source` are deferred: a
|
|
949
|
+
* buy doesn't reference catalog_items or event_sources by stable id in
|
|
950
|
+
* the cached schema, so the runner can't traverse buy → resource.
|
|
945
951
|
*/
|
|
946
|
-
const INVERSE_DEFERRED_FAMILIES = new Set(['
|
|
952
|
+
const INVERSE_DEFERRED_FAMILIES = new Set(['catalog_item', 'event_source']);
|
|
947
953
|
const IMPAIRMENT_STATE_KEY = 'impairmentCoherence';
|
|
948
954
|
function getImpairmentState(ctx) {
|
|
949
955
|
// onStart populates the namespaced slot; the cast is safe because no other
|
|
@@ -996,20 +1002,18 @@ registerOnce('impairment.coherence', {
|
|
|
996
1002
|
state.offlineObservationsByFamily.set(ob.resource_type, (state.offlineObservationsByFamily.get(ob.resource_type) ?? 0) + 1);
|
|
997
1003
|
// Issue #1806: surface deferred inverse-rule coverage at the
|
|
998
1004
|
// transition step. When a resource family the runner can't yet
|
|
999
|
-
// reverse-traverse (`
|
|
1000
|
-
//
|
|
1005
|
+
// reverse-traverse (`catalog_item` / `event_source`) enters an
|
|
1006
|
+
// offline state for the first time in this run, emit a
|
|
1001
1007
|
// `not_applicable` step-level result so reviewers see the gap in
|
|
1002
1008
|
// run output instead of having to read PR prose. One emission per
|
|
1003
1009
|
// (resource_type, resource_id) per run — re-syncs of an already
|
|
1004
|
-
// offline resource don't re-fire.
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
ob.resource_type === 'event_source')) {
|
|
1010
|
+
// offline resource don't re-fire. Only catalog_item and event_source
|
|
1011
|
+
// surface here; audience is graded via the inverse rule using refs
|
|
1012
|
+
// from packages[*].targeting_overlay.audience_include[].
|
|
1013
|
+
if (!wasOffline && (ob.resource_type === 'catalog_item' || ob.resource_type === 'event_source')) {
|
|
1009
1014
|
const message = `inverse-rule coverage for ${ob.resource_type} ${ob.resource_id} ` +
|
|
1010
1015
|
`(status="${ob.status}", step "${stepResult.step_id}") is deferred — ` +
|
|
1011
|
-
`buy → resource traversal not yet implemented for this family
|
|
1012
|
-
`Tracked in adcontextprotocol/adcp#2860.`;
|
|
1016
|
+
`buy → resource traversal not yet implemented for this family.`;
|
|
1013
1017
|
deferredCoverageResults.push({
|
|
1014
1018
|
passed: true,
|
|
1015
1019
|
status: 'not_applicable',
|
|
@@ -1111,46 +1115,52 @@ registerOnce('impairment.coherence', {
|
|
|
1111
1115
|
},
|
|
1112
1116
|
});
|
|
1113
1117
|
}
|
|
1114
|
-
// Inverse check
|
|
1115
|
-
//
|
|
1116
|
-
//
|
|
1117
|
-
//
|
|
1118
|
-
//
|
|
1119
|
-
//
|
|
1120
|
-
//
|
|
1121
|
-
//
|
|
1118
|
+
// Inverse check. For each resource the buy references — creatives
|
|
1119
|
+
// via `packages[].creative_assignments[].creative_id`, audiences via
|
|
1120
|
+
// `packages[].targeting_overlay.audience_include[]` — if the runner
|
|
1121
|
+
// has it in the offline set AND the buy is non-terminal AND the
|
|
1122
|
+
// impairments[] list doesn't mention it, the seller failed to
|
|
1123
|
+
// propagate the resource state into the buy. `catalog_item` and
|
|
1124
|
+
// `event_source` inverse coverage is still deferred: their buy-side
|
|
1125
|
+
// reference shape isn't yet stable enough in the cached schema to
|
|
1126
|
+
// extract without ambiguity.
|
|
1122
1127
|
if (isTerminal)
|
|
1123
1128
|
continue;
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
message,
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1129
|
+
for (const [resourceType, referencedIds] of [
|
|
1130
|
+
['creative', snap.referencedCreativeIds],
|
|
1131
|
+
['audience', snap.referencedAudienceIds],
|
|
1132
|
+
]) {
|
|
1133
|
+
const impairedIds = new Set(snap.impairments.filter(e => e.resource_type === resourceType).map(e => e.resource_id));
|
|
1134
|
+
for (const resourceId of referencedIds) {
|
|
1135
|
+
const key = `${resourceType}:${resourceId}`;
|
|
1136
|
+
const offline = state.offlineResources.get(key);
|
|
1137
|
+
if (!offline)
|
|
1138
|
+
continue;
|
|
1139
|
+
if (impairedIds.has(resourceId))
|
|
1140
|
+
continue;
|
|
1141
|
+
const message = `media_buy ${snap.media_buy_id} (status="${snap.status ?? 'unknown'}") references ${resourceType} ` +
|
|
1142
|
+
`${resourceId} which is offline (status="${offline.status}", step "${offline.stepId}"), ` +
|
|
1143
|
+
`but impairments[] does not list it. Spec: any offline resource referenced by a ` +
|
|
1144
|
+
`non-terminal buy MUST appear in impairments[] (adcp#2859).`;
|
|
1145
|
+
results.push({
|
|
1146
|
+
passed: false,
|
|
1147
|
+
description,
|
|
1148
|
+
step_id: stepResult.step_id,
|
|
1149
|
+
error: message,
|
|
1150
|
+
hint: {
|
|
1151
|
+
kind: 'impairment_coherence_violation',
|
|
1152
|
+
violation: 'inverse',
|
|
1153
|
+
message,
|
|
1154
|
+
media_buy_id: snap.media_buy_id,
|
|
1155
|
+
buy_step_id: snap.stepId,
|
|
1156
|
+
resource_type: resourceType,
|
|
1157
|
+
resource_id: resourceId,
|
|
1158
|
+
resource_status: offline.status,
|
|
1159
|
+
resource_step_id: offline.stepId,
|
|
1160
|
+
impairments_count: snap.impairments.length,
|
|
1161
|
+
},
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1154
1164
|
}
|
|
1155
1165
|
}
|
|
1156
1166
|
if (results.length === 0) {
|
|
@@ -1191,8 +1201,8 @@ registerOnce('impairment.coherence', {
|
|
|
1191
1201
|
results.push({
|
|
1192
1202
|
passed: true,
|
|
1193
1203
|
description: 'inverse coverage gap: offline resources observed for families the runner does not yet grade ' +
|
|
1194
|
-
'on the inverse rule (creative
|
|
1195
|
-
`Observed: ${summary}
|
|
1204
|
+
'on the inverse rule (creative and audience are graded; catalog_item and event_source are forward-only). ' +
|
|
1205
|
+
`Observed: ${summary}.`,
|
|
1196
1206
|
observation_count: 0,
|
|
1197
1207
|
});
|
|
1198
1208
|
}
|
|
@@ -1272,9 +1282,15 @@ function extractImpairmentObservations(task, body) {
|
|
|
1272
1282
|
* Extract every media-buy snapshot present on a step response. Walks
|
|
1273
1283
|
* `create_media_buy` / `update_media_buy` (top-level buy object) and
|
|
1274
1284
|
* `get_media_buys` (`media_buys[]` array). Returns each snapshot's
|
|
1275
|
-
* impairments[], health, status,
|
|
1276
|
-
* references through `packages[].creative_assignments[]
|
|
1277
|
-
*
|
|
1285
|
+
* impairments[], health, status, the set of `creative_id`s the buy
|
|
1286
|
+
* references through `packages[].creative_assignments[]`, and the set of
|
|
1287
|
+
* `audience_id`s referenced through `packages[].targeting_overlay.audience_include[]`.
|
|
1288
|
+
* Both reference sets feed the inverse rule. `audience_exclude` is not
|
|
1289
|
+
* collected as a hard dependency for the inverse rule: an offline exclude
|
|
1290
|
+
* does not prevent the buy from serving, so it isn't a "buy can't function"
|
|
1291
|
+
* signal. Note this is a serviceability framing, not a safety framing —
|
|
1292
|
+
* an offline exclude can still silently break the suppression promise,
|
|
1293
|
+
* which is a separate (forward-looking) signal class.
|
|
1278
1294
|
*/
|
|
1279
1295
|
function extractBuySnapshots(task, body, stepId) {
|
|
1280
1296
|
const out = [];
|
|
@@ -1311,9 +1327,18 @@ function readBuySnapshot(record, stepId) {
|
|
|
1311
1327
|
impairments.push({ resource_type, resource_id });
|
|
1312
1328
|
}
|
|
1313
1329
|
const referencedCreativeIds = new Set();
|
|
1330
|
+
const referencedAudienceIds = new Set();
|
|
1314
1331
|
for (const pkg of asArray(record.packages)) {
|
|
1315
1332
|
if (!isObject(pkg))
|
|
1316
1333
|
continue;
|
|
1334
|
+
// Creative refs appear in two shapes on the wire:
|
|
1335
|
+
// - `core/package.json` → `creative_assignments[].creative_id` (used on
|
|
1336
|
+
// create_media_buy request/response, update_media_buy)
|
|
1337
|
+
// - `get-media-buys-response.json` → `creative_approvals[].creative_id`
|
|
1338
|
+
// (the snapshot shape — `creative_approvals` carries per-assignment
|
|
1339
|
+
// approval_status alongside the id)
|
|
1340
|
+
// Walk both — sellers conformant to either schema surface the references
|
|
1341
|
+
// we need for the inverse rule.
|
|
1317
1342
|
for (const ca of asArray(pkg.creative_assignments)) {
|
|
1318
1343
|
if (!isObject(ca))
|
|
1319
1344
|
continue;
|
|
@@ -1321,7 +1346,34 @@ function readBuySnapshot(record, stepId) {
|
|
|
1321
1346
|
if (cid)
|
|
1322
1347
|
referencedCreativeIds.add(cid);
|
|
1323
1348
|
}
|
|
1349
|
+
for (const ca of asArray(pkg.creative_approvals)) {
|
|
1350
|
+
if (!isObject(ca))
|
|
1351
|
+
continue;
|
|
1352
|
+
const cid = asString(ca.creative_id);
|
|
1353
|
+
if (cid)
|
|
1354
|
+
referencedCreativeIds.add(cid);
|
|
1355
|
+
}
|
|
1356
|
+
// Audience refs: only `audience_include` counts as a hard dependency
|
|
1357
|
+
// for the inverse rule. `audience_exclude` is omitted on serviceability
|
|
1358
|
+
// grounds — a suspended exclude doesn't keep the buy from serving — not
|
|
1359
|
+
// on safety grounds. An offline exclude can still silently break the
|
|
1360
|
+
// suppression promise; that's a separate signal class (see extractBuySnapshots).
|
|
1361
|
+
const overlay = isObject(pkg.targeting_overlay) ? pkg.targeting_overlay : undefined;
|
|
1362
|
+
if (overlay) {
|
|
1363
|
+
for (const aid of asArray(overlay.audience_include)) {
|
|
1364
|
+
if (typeof aid === 'string' && aid.length > 0)
|
|
1365
|
+
referencedAudienceIds.add(aid);
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1324
1368
|
}
|
|
1325
|
-
return {
|
|
1369
|
+
return {
|
|
1370
|
+
media_buy_id,
|
|
1371
|
+
status,
|
|
1372
|
+
health,
|
|
1373
|
+
impairments,
|
|
1374
|
+
referencedCreativeIds,
|
|
1375
|
+
referencedAudienceIds,
|
|
1376
|
+
stepId,
|
|
1377
|
+
};
|
|
1326
1378
|
}
|
|
1327
1379
|
//# sourceMappingURL=default-invariants.js.map
|