@clowder-ai/plugin-contract 0.1.0-beta.6 → 0.1.0-beta.8

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 (45) hide show
  1. package/dist/conformance/fixtures.d.ts +9 -0
  2. package/dist/conformance/fixtures.d.ts.map +1 -0
  3. package/dist/conformance/fixtures.js +8 -0
  4. package/dist/conformance/fixtures.js.map +1 -0
  5. package/dist/conformance/index.d.ts +2 -0
  6. package/dist/conformance/index.d.ts.map +1 -1
  7. package/dist/conformance/index.js +1 -0
  8. package/dist/conformance/index.js.map +1 -1
  9. package/dist/validation/index.d.ts +1 -0
  10. package/dist/validation/index.d.ts.map +1 -1
  11. package/dist/validation/index.js +1 -0
  12. package/dist/validation/index.js.map +1 -1
  13. package/dist/validation/manifest.d.ts +23 -0
  14. package/dist/validation/manifest.d.ts.map +1 -0
  15. package/dist/validation/manifest.js +33 -0
  16. package/dist/validation/manifest.js.map +1 -0
  17. package/dist/wire/disposition-fixtures.d.ts +9 -2
  18. package/dist/wire/disposition-fixtures.d.ts.map +1 -1
  19. package/dist/wire/disposition-fixtures.js +450 -3
  20. package/dist/wire/disposition-fixtures.js.map +1 -1
  21. package/dist/wire/disposition.d.ts +10 -8
  22. package/dist/wire/disposition.d.ts.map +1 -1
  23. package/dist/wire/disposition.js +20 -8
  24. package/dist/wire/disposition.js.map +1 -1
  25. package/dist/wire/handshake-byte-bounds.d.ts +69 -0
  26. package/dist/wire/handshake-byte-bounds.d.ts.map +1 -0
  27. package/dist/wire/handshake-byte-bounds.js +173 -0
  28. package/dist/wire/handshake-byte-bounds.js.map +1 -0
  29. package/dist/wire/handshake.d.ts +53 -7
  30. package/dist/wire/handshake.d.ts.map +1 -1
  31. package/dist/wire/handshake.js +129 -10
  32. package/dist/wire/handshake.js.map +1 -1
  33. package/dist/wire/index.d.ts +8 -4
  34. package/dist/wire/index.d.ts.map +1 -1
  35. package/dist/wire/index.js +6 -2
  36. package/dist/wire/index.js.map +1 -1
  37. package/dist/wire/registry.d.ts +170 -6
  38. package/dist/wire/registry.d.ts.map +1 -1
  39. package/dist/wire/registry.js +13 -11
  40. package/dist/wire/registry.js.map +1 -1
  41. package/dist/wire/row-shapes.d.ts +11 -11
  42. package/dist/wire/row-shapes.d.ts.map +1 -1
  43. package/dist/wire/row-shapes.js +2 -2
  44. package/dist/wire/row-shapes.js.map +1 -1
  45. package/package.json +5 -3
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Pre-dispatch disposition table -- T-A through T-L.
3
- * Mechanized verbatim from #1165 R35/R39/R44.
2
+ * Pre-dispatch disposition table -- T-A through T-M.
3
+ * T-A through T-L are mechanized from #1165 R35/R39/R44; beta.8 adds T-M
4
+ * because a ready request row now has a legal input shape.
4
5
  *
5
6
  * Every raw-frame/profile/request rejection class has exactly one
6
7
  * deterministic transport disposition. The table is frozen: adding
@@ -14,7 +15,7 @@
14
15
  * Derived subsets (exported):
15
16
  * - CLOSE_CLASSES: close with no response (T-A, T-C, T-E, T-H, T-I, T-K).
16
17
  * - RESPOND_CLASSES: respond with an error (T-B, T-D, T-F, T-G).
17
- * - ACCEPT_CLASSES: accept and process (T-J, T-L).
18
+ * - ACCEPT_CLASSES: accept and process (T-J, T-L, T-M).
18
19
  *
19
20
  * These subsets are used in byte-proof exclusion: close/accept classes
20
21
  * are excluded from error byte proofs because they never emit an error
@@ -24,19 +25,19 @@
24
25
  // Disposition class enum
25
26
  // ---------------------------------------------------------------------------
26
27
  /**
27
- * The 12 pre-dispatch disposition classes, T-A through T-L.
28
- * Mechanized from #1165 R35.
28
+ * The 13 pre-dispatch disposition classes, T-A through T-M.
29
+ * Adding a class requires a reviewed contract revision.
29
30
  */
30
31
  export const DISPOSITION_CLASSES = [
31
32
  'T-A', 'T-B', 'T-C', 'T-D', 'T-E', 'T-F',
32
- 'T-G', 'T-H', 'T-I', 'T-J', 'T-K', 'T-L',
33
+ 'T-G', 'T-H', 'T-I', 'T-J', 'T-K', 'T-L', 'T-M',
33
34
  ];
34
35
  // ---------------------------------------------------------------------------
35
36
  // The frozen table (R35/R39/R44)
36
37
  // ---------------------------------------------------------------------------
37
38
  /**
38
39
  * The complete pre-dispatch disposition table.
39
- * Every row is mechanized from #1165 R35/R39/R44 -- no interpretation.
40
+ * T-A through T-L are frozen #1165 rows; T-M is beta.8's ready-row closure.
40
41
  *
41
42
  * | # | Rejection class | Disposition |
42
43
  * |-----|--------------------------------------------------------|-----------------------------------|
@@ -52,6 +53,7 @@ export const DISPOSITION_CLASSES = [
52
53
  * | T-J | legal Notification (row 10) | accept, dispatch, no response |
53
54
  * | T-K | valid Notification, v0 violation | close, no response, zero dispatch |
54
55
  * | T-L | valid correlated response | accept, settle, no response |
56
+ * | T-M | legal Request on a ready row | accept, dispatch, no response |
55
57
  */
56
58
  export const DISPOSITION_TABLE = {
57
59
  'T-A': {
@@ -174,6 +176,16 @@ export const DISPOSITION_TABLE = {
174
176
  predicate: 'valid correlated response matching an in-flight request',
175
177
  canonicalExample: '{"jsonrpc":"2.0","id":"req-1","result":{"nonce":"x"}}',
176
178
  },
179
+ 'T-M': {
180
+ class: 'T-M',
181
+ outcome: 'accept',
182
+ emitsResponse: false,
183
+ dispatches: true,
184
+ description: 'legal Request on a ready row',
185
+ errorCodes: [],
186
+ predicate: 'profile-valid Request with a closed valid input for a registry row marked ready=true',
187
+ canonicalExample: '{"jsonrpc":"2.0","id":"hello-1","method":"broker.hello","params":{"meta":{"deadlineUnixMs":1},"input":{"pluginId":"example.loopback","packageDigest":"sha512-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","contractVersion":"0.1.0-beta.8","wireVersion":"0.1.0"}}}',
188
+ },
177
189
  };
178
190
  // ---------------------------------------------------------------------------
179
191
  // Derived subsets for byte-proof exclusion
@@ -200,6 +212,6 @@ export const RESPOND_CLASSES = [
200
212
  * Mechanized from #1165 R35.
201
213
  */
202
214
  export const ACCEPT_CLASSES = [
203
- 'T-J', 'T-L',
215
+ 'T-J', 'T-L', 'T-M',
204
216
  ];
205
217
  //# sourceMappingURL=disposition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"disposition.js","sourceRoot":"","sources":["../../src/wire/disposition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"disposition.js","sourceRoot":"","sources":["../../src/wire/disposition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Derived compact-JSON byte bounds for the beta.8 handshake rows.
3
+ *
4
+ * This production module owns only the published summary metadata. The
5
+ * generic byte-proof kernel remains test-only; keeping it out of the packed
6
+ * artifact prevents consumers from accidentally treating a proof generator
7
+ * as a runtime protocol dependency. The test-only templates independently
8
+ * recompute these values from the same closed grammar.
9
+ */
10
+ /** Encoding families used for raw UTF-8 boundary evidence. */
11
+ export declare const HANDSHAKE_BYTE_PROOF_ENCODING_FAMILIES: readonly ["ascii", "multibyte", "escaping"];
12
+ export type HandshakeByteProofEncodingFamily = (typeof HANDSHAKE_BYTE_PROOF_ENCODING_FAMILIES)[number];
13
+ /** One rejected N+1 candidate measured alongside a maximum frame. */
14
+ export interface HandshakeNPlusOneByteProof {
15
+ readonly leaf: string;
16
+ readonly encodedBytes: number;
17
+ readonly fitsFrame: boolean;
18
+ }
19
+ /** Raw UTF-8 measurement for one encoding family. */
20
+ export interface HandshakeEncodedByteProofCase {
21
+ readonly family: HandshakeByteProofEncodingFamily;
22
+ readonly encodedBytes: number;
23
+ readonly fitsFrame: boolean;
24
+ readonly nPlusOne: readonly HandshakeNPlusOneByteProof[];
25
+ }
26
+ /** Published max plus the raw-family proof cases from which it is derived. */
27
+ export interface HandshakeEncodedByteProof {
28
+ readonly maxEncodedBytes: number;
29
+ readonly cases: readonly HandshakeEncodedByteProofCase[];
30
+ }
31
+ /** Per-row frame maxima consumed by the public method registry. */
32
+ export interface HandshakeRowEncodedByteBounds {
33
+ readonly maxEncodedRequestBytes: number;
34
+ readonly maxEncodedResultBytes: number;
35
+ readonly maxEncodedErrorBytes: number;
36
+ }
37
+ /** Raw proof of the largest legal broker.hello request. */
38
+ export declare const BROKER_HELLO_REQUEST_BYTE_PROOF: HandshakeEncodedByteProof;
39
+ /** Raw proof of the largest legal broker.hello success result. */
40
+ export declare const BROKER_HELLO_RESULT_BYTE_PROOF: HandshakeEncodedByteProof;
41
+ /** Raw proof of the largest legal broker.ready request. */
42
+ export declare const BROKER_READY_REQUEST_BYTE_PROOF: HandshakeEncodedByteProof;
43
+ /** Raw proof of the largest handshake rejection envelope. */
44
+ export declare const HANDSHAKE_REJECTED_ERROR_BYTE_PROOF: HandshakeEncodedByteProof;
45
+ /** broker.ready succeeds with the exact JSON-RPC result `null`. */
46
+ export declare const BROKER_READY_MAX_ENCODED_RESULT_BYTES: number;
47
+ export declare const BROKER_HELLO_MAX_ENCODED_REQUEST_BYTES: number;
48
+ export declare const BROKER_HELLO_MAX_ENCODED_RESULT_BYTES: number;
49
+ export declare const BROKER_HELLO_MAX_ENCODED_ERROR_BYTES: number;
50
+ export declare const BROKER_READY_MAX_ENCODED_REQUEST_BYTES: number;
51
+ export declare const BROKER_READY_MAX_ENCODED_ERROR_BYTES: number;
52
+ /**
53
+ * The exact per-row summary consumed by the registry. No byte value is
54
+ * hand-entered in the registry; all maxima are derived above from the closed
55
+ * grammar and raw UTF-8 serialization.
56
+ */
57
+ export declare const HANDSHAKE_ROW_ENCODED_BYTE_BOUNDS: {
58
+ readonly 'broker.hello': {
59
+ readonly maxEncodedRequestBytes: number;
60
+ readonly maxEncodedResultBytes: number;
61
+ readonly maxEncodedErrorBytes: number;
62
+ };
63
+ readonly 'broker.ready': {
64
+ readonly maxEncodedRequestBytes: number;
65
+ readonly maxEncodedResultBytes: number;
66
+ readonly maxEncodedErrorBytes: number;
67
+ };
68
+ };
69
+ //# sourceMappingURL=handshake-byte-bounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake-byte-bounds.d.ts","sourceRoot":"","sources":["../../src/wire/handshake-byte-bounds.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,8DAA8D;AAC9D,eAAO,MAAM,sCAAsC,6CAIzC,CAAC;AAEX,MAAM,MAAM,gCAAgC,GAC1C,CAAC,OAAO,sCAAsC,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,qDAAqD;AACrD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC1D;AAED,8EAA8E;AAC9E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC1D;AAED,mEAAmE;AACnE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AA6KD,2DAA2D;AAC3D,eAAO,MAAM,+BAA+B,2BAG3C,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,8BAA8B,2BAG1C,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,+BAA+B,2BAG3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,mCAAmC,2BAG/C,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,qCAAqC,QAGjD,CAAC;AAEF,eAAO,MAAM,sCAAsC,QACF,CAAC;AAClD,eAAO,MAAM,qCAAqC,QACF,CAAC;AACjD,eAAO,MAAM,oCAAoC,QACI,CAAC;AACtD,eAAO,MAAM,sCAAsC,QACF,CAAC;AAClD,eAAO,MAAM,oCAAoC,QACI,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;CAW6C,CAAC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Derived compact-JSON byte bounds for the beta.8 handshake rows.
3
+ *
4
+ * This production module owns only the published summary metadata. The
5
+ * generic byte-proof kernel remains test-only; keeping it out of the packed
6
+ * artifact prevents consumers from accidentally treating a proof generator
7
+ * as a runtime protocol dependency. The test-only templates independently
8
+ * recompute these values from the same closed grammar.
9
+ */
10
+ import { MAX_FRAME_BYTES } from './constants.js';
11
+ import { HANDSHAKE_REJECTED_CODE, HANDSHAKE_REJECTED_MESSAGE, HANDSHAKE_REJECT_REASONS, } from './errors.js';
12
+ import { BINDING_NONCE_MAX_LENGTH, HANDSHAKE_VERSION_MAX_LENGTH, HOST_IDENTIFIER_MAX_LENGTH, PACKAGE_DIGEST_LENGTH, PLUGIN_ID_MAX_LENGTH, } from './handshake.js';
13
+ import { VALID_CAPABILITIES } from './grants.js';
14
+ import { REQUEST_ID_MAX_LENGTH } from './request-id.js';
15
+ import { WIRE_UINT53_MAX } from './wire-uint53.js';
16
+ /** Encoding families used for raw UTF-8 boundary evidence. */
17
+ export const HANDSHAKE_BYTE_PROOF_ENCODING_FAMILIES = [
18
+ 'ascii',
19
+ 'multibyte',
20
+ 'escaping',
21
+ ];
22
+ const FAMILY_CODE_POINT = {
23
+ ascii: 'a',
24
+ multibyte: '😀',
25
+ escaping: '\u0000',
26
+ };
27
+ const MAX_REQUEST_ID = 'a'.repeat(REQUEST_ID_MAX_LENGTH);
28
+ const MAX_PACKAGE_DIGEST = `sha512-${'A'.repeat(PACKAGE_DIGEST_LENGTH - 9)}==`;
29
+ const MAX_EFFECTIVE_GRANTS = [...VALID_CAPABILITIES];
30
+ const MAX_HANDSHAKE_REJECT_REASON = HANDSHAKE_REJECT_REASONS.reduce((longest, value) => (value.length > longest.length ? value : longest));
31
+ function valueFor(family, leaf, nPlusOneLeaf) {
32
+ const codePoint = leaf.asciiOnly ? FAMILY_CODE_POINT.ascii : FAMILY_CODE_POINT[family];
33
+ return codePoint.repeat(leaf.maxCodePoints + Number(leaf.id === nPlusOneLeaf));
34
+ }
35
+ function semverFor(nPlusOneLeaf, leaf) {
36
+ return `0.0.0-${'a'.repeat(HANDSHAKE_VERSION_MAX_LENGTH - 6 + Number(nPlusOneLeaf === leaf))}`;
37
+ }
38
+ function measureProof(leaves, frameFor) {
39
+ const cases = HANDSHAKE_BYTE_PROOF_ENCODING_FAMILIES.map((family) => {
40
+ const encodedBytes = Buffer.byteLength(JSON.stringify(frameFor(family)), 'utf8');
41
+ return {
42
+ family,
43
+ encodedBytes,
44
+ fitsFrame: encodedBytes <= MAX_FRAME_BYTES,
45
+ nPlusOne: leaves.map((leaf) => {
46
+ const nPlusOneBytes = Buffer.byteLength(JSON.stringify(frameFor(family, leaf.id)), 'utf8');
47
+ return {
48
+ leaf: leaf.id,
49
+ encodedBytes: nPlusOneBytes,
50
+ fitsFrame: nPlusOneBytes <= MAX_FRAME_BYTES,
51
+ };
52
+ }),
53
+ };
54
+ });
55
+ return {
56
+ maxEncodedBytes: Math.max(...cases.map(({ encodedBytes }) => encodedBytes)),
57
+ cases,
58
+ };
59
+ }
60
+ const HELLO_REQUEST_LEAVES = [
61
+ { id: 'requestId', maxCodePoints: REQUEST_ID_MAX_LENGTH, asciiOnly: true },
62
+ { id: 'pluginId', maxCodePoints: PLUGIN_ID_MAX_LENGTH },
63
+ { id: 'contractVersion', maxCodePoints: HANDSHAKE_VERSION_MAX_LENGTH, asciiOnly: true },
64
+ { id: 'wireVersion', maxCodePoints: HANDSHAKE_VERSION_MAX_LENGTH, asciiOnly: true },
65
+ ];
66
+ const HELLO_RESULT_LEAVES = [
67
+ { id: 'requestId', maxCodePoints: REQUEST_ID_MAX_LENGTH, asciiOnly: true },
68
+ { id: 'pluginId', maxCodePoints: PLUGIN_ID_MAX_LENGTH },
69
+ { id: 'contractVersion', maxCodePoints: HANDSHAKE_VERSION_MAX_LENGTH, asciiOnly: true },
70
+ { id: 'wireVersion', maxCodePoints: HANDSHAKE_VERSION_MAX_LENGTH, asciiOnly: true },
71
+ { id: 'pluginInstanceId', maxCodePoints: HOST_IDENTIFIER_MAX_LENGTH },
72
+ { id: 'brokerSessionId', maxCodePoints: HOST_IDENTIFIER_MAX_LENGTH },
73
+ { id: 'bindingNonce', maxCodePoints: BINDING_NONCE_MAX_LENGTH },
74
+ ];
75
+ const READY_REQUEST_LEAVES = [
76
+ { id: 'requestId', maxCodePoints: REQUEST_ID_MAX_LENGTH, asciiOnly: true },
77
+ { id: 'bindingNonce', maxCodePoints: BINDING_NONCE_MAX_LENGTH },
78
+ ];
79
+ const HANDSHAKE_ERROR_LEAVES = [
80
+ { id: 'requestId', maxCodePoints: REQUEST_ID_MAX_LENGTH, asciiOnly: true },
81
+ ];
82
+ function helloRequestFrame(family, nPlusOneLeaf) {
83
+ const leaf = (entry) => valueFor(family, entry, nPlusOneLeaf);
84
+ return {
85
+ jsonrpc: '2.0',
86
+ id: leaf(HELLO_REQUEST_LEAVES[0]),
87
+ method: 'broker.hello',
88
+ params: {
89
+ meta: { deadlineUnixMs: WIRE_UINT53_MAX },
90
+ input: {
91
+ pluginId: leaf(HELLO_REQUEST_LEAVES[1]),
92
+ packageDigest: MAX_PACKAGE_DIGEST,
93
+ contractVersion: semverFor(nPlusOneLeaf, 'contractVersion'),
94
+ wireVersion: semverFor(nPlusOneLeaf, 'wireVersion'),
95
+ },
96
+ },
97
+ };
98
+ }
99
+ function helloResultFrame(family, nPlusOneLeaf) {
100
+ const leaf = (entry) => valueFor(family, entry, nPlusOneLeaf);
101
+ return {
102
+ jsonrpc: '2.0',
103
+ id: leaf(HELLO_RESULT_LEAVES[0]),
104
+ result: {
105
+ pluginId: leaf(HELLO_RESULT_LEAVES[1]),
106
+ packageDigest: MAX_PACKAGE_DIGEST,
107
+ contractVersion: semverFor(nPlusOneLeaf, 'contractVersion'),
108
+ wireVersion: semverFor(nPlusOneLeaf, 'wireVersion'),
109
+ pluginInstanceId: leaf(HELLO_RESULT_LEAVES[4]),
110
+ brokerSessionId: leaf(HELLO_RESULT_LEAVES[5]),
111
+ grantRevision: WIRE_UINT53_MAX,
112
+ effectiveGrants: MAX_EFFECTIVE_GRANTS,
113
+ bindingNonce: leaf(HELLO_RESULT_LEAVES[6]),
114
+ },
115
+ };
116
+ }
117
+ function readyRequestFrame(family, nPlusOneLeaf) {
118
+ const leaf = (entry) => valueFor(family, entry, nPlusOneLeaf);
119
+ return {
120
+ jsonrpc: '2.0',
121
+ id: leaf(READY_REQUEST_LEAVES[0]),
122
+ method: 'broker.ready',
123
+ params: {
124
+ meta: { deadlineUnixMs: WIRE_UINT53_MAX },
125
+ input: { bindingNonce: leaf(READY_REQUEST_LEAVES[1]) },
126
+ },
127
+ };
128
+ }
129
+ function handshakeRejectedFrame(family, nPlusOneLeaf) {
130
+ const requestId = valueFor(family, HANDSHAKE_ERROR_LEAVES[0], nPlusOneLeaf);
131
+ return {
132
+ jsonrpc: '2.0',
133
+ id: requestId,
134
+ error: {
135
+ code: HANDSHAKE_REJECTED_CODE,
136
+ message: HANDSHAKE_REJECTED_MESSAGE,
137
+ data: { reason: MAX_HANDSHAKE_REJECT_REASON },
138
+ },
139
+ };
140
+ }
141
+ /** Raw proof of the largest legal broker.hello request. */
142
+ export const BROKER_HELLO_REQUEST_BYTE_PROOF = measureProof(HELLO_REQUEST_LEAVES, helloRequestFrame);
143
+ /** Raw proof of the largest legal broker.hello success result. */
144
+ export const BROKER_HELLO_RESULT_BYTE_PROOF = measureProof(HELLO_RESULT_LEAVES, helloResultFrame);
145
+ /** Raw proof of the largest legal broker.ready request. */
146
+ export const BROKER_READY_REQUEST_BYTE_PROOF = measureProof(READY_REQUEST_LEAVES, readyRequestFrame);
147
+ /** Raw proof of the largest handshake rejection envelope. */
148
+ export const HANDSHAKE_REJECTED_ERROR_BYTE_PROOF = measureProof(HANDSHAKE_ERROR_LEAVES, handshakeRejectedFrame);
149
+ /** broker.ready succeeds with the exact JSON-RPC result `null`. */
150
+ export const BROKER_READY_MAX_ENCODED_RESULT_BYTES = Buffer.byteLength(JSON.stringify({ jsonrpc: '2.0', id: MAX_REQUEST_ID, result: null }), 'utf8');
151
+ export const BROKER_HELLO_MAX_ENCODED_REQUEST_BYTES = BROKER_HELLO_REQUEST_BYTE_PROOF.maxEncodedBytes;
152
+ export const BROKER_HELLO_MAX_ENCODED_RESULT_BYTES = BROKER_HELLO_RESULT_BYTE_PROOF.maxEncodedBytes;
153
+ export const BROKER_HELLO_MAX_ENCODED_ERROR_BYTES = HANDSHAKE_REJECTED_ERROR_BYTE_PROOF.maxEncodedBytes;
154
+ export const BROKER_READY_MAX_ENCODED_REQUEST_BYTES = BROKER_READY_REQUEST_BYTE_PROOF.maxEncodedBytes;
155
+ export const BROKER_READY_MAX_ENCODED_ERROR_BYTES = HANDSHAKE_REJECTED_ERROR_BYTE_PROOF.maxEncodedBytes;
156
+ /**
157
+ * The exact per-row summary consumed by the registry. No byte value is
158
+ * hand-entered in the registry; all maxima are derived above from the closed
159
+ * grammar and raw UTF-8 serialization.
160
+ */
161
+ export const HANDSHAKE_ROW_ENCODED_BYTE_BOUNDS = {
162
+ 'broker.hello': {
163
+ maxEncodedRequestBytes: BROKER_HELLO_MAX_ENCODED_REQUEST_BYTES,
164
+ maxEncodedResultBytes: BROKER_HELLO_MAX_ENCODED_RESULT_BYTES,
165
+ maxEncodedErrorBytes: BROKER_HELLO_MAX_ENCODED_ERROR_BYTES,
166
+ },
167
+ 'broker.ready': {
168
+ maxEncodedRequestBytes: BROKER_READY_MAX_ENCODED_REQUEST_BYTES,
169
+ maxEncodedResultBytes: BROKER_READY_MAX_ENCODED_RESULT_BYTES,
170
+ maxEncodedErrorBytes: BROKER_READY_MAX_ENCODED_ERROR_BYTES,
171
+ },
172
+ };
173
+ //# sourceMappingURL=handshake-byte-bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake-byte-bounds.js","sourceRoot":"","sources":["../../src/wire/handshake-byte-bounds.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,24 @@ export declare const PACKAGE_DIGEST_PATTERN: RegExp;
23
23
  * 95 chars (all ASCII) + 2 surrounding quotes = 97 bytes.
24
24
  */
25
25
  export declare const PACKAGE_DIGEST_ENCODED_BYTES: 97;
26
+ /** H1 wire pluginId minimum length in Unicode code points. */
27
+ export declare const PLUGIN_ID_MIN_LENGTH: 1;
28
+ /** H1 wire pluginId maximum length in Unicode code points. */
29
+ export declare const PLUGIN_ID_MAX_LENGTH: 256;
30
+ /** Worst compact-JSON encoded bytes for H1 pluginId. */
31
+ export declare const PLUGIN_ID_MAX_ENCODED_BYTES: 1538;
32
+ /** Shared H3/H4 SemVer maximum length (the grammar is ASCII-only). */
33
+ export declare const HANDSHAKE_VERSION_MAX_LENGTH: 256;
34
+ /** Worst compact-JSON encoded bytes for H3/H4 version strings. */
35
+ export declare const HANDSHAKE_VERSION_MAX_ENCODED_BYTES: 258;
36
+ /** Exact SemVer 2.0.0 grammar copied from manifest.schema.json $defs.SemVer. */
37
+ export declare const HANDSHAKE_SEMVER_PATTERN: RegExp;
38
+ /** H5/H6 opaque Host-minted identifier minimum length in code points. */
39
+ export declare const HOST_IDENTIFIER_MIN_LENGTH: 1;
40
+ /** H5/H6 opaque Host-minted identifier maximum length in code points. */
41
+ export declare const HOST_IDENTIFIER_MAX_LENGTH: 512;
42
+ /** Worst compact-JSON encoded bytes for either opaque Host identifier. */
43
+ export declare const HOST_IDENTIFIER_MAX_ENCODED_BYTES: 3074;
26
44
  /** Minimum code-point length for bindingNonce. */
27
45
  export declare const BINDING_NONCE_MIN_LENGTH: 1;
28
46
  /** Maximum code-point length for bindingNonce. */
@@ -40,13 +58,13 @@ export declare const BINDING_NONCE_MAX_ENCODED_BYTES: 3074;
40
58
  * Additional identity/instance/grant/session fields are REJECTED.
41
59
  */
42
60
  export interface CandidateHello {
43
- /** RESERVED (H1) — manifest pluginId, no maximum bound declared. */
61
+ /** CLOSED (H1) — manifest pluginId, 1..256 Unicode code points. */
44
62
  readonly pluginId: string;
45
63
  /** CLOSED (H2) — exactly 95 chars, sha512 SRI digest. */
46
64
  readonly packageDigest: string;
47
- /** RESERVED (H3) — SemVer contract version, no maximum bound declared. */
65
+ /** CLOSED (H3) — SemVer contract version, at most 256 ASCII characters. */
48
66
  readonly contractVersion: string;
49
- /** RESERVED (H4) — wire protocol version, not yet owner-declared. */
67
+ /** CLOSED (H4) — SemVer wire protocol version, at most 256 ASCII characters. */
50
68
  readonly wireVersion: string;
51
69
  }
52
70
  /**
@@ -63,9 +81,9 @@ export interface SessionBinding {
63
81
  readonly contractVersion: string;
64
82
  /** Echoed from CandidateHello. */
65
83
  readonly wireVersion: string;
66
- /** RESERVED (H5) — Host-minted instance id, grammar pending. */
84
+ /** CLOSED (H5) — Host-minted instance id, 1..512 Unicode code points. */
67
85
  readonly pluginInstanceId: string;
68
- /** RESERVED (H6) — Host-minted session id, grammar pending. */
86
+ /** CLOSED (H6) — Host-minted session id, 1..512 Unicode code points. */
69
87
  readonly brokerSessionId: string;
70
88
  /** CLOSED (H7) — WireUInt53(0, 9_007_199_254_740_991), monotonically increasing. */
71
89
  readonly grantRevision: number;
@@ -88,7 +106,17 @@ export interface BrokerReadyParams {
88
106
  * Validate a string as a conformant sha512 SRI package digest.
89
107
  * Checks exact length (95) and pattern match.
90
108
  */
91
- export declare function validatePackageDigest(value: string): boolean;
109
+ export declare function validatePackageDigest(value: unknown): value is string;
110
+ /** Validate H1's bounded wire representation without narrowing manifest syntax. */
111
+ export declare function validatePluginId(value: unknown): value is string;
112
+ /** Validate H3 contractVersion. Ranges and non-SemVer values are rejected. */
113
+ export declare function validateContractVersion(value: unknown): value is string;
114
+ /** Validate H4 wireVersion. Compatibility negotiation is Host policy, not syntax. */
115
+ export declare function validateWireVersion(value: unknown): value is string;
116
+ /** Validate H5 pluginInstanceId as an opaque Host-minted bounded value. */
117
+ export declare function validatePluginInstanceId(value: unknown): value is string;
118
+ /** Validate H6 brokerSessionId as an opaque Host-minted bounded value. */
119
+ export declare function validateBrokerSessionId(value: unknown): value is string;
92
120
  /**
93
121
  * Validate a string as a conformant binding nonce.
94
122
  * Checks code-point count is within [1, 512].
@@ -96,5 +124,23 @@ export declare function validatePackageDigest(value: string): boolean;
96
124
  * Note: uses spread to count code points (not .length, which counts
97
125
  * UTF-16 code units and misreports surrogate pairs).
98
126
  */
99
- export declare function validateBindingNonce(value: string): boolean;
127
+ export declare function validateBindingNonce(value: unknown): value is string;
128
+ /**
129
+ * Detect caller-supplied fields that belong exclusively to the Host's
130
+ * SessionBinding authority. These are a closed handshake rejection rather
131
+ * than an ordinary grammar error.
132
+ */
133
+ export declare function hasHandshakeAuthorityInjection(value: unknown): boolean;
134
+ /**
135
+ * Validate the closed plugin-to-Host CandidateHello object. It deliberately
136
+ * validates only grammar: the Host decides whether the candidate is allowed.
137
+ */
138
+ export declare function validateCandidateHello(value: unknown): value is CandidateHello;
139
+ /**
140
+ * Validate the closed Host-to-plugin SessionBinding object. Candidate echo
141
+ * equality and nonce-use state are peer protocol checks, not schema grammar.
142
+ */
143
+ export declare function validateSessionBinding(value: unknown): value is SessionBinding;
144
+ /** Validate the closed activation-only broker.ready input object. */
145
+ export declare function validateBrokerReadyParams(value: unknown): value is BrokerReadyParams;
100
146
  //# sourceMappingURL=handshake.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../src/wire/handshake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMrE,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAG,EAAW,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAuC,CAAC;AAE3E;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,EAAW,CAAC;AAMxD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAC;AAEnD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAG,GAAY,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAG,IAAa,CAAC;AAM7D;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;IAChD,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAMD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ3D"}
1
+ {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../src/wire/handshake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAQrE,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAG,EAAW,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAuC,CAAC;AAE3E;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,EAAW,CAAC;AAMxD,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAE/C,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,EAAG,GAAY,CAAC;AAEjD,wDAAwD;AACxD,eAAO,MAAM,2BAA2B,EAAG,IAAa,CAAC;AAEzD,sEAAsE;AACtE,eAAO,MAAM,4BAA4B,EAAG,GAAY,CAAC;AAEzD,kEAAkE;AAClE,eAAO,MAAM,mCAAmC,EAAG,GAAY,CAAC;AAEhE,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,QAA6L,CAAC;AAEnO,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAC;AAErD,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,EAAG,GAAY,CAAC;AAEvD,0EAA0E;AAC1E,eAAO,MAAM,iCAAiC,EAAG,IAAa,CAAC;AAM/D,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAC;AAEnD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAG,GAAY,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAG,IAAa,CAAC;AAM7D;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;IAChD,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAMD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAGrE;AAUD,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAYD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEvE;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEnE;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExE;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEvE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE;AA4BD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtE;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAS9E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAiB9E;AAED,qEAAqE;AACrE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAMpF"}
@@ -10,6 +10,8 @@
10
10
  * CandidateHello and BrokerReadyParams REJECT any additional
11
11
  * identity/instance/grant/session fields (closed surface).
12
12
  */
13
+ import { validateEffectiveGrants } from './grants.js';
14
+ import { isWireUInt53 } from './wire-uint53.js';
13
15
  // ---------------------------------------------------------------------------
14
16
  // Package digest constants (CLOSED — H2)
15
17
  // ---------------------------------------------------------------------------
@@ -26,6 +28,27 @@ export const PACKAGE_DIGEST_PATTERN = /^sha512-[A-Za-z0-9+/]{85}[AQgw]==$/;
26
28
  */
27
29
  export const PACKAGE_DIGEST_ENCODED_BYTES = 97;
28
30
  // ---------------------------------------------------------------------------
31
+ // H1/H3/H4/H5/H6 closure bounds
32
+ // ---------------------------------------------------------------------------
33
+ /** H1 wire pluginId minimum length in Unicode code points. */
34
+ export const PLUGIN_ID_MIN_LENGTH = 1;
35
+ /** H1 wire pluginId maximum length in Unicode code points. */
36
+ export const PLUGIN_ID_MAX_LENGTH = 256;
37
+ /** Worst compact-JSON encoded bytes for H1 pluginId. */
38
+ export const PLUGIN_ID_MAX_ENCODED_BYTES = 1538;
39
+ /** Shared H3/H4 SemVer maximum length (the grammar is ASCII-only). */
40
+ export const HANDSHAKE_VERSION_MAX_LENGTH = 256;
41
+ /** Worst compact-JSON encoded bytes for H3/H4 version strings. */
42
+ export const HANDSHAKE_VERSION_MAX_ENCODED_BYTES = 258;
43
+ /** Exact SemVer 2.0.0 grammar copied from manifest.schema.json $defs.SemVer. */
44
+ export const HANDSHAKE_SEMVER_PATTERN = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/;
45
+ /** H5/H6 opaque Host-minted identifier minimum length in code points. */
46
+ export const HOST_IDENTIFIER_MIN_LENGTH = 1;
47
+ /** H5/H6 opaque Host-minted identifier maximum length in code points. */
48
+ export const HOST_IDENTIFIER_MAX_LENGTH = 512;
49
+ /** Worst compact-JSON encoded bytes for either opaque Host identifier. */
50
+ export const HOST_IDENTIFIER_MAX_ENCODED_BYTES = 3074;
51
+ // ---------------------------------------------------------------------------
29
52
  // Binding nonce bounds (CLOSED — H9)
30
53
  // ---------------------------------------------------------------------------
31
54
  /** Minimum code-point length for bindingNonce. */
@@ -45,10 +68,46 @@ export const BINDING_NONCE_MAX_ENCODED_BYTES = 3074;
45
68
  * Checks exact length (95) and pattern match.
46
69
  */
47
70
  export function validatePackageDigest(value) {
48
- if (value.length !== PACKAGE_DIGEST_LENGTH)
71
+ if (typeof value !== 'string' || value.length !== PACKAGE_DIGEST_LENGTH)
49
72
  return false;
50
73
  return PACKAGE_DIGEST_PATTERN.test(value);
51
74
  }
75
+ /** Test a string's code-point length using the established H9 convention. */
76
+ function hasCodePointLength(value, min, max) {
77
+ if (typeof value !== 'string' || value.length === 0)
78
+ return false;
79
+ if (value.length <= max)
80
+ return value.length >= min;
81
+ const codePointCount = [...value].length;
82
+ return codePointCount >= min && codePointCount <= max;
83
+ }
84
+ /** Validate H1's bounded wire representation without narrowing manifest syntax. */
85
+ export function validatePluginId(value) {
86
+ return hasCodePointLength(value, PLUGIN_ID_MIN_LENGTH, PLUGIN_ID_MAX_LENGTH);
87
+ }
88
+ /** Validate an exact, bounded SemVer candidate used by H3 and H4. */
89
+ function validateHandshakeVersion(value) {
90
+ return (typeof value === 'string' &&
91
+ value.length >= 1 &&
92
+ value.length <= HANDSHAKE_VERSION_MAX_LENGTH &&
93
+ HANDSHAKE_SEMVER_PATTERN.test(value));
94
+ }
95
+ /** Validate H3 contractVersion. Ranges and non-SemVer values are rejected. */
96
+ export function validateContractVersion(value) {
97
+ return validateHandshakeVersion(value);
98
+ }
99
+ /** Validate H4 wireVersion. Compatibility negotiation is Host policy, not syntax. */
100
+ export function validateWireVersion(value) {
101
+ return validateHandshakeVersion(value);
102
+ }
103
+ /** Validate H5 pluginInstanceId as an opaque Host-minted bounded value. */
104
+ export function validatePluginInstanceId(value) {
105
+ return hasCodePointLength(value, HOST_IDENTIFIER_MIN_LENGTH, HOST_IDENTIFIER_MAX_LENGTH);
106
+ }
107
+ /** Validate H6 brokerSessionId as an opaque Host-minted bounded value. */
108
+ export function validateBrokerSessionId(value) {
109
+ return hasCodePointLength(value, HOST_IDENTIFIER_MIN_LENGTH, HOST_IDENTIFIER_MAX_LENGTH);
110
+ }
52
111
  /**
53
112
  * Validate a string as a conformant binding nonce.
54
113
  * Checks code-point count is within [1, 512].
@@ -57,14 +116,74 @@ export function validatePackageDigest(value) {
57
116
  * UTF-16 code units and misreports surrogate pairs).
58
117
  */
59
118
  export function validateBindingNonce(value) {
60
- // Fast path: empty string
61
- if (value.length === 0)
62
- return false;
63
- // Fast path: if byte length <= max, code-point count <= max
64
- if (value.length <= BINDING_NONCE_MAX_LENGTH)
65
- return true;
66
- // Slow path: count actual code points for strings with surrogates
67
- const codePointCount = [...value].length;
68
- return codePointCount >= BINDING_NONCE_MIN_LENGTH && codePointCount <= BINDING_NONCE_MAX_LENGTH;
119
+ return hasCodePointLength(value, BINDING_NONCE_MIN_LENGTH, BINDING_NONCE_MAX_LENGTH);
120
+ }
121
+ const CANDIDATE_HELLO_KEYS = new Set([
122
+ 'pluginId', 'packageDigest', 'contractVersion', 'wireVersion',
123
+ ]);
124
+ const SESSION_BINDING_KEYS = new Set([
125
+ 'pluginId', 'packageDigest', 'contractVersion', 'wireVersion',
126
+ 'pluginInstanceId', 'brokerSessionId', 'grantRevision', 'effectiveGrants',
127
+ 'bindingNonce',
128
+ ]);
129
+ const BROKER_READY_PARAMS_KEYS = new Set(['bindingNonce']);
130
+ const HANDSHAKE_AUTHORITY_KEYS = new Set([
131
+ 'pluginInstanceId',
132
+ 'brokerSessionId',
133
+ 'grantRevision',
134
+ 'effectiveGrants',
135
+ ]);
136
+ function isRecord(value) {
137
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
138
+ }
139
+ /**
140
+ * Detect caller-supplied fields that belong exclusively to the Host's
141
+ * SessionBinding authority. These are a closed handshake rejection rather
142
+ * than an ordinary grammar error.
143
+ */
144
+ export function hasHandshakeAuthorityInjection(value) {
145
+ return isRecord(value) && Object.keys(value).some(key => HANDSHAKE_AUTHORITY_KEYS.has(key));
146
+ }
147
+ function hasExactKeys(value, expected) {
148
+ const keys = Object.keys(value);
149
+ return keys.length === expected.size && keys.every(key => expected.has(key));
150
+ }
151
+ /**
152
+ * Validate the closed plugin-to-Host CandidateHello object. It deliberately
153
+ * validates only grammar: the Host decides whether the candidate is allowed.
154
+ */
155
+ export function validateCandidateHello(value) {
156
+ return (isRecord(value) &&
157
+ hasExactKeys(value, CANDIDATE_HELLO_KEYS) &&
158
+ validatePluginId(value.pluginId) &&
159
+ validatePackageDigest(value.packageDigest) &&
160
+ validateContractVersion(value.contractVersion) &&
161
+ validateWireVersion(value.wireVersion));
162
+ }
163
+ /**
164
+ * Validate the closed Host-to-plugin SessionBinding object. Candidate echo
165
+ * equality and nonce-use state are peer protocol checks, not schema grammar.
166
+ */
167
+ export function validateSessionBinding(value) {
168
+ return (isRecord(value) &&
169
+ hasExactKeys(value, SESSION_BINDING_KEYS) &&
170
+ validatePluginId(value.pluginId) &&
171
+ validatePackageDigest(value.packageDigest) &&
172
+ validateContractVersion(value.contractVersion) &&
173
+ validateWireVersion(value.wireVersion) &&
174
+ validatePluginInstanceId(value.pluginInstanceId) &&
175
+ validateBrokerSessionId(value.brokerSessionId) &&
176
+ typeof value.grantRevision === 'number' &&
177
+ isWireUInt53(value.grantRevision) &&
178
+ Array.isArray(value.effectiveGrants) &&
179
+ value.effectiveGrants.every(grant => typeof grant === 'string') &&
180
+ validateEffectiveGrants(value.effectiveGrants) &&
181
+ validateBindingNonce(value.bindingNonce));
182
+ }
183
+ /** Validate the closed activation-only broker.ready input object. */
184
+ export function validateBrokerReadyParams(value) {
185
+ return (isRecord(value) &&
186
+ hasExactKeys(value, BROKER_READY_PARAMS_KEYS) &&
187
+ validateBindingNonce(value.bindingNonce));
69
188
  }
70
189
  //# sourceMappingURL=handshake.js.map