@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.
- package/README.md +33 -16
- package/dist/cli.d.ts +27 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +269 -23
- package/dist/domain-error-conformance/cases/amend-unknown-session.json +9 -0
- package/dist/domain-error-conformance/cases/consume-unknown-session.json +9 -0
- package/dist/domain-error-conformance/cases/emit-unknown-session.json +9 -0
- package/dist/domain-error-conformance/cases/get-session-unknown-session.json +6 -0
- package/dist/domain-error-conformance/cases/render-unknown-handshake.json +6 -0
- package/dist/domain-error-conformance/cases/update-unknown-session.json +9 -0
- package/dist/domain-error-conformance/index.d.ts +97 -0
- package/dist/domain-error-conformance/index.d.ts.map +1 -0
- package/dist/domain-error-conformance/index.js +97 -0
- package/dist/fixtures/index.d.ts +8 -6
- package/dist/fixtures/index.d.ts.map +1 -1
- package/dist/fixtures/index.js +9 -7
- package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/absent-appid-defaults.json +1 -1
- package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/app-mismatch.json +1 -1
- package/dist/fixtures/subscribe-app-scope/index.d.ts +6 -0
- package/dist/fixtures/subscribe-app-scope/index.d.ts.map +1 -0
- package/dist/fixtures/{subscribe-tenancy → subscribe-app-scope}/index.js +5 -5
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/json-equal.d.ts +6 -0
- package/dist/json-equal.d.ts.map +1 -0
- package/dist/json-equal.js +23 -0
- package/dist/refusal-envelope-conformance/cases/refuse-after-fix-caller.json +3 -3
- package/dist/refusal-envelope-conformance/cases/refuse-non-render-surface.json +4 -4
- package/dist/refusal-envelope-conformance/index.d.ts.map +1 -1
- package/dist/refusal-envelope-conformance/index.js +1 -20
- package/dist/run-conformance.d.ts +22 -3
- package/dist/run-conformance.d.ts.map +1 -1
- package/dist/run-conformance.js +86 -9
- package/dist/theme-binding-conformance/cases/app-theme-v1-base.json +18 -0
- package/dist/theme-binding-conformance/cases/app-theme-v1-one-palette.json +11 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-accepted.json +18 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-keyframes-accepted.json +16 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-keyframes-not-keyframes.json +15 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-label-too-long.json +17 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-missing-dark.json +13 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-no-hash.json +15 -0
- package/dist/theme-binding-conformance/cases/app-theme-v2-platform-pin.json +17 -0
- package/dist/theme-binding-conformance/cases/overlay-hash-canonical.json +17 -0
- package/dist/theme-binding-conformance/cases/theme-mode-absence.json +10 -0
- package/dist/theme-binding-conformance/cases/theme-mode-default-when-silent-host.json +10 -0
- package/dist/theme-binding-conformance/cases/theme-mode-order.json +10 -0
- package/dist/theme-binding-conformance/index.d.ts +59 -0
- package/dist/theme-binding-conformance/index.d.ts.map +1 -0
- package/dist/theme-binding-conformance/index.js +110 -0
- package/dist/transport-refusal-conformance/cases/refuse-deprovisioned-endpoint.json +27 -0
- package/dist/transport-refusal-conformance/cases/refuse-render-only-code.json +12 -0
- package/dist/transport-refusal-conformance/index.d.ts +56 -0
- package/dist/transport-refusal-conformance/index.d.ts.map +1 -0
- package/dist/transport-refusal-conformance/index.js +52 -0
- package/dist/types.d.ts +1 -1
- package/package.json +18 -3
- package/dist/fixtures/subscribe-tenancy/index.d.ts +0 -6
- 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
|
+
}
|
package/dist/fixtures/index.d.ts
CHANGED
|
@@ -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`)
|
|
42
|
-
* refusal registry must satisfy (`../registry-completeness`)
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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 {
|
|
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-
|
|
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
|
|
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"}
|
package/dist/fixtures/index.js
CHANGED
|
@@ -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`)
|
|
42
|
-
* refusal registry must satisfy (`../registry-completeness`)
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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 {
|
|
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 {
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
2
|
+
* `subscribe-app-scope` fixture sub-module.
|
|
3
3
|
*
|
|
4
|
-
* Exercises the subscribe-time
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,YAAY,EAEV,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,UAAU,EAEV,QAAQ,EACR,qBAAqB,EAErB,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,gBAAgB,EAEhB,YAAY,EAEZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,eAAe,EAEf,aAAa,EACb,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAMpB,YAAY,EACV,eAAe,EAEf,SAAS,IAAI,aAAa,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,iBAAiB,EAEjB,YAAY,IAAI,gBAAgB,GACjC,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,EAChC,8BAA8B,EAC9B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,YAAY,EAEV,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,UAAU,EAEV,QAAQ,EACR,qBAAqB,EAErB,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,gBAAgB,EAEhB,YAAY,EAEZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,eAAe,EAEf,aAAa,EACb,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAMpB,YAAY,EACV,eAAe,EAEf,SAAS,IAAI,aAAa,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,iBAAiB,EAEjB,YAAY,IAAI,gBAAgB,GACjC,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,EAChC,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,2BAA2B,EAC3B,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAM3C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,gCAAgC,CAAC;AAOxC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,yCAAyC,CAAC;AACjD,YAAY,EACV,yBAAyB,EACzB,sBAAsB,EACtB,8BAA8B,EAC9B,gCAAgC,EAChC,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AAMjD,OAAO,EACL,wBAAwB,EACxB,kCAAkC,GACnC,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC;AAO1C,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,yBAAyB,EACzB,+BAA+B,EAC/B,iCAAiC,EACjC,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,4BAA4B,EAC5B,kBAAkB,EAClB,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,GAClC,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EAInB,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gCAAgC,EAChC,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,sCAAsC,CAAC"}
|
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,
|
|
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 @@
|
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
6
|
-
"message": "
|
|
7
|
-
"fix": "
|
|
8
|
-
"retry": "
|
|
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":"
|
|
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
|
|
53
|
-
*
|
|
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":"
|
|
1
|
+
{"version":3,"file":"run-conformance.d.ts","sourceRoot":"","sources":["../src/run-conformance.ts"],"names":[],"mappings":"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"}
|