@ggui-ai/protocol-conformance 0.14.0 → 0.16.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.
Files changed (59) hide show
  1. package/README.md +33 -16
  2. package/dist/cli.d.ts +27 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +269 -23
  5. package/dist/domain-error-conformance/cases/amend-unknown-session.json +9 -0
  6. package/dist/domain-error-conformance/cases/consume-unknown-session.json +9 -0
  7. package/dist/domain-error-conformance/cases/emit-unknown-session.json +9 -0
  8. package/dist/domain-error-conformance/cases/get-session-unknown-session.json +6 -0
  9. package/dist/domain-error-conformance/cases/render-unknown-handshake.json +6 -0
  10. package/dist/domain-error-conformance/cases/update-unknown-session.json +9 -0
  11. package/dist/domain-error-conformance/index.d.ts +97 -0
  12. package/dist/domain-error-conformance/index.d.ts.map +1 -0
  13. package/dist/domain-error-conformance/index.js +97 -0
  14. package/dist/fixtures/index.d.ts +8 -6
  15. package/dist/fixtures/index.d.ts.map +1 -1
  16. package/dist/fixtures/index.js +9 -7
  17. package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/absent-appid-defaults.json +1 -1
  18. package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/app-mismatch.json +1 -1
  19. package/dist/fixtures/subscribe-app-scope/index.d.ts +6 -0
  20. package/dist/fixtures/subscribe-app-scope/index.d.ts.map +1 -0
  21. package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/index.js +5 -5
  22. package/dist/index.d.ts +7 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +11 -1
  25. package/dist/json-equal.d.ts +6 -0
  26. package/dist/json-equal.d.ts.map +1 -0
  27. package/dist/json-equal.js +23 -0
  28. package/dist/refusal-envelope-conformance/cases/refuse-after-fix-caller.json +3 -3
  29. package/dist/refusal-envelope-conformance/cases/refuse-non-render-surface.json +4 -4
  30. package/dist/refusal-envelope-conformance/index.d.ts.map +1 -1
  31. package/dist/refusal-envelope-conformance/index.js +1 -20
  32. package/dist/run-conformance.d.ts +22 -3
  33. package/dist/run-conformance.d.ts.map +1 -1
  34. package/dist/run-conformance.js +86 -9
  35. package/dist/theme-binding-conformance/cases/app-theme-v1-base.json +18 -0
  36. package/dist/theme-binding-conformance/cases/app-theme-v1-one-palette.json +11 -0
  37. package/dist/theme-binding-conformance/cases/app-theme-v2-accepted.json +18 -0
  38. package/dist/theme-binding-conformance/cases/app-theme-v2-keyframes-accepted.json +16 -0
  39. package/dist/theme-binding-conformance/cases/app-theme-v2-keyframes-not-keyframes.json +15 -0
  40. package/dist/theme-binding-conformance/cases/app-theme-v2-label-too-long.json +17 -0
  41. package/dist/theme-binding-conformance/cases/app-theme-v2-missing-dark.json +13 -0
  42. package/dist/theme-binding-conformance/cases/app-theme-v2-no-hash.json +15 -0
  43. package/dist/theme-binding-conformance/cases/app-theme-v2-platform-pin.json +17 -0
  44. package/dist/theme-binding-conformance/cases/overlay-hash-canonical.json +17 -0
  45. package/dist/theme-binding-conformance/cases/theme-mode-absence.json +10 -0
  46. package/dist/theme-binding-conformance/cases/theme-mode-default-when-silent-host.json +10 -0
  47. package/dist/theme-binding-conformance/cases/theme-mode-order.json +10 -0
  48. package/dist/theme-binding-conformance/index.d.ts +59 -0
  49. package/dist/theme-binding-conformance/index.d.ts.map +1 -0
  50. package/dist/theme-binding-conformance/index.js +110 -0
  51. package/dist/transport-refusal-conformance/cases/refuse-deprovisioned-endpoint.json +27 -0
  52. package/dist/transport-refusal-conformance/cases/refuse-render-only-code.json +12 -0
  53. package/dist/transport-refusal-conformance/index.d.ts +56 -0
  54. package/dist/transport-refusal-conformance/index.d.ts.map +1 -0
  55. package/dist/transport-refusal-conformance/index.js +52 -0
  56. package/dist/types.d.ts +1 -1
  57. package/package.json +18 -3
  58. package/dist/fixtures/subscribe-tenancy/index.d.ts +0 -6
  59. package/dist/fixtures/subscribe-tenancy/index.d.ts.map +0 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `domain-error` catalog — SPEC §7.9 Plane 2 on the `tools/call` wire
3
+ * (ggui#880). The kit's FIRST `tools/call` driver.
4
+ *
5
+ * A Plane-2 failure (a missing session or handshake, props that do not
6
+ * satisfy the contract, an undeclared channel) is a tool-execution error,
7
+ * so it is a tool RESULT with `isError: true` — never a JSON-RPC error
8
+ * frame — whose `content[0].text` LEADS with the registered slug:
9
+ * `<code>: <detail>`. No `structuredContent`, no `_meta`. A raw MCP agent
10
+ * branches on `text.startsWith(code + ': ')` and on nothing else.
11
+ *
12
+ * Vendor-neutral by construction: the kit imports no server. The adopter
13
+ * supplies a {@link ToolCallDriver} that performs ONE `tools/call` against
14
+ * its deployment and returns the raw result the MCP client received (or
15
+ * `null` when the tool is not bound there — that case is SKIPPED, named).
16
+ * The kit owns the scenarios and every assertion. Each case ships as raw
17
+ * JSON under `./cases/`; the six here need no setup — an id nothing
18
+ * minted is refused the same way on every deployment.
19
+ *
20
+ * The catalog exists for one receipt: before the slug led the text, every
21
+ * first-party server failed every case on `slug-leads`.
22
+ */
23
+ import type { JsonValue } from '@ggui-ai/protocol';
24
+ /** A JSON object — the `arguments` of one `tools/call`. */
25
+ export type ToolCallArgs = {
26
+ readonly [key: string]: JsonValue;
27
+ };
28
+ /** One `tools/call` the adopter's driver performs verbatim. */
29
+ export interface ToolCallScenario {
30
+ readonly tool: string;
31
+ readonly args: ToolCallArgs;
32
+ }
33
+ /** One content block of a tool result, as the MCP client received it. */
34
+ export interface ToolCallContent {
35
+ readonly type: string;
36
+ readonly text?: string;
37
+ }
38
+ /**
39
+ * The raw `tools/call` result as the MCP client received it. Authored here
40
+ * rather than imported from an SDK so the driver is typed against the kit
41
+ * alone; `structuredContent` and `_meta` are read only for presence.
42
+ */
43
+ export interface RawToolCallResult {
44
+ readonly isError?: boolean;
45
+ readonly content: readonly ToolCallContent[];
46
+ readonly structuredContent?: unknown;
47
+ readonly _meta?: unknown;
48
+ }
49
+ /** External-boundary guard for a value an adopter's driver returned. */
50
+ export declare function isRawToolCallResult(value: unknown): value is RawToolCallResult;
51
+ /**
52
+ * Performs one `tools/call` and returns the raw result — or `null` when
53
+ * the deployment does not bind that tool. May be async: a live call is the
54
+ * intended binding.
55
+ */
56
+ export type ToolCallDriver = (scenario: ToolCallScenario) => RawToolCallResult | null | Promise<RawToolCallResult | null>;
57
+ /** One catalog case, authored as JSON under `./cases/`. */
58
+ export interface DomainErrorConformanceCase {
59
+ /** Reported as `domain-error/<name>` by the runner. */
60
+ readonly name: string;
61
+ readonly description: string;
62
+ readonly scenario: ToolCallScenario;
63
+ /** The registered slug that must lead the result text. */
64
+ readonly expect: {
65
+ readonly code: string;
66
+ };
67
+ }
68
+ /** The catalog, in wire order: handshake first, then the session tools. */
69
+ export declare const domainErrorCases: readonly DomainErrorConformanceCase[];
70
+ /** The criterion a case failed on — the first that did not hold. */
71
+ export type DomainErrorCriterion = 'driver-threw' | 'isError' | 'content-text' | 'slug-leads' | 'no-structuredContent' | 'no-meta';
72
+ export interface DomainErrorMismatch {
73
+ readonly name: string;
74
+ readonly criterion: DomainErrorCriterion;
75
+ readonly expected: unknown;
76
+ readonly actual: unknown;
77
+ }
78
+ export interface DomainErrorSkip {
79
+ readonly name: string;
80
+ readonly reason: string;
81
+ }
82
+ export interface DomainErrorConformanceResult {
83
+ readonly passed: readonly string[];
84
+ readonly failed: readonly DomainErrorMismatch[];
85
+ readonly skipped: readonly DomainErrorSkip[];
86
+ }
87
+ /**
88
+ * Drive every case through `driver` and grade the raw results. A driver
89
+ * that throws fails THAT case (`driver-threw`) and the rest are still
90
+ * graded; a driver that returns `null` skips that case with the tool named.
91
+ */
92
+ export interface RunDomainErrorConformanceOptions {
93
+ /** The cases to drive — the whole catalog by default. A live driver is real calls, so a runner selecting rows passes only those. */
94
+ readonly cases?: readonly DomainErrorConformanceCase[];
95
+ }
96
+ export declare function runDomainErrorConformance(driver: ToolCallDriver, options?: RunDomainErrorConformanceOptions): Promise<DomainErrorConformanceResult>;
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain-error-conformance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQnD,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjE,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAY9E;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,QAAQ,EAAE,gBAAgB,KACvB,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;AAElE,2DAA2D;AAC3D,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,0BAA0B,EAOjE,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAC5B,cAAc,GACd,SAAS,GACT,cAAc,GACd,YAAY,GACZ,sBAAsB,GACtB,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAqCD;;;;GAIG;AACH,MAAM,WAAW,gCAAgC;IAC/C,oIAAoI;IACpI,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;CACxD;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,4BAA4B,CAAC,CA6BvC"}
@@ -0,0 +1,97 @@
1
+ import amendUnknownSession from './cases/amend-unknown-session.json' with { type: 'json' };
2
+ import consumeUnknownSession from './cases/consume-unknown-session.json' with { type: 'json' };
3
+ import emitUnknownSession from './cases/emit-unknown-session.json' with { type: 'json' };
4
+ import getSessionUnknownSession from './cases/get-session-unknown-session.json' with { type: 'json' };
5
+ import renderUnknownHandshake from './cases/render-unknown-handshake.json' with { type: 'json' };
6
+ import updateUnknownSession from './cases/update-unknown-session.json' with { type: 'json' };
7
+ /** External-boundary guard for a value an adopter's driver returned. */
8
+ export function isRawToolCallResult(value) {
9
+ if (typeof value !== 'object' || value === null)
10
+ return false;
11
+ const content = Reflect.get(value, 'content');
12
+ if (!Array.isArray(content))
13
+ return false;
14
+ for (const block of content) {
15
+ if (typeof block !== 'object' || block === null)
16
+ return false;
17
+ if (typeof Reflect.get(block, 'type') !== 'string')
18
+ return false;
19
+ const text = Reflect.get(block, 'text');
20
+ if (text !== undefined && typeof text !== 'string')
21
+ return false;
22
+ }
23
+ const isError = Reflect.get(value, 'isError');
24
+ return isError === undefined || typeof isError === 'boolean';
25
+ }
26
+ /** The catalog, in wire order: handshake first, then the session tools. */
27
+ export const domainErrorCases = [
28
+ renderUnknownHandshake,
29
+ consumeUnknownSession,
30
+ getSessionUnknownSession,
31
+ updateUnknownSession,
32
+ amendUnknownSession,
33
+ emitUnknownSession,
34
+ ];
35
+ function errorText(err) {
36
+ return err instanceof Error ? err.message : String(err);
37
+ }
38
+ /** Grade one raw result against a case; `undefined` = every criterion held. */
39
+ function grade(testCase, result) {
40
+ const { name } = testCase;
41
+ if (result.isError !== true) {
42
+ return { name, criterion: 'isError', expected: true, actual: result.isError };
43
+ }
44
+ const first = result.content[0];
45
+ if (first === undefined || first.type !== 'text' || typeof first.text !== 'string') {
46
+ return { name, criterion: 'content-text', expected: 'content[0] of type text', actual: first };
47
+ }
48
+ const lead = `${testCase.expect.code}: `;
49
+ if (!first.text.startsWith(lead)) {
50
+ return { name, criterion: 'slug-leads', expected: `${lead}<detail>`, actual: first.text };
51
+ }
52
+ if (result.structuredContent !== undefined) {
53
+ return {
54
+ name,
55
+ criterion: 'no-structuredContent',
56
+ expected: undefined,
57
+ actual: result.structuredContent,
58
+ };
59
+ }
60
+ if (result._meta !== undefined) {
61
+ return { name, criterion: 'no-meta', expected: undefined, actual: result._meta };
62
+ }
63
+ return undefined;
64
+ }
65
+ export async function runDomainErrorConformance(driver, options = {}) {
66
+ const passed = [];
67
+ const failed = [];
68
+ const skipped = [];
69
+ for (const testCase of options.cases ?? domainErrorCases) {
70
+ let result;
71
+ try {
72
+ result = await driver(testCase.scenario);
73
+ }
74
+ catch (err) {
75
+ failed.push({
76
+ name: testCase.name,
77
+ criterion: 'driver-threw',
78
+ expected: 'a raw tools/call result',
79
+ actual: errorText(err),
80
+ });
81
+ continue;
82
+ }
83
+ if (result === null) {
84
+ skipped.push({
85
+ name: testCase.name,
86
+ reason: `the driver returned null — \`${testCase.scenario.tool}\` is not bound on this deployment`,
87
+ });
88
+ continue;
89
+ }
90
+ const mismatch = grade(testCase, result);
91
+ if (mismatch === undefined)
92
+ passed.push(testCase.name);
93
+ else
94
+ failed.push(mismatch);
95
+ }
96
+ return { passed, failed, skipped };
97
+ }
@@ -38,10 +38,12 @@
38
38
  *
39
39
  * The same is true of SPEC §7.1's PRE-GENERATION refusal obligations
40
40
  * (ggui#786): what a server projects for a refusal
41
- * (`../refusal-envelope-conformance`) and what a deployment's closed
42
- * refusal registry must satisfy (`../registry-completeness`) are a
43
- * projection and a data check. Neither is WebSocket-observable, so
44
- * neither is registered below.
41
+ * (`../refusal-envelope-conformance`), what a deployment's closed
42
+ * refusal registry must satisfy (`../registry-completeness`), and what
43
+ * a per-app endpoint answers for an endpoint-level refusal
44
+ * (`../transport-refusal-conformance`, ggui#825) are two projections
45
+ * and a data check. None is WebSocket-observable, so none is
46
+ * registered below.
45
47
  *
46
48
  * ## An MCP-binding driver EXISTS for `resources/read` — `../resource-read-conformance`
47
49
  *
@@ -106,7 +108,7 @@ export { consumeBufferFixtures } from './consume-buffer/index.js';
106
108
  export { hostContextFixtures } from './host-context/index.js';
107
109
  export { reservedChannelAuthorityFixtures } from './reserved-channel-authority/index.js';
108
110
  export { schemaVersionHandshakeFixtures } from './schema-version-handshake/index.js';
109
- export { subscribeTenancyFixtures } from './subscribe-tenancy/index.js';
111
+ export { subscribeAppScopeFixtures } from './subscribe-app-scope/index.js';
110
112
  import type { TestCase } from '../types.js';
111
113
  /**
112
114
  * Contract slugs — match the sub-module directory names. The
@@ -114,7 +116,7 @@ import type { TestCase } from '../types.js';
114
116
  * Extensibly-closed via `(string & {})` so additive sub-modules
115
117
  * register without an API break.
116
118
  */
117
- export type ContractSlug = 'bootstrap-protocol' | 'consume-buffer' | 'host-context' | 'reserved-channel-authority' | 'schema-version-handshake' | 'subscribe-tenancy' | (string & {});
119
+ export type ContractSlug = 'bootstrap-protocol' | 'consume-buffer' | 'host-context' | 'reserved-channel-authority' | 'schema-version-handshake' | 'subscribe-app-scope' | (string & {});
118
120
  /**
119
121
  * Every fixture the kit ships, grouped by the contract it exercises.
120
122
  * Order within each group matches the sub-module's `export` order.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,gBAAgB,GAChB,cAAc,GACd,4BAA4B,GAC5B,0BAA0B,GAC1B,mBAAmB,GACnB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC,CAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,QAAQ,EAGwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,gBAAgB,GAChB,cAAc,GACd,4BAA4B,GAC5B,0BAA0B,GAC1B,qBAAqB,GACrB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC,CAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,QAAQ,EAGwB,CAAC"}
@@ -38,10 +38,12 @@
38
38
  *
39
39
  * The same is true of SPEC §7.1's PRE-GENERATION refusal obligations
40
40
  * (ggui#786): what a server projects for a refusal
41
- * (`../refusal-envelope-conformance`) and what a deployment's closed
42
- * refusal registry must satisfy (`../registry-completeness`) are a
43
- * projection and a data check. Neither is WebSocket-observable, so
44
- * neither is registered below.
41
+ * (`../refusal-envelope-conformance`), what a deployment's closed
42
+ * refusal registry must satisfy (`../registry-completeness`), and what
43
+ * a per-app endpoint answers for an endpoint-level refusal
44
+ * (`../transport-refusal-conformance`, ggui#825) are two projections
45
+ * and a data check. None is WebSocket-observable, so none is
46
+ * registered below.
45
47
  *
46
48
  * ## An MCP-binding driver EXISTS for `resources/read` — `../resource-read-conformance`
47
49
  *
@@ -106,13 +108,13 @@ export { consumeBufferFixtures } from './consume-buffer/index.js';
106
108
  export { hostContextFixtures } from './host-context/index.js';
107
109
  export { reservedChannelAuthorityFixtures } from './reserved-channel-authority/index.js';
108
110
  export { schemaVersionHandshakeFixtures } from './schema-version-handshake/index.js';
109
- export { subscribeTenancyFixtures } from './subscribe-tenancy/index.js';
111
+ export { subscribeAppScopeFixtures } from './subscribe-app-scope/index.js';
110
112
  import { bootstrapProtocolFixtures } from './bootstrap-protocol/index.js';
111
113
  import { consumeBufferFixtures } from './consume-buffer/index.js';
112
114
  import { hostContextFixtures } from './host-context/index.js';
113
115
  import { reservedChannelAuthorityFixtures } from './reserved-channel-authority/index.js';
114
116
  import { schemaVersionHandshakeFixtures } from './schema-version-handshake/index.js';
115
- import { subscribeTenancyFixtures } from './subscribe-tenancy/index.js';
117
+ import { subscribeAppScopeFixtures } from './subscribe-app-scope/index.js';
116
118
  /**
117
119
  * Every fixture the kit ships, grouped by the contract it exercises.
118
120
  * Order within each group matches the sub-module's `export` order.
@@ -127,7 +129,7 @@ export const fixturesByContract = {
127
129
  'host-context': hostContextFixtures,
128
130
  'reserved-channel-authority': reservedChannelAuthorityFixtures,
129
131
  'schema-version-handshake': schemaVersionHandshakeFixtures,
130
- 'subscribe-tenancy': subscribeTenancyFixtures,
132
+ 'subscribe-app-scope': subscribeAppScopeFixtures,
131
133
  };
132
134
  /**
133
135
  * Every fixture flat, in deterministic lexicographic order by
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "absent-appid-defaults",
3
- "description": "A subscribe that OMITS `appId` resolves the caller's identity-default app and acks. SPEC §12.2's subscribe-payload table makes `appId` optional: absent ⇒ the server resolves it from the connection's authenticated identity (token binding, else identity mapping, else the deployment default) — clients never invent the default. Under the kit's harness the identity-default is the conventional tenant 'conformance', so the provision-on-subscribe path must bind exactly that value to the fresh render row — a real string tenant, never an undefined one (the corrupt-row failure mode this fixture locks out: a silent ack whose provisioned row carries appId undefined, unreachable by any later legal subscribe). The runner-owned subscribe frame IS the probe (`subscribe.omitAppId` drops the runner's conventional appId stamp; the inputEnvelope is descriptive, not dispatched); graded as a session-state read-back of the bound `appId` through the host's readSessionField seam. The §12.2.3 APP_MISMATCH tenancy gate is the sibling `app-mismatch` fixture's claim and still applies to the RESOLVED value.",
3
+ "description": "A subscribe that OMITS `appId` resolves the caller's identity-default app and acks. SPEC §12.2's subscribe-payload table makes `appId` optional: absent ⇒ the server resolves it from the connection's authenticated identity (token binding, else identity mapping, else the deployment default) — clients never invent the default. Under the kit's harness the identity-default is the conventional app 'conformance', so the provision-on-subscribe path must bind exactly that value to the fresh render row — a real string app id, never an undefined one (the corrupt-row failure mode this fixture locks out: a silent ack whose provisioned row carries appId undefined, unreachable by any later legal subscribe). The runner-owned subscribe frame IS the probe (`subscribe.omitAppId` drops the runner's conventional appId stamp; the inputEnvelope is descriptive, not dispatched); graded as a session-state read-back of the bound `appId` through the host's readSessionField seam. The §12.2.3 APP_MISMATCH app-scope gate is the sibling `app-mismatch` fixture's claim and still applies to the RESOLVED value.",
4
4
  "skipReason": null,
5
5
  "setup": [],
6
6
  "subscribe": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "app-mismatch",
3
- "description": "The GguiSession exists but is bound to a DIFFERENT app than the subscriber claims: `create-session` binds appId 'conformance-other', while the kit's runner always subscribes with appId 'conformance'. SPEC §12.2's subscribe-payload table makes the tenancy check a MUST — appId 'MUST match the GguiSession's bound appId or subscribe fails APP_MISMATCH' — and §12.2.3 keeps the code distinct from SESSION_NOT_FOUND (the GguiSession exists; it is reachable only from a different app), so clients route 'fix your appId / API key' differently from 're-handshake'. The runner-owned subscribe frame IS the probe (the inputEnvelope is descriptive, not dispatched); expected: an `error` frame with `payload.code === 'APP_MISMATCH'`.",
3
+ "description": "The GguiSession exists but is bound to a DIFFERENT app than the subscriber claims: `create-session` binds appId 'conformance-other', while the kit's runner always subscribes with appId 'conformance'. SPEC §12.2's subscribe-payload table makes the app-scope check a MUST — appId 'MUST match the GguiSession's bound appId or subscribe fails APP_MISMATCH' — and §12.2.3 keeps the code distinct from SESSION_NOT_FOUND (the GguiSession exists; it is reachable only from a different app), so clients route 'fix your appId / API key' differently from 're-handshake'. The runner-owned subscribe frame IS the probe (the inputEnvelope is descriptive, not dispatched); expected: an `error` frame with `payload.code === 'APP_MISMATCH'`.",
4
4
  "skipReason": null,
5
5
  "setup": [
6
6
  {
@@ -0,0 +1,6 @@
1
+ import type { TestCase } from '../../types.js';
2
+ /** All fixtures asserting subscribe-time app scope (SPEC §12.2 field
3
+ * table — identity-default resolution on absent `appId` — and
4
+ * §12.2.3 `APP_MISMATCH`). */
5
+ export declare const subscribeAppScopeFixtures: readonly TestCase[];
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fixtures/subscribe-app-scope/index.ts"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;+BAE+B;AAC/B,eAAO,MAAM,yBAAyB,EAAE,SAAS,QAAQ,EAGxD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * `subscribe-tenancy` fixture sub-module.
2
+ * `subscribe-app-scope` fixture sub-module.
3
3
  *
4
- * Exercises the subscribe-time tenancy contract (SPEC §12.2 subscribe
4
+ * Exercises the subscribe-time app-scope contract (SPEC §12.2 subscribe
5
5
  * payload table + §12.2.3 channel-3 error codes):
6
6
  *
7
7
  * - `app-mismatch` — the GguiSession exists but is bound to a
@@ -18,7 +18,7 @@
18
18
  * mapping, else the deployment default) and the subscribe acks.
19
19
  * Graded as a session-state read-back of the bound `appId` on the
20
20
  * provisioned render (hosts expose it via `readSessionField`), so
21
- * a server that acks but binds an undefined tenant — the
21
+ * a server that acks but binds an undefined app id — the
22
22
  * corrupt-row failure mode — fails rather than passing on the ack
23
23
  * alone.
24
24
  *
@@ -53,10 +53,10 @@
53
53
  */
54
54
  import absentAppidDefaults from './absent-appid-defaults.json' with { type: 'json' };
55
55
  import appMismatch from './app-mismatch.json' with { type: 'json' };
56
- /** All fixtures asserting subscribe-time tenancy (SPEC §12.2 field
56
+ /** All fixtures asserting subscribe-time app scope (SPEC §12.2 field
57
57
  * table — identity-default resolution on absent `appId` — and
58
58
  * §12.2.3 `APP_MISMATCH`). */
59
- export const subscribeTenancyFixtures = [
59
+ export const subscribeAppScopeFixtures = [
60
60
  absentAppidDefaults,
61
61
  appMismatch,
62
62
  ];
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  */
13
13
  export type { TransportConfig, WebSocketTransportConfig, UnknownTransportConfig, AuthConfig, TestCase, SubscribeFrameShaping, SetupStep, CreateGguiSessionStep, ActionSpecEntryDecl, JsonSchemaDecl, RendererUrlOverrideStep, ServerVersionOverrideStep, UiInitializeResponseOverrideStep, EmitEnvelopeStep, TeardownStep, ExpectedBehavior, ActionAckBehavior, ErrorFrameBehavior, StreamUpdateBehavior, BootstrapFailureBehavior, BootstrapSuccessBehavior, VersionMismatchBehavior, PropsUpdateBehavior, SessionStateBehavior, NoOpBehavior, UnknownBehavior, ProtocolError, BootstrapFailureReason, } from './types.js';
14
14
  export type { ConformanceHost, SetupStep as HostSetupStep, CreateGguiSessionSetup, RendererUrlOverrideSetup, ServerVersionOverrideSetup, UiInitializeResponseOverrideSetup, EmitEnvelopeSetup, TeardownStep as HostTeardownStep, } from './conformance-host.js';
15
- export { allFixtures, fixturesByContract, bootstrapProtocolFixtures, consumeBufferFixtures, hostContextFixtures, reservedChannelAuthorityFixtures, schemaVersionHandshakeFixtures, subscribeTenancyFixtures, } from './fixtures/index.js';
15
+ export { allFixtures, fixturesByContract, bootstrapProtocolFixtures, consumeBufferFixtures, hostContextFixtures, reservedChannelAuthorityFixtures, schemaVersionHandshakeFixtures, subscribeAppScopeFixtures, } from './fixtures/index.js';
16
16
  export type { ContractSlug } from './fixtures/index.js';
17
17
  export { gadgetWireSchemaCases, runSchemaConformance, } from './schema-conformance/index.js';
18
18
  export type { SchemaConformanceCase, SchemaConformanceMismatch, SchemaConformanceResult, } from './schema-conformance/index.js';
@@ -28,6 +28,8 @@ export { refusalEnvelopeCases, runRefusalEnvelopeConformance, } from './refusal-
28
28
  export type { PreGenerationRefusalInput, ProjectedRefusalResult, RefusalEnvelopeConformanceCase, RefusalEnvelopeConformanceResult, RefusalEnvelopeMismatch, } from './refusal-envelope-conformance/index.js';
29
29
  export { registryCompletenessPins, runRegistryCompletenessConformance, } from './registry-completeness/index.js';
30
30
  export type { RefusalRegistryRow, RefusalRegistryView, RegistryCompletenessMismatch, RegistryCompletenessPin, RegistryCompletenessResult, } from './registry-completeness/index.js';
31
+ export { runTransportRefusalConformance, transportRefusalCases, } from './transport-refusal-conformance/index.js';
32
+ export type { ProjectedTransportRefusal, TransportRefusalConformanceCase, TransportRefusalConformanceResult, TransportRefusalInput, TransportRefusalMismatch, } from './transport-refusal-conformance/index.js';
31
33
  export { declaresDeliveryChannel, renderLocatorUri, resourceReadCases, runResourceReadConformance, GGUI_RENDER_RESOURCE_URI, } from './resource-read-conformance/index.js';
32
34
  export type { DurableSubstrateWiring, JsonRpcErrorFrame, PreparedResourceReadScenario, ResourceReadCaller, ResourceReadConformanceCase, ResourceReadConformanceFailure, ResourceReadConformanceResult, ResourceReadConformanceSkip, ResourceReadErrorCodeDecl, ResourceReadExpectation, ResourceReadKey, ResourceReadLocator, ResourceReadOutcome, ResourceReadProbe, ResourceReadRenderMeta, ResourceReadScenario, ResourceReadScenarioDriver, ResourceReadSeed, ResourceReadServerShape, RunResourceReadConformanceOptions, } from './resource-read-conformance/index.js';
33
35
  export { loadFixture, listFixtures, loadAllFixtures } from './loader.js';
@@ -35,4 +37,8 @@ export { runConformance } from './run-conformance.js';
35
37
  export type { RunConformanceConfig, ConformanceResult, ConformanceFailure, SkippedFixture, ConformanceReporter, InputEnvelopeDispatch, HostContextObservedInputEnvelope, } from './run-conformance.js';
36
38
  export { createDefaultReporter, formatScorecard, formatSummary, formatFailures, formatSkips, } from './reporter.js';
37
39
  export type { DefaultReporterOptions } from './reporter.js';
40
+ export { domainErrorCases, isRawToolCallResult, runDomainErrorConformance, } from './domain-error-conformance/index.js';
41
+ export type { DomainErrorConformanceCase, DomainErrorConformanceResult, DomainErrorCriterion, DomainErrorMismatch, DomainErrorSkip, RawToolCallResult, RunDomainErrorConformanceOptions, ToolCallArgs, ToolCallContent, ToolCallDriver, ToolCallScenario, } from './domain-error-conformance/index.js';
42
+ export { APP_THEME_CASES, OVERLAY_HASH_CASES, THEME_MODE_CASES, runThemeBindingConformance, } from './theme-binding-conformance/index.js';
43
+ export type { AppThemeCase, OverlayHashCase, ThemeBindingResult, ThemeModeCase, } from './theme-binding-conformance/index.js';
38
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@
13
13
  // Fixture catalog — every authored conformance case, classified by
14
14
  // contract. Third-party runners + the kit's own `runConformance()`
15
15
  // consume this surface.
16
- export { allFixtures, fixturesByContract, bootstrapProtocolFixtures, consumeBufferFixtures, hostContextFixtures, reservedChannelAuthorityFixtures, schemaVersionHandshakeFixtures, subscribeTenancyFixtures, } from './fixtures/index.js';
16
+ export { allFixtures, fixturesByContract, bootstrapProtocolFixtures, consumeBufferFixtures, hostContextFixtures, reservedChannelAuthorityFixtures, schemaVersionHandshakeFixtures, subscribeAppScopeFixtures, } from './fixtures/index.js';
17
17
  // Pure-function conformance catalogs — SPEC §7.7.2's gadget
18
18
  // obligations are deterministic validation functions, not transport-
19
19
  // observable behaviors. Each catalog grades a caller-supplied function
@@ -52,6 +52,12 @@ export { refusalEnvelopeCases, runRefusalEnvelopeConformance, } from './refusal-
52
52
  // function: `surfaces` non-empty, `code === key`, every `after-fix`
53
53
  // entry naming who acts, and `retry` inside the closed four-value set.
54
54
  export { registryCompletenessPins, runRegistryCompletenessConformance, } from './registry-completeness/index.js';
55
+ // Transport-refusal — the JSON-RPC error a per-app MCP endpoint answers
56
+ // with when it refuses a request for a typed reason (ggui#825): HTTP 403,
57
+ // `-32003` / `App not found` (ggui#836), `data.refusal` carrying the registry
58
+ // projection without the render-only fields; a code whose surfaces
59
+ // exclude `mcp-endpoint` projects to nothing.
60
+ export { runTransportRefusalConformance, transportRefusalCases, } from './transport-refusal-conformance/index.js';
55
61
  // Resource-read conformance — the kit's first MCP-binding driver, and
56
62
  // it binds `resources/read` ONLY (`tools/call` has none). A read of a
57
63
  // render locator has exactly two exits: a result whose contents
@@ -67,3 +73,7 @@ export { runConformance } from './run-conformance.js';
67
73
  // formatters programmatic consumers can reuse when building their
68
74
  // own reporter (CI annotations, vitest integration, etc.).
69
75
  export { createDefaultReporter, formatScorecard, formatSummary, formatFailures, formatSkips, } from './reporter.js';
76
+ // ── domain-error (SPEC §7.9 Plane 2 on the tools/call wire, ggui#880) ──
77
+ export { domainErrorCases, isRawToolCallResult, runDomainErrorConformance, } from './domain-error-conformance/index.js';
78
+ // ── theme binding (ggui#987 — the theming wave's arbiter; guuey 1.3 judges against it) ──
79
+ export { APP_THEME_CASES, OVERLAY_HASH_CASES, THEME_MODE_CASES, runThemeBindingConformance, } from './theme-binding-conformance/index.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Structural equality over plain JSON data — the one comparator every
3
+ * pure-function catalog grades with (key order ignored, arrays ordered).
4
+ */
5
+ export declare function jsonEqual(a: unknown, b: unknown): boolean;
6
+ //# sourceMappingURL=json-equal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-equal.d.ts","sourceRoot":"","sources":["../src/json-equal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAezD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Structural equality over plain JSON data — the one comparator every
3
+ * pure-function catalog grades with (key order ignored, arrays ordered).
4
+ */
5
+ export function jsonEqual(a, b) {
6
+ if (a === b)
7
+ return true;
8
+ if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
9
+ return false;
10
+ }
11
+ if (Array.isArray(a) || Array.isArray(b)) {
12
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
13
+ return false;
14
+ return a.every((item, index) => jsonEqual(item, b[index]));
15
+ }
16
+ const left = a;
17
+ const right = b;
18
+ const leftKeys = Object.keys(left).sort();
19
+ const rightKeys = Object.keys(right).sort();
20
+ if (!jsonEqual(leftKeys, rightKeys))
21
+ return false;
22
+ return leftKeys.every((key) => jsonEqual(left[key], right[key]));
23
+ }
@@ -2,7 +2,7 @@
2
2
  "name": "refuse-after-fix-caller",
3
3
  "description": "An after-fix refusal the CALLER can act on itself: the projector emits an isError result whose text leads with the code, carries outcome 'refused' plus the refusal and nothing else, and exposes no _meta. This is the only fixBy class an agent may retry on its own.",
4
4
  "refusal": {
5
- "code": "model_not_in_tier",
5
+ "code": "model_not_allowed",
6
6
  "message": "the requested model is not among those this app may use",
7
7
  "fix": "pick a model the app is allowed to use and call again with the same handshakeId",
8
8
  "retry": "after-fix",
@@ -10,11 +10,11 @@
10
10
  },
11
11
  "expect": {
12
12
  "isError": true,
13
- "text": "model_not_in_tier: the requested model is not among those this app may use pick a model the app is allowed to use and call again with the same handshakeId",
13
+ "text": "model_not_allowed: the requested model is not among those this app may use pick a model the app is allowed to use and call again with the same handshakeId",
14
14
  "structuredContent": {
15
15
  "outcome": "refused",
16
16
  "refusal": {
17
- "code": "model_not_in_tier",
17
+ "code": "model_not_allowed",
18
18
  "message": "the requested model is not among those this app may use",
19
19
  "fix": "pick a model the app is allowed to use and call again with the same handshakeId",
20
20
  "retry": "after-fix",
@@ -2,10 +2,10 @@
2
2
  "name": "refuse-non-render-surface",
3
3
  "description": "A REGISTERED code whose surfaces exclude the render gate. It has no render envelope at all, so a conformant projector produces nothing for it. Projecting it anyway is the drift the per-surface namespace rule forbids \u2014 this case is what makes that rule observable rather than prose.",
4
4
  "refusal": {
5
- "code": "subscription_exists",
6
- "message": "an active plan already exists on this app",
7
- "fix": "cancel the existing plan first, then call again",
8
- "retry": "after-fix",
5
+ "code": "checkout_unavailable",
6
+ "message": "Top-ups are unavailable right now.",
7
+ "fix": "Try again in a few minutes; if it persists, write to hello@ggui.ai.",
8
+ "retry": "later",
9
9
  "handshake": "intact"
10
10
  },
11
11
  "expect": null
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/refusal-envelope-conformance/index.ts"],"names":[],"mappings":"AA0DA;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;KAC7C,CAAC;IACF,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,8BAA8B;IAC7C,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,8BAA8B,EAOzE,CAAC;AAEF,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAAC;CACzD;AAED,0DAA0D;AAC1D,MAAM,WAAW,gCAAgC;IAC/C,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACrD;AAkCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,CACP,OAAO,EAAE,yBAAyB,KAC/B,sBAAsB,GAAG,IAAI,GACjC,gCAAgC,CAwBlC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/refusal-envelope-conformance/index.ts"],"names":[],"mappings":"AA4DA;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;KAC7C,CAAC;IACF,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,8BAA8B;IAC7C,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,8BAA8B,EAOzE,CAAC;AAEF,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAAC;CACzD;AAED,0DAA0D;AAC1D,MAAM,WAAW,gCAAgC;IAC/C,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACrD;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,CACP,OAAO,EAAE,yBAAyB,KAC/B,sBAAsB,GAAG,IAAI,GACjC,gCAAgC,CAwBlC"}
@@ -55,6 +55,7 @@ import refuseLater from './cases/refuse-later.json' with { type: 'json' };
55
55
  import refuseNever from './cases/refuse-never.json' with { type: 'json' };
56
56
  import refuseNextPeriod from './cases/refuse-next-period.json' with { type: 'json' };
57
57
  import refuseNonRenderSurface from './cases/refuse-non-render-surface.json' with { type: 'json' };
58
+ import { jsonEqual } from '../json-equal.js';
58
59
  /**
59
60
  * Every refusal-envelope case the kit ships, in deterministic order:
60
61
  * the projectable cases by retry class (after-fix, next-period, later,
@@ -68,26 +69,6 @@ export const refusalEnvelopeCases = [
68
69
  refuseNever,
69
70
  refuseNonRenderSurface,
70
71
  ];
71
- /** Structural equality over plain JSON data. */
72
- function jsonEqual(a, b) {
73
- if (a === b)
74
- return true;
75
- if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
76
- return false;
77
- }
78
- if (Array.isArray(a) || Array.isArray(b)) {
79
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
80
- return false;
81
- return a.every((item, index) => jsonEqual(item, b[index]));
82
- }
83
- const left = a;
84
- const right = b;
85
- const leftKeys = Object.keys(left).sort();
86
- const rightKeys = Object.keys(right).sort();
87
- if (!jsonEqual(leftKeys, rightKeys))
88
- return false;
89
- return leftKeys.every((key) => jsonEqual(left[key], right[key]));
90
- }
91
72
  function projectionEqual(a, b) {
92
73
  if (a === null || b === null)
93
74
  return a === b;
@@ -4,6 +4,8 @@ import { type MatchResult } from './match-behavior.js';
4
4
  import type { AuthConfig, SessionStateBehavior, StreamUpdateBehavior, VersionMismatchBehavior } from './types.js';
5
5
  import { type PreGenerationRefusalInput, type ProjectedRefusalResult } from './refusal-envelope-conformance/index.js';
6
6
  import { type RefusalRegistryView } from './registry-completeness/index.js';
7
+ import { type ProjectedTransportRefusal, type TransportRefusalInput } from './transport-refusal-conformance/index.js';
8
+ import { type ToolCallDriver } from './domain-error-conformance/index.js';
7
9
  export interface RunConformanceConfig {
8
10
  /**
9
11
  * URL of the implementation under test. `http://` / `https://`
@@ -47,14 +49,31 @@ export interface RunConformanceConfig {
47
49
  * this run; omitted ⇒ reported SKIPPED, same reasoning as above.
48
50
  */
49
51
  readonly refusalRegistry?: RefusalRegistryView;
52
+ /**
53
+ * The deployment's PER-APP ENDPOINT refusal projector (SPEC §7.1's
54
+ * endpoint-level refusal, ggui#825): given a registry refusal, return
55
+ * the HTTP status + JSON-RPC error object the endpoint answers with, or
56
+ * `null` when the code has no transport envelope. Supplied ⇒ the
57
+ * `transport-refusal` catalog is graded; omitted ⇒ SKIPPED, named.
58
+ */
59
+ readonly transportRefusalProjector?: (refusal: TransportRefusalInput) => ProjectedTransportRefusal | null;
60
+ /**
61
+ * Performs one `tools/call` against the deployment and returns the raw
62
+ * result (or `null` when the tool is not bound). Supplied ⇒ the
63
+ * `domain-error` catalog (SPEC §7.9 Plane 2 on the wire, ggui#880) is
64
+ * graded; omitted ⇒ SKIPPED, named.
65
+ */
66
+ readonly toolCallDriver?: ToolCallDriver;
50
67
  }
51
68
  /**
52
- * Row-name prefixes for the PURE-FUNCTION catalogs the runner folds
53
- * into a run. Prefixed so a catalog row can never collide with a
69
+ * Row-name prefixes for the catalogs the runner folds into a run beside
70
+ * the WebSocket fixtures: three grade an in-process function or a data
71
+ * table; `domain-error` (ggui#880) drives live `tools/call` scenarios
72
+ * through an adopter-supplied driver. Prefixed so a catalog row can never collide with a
54
73
  * WebSocket fixture name, and so the reporter can group them without a
55
74
  * second registry of names.
56
75
  */
57
- export declare const PURE_FUNCTION_CATALOG_SLUGS: readonly ["refusal-envelope", "registry-completeness"];
76
+ export declare const PURE_FUNCTION_CATALOG_SLUGS: readonly ["refusal-envelope", "registry-completeness", "transport-refusal", "domain-error", "theme-binding"];
58
77
  /** One member of {@link PURE_FUNCTION_CATALOG_SLUGS}. */
59
78
  export type PureFunctionCatalogSlug = (typeof PURE_FUNCTION_CATALOG_SLUGS)[number];
60
79
  export interface ConformanceResult {
@@ -1 +1 @@
1
- {"version":3,"file":"run-conformance.d.ts","sourceRoot":"","sources":["../src/run-conformance.ts"],"names":[],"mappings":"AA6DA,OAAO,KAAK,EACV,0BAA0B,EAG3B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EACV,eAAe,EACf,SAAS,IAAI,aAAa,EAE3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,KAAK,EAEV,UAAU,EAEV,oBAAoB,EACpB,oBAAoB,EAEpB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kCAAkC,CAAC;AAM1C,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,sDAAsD;IACtD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAC1B,OAAO,EAAE,yBAAyB,KAC/B,sBAAsB,GAAG,IAAI,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CAChD;AAED;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,wDAG9B,CAAC;AAEX,yDAAyD;AACzD,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,aAAa,CAAC,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClD,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,UAAU,CAAC,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC9C;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CA+C5B;AAwQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWrD;AAoBD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvD;IACE,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;CACrD,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9B;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,GAChB,qBAAqB,CAcvB;AAkOD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,wBAAwB,CAmC1B;AAqED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,aAAa,CA4DhF;AAqHD,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"run-conformance.d.ts","sourceRoot":"","sources":["../src/run-conformance.ts"],"names":[],"mappings":"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"}