sealbridge 0.4.2 → 0.6.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.ja.md +6 -4
- package/README.md +9 -4
- package/dist/cli/dist/accept.d.ts +2 -1
- package/dist/cli/dist/accept.js +18 -7
- package/dist/cli/dist/accept.js.map +1 -1
- package/dist/cli/dist/index.js +46 -13
- package/dist/cli/dist/index.js.map +1 -1
- package/dist/cli/dist/invite-links.d.ts +14 -0
- package/dist/cli/dist/invite-links.js +263 -0
- package/dist/cli/dist/invite-links.js.map +1 -0
- package/dist/cli/dist/invite-output.d.ts +1 -1
- package/dist/cli/dist/invite-output.js +3 -2
- package/dist/cli/dist/invite-output.js.map +1 -1
- package/dist/cli/dist/network.js +16 -23
- package/dist/cli/dist/network.js.map +1 -1
- package/dist/cli/dist/receipt.d.ts +12 -2
- package/dist/cli/dist/receipt.js +6 -5
- package/dist/cli/dist/receipt.js.map +1 -1
- package/dist/cli/dist/sdk.d.ts +6 -4
- package/dist/cli/dist/sdk.js +3 -2
- package/dist/cli/dist/sdk.js.map +1 -1
- package/dist/cli/dist/task-review.d.ts +1 -8
- package/dist/cli/dist/task-review.js +4 -17
- package/dist/cli/dist/task-review.js.map +1 -1
- package/dist/cli/dist/tasks.js +1 -1
- package/dist/cli/dist/tasks.js.map +1 -1
- package/dist/examples/two-owner-demo/dist/run-demo.js +3 -1
- package/dist/examples/two-owner-demo/dist/run-demo.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/packages/core/dist/content-inspection-rules.d.ts +22 -0
- package/dist/packages/core/dist/content-inspection-rules.js +34 -0
- package/dist/packages/core/dist/content-inspection-rules.js.map +1 -0
- package/dist/packages/core/dist/content-inspection.d.ts +43 -0
- package/dist/packages/core/dist/content-inspection.js +192 -0
- package/dist/packages/core/dist/content-inspection.js.map +1 -0
- package/dist/packages/core/dist/context-grant.d.ts +13 -0
- package/dist/packages/core/dist/context-grant.js +65 -0
- package/dist/packages/core/dist/context-grant.js.map +1 -0
- package/dist/packages/core/dist/delegation.d.ts +17 -0
- package/dist/packages/core/dist/delegation.js +126 -0
- package/dist/packages/core/dist/delegation.js.map +1 -0
- package/dist/packages/core/dist/edge.d.ts +2 -0
- package/dist/packages/core/dist/edge.js +2 -0
- package/dist/packages/core/dist/edge.js.map +1 -1
- package/dist/packages/core/dist/index.d.ts +6 -0
- package/dist/packages/core/dist/index.js +6 -0
- package/dist/packages/core/dist/index.js.map +1 -1
- package/dist/packages/core/dist/invite-link.d.ts +72 -0
- package/dist/packages/core/dist/invite-link.js +225 -0
- package/dist/packages/core/dist/invite-link.js.map +1 -0
- package/dist/packages/core/dist/invite-sas.d.ts +7 -0
- package/dist/packages/core/dist/invite-sas.js +15 -0
- package/dist/packages/core/dist/invite-sas.js.map +1 -0
- package/dist/packages/core/dist/relay-auth.d.ts +1 -1
- package/dist/packages/core/dist/relay-auth.js +1 -1
- package/dist/packages/core/dist/relay-auth.js.map +1 -1
- package/dist/packages/core/dist/schema.d.ts +1 -1
- package/dist/packages/core/dist/schema.js +4 -0
- package/dist/packages/core/dist/schema.js.map +1 -1
- package/dist/packages/core/dist/types.d.ts +52 -0
- package/dist/packages/ledger/dist/index.d.ts +70 -2
- package/dist/packages/ledger/dist/index.js +404 -26
- package/dist/packages/ledger/dist/index.js.map +1 -1
- package/dist/packages/relay/dist/fetch.js +4 -0
- package/dist/packages/relay/dist/fetch.js.map +1 -1
- package/dist/packages/relay/dist/invites.d.ts +42 -0
- package/dist/packages/relay/dist/invites.js +347 -0
- package/dist/packages/relay/dist/invites.js.map +1 -0
- package/dist/packages/relay/dist/worker.d.ts +3 -0
- package/dist/packages/relay/dist/worker.js +21 -0
- package/dist/packages/relay/dist/worker.js.map +1 -1
- package/dist/packages/runtime/dist/a2a.js +1 -1
- package/dist/packages/runtime/dist/adapter.d.ts +1 -0
- package/dist/packages/runtime/dist/application-config.js +69 -6
- package/dist/packages/runtime/dist/application-config.js.map +1 -1
- package/dist/packages/runtime/dist/approval-providers.d.ts +4 -0
- package/dist/packages/runtime/dist/approval-providers.js +3 -0
- package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
- package/dist/packages/runtime/dist/connection-persistence.d.ts +1 -1
- package/dist/packages/runtime/dist/context-grant-audit.d.ts +8 -0
- package/dist/packages/runtime/dist/context-grant-audit.js +41 -0
- package/dist/packages/runtime/dist/context-grant-audit.js.map +1 -0
- package/dist/packages/runtime/dist/delegation.d.ts +37 -0
- package/dist/packages/runtime/dist/delegation.js +125 -0
- package/dist/packages/runtime/dist/delegation.js.map +1 -0
- package/dist/packages/runtime/dist/gateway.d.ts +1 -0
- package/dist/packages/runtime/dist/gateway.js.map +1 -1
- package/dist/packages/runtime/dist/held-request-store.d.ts +2 -0
- package/dist/packages/runtime/dist/held-request-store.js +3 -2
- package/dist/packages/runtime/dist/held-request-store.js.map +1 -1
- package/dist/packages/runtime/dist/held-task-content.d.ts +14 -0
- package/dist/packages/runtime/dist/held-task-content.js +33 -0
- package/dist/packages/runtime/dist/held-task-content.js.map +1 -0
- package/dist/packages/runtime/dist/index.d.ts +4 -0
- package/dist/packages/runtime/dist/index.js +4 -0
- package/dist/packages/runtime/dist/index.js.map +1 -1
- package/dist/packages/runtime/dist/mcp-server.js +22 -8
- package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
- package/dist/packages/runtime/dist/mcp-tool-catalog.js +44 -5
- package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
- package/dist/packages/runtime/dist/rule-content-review-child.d.ts +1 -0
- package/dist/packages/runtime/dist/rule-content-review-child.js +25 -0
- package/dist/packages/runtime/dist/rule-content-review-child.js.map +1 -0
- package/dist/packages/runtime/dist/rule-content-review.d.ts +9 -0
- package/dist/packages/runtime/dist/rule-content-review.js +217 -0
- package/dist/packages/runtime/dist/rule-content-review.js.map +1 -0
- package/dist/packages/runtime/dist/session-audit.d.ts +6 -1
- package/dist/packages/runtime/dist/session-audit.js +35 -4
- package/dist/packages/runtime/dist/session-audit.js.map +1 -1
- package/dist/packages/runtime/dist/session.d.ts +21 -1
- package/dist/packages/runtime/dist/session.js +429 -63
- package/dist/packages/runtime/dist/session.js.map +1 -1
- package/dist/packages/runtime/dist/task-journal.d.ts +10 -1
- package/dist/packages/runtime/dist/task-journal.js +26 -1
- package/dist/packages/runtime/dist/task-journal.js.map +1 -1
- package/dist/packages/runtime/dist/verifier.d.ts +5 -2
- package/dist/packages/runtime/dist/verifier.js +14 -4
- package/dist/packages/runtime/dist/verifier.js.map +1 -1
- package/dist/spec/audit-entry.schema.json +25 -1
- package/dist/spec/audit-evidence.schema.json +179 -0
- package/dist/spec/audit-file-record.schema.json +177 -0
- package/dist/spec/audit-interruption.schema.json +110 -0
- package/dist/spec/context-grant-audit-payload.schema.json +24 -0
- package/dist/spec/context-grant.schema.json +146 -0
- package/dist/spec/delegation-attachment.schema.json +167 -0
- package/dist/spec/delegation-link.schema.json +141 -0
- package/dist/spec/examples/context-pooling/approval_redelegation/sample-delegation-attachment.json +413 -0
- package/dist/spec/examples/context-pooling/hand_over/sample-context-grant.json +18 -0
- package/dist/spec/examples/context-pooling/hand_over/sample-task-manifest.0.2.0.json +94 -0
- package/dist/spec/examples/context-pooling/sample-context-grant-audit-payload.json +4 -0
- package/dist/spec/examples/context-pooling/view_only/sample-context-grant.json +18 -0
- package/dist/spec/examples/context-pooling/view_only/sample-task-manifest.0.2.0.json +94 -0
- package/dist/spec/examples/sample-audit-evidence.json +138 -0
- package/dist/spec/examples/sample-audit-file-record.json +31 -0
- package/dist/spec/examples/sample-audit-interruption.json +29 -0
- package/dist/spec/task-manifest.0.2.0.schema.json +87 -1
- package/docs/context-grants.md +221 -0
- package/docs/sdk.ja.md +108 -2
- package/docs/sdk.md +120 -2
- package/package.json +3 -2
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { digest } from './crypto.js';
|
|
3
|
+
import { validateManifest } from './schema.js';
|
|
4
|
+
import { CONTENT_INSPECTION_LIMITS, CONTENT_INSPECTION_RULES, CONTENT_INSPECTION_RULESET_DIGEST, CONTENT_INSPECTION_RULESET_VERSION } from './content-inspection-rules.js';
|
|
5
|
+
const pointer = (segment) => segment.replace(/~/gu, '~0').replace(/\//gu, '~1');
|
|
6
|
+
// Ordinary pointer keys locate content; keys containing potential evidence use a fixed marker.
|
|
7
|
+
function pathSegment(key) {
|
|
8
|
+
const redact = key.length > 80 || /[\p{C}]|[a-z][a-z0-9+.-]*:|api.?key|token|password|secret|\.env|\.ssh|id_rsa|パスワード|トークン|秘密/iu.test(key) ||
|
|
9
|
+
CONTENT_INSPECTION_RULES.some(rule => rule.pattern && new RegExp(rule.pattern, rule.flags).test(key));
|
|
10
|
+
return pointer(redact ? '[redacted]' : key);
|
|
11
|
+
}
|
|
12
|
+
function binaryMagic(bytes) {
|
|
13
|
+
const hex = bytes.subarray(0, 8).toString('hex');
|
|
14
|
+
return ['4d5a', '7f454c46', 'cafebabe', 'cefaedfe', 'cffaedfe', 'feedface', 'feedfacf',
|
|
15
|
+
'504b0304', '504b0506', '504b0708', '1f8b', '377abcaf271c', '526172211a07', '425a68', 'fd377a585a00', '0061736d']
|
|
16
|
+
.some(magic => hex.startsWith(magic)) || bytes.subarray(257, 262).toString('ascii') === 'ustar';
|
|
17
|
+
}
|
|
18
|
+
/** Offline heuristic inspection. Limits are local and may only be lowered. Content is never executed. */
|
|
19
|
+
export async function inspectRuleContent(content, options = {}, signal) {
|
|
20
|
+
const limits = { ...CONTENT_INSPECTION_LIMITS };
|
|
21
|
+
const findings = [];
|
|
22
|
+
let sizeBytes = 0, nodes = 0, decodedBytes = 0;
|
|
23
|
+
let contentDigest = digest(null);
|
|
24
|
+
let failure;
|
|
25
|
+
const stop = (code) => { throw code; };
|
|
26
|
+
const checkAbort = () => { if (signal?.aborted)
|
|
27
|
+
stop('ABORTED'); };
|
|
28
|
+
const addBytes = (bytes) => { sizeBytes += bytes; if (sizeBytes > limits.maxBytes)
|
|
29
|
+
stop('LIMIT_EXCEEDED'); };
|
|
30
|
+
const add = (rule, path, start, end) => {
|
|
31
|
+
if (findings.length >= limits.maxFindings)
|
|
32
|
+
stop('LIMIT_EXCEEDED');
|
|
33
|
+
findings.push({ ruleId: rule.id, kind: rule.kind, severity: rule.severity, noteCode: rule.noteCode,
|
|
34
|
+
...(path === undefined ? {} : { location: { path, ...(start === undefined ? {} : { start, end }) } }) });
|
|
35
|
+
};
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const strings = [];
|
|
38
|
+
const count = async () => {
|
|
39
|
+
checkAbort();
|
|
40
|
+
if (++nodes > limits.maxNodes)
|
|
41
|
+
stop('LIMIT_EXCEEDED');
|
|
42
|
+
if (nodes % 256 === 0) {
|
|
43
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
44
|
+
checkAbort();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const string = (value, path, order) => {
|
|
48
|
+
if (/[\uD800-\uDFFF]/u.test(value))
|
|
49
|
+
stop('INVALID_CONTENT');
|
|
50
|
+
if (Buffer.byteLength(value) > limits.maxStringLength)
|
|
51
|
+
stop('LIMIT_EXCEEDED');
|
|
52
|
+
addBytes(Buffer.byteLength(JSON.stringify(value)));
|
|
53
|
+
strings.push({ value, path, order });
|
|
54
|
+
};
|
|
55
|
+
// Validate JSON without invoking accessors/toJSON, then hash only the bounded snapshot.
|
|
56
|
+
async function visit(value, path, depth, order = '') {
|
|
57
|
+
await count();
|
|
58
|
+
if (depth > limits.maxDepth)
|
|
59
|
+
stop('LIMIT_EXCEEDED');
|
|
60
|
+
if (typeof value === 'string') {
|
|
61
|
+
string(value, path, order);
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'number' && Number.isFinite(value)) {
|
|
65
|
+
addBytes(Buffer.byteLength(JSON.stringify(value)));
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
if (!value || typeof value !== 'object' || seen.has(value))
|
|
69
|
+
return stop('INVALID_CONTENT');
|
|
70
|
+
const array = Array.isArray(value);
|
|
71
|
+
if (!array && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
|
|
72
|
+
return stop('INVALID_CONTENT');
|
|
73
|
+
seen.add(value);
|
|
74
|
+
const keys = Reflect.ownKeys(value);
|
|
75
|
+
if (keys.some(key => typeof key !== 'string'))
|
|
76
|
+
return stop('INVALID_CONTENT');
|
|
77
|
+
if (keys.length > limits.maxNodes - nodes + (array ? 1 : 0))
|
|
78
|
+
return stop('LIMIT_EXCEEDED');
|
|
79
|
+
const result = array ? [] : Object.create(null);
|
|
80
|
+
const ordered = array ? keys.filter(key => key !== 'length') : keys.sort((a, b) => pointer(a) < pointer(b) ? -1 : pointer(a) > pointer(b) ? 1 : 0);
|
|
81
|
+
if (array && ordered.length !== value.length)
|
|
82
|
+
return stop('INVALID_CONTENT');
|
|
83
|
+
addBytes(2);
|
|
84
|
+
for (let i = 0; i < ordered.length; i++) {
|
|
85
|
+
const key = ordered[i];
|
|
86
|
+
if (array && key !== String(i))
|
|
87
|
+
return stop('INVALID_CONTENT');
|
|
88
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
89
|
+
if (!descriptor.enumerable || !Object.hasOwn(descriptor, 'value'))
|
|
90
|
+
return stop('INVALID_CONTENT');
|
|
91
|
+
if (i)
|
|
92
|
+
addBytes(1);
|
|
93
|
+
const nextPath = path + '/' + pathSegment(key);
|
|
94
|
+
const nextOrder = order + '/' + pointer(key);
|
|
95
|
+
if (!array) {
|
|
96
|
+
await count();
|
|
97
|
+
string(key, nextPath, nextOrder);
|
|
98
|
+
addBytes(1);
|
|
99
|
+
}
|
|
100
|
+
const item = await visit(descriptor.value, nextPath, depth + 1, nextOrder);
|
|
101
|
+
if (array)
|
|
102
|
+
result.push(item);
|
|
103
|
+
else
|
|
104
|
+
result[key] = item;
|
|
105
|
+
}
|
|
106
|
+
seen.delete(value);
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
checkAbort();
|
|
111
|
+
if (!options || typeof options !== 'object' || Object.keys(options).some(key => !Object.hasOwn(limits, key)))
|
|
112
|
+
stop('INVALID_CONTENT');
|
|
113
|
+
for (const key of Object.keys(limits)) {
|
|
114
|
+
const value = options[key];
|
|
115
|
+
if (value !== undefined) {
|
|
116
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > CONTENT_INSPECTION_LIMITS[key])
|
|
117
|
+
stop('INVALID_CONTENT');
|
|
118
|
+
limits[key] = value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const snapshot = await visit(content, '', 0);
|
|
122
|
+
if (!snapshot || typeof snapshot !== 'object' || !Object.hasOwn(snapshot, 'manifest') || !Object.hasOwn(snapshot, 'input') ||
|
|
123
|
+
Object.keys(snapshot).some(key => !['manifest', 'input', 'capabilityChains'].includes(key)))
|
|
124
|
+
stop('INVALID_CONTENT');
|
|
125
|
+
contentDigest = digest({ manifest: snapshot.manifest, input: snapshot.input });
|
|
126
|
+
try {
|
|
127
|
+
validateManifest(snapshot.manifest);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
stop('INVALID_CONTENT');
|
|
131
|
+
}
|
|
132
|
+
// Arrays also follow lexical JSON Pointer order (10 precedes 2).
|
|
133
|
+
strings.sort((a, b) => a.order < b.order ? -1 : a.order > b.order ? 1 : 0);
|
|
134
|
+
for (const { value, path } of strings) {
|
|
135
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
136
|
+
checkAbort();
|
|
137
|
+
for (const rule of CONTENT_INSPECTION_RULES) {
|
|
138
|
+
if (!rule.pattern)
|
|
139
|
+
continue;
|
|
140
|
+
const regex = new RegExp(rule.pattern, rule.flags);
|
|
141
|
+
for (const match of value.matchAll(regex)) {
|
|
142
|
+
checkAbort();
|
|
143
|
+
const start = match.index, end = start + match[0].length;
|
|
144
|
+
if (rule.detector === 'unicode' && match[0] === '\u200d' &&
|
|
145
|
+
/\p{Extended_Pictographic}[\uFE0F\p{Emoji_Modifier}]*$/u.test(value.slice(0, start)) &&
|
|
146
|
+
/^\p{Extended_Pictographic}/u.test(value.slice(end)))
|
|
147
|
+
continue;
|
|
148
|
+
if (rule.id === 'secret-request' && !rule.terms.some(term => value.toLowerCase().includes(term)))
|
|
149
|
+
continue;
|
|
150
|
+
if (rule.detector === 'url') {
|
|
151
|
+
try {
|
|
152
|
+
const url = new URL(match[0].startsWith('www.') ? 'https://' + match[0] : match[0]);
|
|
153
|
+
const host = url.hostname.toLowerCase();
|
|
154
|
+
if (url.protocol === 'https:' && !host.includes('xn--') && !/^\[|^\d+(?:\.\d+){3}$/u.test(host) &&
|
|
155
|
+
!rule.terms.includes(host.replace(/^www\./u, '')))
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
catch { /* A recognized URL form that cannot be parsed is still a finding. */ }
|
|
159
|
+
}
|
|
160
|
+
add(rule, path, start, end);
|
|
161
|
+
if (rule.id === 'base64') {
|
|
162
|
+
const text = match[0];
|
|
163
|
+
const length = Math.floor(text.replace(/=+$/u, '').length * 6 / 8);
|
|
164
|
+
if (decodedBytes + length > limits.maxDecodedBytes)
|
|
165
|
+
stop('LIMIT_EXCEEDED');
|
|
166
|
+
const bytes = Buffer.from(text, 'base64');
|
|
167
|
+
decodedBytes += bytes.length;
|
|
168
|
+
if (binaryMagic(bytes))
|
|
169
|
+
add(CONTENT_INSPECTION_RULES.find(rule => rule.id === 'binary-magic'), path, start, end);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
checkAbort();
|
|
175
|
+
}
|
|
176
|
+
catch (code) {
|
|
177
|
+
failure = ['LIMIT_EXCEEDED', 'ABORTED', 'INVALID_CONTENT'].includes(code)
|
|
178
|
+
? code : 'INSPECTOR_FAILED';
|
|
179
|
+
if (failure === 'LIMIT_EXCEEDED' || failure === 'INVALID_CONTENT') {
|
|
180
|
+
// Leave room for the failure finding even when the finding cap was reached.
|
|
181
|
+
const rule = CONTENT_INSPECTION_RULES.find(rule => rule.id === (failure === 'LIMIT_EXCEEDED' ? 'bounds' : 'format'));
|
|
182
|
+
if (findings.length >= limits.maxFindings)
|
|
183
|
+
findings.pop();
|
|
184
|
+
findings.push({ ruleId: rule.id, kind: rule.kind, severity: rule.severity, noteCode: rule.noteCode });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { inspectorId: 'rules', inspectorVersion: CONTENT_INSPECTION_RULESET_VERSION,
|
|
188
|
+
rulesetDigest: CONTENT_INSPECTION_RULESET_DIGEST, contentDigest, sizeBytes, limits,
|
|
189
|
+
status: failure ? 'error' : 'ok', verdict: failure ? 'error' : findings.some(f => f.severity === 'block') ? 'block' :
|
|
190
|
+
findings.some(f => f.severity === 'warn') ? 'warn' : 'pass', findings, diagnostics: failure ? [{ code: failure }] : [] };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=content-inspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-inspection.js","sourceRoot":"","sources":["../src/content-inspection.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,iCAAiC,EAC7F,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AAmB5E,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACxF,+FAA+F;AAC/F,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,8FAA8F,CAAC,IAAI,CAAC,GAAG,CAAC;QACxI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AACD,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;QACpF,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC;SAChH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;AACpG,CAAC;AACD,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA4B,EAAE,UAAiC,EAAE,EAAE,MAAoB;IAC9H,MAAM,MAAM,GAAoC,EAAE,GAAG,yBAAyB,EAAE,CAAC;IACjF,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;IAC/C,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,OAAiD,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,IAAkC,EAAS,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,GAAG,EAAE,GAAG,IAAI,MAAM,EAAE,OAAO;QAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,MAAM,CAAC,QAAQ;QAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrH,MAAM,GAAG,GAAG,CAAC,IAAwB,EAAE,IAAa,EAAE,KAAc,EAAE,GAAY,EAAE,EAAE;QACpF,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW;YAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YAChG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAqD,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,UAAU,EAAE,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,KAAK,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAAC,UAAU,EAAE,CAAC;QAAC,CAAC;IACrG,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE;QAC5D,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,eAAe;YAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9E,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC;IACF,wFAAwF;IACxF,KAAK,UAAU,KAAK,CAAC,KAAc,EAAE,IAAY,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;QAC1E,MAAM,KAAK,EAAE,CAAC;QACd,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI;YACtG,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAqC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAa,CAAC,CAAC,CAAE,IAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1G,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7E,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAE,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAClG,IAAI,CAAC;gBAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,KAAK,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3E,IAAI,KAAK;gBAAG,MAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;gBAAO,MAAkC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACjG,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACH,UAAU,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtI,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAoC,EAAE,CAAC;YACzE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,yBAAyB,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACjH,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAmC,CAAC;QAC/E,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvH,aAAa,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC;YAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAAC,CAAC;QAC/E,iEAAiE;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAAC,UAAU,EAAE,CAAC;YACxE,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAC5B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1C,UAAU,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;wBACtD,wDAAwD,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;wBACpF,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAAE,SAAS;oBACjE,IAAI,IAAI,CAAC,EAAE,KAAK,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAAE,SAAS;oBAC5G,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;wBAC5B,IAAI,CAAC;4BACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;4BACpF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;4BACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;gCAC7F,CAAC,IAAI,CAAC,KAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gCAAE,SAAS;wBACjE,CAAC;wBAAC,MAAM,CAAC,CAAC,qEAAqE,CAAC,CAAC;oBACnF,CAAC;oBACD,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC5B,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;wBACnE,IAAI,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC,eAAe;4BAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;wBAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;wBAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;wBACxE,IAAI,WAAW,CAAC,KAAK,CAAC;4BAAE,GAAG,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,CAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;oBACpH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAc,CAAC;YACjF,CAAC,CAAC,IAAoC,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC9D,IAAI,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,iBAAiB,EAAE,CAAC;YAClE,4EAA4E;YAC5E,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAE,CAAC;YACtH,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW;gBAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,kCAAkC;QACjF,aAAa,EAAE,iCAAiC,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM;QAClF,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACnH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC/H,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ContextGrant, ContextGrantOptions, ContextGrantAuditPayload, TaskManifest } from './types.js';
|
|
2
|
+
export declare const CONTEXT_GRANT_MAX_BYTES: number;
|
|
3
|
+
export declare const CONTEXT_GRANT_MAX_LIFETIME_MS: number;
|
|
4
|
+
export declare const CONTEXT_GRANT_DEFAULT_LIFETIME_MS: number;
|
|
5
|
+
/** Time-independent contract checks also apply when verifying historical evidence. */
|
|
6
|
+
export declare function validateContextGrant(grant: unknown, createdAt: string): asserts grant is ContextGrant;
|
|
7
|
+
export declare function validateManifestContextGrant(manifest: TaskManifest): void;
|
|
8
|
+
/** Check live use separately so expired grants remain verifiable in historical contracts. */
|
|
9
|
+
export declare function validateContextGrantUse(manifest: TaskManifest, input: unknown, now?: number): void;
|
|
10
|
+
/** Defaults are opt-in and never widen a supplied declaration. */
|
|
11
|
+
export declare function buildContextGrant(options: ContextGrantOptions, createdAt?: string): ContextGrant;
|
|
12
|
+
/** Only these two fields enter context lifecycle audit payloads. */
|
|
13
|
+
export declare function contextGrantAuditPayload(grant: ContextGrant): ContextGrantAuditPayload;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { digest } from './crypto.js';
|
|
3
|
+
import { validateSchema } from './schema.js';
|
|
4
|
+
export const CONTEXT_GRANT_MAX_BYTES = 64 * 1024;
|
|
5
|
+
export const CONTEXT_GRANT_MAX_LIFETIME_MS = 7 * 24 * 60 * 60 * 1000;
|
|
6
|
+
export const CONTEXT_GRANT_DEFAULT_LIFETIME_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
/** Time-independent contract checks also apply when verifying historical evidence. */
|
|
8
|
+
export function validateContextGrant(grant, createdAt) {
|
|
9
|
+
validateSchema('context-grant', grant);
|
|
10
|
+
const g = grant;
|
|
11
|
+
if (g.inputRetentionAllowed === true)
|
|
12
|
+
throw new Error('CONTEXT_GRANT_INPUT_RETENTION_UNAVAILABLE');
|
|
13
|
+
const start = Date.parse(createdAt), end = Date.parse(g.expiresAt);
|
|
14
|
+
if (!Number.isFinite(start) || end <= start || end - start > CONTEXT_GRANT_MAX_LIFETIME_MS)
|
|
15
|
+
throw new Error('CONTEXT_GRANT_EXPIRY_INVALID');
|
|
16
|
+
const denied = new Set(g.fieldsDenied);
|
|
17
|
+
if (g.fieldsAllowed?.some(field => denied.has(field)))
|
|
18
|
+
throw new Error('CONTEXT_GRANT_FIELDS_CONFLICT');
|
|
19
|
+
}
|
|
20
|
+
export function validateManifestContextGrant(manifest) {
|
|
21
|
+
const grant = manifest.contextGrant;
|
|
22
|
+
if (!grant)
|
|
23
|
+
return;
|
|
24
|
+
validateContextGrant(grant, manifest.createdAt);
|
|
25
|
+
if (manifest.protocolVersion !== '0.2.0')
|
|
26
|
+
throw new Error('CONTEXT_GRANT_PROTOCOL_UNSUPPORTED');
|
|
27
|
+
if (manifest.permissions.maxDelegationDepth !== (grant.deliveryMode === 'approval_redelegation' ? 1 : 0))
|
|
28
|
+
throw new Error('CONTEXT_GRANT_DEPTH_CONFLICT');
|
|
29
|
+
if (grant.deliveryMode !== 'hand_over' && manifest.sandboxPolicy.filesystemScope !== 'ephemeral_workspace_only')
|
|
30
|
+
throw new Error('CONTEXT_GRANT_FILESYSTEM_CONFLICT');
|
|
31
|
+
}
|
|
32
|
+
/** Check live use separately so expired grants remain verifiable in historical contracts. */
|
|
33
|
+
export function validateContextGrantUse(manifest, input, now = Date.now()) {
|
|
34
|
+
validateManifestContextGrant(manifest);
|
|
35
|
+
const grant = manifest.contextGrant;
|
|
36
|
+
if (!grant)
|
|
37
|
+
return;
|
|
38
|
+
if (!Number.isFinite(now) || Date.parse(grant.expiresAt) <= now)
|
|
39
|
+
throw new Error('CONTEXT_GRANT_EXPIRED');
|
|
40
|
+
const bytes = JSON.stringify(input);
|
|
41
|
+
if (bytes === undefined || Buffer.byteLength(bytes, 'utf8') > grant.maxBytes)
|
|
42
|
+
throw new Error('CONTEXT_GRANT_MAX_BYTES_EXCEEDED');
|
|
43
|
+
}
|
|
44
|
+
/** Defaults are opt-in and never widen a supplied declaration. */
|
|
45
|
+
export function buildContextGrant(options, createdAt = new Date().toISOString()) {
|
|
46
|
+
const mode = options.deliveryMode === undefined ? 'view_only' : options.deliveryMode;
|
|
47
|
+
const grant = structuredClone({
|
|
48
|
+
...options,
|
|
49
|
+
deliveryMode: mode,
|
|
50
|
+
expiresAt: options.expiresAt === undefined
|
|
51
|
+
? new Date(Date.parse(createdAt) + CONTEXT_GRANT_DEFAULT_LIFETIME_MS).toISOString() : options.expiresAt,
|
|
52
|
+
maxBytes: options.maxBytes === undefined ? CONTEXT_GRANT_MAX_BYTES : options.maxBytes,
|
|
53
|
+
retention: options.retention === undefined
|
|
54
|
+
? mode === 'hand_over' ? 'keep_deliverable' : 'ephemeral_view' : options.retention,
|
|
55
|
+
inputRetentionAllowed: options.inputRetentionAllowed === undefined ? false : options.inputRetentionAllowed,
|
|
56
|
+
});
|
|
57
|
+
validateContextGrant(grant, createdAt);
|
|
58
|
+
return grant;
|
|
59
|
+
}
|
|
60
|
+
/** Only these two fields enter context lifecycle audit payloads. */
|
|
61
|
+
export function contextGrantAuditPayload(grant) {
|
|
62
|
+
validateSchema('context-grant', grant);
|
|
63
|
+
return { grantDigest: digest(grant), deliveryMode: grant.deliveryMode };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=context-grant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-grant.js","sourceRoot":"","sources":["../src/context-grant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TaskContract } from './contract.js';
|
|
2
|
+
import type { DelegationLink, DelegationProof, KeyPair, TaskManifest } from './types.js';
|
|
3
|
+
/** Literal declaration comparison only; it does not interpret selectors or inspect provenance. */
|
|
4
|
+
export declare function assertDelegationAttenuation(parent: TaskManifest, child: TaskManifest): void;
|
|
5
|
+
/** Historical verification has no implicit current clock. Siblings are separate one-edge chains. */
|
|
6
|
+
export declare function verifyDelegationChain(input: {
|
|
7
|
+
rootContract: TaskContract;
|
|
8
|
+
chain: readonly DelegationProof[];
|
|
9
|
+
}): {
|
|
10
|
+
depthRemaining: number;
|
|
11
|
+
delegateeOwnerDids: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function createDelegationLink(input: {
|
|
14
|
+
parentContract: TaskContract;
|
|
15
|
+
childContract: TaskContract;
|
|
16
|
+
issuedAt?: string;
|
|
17
|
+
}, delegator: KeyPair): DelegationLink;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { digest, signPayload, verifySigned } from './crypto.js';
|
|
3
|
+
import { verifyContract } from './contract.js';
|
|
4
|
+
import { validateManifest, validateSchema } from './schema.js';
|
|
5
|
+
const maxima = ['maxInputTokens', 'maxOutputTokens', 'maxToolInvocations', 'maxWallClockSeconds'];
|
|
6
|
+
const equal = (a, b) => digest(a) === digest(b);
|
|
7
|
+
function fail(code = 'DELEGATION_INVALID') { throw new Error(code); }
|
|
8
|
+
function time(value) {
|
|
9
|
+
const n = Date.parse(value);
|
|
10
|
+
if (!Number.isFinite(n))
|
|
11
|
+
fail();
|
|
12
|
+
return n;
|
|
13
|
+
}
|
|
14
|
+
function root(manifest) {
|
|
15
|
+
if (manifest.protocolVersion !== '0.2.0' || manifest.contextGrant?.deliveryMode !== 'approval_redelegation')
|
|
16
|
+
fail('DELEGATION_INVALID');
|
|
17
|
+
if (manifest.permissions.maxDelegationDepth !== 1)
|
|
18
|
+
fail('DELEGATION_INVALID');
|
|
19
|
+
}
|
|
20
|
+
/** Literal declaration comparison only; it does not interpret selectors or inspect provenance. */
|
|
21
|
+
export function assertDelegationAttenuation(parent, child) {
|
|
22
|
+
root(parent);
|
|
23
|
+
try {
|
|
24
|
+
validateManifest(parent);
|
|
25
|
+
validateManifest(child);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
fail();
|
|
29
|
+
}
|
|
30
|
+
const p = parent.contextGrant, c = child.contextGrant;
|
|
31
|
+
if (!c || c.deliveryMode !== 'view_only' || c.retention !== 'ephemeral_view' || c.inputRetentionAllowed === true)
|
|
32
|
+
fail('DELEGATION_INVALID');
|
|
33
|
+
if (child.permissions.maxDelegationDepth !== 0)
|
|
34
|
+
fail('DELEGATION_INVALID');
|
|
35
|
+
if (child.permissions.grantedCapabilities.length)
|
|
36
|
+
fail('DELEGATION_INVALID');
|
|
37
|
+
if (time(child.createdAt) < time(parent.createdAt) || time(child.deadline) <= time(child.createdAt) ||
|
|
38
|
+
time(parent.deadline) <= time(parent.createdAt))
|
|
39
|
+
fail();
|
|
40
|
+
if (time(child.deadline) > time(parent.deadline) || time(c.expiresAt) > time(p.expiresAt) || c.maxBytes > p.maxBytes)
|
|
41
|
+
fail('DELEGATION_INVALID');
|
|
42
|
+
for (const name of maxima)
|
|
43
|
+
if (child.budget[name] > parent.budget[name])
|
|
44
|
+
fail('DELEGATION_INVALID');
|
|
45
|
+
const withoutMaxima = (m) => Object.fromEntries(Object.entries(m.budget).filter(([k]) => !maxima.includes(k)));
|
|
46
|
+
if (!equal(withoutMaxima(parent), withoutMaxima(child)) || !equal(parent.sandboxPolicy, child.sandboxPolicy) ||
|
|
47
|
+
!equal(parent.verification, child.verification))
|
|
48
|
+
fail('DELEGATION_INVALID');
|
|
49
|
+
if (!c.selectors.length || c.selectors.some(s => !p.selectors.includes(s)) ||
|
|
50
|
+
p.fieldsAllowed && (!c.fieldsAllowed?.length || c.fieldsAllowed.some(f => !p.fieldsAllowed.includes(f))) ||
|
|
51
|
+
c.fieldsAllowed && !c.fieldsAllowed.length ||
|
|
52
|
+
p.fieldsDenied?.some(f => !c.fieldsDenied?.includes(f)) ||
|
|
53
|
+
p.outputSchema !== undefined && (c.outputSchema === undefined || !equal(p.outputSchema, c.outputSchema)))
|
|
54
|
+
fail('DELEGATION_INVALID');
|
|
55
|
+
const narrower = c.selectors.length < p.selectors.length ||
|
|
56
|
+
(p.fieldsAllowed ? !!c.fieldsAllowed && c.fieldsAllowed.length < p.fieldsAllowed.length : !!c.fieldsAllowed?.length);
|
|
57
|
+
if (!narrower)
|
|
58
|
+
fail('DELEGATION_INVALID');
|
|
59
|
+
}
|
|
60
|
+
function actualLimits(child) {
|
|
61
|
+
return structuredClone({ deadline: child.deadline, expiresAt: child.contextGrant.expiresAt,
|
|
62
|
+
budget: child.budget, sandboxPolicy: child.sandboxPolicy, verification: child.verification,
|
|
63
|
+
depthRemaining: child.permissions.maxDelegationDepth });
|
|
64
|
+
}
|
|
65
|
+
/** Historical verification has no implicit current clock. Siblings are separate one-edge chains. */
|
|
66
|
+
export function verifyDelegationChain(input) {
|
|
67
|
+
const { rootContract: parent, chain } = input;
|
|
68
|
+
if (!verifyContract(parent))
|
|
69
|
+
fail();
|
|
70
|
+
root(parent.manifest);
|
|
71
|
+
if (!Array.isArray(chain) || !chain.length)
|
|
72
|
+
fail('DELEGATION_PROOF_REQUIRED');
|
|
73
|
+
if (chain.length > 1 || chain.length > parent.manifest.permissions.maxDelegationDepth)
|
|
74
|
+
fail('DELEGATION_INVALID');
|
|
75
|
+
const proof = chain[0];
|
|
76
|
+
try {
|
|
77
|
+
validateSchema('delegation-attachment', { parentContract: parent, children: [proof] });
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
fail();
|
|
81
|
+
}
|
|
82
|
+
const child = proof.childContract, link = proof.link, l = link.payload;
|
|
83
|
+
if (!verifyContract(child))
|
|
84
|
+
fail();
|
|
85
|
+
const a = parent.manifest.requester.ownerDid, b = parent.manifest.worker.ownerDid, c = child.manifest.worker.ownerDid;
|
|
86
|
+
if (new Set([a, b, c]).size !== 3 || b !== child.manifest.requester.ownerDid ||
|
|
87
|
+
parent.manifest.taskId === child.manifest.taskId || !verifySigned(link, b) ||
|
|
88
|
+
l.delegatorOwnerDid !== b || l.delegateeOwnerDid !== c || l.parentTaskId !== parent.manifest.taskId ||
|
|
89
|
+
l.childTaskId !== child.manifest.taskId || l.parentContractDigest !== parent.contractDigest ||
|
|
90
|
+
l.childContractDigest !== child.contractDigest || l.prevLinkDigest !== null)
|
|
91
|
+
fail();
|
|
92
|
+
const remaining = parent.manifest.permissions.maxDelegationDepth - 1;
|
|
93
|
+
if (l.depthRemaining !== remaining || l.limits.depthRemaining !== remaining || child.manifest.permissions.maxDelegationDepth !== remaining)
|
|
94
|
+
fail('DELEGATION_INVALID');
|
|
95
|
+
assertDelegationAttenuation(parent.manifest, child.manifest);
|
|
96
|
+
if (!equal(l.limits, actualLimits(child.manifest)))
|
|
97
|
+
fail('DELEGATION_INVALID');
|
|
98
|
+
const issued = time(l.issuedAt);
|
|
99
|
+
if (l.issuedAt !== link.signature.signedAt || time(child.acceptance.signature.signedAt) > issued ||
|
|
100
|
+
time(child.manifest.createdAt) > time(child.acceptance.signature.signedAt) ||
|
|
101
|
+
[parent.manifest, child.manifest].some(m => issued >= time(m.deadline) || issued >= time(m.contextGrant.expiresAt)))
|
|
102
|
+
fail();
|
|
103
|
+
return { depthRemaining: remaining, delegateeOwnerDids: [c] };
|
|
104
|
+
}
|
|
105
|
+
export function createDelegationLink(input, delegator) {
|
|
106
|
+
const { parentContract: parent, childContract: child } = input;
|
|
107
|
+
if (!verifyContract(parent) || !verifyContract(child))
|
|
108
|
+
fail();
|
|
109
|
+
assertDelegationAttenuation(parent.manifest, child.manifest);
|
|
110
|
+
const issuedAt = input.issuedAt ?? new Date().toISOString();
|
|
111
|
+
time(issuedAt);
|
|
112
|
+
let link;
|
|
113
|
+
try {
|
|
114
|
+
link = signPayload({ type: 'DelegationLink', parentTaskId: parent.manifest.taskId,
|
|
115
|
+
parentContractDigest: parent.contractDigest, childTaskId: child.manifest.taskId,
|
|
116
|
+
childContractDigest: child.contractDigest, delegatorOwnerDid: delegator.did,
|
|
117
|
+
delegateeOwnerDid: child.manifest.worker.ownerDid, depthRemaining: 0, limits: actualLimits(child.manifest),
|
|
118
|
+
issuedAt, prevLinkDigest: null }, delegator, issuedAt);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
fail();
|
|
122
|
+
}
|
|
123
|
+
verifyDelegationChain({ rootContract: parent, chain: [{ link, childContract: child }] });
|
|
124
|
+
return link;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=delegation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation.js","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export * from './types.js';
|
|
3
3
|
export * from './crypto.js';
|
|
4
4
|
export * from './discovery.js';
|
|
5
|
+
export * from './invite-link.js';
|
|
6
|
+
export * from './invite-sas.js';
|
|
5
7
|
export * from './relay-auth.js';
|
|
6
8
|
export * from './delivery-status.js';
|
|
7
9
|
//# sourceMappingURL=edge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export * from './context-grant.js';
|
|
2
3
|
export * from './crypto.js';
|
|
3
4
|
export * from './schema.js';
|
|
4
5
|
export * from './protocol.js';
|
|
@@ -6,7 +7,12 @@ export * from './capability.js';
|
|
|
6
7
|
export * from './receipts.js';
|
|
7
8
|
export * from './contract.js';
|
|
8
9
|
export * from './discovery.js';
|
|
10
|
+
export * from './invite-link.js';
|
|
11
|
+
export * from './invite-sas.js';
|
|
9
12
|
export * from './connection.js';
|
|
10
13
|
export * from './relay-auth.js';
|
|
11
14
|
export * from './revocation.js';
|
|
12
15
|
export * from './delivery-status.js';
|
|
16
|
+
export * from './delegation.js';
|
|
17
|
+
export * from './content-inspection.js';
|
|
18
|
+
export * from './content-inspection-rules.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
|
+
export * from './context-grant.js';
|
|
2
3
|
export * from './crypto.js';
|
|
3
4
|
export * from './schema.js';
|
|
4
5
|
export * from './protocol.js';
|
|
@@ -6,8 +7,13 @@ export * from './capability.js';
|
|
|
6
7
|
export * from './receipts.js';
|
|
7
8
|
export * from './contract.js';
|
|
8
9
|
export * from './discovery.js';
|
|
10
|
+
export * from './invite-link.js';
|
|
11
|
+
export * from './invite-sas.js';
|
|
9
12
|
export * from './connection.js';
|
|
10
13
|
export * from './relay-auth.js';
|
|
11
14
|
export * from './revocation.js';
|
|
12
15
|
export * from './delivery-status.js';
|
|
16
|
+
export * from './delegation.js';
|
|
17
|
+
export * from './content-inspection.js';
|
|
18
|
+
export * from './content-inspection-rules.js';
|
|
13
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { RelayEndpointPolicy } from './discovery.js';
|
|
2
|
+
export declare const INVITE_LINK_CONTEXT = "sealbridge/invite-link/v1";
|
|
3
|
+
/** UTF-8 info labels; each HKDF uses K as IKM and an empty salt (RFC 5869). */
|
|
4
|
+
export declare const INVITE_LINK_HKDF_INFO: Readonly<{
|
|
5
|
+
id: string;
|
|
6
|
+
encKey: string;
|
|
7
|
+
accessKey: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const INVITE_LINK_PAD_BLOCK_BYTES = 4096;
|
|
10
|
+
export declare const INVITE_LINK_MAX_PADDED_BYTES = 16384;
|
|
11
|
+
export declare const INVITE_LINK_DEFAULT_TTL_MS: number;
|
|
12
|
+
export declare const INVITE_LINK_MAX_TTL_MS: number;
|
|
13
|
+
export declare const INVITE_LINK_TOKEN_GRACE_MS: number;
|
|
14
|
+
export interface InviteLinkKeys {
|
|
15
|
+
id: Buffer;
|
|
16
|
+
encKey: Buffer;
|
|
17
|
+
accessKey: Buffer;
|
|
18
|
+
}
|
|
19
|
+
export interface InviteLinkCiphertext {
|
|
20
|
+
id: Uint8Array;
|
|
21
|
+
/** Encrypted padded plaintext followed by the 16-byte GCM authentication tag. */
|
|
22
|
+
ciphertext: Uint8Array;
|
|
23
|
+
nonce: Uint8Array;
|
|
24
|
+
expiresAt: string;
|
|
25
|
+
}
|
|
26
|
+
/** Relay storage encoding. No K, plaintext, claim tag, or verification number. */
|
|
27
|
+
export interface InviteLinkStorage {
|
|
28
|
+
id: string;
|
|
29
|
+
ciphertext: string;
|
|
30
|
+
nonce: string;
|
|
31
|
+
expiresAt: string;
|
|
32
|
+
}
|
|
33
|
+
export interface InviteLinkRelayPolicy extends RelayEndpointPolicy {
|
|
34
|
+
/** Same URL comparison as application relay allow-lists (origin + pathname). */
|
|
35
|
+
allowedRelayUrls?: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
export interface ParsedInviteLink {
|
|
38
|
+
v: 1;
|
|
39
|
+
k: string;
|
|
40
|
+
relayOrigin: string;
|
|
41
|
+
}
|
|
42
|
+
/** Returns the link deadline and the inner token deadline (link + 24 hours). */
|
|
43
|
+
export declare function inviteLinkExpiry(now?: number, ttlMs?: number): {
|
|
44
|
+
expiresAt: string;
|
|
45
|
+
tokenExpiresAt: string;
|
|
46
|
+
};
|
|
47
|
+
/** The returned k is exactly 43 unpadded base64url characters encoding 32 random bytes. */
|
|
48
|
+
export declare function generateInviteLinkKey(): string;
|
|
49
|
+
export declare function deriveInviteLinkKeys(k: string): InviteLinkKeys;
|
|
50
|
+
/** Exact bytes: HMAC-SHA256(accessKey, UTF8("claim") || raw 16-byte id). */
|
|
51
|
+
export declare function inviteLinkClaimTag(accessKey: Uint8Array, id: Uint8Array): Buffer;
|
|
52
|
+
/**
|
|
53
|
+
* AAD = UTF8(context) || raw id || UTF8(normalizeRelayOrigin(relayOrigin)) ||
|
|
54
|
+
* UTF8(expiresAt). No separators, length prefixes, JSON, or terminating NULs.
|
|
55
|
+
* The origin has no path, trailing slash, or default port; ws(s) maps to http(s).
|
|
56
|
+
*/
|
|
57
|
+
export declare function inviteLinkAad(id: Uint8Array, relayOrigin: string, expiresAt: string): Buffer;
|
|
58
|
+
/** Four-byte big-endian UTF-8 byte length, token bytes, then zero padding. */
|
|
59
|
+
export declare function padInviteLinkToken(token: string): Buffer;
|
|
60
|
+
export declare function unpadInviteLinkToken(padded: Uint8Array): string;
|
|
61
|
+
export declare function packInviteLinkCiphertext(value: InviteLinkCiphertext): InviteLinkStorage;
|
|
62
|
+
/** Strict local decoding of an untrusted relay response, without contacting a relay. */
|
|
63
|
+
export declare function unpackInviteLinkCiphertext(value: unknown): InviteLinkCiphertext;
|
|
64
|
+
/** Opaque token wrapping only. Signature/card/relay verification remains the caller's next step. */
|
|
65
|
+
export declare function encryptInviteLink(token: string, k: string, options: {
|
|
66
|
+
relayOrigin: string;
|
|
67
|
+
expiresAt: string;
|
|
68
|
+
now?: number;
|
|
69
|
+
}): InviteLinkCiphertext;
|
|
70
|
+
export declare function decryptInviteLink(value: InviteLinkCiphertext, k: string, relayOrigin: string, now?: number): string;
|
|
71
|
+
/** Only the two v1 fragment forms are accepted. Parsing performs no network I/O. */
|
|
72
|
+
export declare function parseInviteLink(uri: string, policy?: InviteLinkRelayPolicy): ParsedInviteLink;
|