@dsh-enhanced/assistant-skills 0.1.30
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/LICENSE +21 -0
- package/README.md +211 -0
- package/cordis.patch.yml +3 -0
- package/lib/capture-expansion.d.ts +18 -0
- package/lib/capture-expansion.d.ts.map +1 -0
- package/lib/capture-expansion.js +187 -0
- package/lib/capture-expansion.js.map +1 -0
- package/lib/comparison.d.ts +69 -0
- package/lib/comparison.d.ts.map +1 -0
- package/lib/comparison.js +173 -0
- package/lib/comparison.js.map +1 -0
- package/lib/definition.d.ts +163 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +450 -0
- package/lib/definition.js.map +1 -0
- package/lib/external-holdout.d.ts +34 -0
- package/lib/external-holdout.d.ts.map +1 -0
- package/lib/external-holdout.js +212 -0
- package/lib/external-holdout.js.map +1 -0
- package/lib/holdout-authority.d.ts +123 -0
- package/lib/holdout-authority.d.ts.map +1 -0
- package/lib/holdout-authority.js +263 -0
- package/lib/holdout-authority.js.map +1 -0
- package/lib/holdout-cli.d.ts +4 -0
- package/lib/holdout-cli.d.ts.map +1 -0
- package/lib/holdout-cli.js +221 -0
- package/lib/holdout-cli.js.map +1 -0
- package/lib/holdout-qualification.d.ts +83 -0
- package/lib/holdout-qualification.d.ts.map +1 -0
- package/lib/holdout-qualification.js +306 -0
- package/lib/holdout-qualification.js.map +1 -0
- package/lib/index.d.ts +22 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/prospective-holdout.d.ts +35 -0
- package/lib/prospective-holdout.d.ts.map +1 -0
- package/lib/prospective-holdout.js +254 -0
- package/lib/prospective-holdout.js.map +1 -0
- package/lib/repair-admission.d.ts +11 -0
- package/lib/repair-admission.d.ts.map +1 -0
- package/lib/repair-admission.js +25 -0
- package/lib/repair-admission.js.map +1 -0
- package/lib/repair-agent.d.ts +44 -0
- package/lib/repair-agent.d.ts.map +1 -0
- package/lib/repair-agent.js +241 -0
- package/lib/repair-agent.js.map +1 -0
- package/lib/repair-feedback.d.ts +70 -0
- package/lib/repair-feedback.d.ts.map +1 -0
- package/lib/repair-feedback.js +79 -0
- package/lib/repair-feedback.js.map +1 -0
- package/lib/repair-profile.d.ts +27 -0
- package/lib/repair-profile.d.ts.map +1 -0
- package/lib/repair-profile.js +51 -0
- package/lib/repair-profile.js.map +1 -0
- package/lib/repair-runtime.d.ts +35 -0
- package/lib/repair-runtime.d.ts.map +1 -0
- package/lib/repair-runtime.js +181 -0
- package/lib/repair-runtime.js.map +1 -0
- package/lib/replay.d.ts +38 -0
- package/lib/replay.d.ts.map +1 -0
- package/lib/replay.js +240 -0
- package/lib/replay.js.map +1 -0
- package/lib/sealed-holdout.d.ts +20 -0
- package/lib/sealed-holdout.d.ts.map +1 -0
- package/lib/sealed-holdout.js +12 -0
- package/lib/sealed-holdout.js.map +1 -0
- package/lib/service.d.ts +968 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +1929 -0
- package/lib/service.js.map +1 -0
- package/lib/store.d.ts +366 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +1517 -0
- package/lib/store.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +2 -0
- package/lib/version.js.map +1 -0
- package/lib/watch-proof.d.ts +30 -0
- package/lib/watch-proof.d.ts.map +1 -0
- package/lib/watch-proof.js +209 -0
- package/lib/watch-proof.js.map +1 -0
- package/package.json +141 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { createHash, createPrivateKey, createPublicKey, KeyObject, randomBytes, randomInt, sign, verify } from 'node:crypto';
|
|
2
|
+
const digestPattern = /^[a-f0-9]{64}$/u;
|
|
3
|
+
const protocol = 'assistant-skills/prospective-holdout/v1';
|
|
4
|
+
export const prospectiveGeneratorNames = Object.freeze(['order-summary/v1', 'order-summary/v2', 'template-render/v1', 'template-render-jsonl/v1', 'dependency-topological-order/v1']);
|
|
5
|
+
const generatorName = 'order-summary/v1';
|
|
6
|
+
export const generatorDigest = createHash('sha256').update('assistant-skills/prospective-holdout/order-summary/v1: stdin JSON array of orders; cancelled orders excluded; integer cents summed by currency; sorted JSON object plus newline; CSPRNG cases; replay/evaluation/regression').digest('hex');
|
|
7
|
+
const generatorV2Digest = createHash('sha256').update('assistant-skills/prospective-holdout/order-summary/v2: stdin JSON array of orders; cancelled orders excluded; integer amountCents summed by currency including negative values; sorted JSON object plus newline; explicit empty case and randomized negative evaluation with cancellation and accumulation; CSPRNG cases; replay/evaluation/regression').digest('hex');
|
|
8
|
+
const templateRenderV1Digest = createHash('sha256').update('assistant-skills/prospective-holdout/template-render/v1: stdin JSON object with template string and string values object; replace known {{ascii_key}} placeholders literally in one non-recursive pass; preserve unknown placeholders; append newline; CSPRNG cases; replay/evaluation/regression').digest('hex');
|
|
9
|
+
const templateRenderJsonlV1Digest = createHash('sha256').update('assistant-skills/prospective-holdout/template-render-jsonl/v1: stdin NDJSON of one JSON object per physical line with template string and string values object; process each record independently; replace known {{ascii_key}} placeholders literally in one non-recursive pass; preserve unknown placeholders; emit one rendered line per input record; CSPRNG 1/2/3-record replay/evaluation/regression cases with Unicode values and optional final input newline; replay/evaluation/regression').digest('hex');
|
|
10
|
+
const dependencyTopologicalOrderV1Digest = createHash('sha256').update('assistant-skills/prospective-holdout/dependency-topological-order/v1: stdin lines; exactly two whitespace-separated labels each matching [a-z][a-z0-9]{1,31} (2 through 32 lowercase ASCII alphanumeric characters, letter first) form a directed edge; malformed and blank lines ignored; duplicate edges deduplicated; nodes are edge endpoints; emit lexicographically smallest topological order one node per line or CYCLE newline; bounded CSPRNG labels, edge order, and irrelevant lines; replay DAG, evaluation dynamic lexical tie, regression cycle').digest('hex');
|
|
11
|
+
export function isProspectiveGeneratorName(value) {
|
|
12
|
+
return typeof value === 'string' && prospectiveGeneratorNames.includes(value);
|
|
13
|
+
}
|
|
14
|
+
export function prospectiveGeneratorDigest(name) {
|
|
15
|
+
if (name === 'order-summary/v1')
|
|
16
|
+
return generatorDigest;
|
|
17
|
+
if (name === 'order-summary/v2')
|
|
18
|
+
return generatorV2Digest;
|
|
19
|
+
if (name === 'template-render/v1')
|
|
20
|
+
return templateRenderV1Digest;
|
|
21
|
+
if (name === 'template-render-jsonl/v1')
|
|
22
|
+
return templateRenderJsonlV1Digest;
|
|
23
|
+
if (name === 'dependency-topological-order/v1')
|
|
24
|
+
return dependencyTopologicalOrderV1Digest;
|
|
25
|
+
throw new Error('prospective-holdout: unsupported generator');
|
|
26
|
+
}
|
|
27
|
+
export function prospectiveGeneratorProfile(name) {
|
|
28
|
+
return Object.freeze({ version: name, digest: prospectiveGeneratorDigest(name) });
|
|
29
|
+
}
|
|
30
|
+
function canonical(value) {
|
|
31
|
+
if (value === null || typeof value !== 'object')
|
|
32
|
+
return JSON.stringify(value);
|
|
33
|
+
if (Array.isArray(value))
|
|
34
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
35
|
+
const record = value;
|
|
36
|
+
return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${canonical(record[key])}`).join(',')}}`;
|
|
37
|
+
}
|
|
38
|
+
export function prospectiveDatasetDigest(dataset) { return createHash('sha256').update(canonical(dataset)).digest('hex'); }
|
|
39
|
+
function plain(value) { return value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype && Object.getOwnPropertySymbols(value).length === 0 && Object.values(Object.getOwnPropertyDescriptors(value)).every(item => item.enumerable && 'value' in item); }
|
|
40
|
+
function exact(value, required) { return plain(value) && required.every(key => Object.hasOwn(value, key)) && Object.keys(value).length === required.length && Object.keys(value).every(key => required.includes(key)); }
|
|
41
|
+
function validBinding(value) {
|
|
42
|
+
const required = ['scopeDigest', 'baselineDigest', 'candidateDigest', 'budgetDigest', 'expiresAt', 'repeats'];
|
|
43
|
+
return (exact(value, required) || exact(value, [...required, 'admissionDigest']))
|
|
44
|
+
&& [value.scopeDigest, value.baselineDigest, value.candidateDigest, value.budgetDigest].every(item => typeof item === 'string' && digestPattern.test(item))
|
|
45
|
+
&& (value.admissionDigest === undefined || typeof value.admissionDigest === 'string' && digestPattern.test(value.admissionDigest))
|
|
46
|
+
&& typeof value.expiresAt === 'number' && Number.isSafeInteger(value.expiresAt) && value.expiresAt > 0
|
|
47
|
+
&& typeof value.repeats === 'number' && Number.isInteger(value.repeats) && value.repeats >= 2 && value.repeats <= 4;
|
|
48
|
+
}
|
|
49
|
+
function same(left, right) { return canonical(left) === canonical(right); }
|
|
50
|
+
function currency() { return ['AUD', 'CAD', 'EUR', 'GBP', 'JPY', 'USD'][randomInt(6)]; }
|
|
51
|
+
function order(index) {
|
|
52
|
+
const states = ['paid', 'paid', 'pending', 'cancelled'];
|
|
53
|
+
return { id: `o-${index}-${randomBytes(4).toString('hex')}`, currency: currency(), cents: randomInt(0, 250_001), status: states[randomInt(states.length)] };
|
|
54
|
+
}
|
|
55
|
+
function expected(orders) {
|
|
56
|
+
const totals = {};
|
|
57
|
+
for (const item of orders)
|
|
58
|
+
if (item.status !== 'cancelled')
|
|
59
|
+
totals[item.currency] = (totals[item.currency] ?? 0) + item.cents;
|
|
60
|
+
return JSON.stringify(Object.fromEntries(Object.entries(totals).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0))) + '\n';
|
|
61
|
+
}
|
|
62
|
+
function v2order(index) {
|
|
63
|
+
const states = ['paid', 'paid', 'pending', 'cancelled'];
|
|
64
|
+
return { id: `v2-${index}-${randomBytes(4).toString('hex')}`, currency: currency(), amountCents: randomInt(-250_000, 250_001), status: states[randomInt(states.length)] };
|
|
65
|
+
}
|
|
66
|
+
function v2expected(orders) {
|
|
67
|
+
const totals = {};
|
|
68
|
+
for (const item of orders)
|
|
69
|
+
if (item.status !== 'cancelled')
|
|
70
|
+
totals[item.currency] = (totals[item.currency] ?? 0) + item.amountCents;
|
|
71
|
+
return JSON.stringify(Object.fromEntries(Object.entries(totals).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0))) + '\n';
|
|
72
|
+
}
|
|
73
|
+
function templateInput(kind) {
|
|
74
|
+
const token = randomBytes(8).toString('hex'), secondary = randomBytes(6).toString('hex');
|
|
75
|
+
if (kind === 'replay')
|
|
76
|
+
return { template: `plain-${token}: no substitutions`, values: { unused: secondary } };
|
|
77
|
+
if (kind === 'evaluation')
|
|
78
|
+
return {
|
|
79
|
+
template: `release={{release}};again={{release}};unknown={{missing}};literal={{literal}}`,
|
|
80
|
+
values: { release: `r-${token}`, literal: `{{release}}-${secondary}` },
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
template: `owner={{owner}}\npath=/private/{{path}}/{{owner}}\nunresolved={{later_key}}`,
|
|
84
|
+
values: { owner: `team-${token}`, path: `build_${secondary}` },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function templateExpected(input) {
|
|
88
|
+
return input.template.replace(/\{\{([a-z][a-z0-9_]*)\}\}/gu, (placeholder, key) => Object.hasOwn(input.values, key) ? input.values[key] : placeholder) + '\n';
|
|
89
|
+
}
|
|
90
|
+
function jsonlTemplateInput(index) {
|
|
91
|
+
const token = randomBytes(8).toString('hex'), secondary = randomBytes(6).toString('hex');
|
|
92
|
+
return {
|
|
93
|
+
template: `row=${index};known={{known}};again={{known}};unknown={{missing}};literal={{literal}}`,
|
|
94
|
+
values: { known: `café-☃-${token}`, literal: `{{known}}-東京-${secondary}` },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function templateJsonlDataset() {
|
|
98
|
+
const definitions = [['replay', 1, false], ['evaluation', 2, true], ['regression', 3, true]];
|
|
99
|
+
const cases = definitions.map(([kind, count, terminalNewline]) => {
|
|
100
|
+
const inputs = Array.from({ length: count }, (_, index) => jsonlTemplateInput(index + 1));
|
|
101
|
+
return Object.freeze({ id: `${kind}-${randomBytes(8).toString('hex')}`, kind,
|
|
102
|
+
stdin: inputs.map(input => JSON.stringify(input)).join('\n') + (terminalNewline ? '\n' : ''),
|
|
103
|
+
expectedStdout: inputs.map(templateExpected).join(''), expectedExitCode: 0 });
|
|
104
|
+
});
|
|
105
|
+
return Object.freeze({ id: `prospective-template-render-jsonl-${randomBytes(12).toString('hex')}`, version: 'template-render-jsonl/v1', cases: Object.freeze(cases) });
|
|
106
|
+
}
|
|
107
|
+
function shuffled(values) {
|
|
108
|
+
const result = [...values];
|
|
109
|
+
for (let index = result.length - 1; index > 0; index--) {
|
|
110
|
+
const other = randomInt(index + 1);
|
|
111
|
+
[result[index], result[other]] = [result[other], result[index]];
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
function topologyLabels(count) {
|
|
116
|
+
const labels = new Set();
|
|
117
|
+
while (labels.size < count)
|
|
118
|
+
labels.add(`n${randomBytes(6).toString('hex')}`);
|
|
119
|
+
return [...labels];
|
|
120
|
+
}
|
|
121
|
+
function topologyInput(edges) {
|
|
122
|
+
const duplicate = edges[randomInt(edges.length)];
|
|
123
|
+
const acceptedBoundary = `n${randomBytes(16).toString('hex').slice(0, 31)}`;
|
|
124
|
+
const digitLeading = `1${randomBytes(6).toString('hex')}`, rejectedBoundary = `n${randomBytes(16).toString('hex')}`;
|
|
125
|
+
const irrelevant = ['x y', `${digitLeading} ${duplicate[0]}`, `${rejectedBoundary} ${duplicate[0]}`, `ignored${randomBytes(4).toString('hex')} has extra fields`, ''];
|
|
126
|
+
return shuffled([...edges.map(edge => `${edge[0]} ${edge[1]}`), `${duplicate[0]} ${duplicate[1]}`, `${duplicate[1]} ${acceptedBoundary}`, ...irrelevant]).join('\n') + '\n';
|
|
127
|
+
}
|
|
128
|
+
function topologyExpected(input) {
|
|
129
|
+
const edges = new Set(), nodes = new Set();
|
|
130
|
+
for (const line of input.split(/\r?\n/u)) {
|
|
131
|
+
const fields = line.trim().split(/\s+/u);
|
|
132
|
+
if (fields.length !== 2 || !fields.every(field => /^[a-z][a-z0-9]{1,31}$/u.test(field)))
|
|
133
|
+
continue;
|
|
134
|
+
const [before, after] = fields;
|
|
135
|
+
nodes.add(before);
|
|
136
|
+
nodes.add(after);
|
|
137
|
+
edges.add(`${before}\u0000${after}`);
|
|
138
|
+
}
|
|
139
|
+
const indegree = new Map([...nodes].map(node => [node, 0])), outgoing = new Map([...nodes].map(node => [node, []]));
|
|
140
|
+
for (const edge of edges) {
|
|
141
|
+
const [before, after] = edge.split('\u0000');
|
|
142
|
+
outgoing.get(before).push(after);
|
|
143
|
+
indegree.set(after, indegree.get(after) + 1);
|
|
144
|
+
}
|
|
145
|
+
const ready = [...nodes].filter(node => indegree.get(node) === 0).sort(), result = [];
|
|
146
|
+
while (ready.length) {
|
|
147
|
+
const node = ready.shift();
|
|
148
|
+
result.push(node);
|
|
149
|
+
for (const after of outgoing.get(node).sort()) {
|
|
150
|
+
const remaining = indegree.get(after) - 1;
|
|
151
|
+
indegree.set(after, remaining);
|
|
152
|
+
if (remaining === 0)
|
|
153
|
+
ready.push(after);
|
|
154
|
+
}
|
|
155
|
+
ready.sort();
|
|
156
|
+
}
|
|
157
|
+
return result.length === nodes.size ? `${result.join('\n')}\n` : 'CYCLE\n';
|
|
158
|
+
}
|
|
159
|
+
function topologyDataset() {
|
|
160
|
+
const replayNodes = topologyLabels(6), replayOrder = shuffled(replayNodes);
|
|
161
|
+
const replayEdges = [[replayOrder[0], replayOrder[2]], [replayOrder[1], replayOrder[2]], [replayOrder[2], replayOrder[3]], [replayOrder[1], replayOrder[4]], [replayOrder[4], replayOrder[5]]];
|
|
162
|
+
const tie = topologyLabels(5).sort();
|
|
163
|
+
// After tie[0] is emitted, tie[2] becomes ready ahead of the older tie[3].
|
|
164
|
+
// This distinguishes a lexical priority queue from a one-time root sort.
|
|
165
|
+
const tieEdges = [[tie[0], tie[2]], [tie[2], tie[1]], [tie[3], tie[4]], [tie[1], tie[4]]];
|
|
166
|
+
const cycle = topologyLabels(6).sort();
|
|
167
|
+
const cycleEdges = [[cycle[0], cycle[2]], [cycle[2], cycle[4]], [cycle[4], cycle[0]], [cycle[1], cycle[3]], [cycle[3], cycle[5]]];
|
|
168
|
+
const cases = [['replay', replayEdges], ['evaluation', tieEdges], ['regression', cycleEdges]].map(([kind, edges]) => {
|
|
169
|
+
const stdin = topologyInput(edges);
|
|
170
|
+
return Object.freeze({ id: `${kind}-${randomBytes(8).toString('hex')}`, kind, stdin, expectedStdout: topologyExpected(stdin), expectedExitCode: 0 });
|
|
171
|
+
});
|
|
172
|
+
return Object.freeze({ id: `prospective-dependency-topological-order-${randomBytes(12).toString('hex')}`, version: 'dependency-topological-order/v1', cases: Object.freeze(cases) });
|
|
173
|
+
}
|
|
174
|
+
/** Creates private random cases after an immutable qualification binding has been frozen. */
|
|
175
|
+
export function generateProspectiveDataset(name = generatorName) {
|
|
176
|
+
if (name === 'dependency-topological-order/v1')
|
|
177
|
+
return topologyDataset();
|
|
178
|
+
if (name === 'template-render-jsonl/v1')
|
|
179
|
+
return templateJsonlDataset();
|
|
180
|
+
if (name === 'template-render/v1') {
|
|
181
|
+
const kinds = ['replay', 'evaluation', 'regression'];
|
|
182
|
+
const cases = kinds.map(kind => {
|
|
183
|
+
const input = templateInput(kind);
|
|
184
|
+
return Object.freeze({ id: `${kind}-${randomBytes(8).toString('hex')}`, kind, stdin: JSON.stringify(input) + '\n', expectedStdout: templateExpected(input), expectedExitCode: 0 });
|
|
185
|
+
});
|
|
186
|
+
return Object.freeze({ id: `prospective-template-render-${randomBytes(12).toString('hex')}`, version: name, cases: Object.freeze(cases) });
|
|
187
|
+
}
|
|
188
|
+
if (name === 'order-summary/v2') {
|
|
189
|
+
const negativeCurrency = currency(), magnitude = randomInt(2, 250_001);
|
|
190
|
+
const evaluationOrders = [
|
|
191
|
+
{ id: randomBytes(8).toString('hex'), currency: negativeCurrency, amountCents: -magnitude, status: 'paid' },
|
|
192
|
+
{ id: randomBytes(8).toString('hex'), currency: negativeCurrency, amountCents: randomInt(1, magnitude), status: 'pending' },
|
|
193
|
+
{ id: randomBytes(8).toString('hex'), currency: negativeCurrency, amountCents: randomInt(1, 250_001), status: 'cancelled' },
|
|
194
|
+
{ id: randomBytes(8).toString('hex'), currency: currency(), amountCents: -randomInt(1, 250_001), status: 'paid' },
|
|
195
|
+
];
|
|
196
|
+
const cases = [
|
|
197
|
+
{ id: `replay-empty-${randomBytes(8).toString('hex')}`, kind: 'replay', stdin: '[]\n', expectedStdout: '{}\n', expectedExitCode: 0 },
|
|
198
|
+
{ id: `evaluation-negative-${randomBytes(8).toString('hex')}`, kind: 'evaluation', stdin: JSON.stringify(evaluationOrders) + '\n', expectedStdout: v2expected(evaluationOrders), expectedExitCode: 0 },
|
|
199
|
+
(() => { const orders = Array.from({ length: 3 + randomInt(5) }, (_, index) => v2order(index)); return { id: `regression-${randomBytes(8).toString('hex')}`, kind: 'regression', stdin: JSON.stringify(orders) + '\n', expectedStdout: v2expected(orders), expectedExitCode: 0 }; })(),
|
|
200
|
+
];
|
|
201
|
+
return Object.freeze({ id: `prospective-order-summary-v2-${randomBytes(12).toString('hex')}`, version: name, cases: Object.freeze(cases) });
|
|
202
|
+
}
|
|
203
|
+
if (name !== 'order-summary/v1')
|
|
204
|
+
throw new Error('prospective-holdout: unsupported generator');
|
|
205
|
+
const kinds = ['replay', 'evaluation', 'regression'];
|
|
206
|
+
const cases = kinds.map((kind, index) => {
|
|
207
|
+
const orders = Array.from({ length: 3 + randomInt(6) }, (_, item) => order(index * 16 + item));
|
|
208
|
+
// Every dataset exercises exclusion, zero values, and same-currency accumulation without selecting against an arm.
|
|
209
|
+
orders.push({ id: `edge-cancelled-${index}`, currency: 'USD', cents: 99999, status: 'cancelled' }, { id: `edge-zero-${index}`, currency: 'USD', cents: 0, status: 'paid' }, { id: `edge-sum-${index}`, currency: 'USD', cents: randomInt(1, 1000), status: 'paid' });
|
|
210
|
+
return Object.freeze({ id: `${kind}-${randomBytes(8).toString('hex')}`, kind, stdin: JSON.stringify(orders) + '\n', expectedStdout: expected(orders), expectedExitCode: 0 });
|
|
211
|
+
});
|
|
212
|
+
return Object.freeze({ id: `prospective-order-summary-${randomBytes(12).toString('hex')}`, version: generatorName, cases: Object.freeze(cases) });
|
|
213
|
+
}
|
|
214
|
+
export function createProspectiveCertificate(binding, dataset, privateKey, freezeId) {
|
|
215
|
+
if (!validBinding(binding) || typeof freezeId !== 'string' || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(freezeId))
|
|
216
|
+
throw new Error('prospective-holdout: invalid frozen binding');
|
|
217
|
+
const key = privateKey instanceof KeyObject ? privateKey : createPrivateKey(privateKey);
|
|
218
|
+
if (key.type !== 'private' || key.asymmetricKeyType !== 'ed25519')
|
|
219
|
+
throw new Error('prospective-holdout: private key must be Ed25519');
|
|
220
|
+
if (!isProspectiveGeneratorName(dataset.version))
|
|
221
|
+
throw new Error('prospective-holdout: unsupported dataset generator');
|
|
222
|
+
const name = dataset.version;
|
|
223
|
+
const profile = prospectiveGeneratorProfile(name);
|
|
224
|
+
const unsigned = { protocol, freezeId, binding, generatorDigest: profile.digest, profileVersion: profile.version, profileDigest: profile.digest, datasetDigest: prospectiveDatasetDigest(dataset), publicKey: createPublicKey(key).export({ format: 'pem', type: 'spki' }).toString(), frozenSequence: 1, generatedSequence: 2 };
|
|
225
|
+
return Object.freeze({ ...unsigned, signature: sign(null, Buffer.from(canonical(unsigned)), key).toString('base64url') });
|
|
226
|
+
}
|
|
227
|
+
/** Strictly checks a prospective certificate and its binding to the pinned authority key. */
|
|
228
|
+
export function verifyProspectiveCertificate(value, expectedBinding, pinnedKey, expectedGeneratorDigest) {
|
|
229
|
+
const legacy = exact(value, ['protocol', 'freezeId', 'binding', 'generatorDigest', 'datasetDigest', 'publicKey', 'frozenSequence', 'generatedSequence', 'signature']);
|
|
230
|
+
const profiled = exact(value, ['protocol', 'freezeId', 'binding', 'generatorDigest', 'profileVersion', 'profileDigest', 'datasetDigest', 'publicKey', 'frozenSequence', 'generatedSequence', 'signature']);
|
|
231
|
+
if ((!legacy && !profiled) || !validBinding(expectedBinding)
|
|
232
|
+
|| value.protocol !== protocol || typeof value.freezeId !== 'string' || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(value.freezeId)
|
|
233
|
+
|| !validBinding(value.binding) || !same(value.binding, expectedBinding) || typeof value.generatorDigest !== 'string' || value.generatorDigest !== expectedGeneratorDigest
|
|
234
|
+
|| typeof value.datasetDigest !== 'string' || !digestPattern.test(value.datasetDigest) || value.publicKey !== pinnedKey || value.frozenSequence !== 1 || value.generatedSequence !== 2 || typeof value.signature !== 'string' || value.signature.length < 32 || value.signature.length > 512)
|
|
235
|
+
return false;
|
|
236
|
+
const certificate = value;
|
|
237
|
+
if (profiled) {
|
|
238
|
+
if (!isProspectiveGeneratorName(value.profileVersion)
|
|
239
|
+
|| value.profileDigest !== value.generatorDigest || prospectiveGeneratorDigest(value.profileVersion) !== value.profileDigest)
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
else if (![generatorDigest, generatorV2Digest].includes(String(certificate.generatorDigest)))
|
|
243
|
+
return false;
|
|
244
|
+
try {
|
|
245
|
+
if (createPublicKey(pinnedKey).asymmetricKeyType !== 'ed25519')
|
|
246
|
+
return false;
|
|
247
|
+
const { signature: signatureValue, ...unsigned } = value;
|
|
248
|
+
return verify(null, Buffer.from(canonical(unsigned)), pinnedKey, Buffer.from(signatureValue, 'base64url'));
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=prospective-holdout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prospective-holdout.js","sourceRoot":"","sources":["../src/prospective-holdout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAG5H,MAAM,aAAa,GAAG,iBAAiB,CAAA;AACvC,MAAM,QAAQ,GAAG,yCAAkD,CAAA;AAEnE,MAAM,CAAC,MAAM,yBAAyB,GAAwC,MAAM,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,iCAAiC,CAAC,CAAC,CAAA;AAC1N,MAAM,aAAa,GAAG,kBAA2B,CAAA;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,6NAA6N,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACvS,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,wVAAwV,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7Z,MAAM,sBAAsB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,mSAAmS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7W,MAAM,2BAA2B,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,oeAAoe,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnjB,MAAM,kCAAkC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,giBAAgiB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACtnB,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,yBAAyB,CAAC,QAAQ,CAAC,KAAiC,CAAC,CAAA;AAC3G,CAAC;AACD,MAAM,UAAU,0BAA0B,CAAC,IAA8B;IACvE,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,eAAe,CAAA;IACvD,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,iBAAiB,CAAA;IACzD,IAAI,IAAI,KAAK,oBAAoB;QAAE,OAAO,sBAAsB,CAAA;IAChE,IAAI,IAAI,KAAK,0BAA0B;QAAE,OAAO,2BAA2B,CAAA;IAC3E,IAAI,IAAI,KAAK,iCAAiC;QAAE,OAAO,kCAAkC,CAAA;IACzF,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;AAC/D,CAAC;AACD,MAAM,UAAU,2BAA2B,CAAC,IAA8B;IACxE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACnF,CAAC;AAkBD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACtE,MAAM,MAAM,GAAG,KAAgC,CAAA;IAC/C,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AACnH,CAAC;AACD,MAAM,UAAU,wBAAwB,CAAC,OAAuB,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;AAClJ,SAAS,KAAK,CAAC,KAAc,IAAsC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC,CAAA,CAAC,CAAC;AACrW,SAAS,KAAK,CAAC,KAAc,EAAE,QAA2B,IAAsC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA,CAAC,CAAC;AACrR,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;IAC7G,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;WAC5E,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;WACxJ,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;WAC/H,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC;WACnG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;AACvH,CAAC;AACD,SAAS,IAAI,CAAC,IAAa,EAAE,KAAc,IAAa,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;AACrG,SAAS,QAAQ,KAAa,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;AAChG,SAAS,KAAK,CAAC,KAAa;IAC1B,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IACvD,OAAO,EAAE,EAAE,EAAE,KAAK,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;AAC7J,CAAC;AACD,SAAS,QAAQ,CAAC,MAA0C;IAC1D,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,QAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAkB,CAAC,IAAI,CAAC,CAAC,GAAI,IAAI,CAAC,KAAgB,CAAA;IAC7J,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;AAC9I,CAAC;AACD,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IACvD,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;AAC3K,CAAC;AACD,SAAS,UAAU,CAAC,MAA0C;IAC5D,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,QAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAkB,CAAC,IAAI,CAAC,CAAC,GAAI,IAAI,CAAC,WAAsB,CAAA;IACnK,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;AAC9I,CAAC;AACD,SAAS,aAAa,CAAC,IAAyB;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxF,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,KAAK,oBAAoB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAA;IAC7G,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO;YAChC,QAAQ,EAAE,+EAA+E;YACzF,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,SAAS,EAAE,EAAE;SACvE,CAAA;IACD,OAAO;QACL,QAAQ,EAAE,6EAA6E;QACvF,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,SAAS,EAAE,EAAE;KAC/D,CAAA;AACH,CAAC;AACD,SAAS,gBAAgB,CAAC,KAAqE;IAC7F,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,WAAW,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;AACxK,CAAC;AACD,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxF,OAAO;QACL,QAAQ,EAAE,OAAO,KAAK,0EAA0E;QAChG,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,SAAS,EAAE,EAAE;KAC3E,CAAA;AACH,CAAC;AACD,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAsD,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;IAC/I,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;QACzF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI;YAC1E,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,qCAAqC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AACxK,CAAC;AACD,SAAS,QAAQ,CAAI,MAAoB;IACvC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IAC1B,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAE,EAAE,MAAM,CAAC,KAAK,CAAE,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AACD,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,OAAO,MAAM,CAAC,IAAI,GAAG,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC5E,OAAO,CAAC,GAAG,MAAM,CAAC,CAAA;AACpB,CAAC;AACD,SAAS,aAAa,CAAC,KAA6C;IAClE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAE,CAAA;IACjD,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;IAC3E,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAA;IACnH,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,GAAG,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,gBAAgB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;IACrK,OAAO,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAC7K,CAAC;AACD,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,EAAE,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,SAAQ;QACjG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAA0B,CAAA;QAClD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,KAAK,EAAE,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAc,CAAC,CAAC,CAAC,CAAA;IAC/H,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAqB,CAAA;QAChE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,GAAG,CAAC,CAAC,CAAA;IAClF,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,GAAa,EAAE,CAAA;IAC/F,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,GAAG,CAAC,CAAC;YAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAC1E,IAAI,SAAS,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,CAAA;IACd,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5E,CAAC;AACD,SAAS,eAAe;IACtB,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC1E,MAAM,WAAW,GAAuB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAE5N,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACpC,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,QAAQ,GAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAErH,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACtC,MAAM,UAAU,GAAuB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAC/J,MAAM,KAAK,GAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7H,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAA;IACtJ,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,4CAA4C,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AACtL,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,0BAA0B,CAAC,OAAiC,aAAa;IACvF,IAAI,IAAI,KAAK,iCAAiC;QAAE,OAAO,eAAe,EAAE,CAAA;IACxE,IAAI,IAAI,KAAK,0BAA0B;QAAE,OAAO,oBAAoB,EAAE,CAAA;IACtE,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAClC,MAAM,KAAK,GAA0B,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;QAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YACjC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAA;QACpL,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,+BAA+B,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC5I,CAAC;IACD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAChC,MAAM,gBAAgB,GAAG,QAAQ,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACtE,MAAM,gBAAgB,GAAG;YACvB,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;YAC3G,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;YAC3H,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;YAC3H,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;SAClH,CAAA;QACD,MAAM,KAAK,GAAkB;YAC3B,EAAE,EAAE,EAAE,gBAAgB,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,EAAE;YACpI,EAAE,EAAE,EAAE,uBAAuB,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE;YACtM,CAAC,GAAG,EAAE,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,cAAc,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,YAAqB,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAA,CAAC,CAAC,CAAC,EAAE;SAC/R,CAAA;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,gCAAgC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC7I,CAAC;IACD,IAAI,IAAI,KAAK,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC9F,MAAM,KAAK,GAA0B,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;IAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QAC9F,mHAAmH;QACnH,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACpQ,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9K,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,6BAA6B,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AACnJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAA6B,EAAE,OAAuB,EAAE,UAAuC,EAAE,QAAgB;IAC5J,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,wEAAwE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IACtN,MAAM,GAAG,GAAG,UAAU,YAAY,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;IACvF,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,iBAAiB,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACtI,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAmC,CAAA;IACxD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAU,EAAE,iBAAiB,EAAE,CAAU,EAAE,CAAA;IAClV,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;AAC3H,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,4BAA4B,CAAC,KAAc,EAAE,eAAqC,EAAE,SAAiB,EAAE,uBAA+B;IACpJ,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAA;IACrK,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAA;IAC1M,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;WACvD,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,wEAAwE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;WACnK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,eAAe,KAAK,uBAAuB;WACvK,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,KAAK,CAAA;IAC5S,MAAM,WAAW,GAAG,KAAgC,CAAA;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC;eAChD,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,eAAe,IAAI,0BAA0B,CAAC,KAAK,CAAC,cAA0C,CAAC,KAAK,KAAK,CAAC,aAAa;YAAE,OAAO,KAAK,CAAA;IAC1K,CAAC;SAAM,IAAI,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC5G,IAAI,CAAC;QACH,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,iBAAiB,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAC5E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAA;IAC5G,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillDefinition } from './definition.js';
|
|
2
|
+
import { type CanaryAdmission } from './holdout-qualification.js';
|
|
3
|
+
export interface CanaryAdmissionTemplate {
|
|
4
|
+
readonly protocol: 'assistant-skills/canary-admission-template/v1';
|
|
5
|
+
readonly skillName: string;
|
|
6
|
+
readonly taskFamily: CanaryAdmission['taskFamily'];
|
|
7
|
+
}
|
|
8
|
+
/** Strictly validate the configured, parent-agnostic repair admission template. */
|
|
9
|
+
export declare function validateCanaryAdmissionTemplate(value: unknown): asserts value is CanaryAdmissionTemplate;
|
|
10
|
+
export declare function materializeCanaryAdmission(template: CanaryAdmissionTemplate, parent: SkillDefinition, candidate: SkillDefinition): CanaryAdmission;
|
|
11
|
+
//# sourceMappingURL=repair-admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-admission.d.ts","sourceRoot":"","sources":["../src/repair-admission.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE1F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAA;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;CACnD;AAMD,mFAAmF;AACnF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,uBAAuB,CAOxG;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,GAAG,eAAe,CAOlJ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { acceptanceDigest } from '@dsh-enhanced/task-acceptance-contract';
|
|
2
|
+
import { validateCanaryAdmission } from './holdout-qualification.js';
|
|
3
|
+
const hex = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
|
|
4
|
+
const plain = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype
|
|
5
|
+
&& Object.getOwnPropertySymbols(value).length === 0 && Object.values(Object.getOwnPropertyDescriptors(value)).every(item => item.enumerable && 'value' in item);
|
|
6
|
+
/** Strictly validate the configured, parent-agnostic repair admission template. */
|
|
7
|
+
export function validateCanaryAdmissionTemplate(value) {
|
|
8
|
+
if (!plain(value) || Object.keys(value).length !== 3 || !Object.hasOwn(value, 'protocol') || !Object.hasOwn(value, 'skillName') || !Object.hasOwn(value, 'taskFamily')
|
|
9
|
+
|| value.protocol !== 'assistant-skills/canary-admission-template/v1' || typeof value.skillName !== 'string' || !/^[a-z](?:[a-z0-9-]{0,62}[a-z0-9])?$/u.test(value.skillName)
|
|
10
|
+
|| !plain(value.taskFamily) || Object.keys(value.taskFamily).length !== 2 || !hex(value.taskFamily.goalDefinitionDigest)
|
|
11
|
+
|| !plain(value.taskFamily.outcomeProfile) || Object.keys(value.taskFamily.outcomeProfile).length !== 3
|
|
12
|
+
|| typeof value.taskFamily.outcomeProfile.id !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/u.test(value.taskFamily.outcomeProfile.id)
|
|
13
|
+
|| !Number.isSafeInteger(value.taskFamily.outcomeProfile.version) || value.taskFamily.outcomeProfile.version < 1 || !hex(value.taskFamily.outcomeProfile.digest))
|
|
14
|
+
throw new Error('assistant-skills: invalid canary admission template');
|
|
15
|
+
}
|
|
16
|
+
export function materializeCanaryAdmission(template, parent, candidate) {
|
|
17
|
+
validateCanaryAdmissionTemplate(template);
|
|
18
|
+
const admission = { protocol: 'assistant-skills/canary-admission/v1', skillName: template.skillName,
|
|
19
|
+
parentDefinitionDigest: acceptanceDigest(parent), candidateDefinitionDigest: acceptanceDigest(candidate), taskFamily: template.taskFamily };
|
|
20
|
+
validateCanaryAdmission(admission);
|
|
21
|
+
if (admission.skillName !== parent.name || admission.skillName !== candidate.name || admission.taskFamily.goalDefinitionDigest !== candidate.source.goal.definition.digest)
|
|
22
|
+
throw new Error('assistant-skills: repair admission does not match exact definitions');
|
|
23
|
+
return Object.freeze(admission);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=repair-admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-admission.js","sourceRoot":"","sources":["../src/repair-admission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAEzE,OAAO,EAAE,uBAAuB,EAAwB,MAAM,4BAA4B,CAAA;AAQ1F,MAAM,GAAG,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC3G,MAAM,KAAK,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;OACxL,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC,CAAA;AAEjK,mFAAmF;AACnF,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC;WACjK,KAAK,CAAC,QAAQ,KAAK,+CAA+C,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;WAC1K,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC;WACrH,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC;WACpG,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;WACzI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,IAAK,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,OAAkB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;AACxP,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiC,EAAE,MAAuB,EAAE,SAA0B;IAC/H,+BAA+B,CAAC,QAAQ,CAAC,CAAA;IACzC,MAAM,SAAS,GAAoB,EAAE,QAAQ,EAAE,sCAAsC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS;QAClH,sBAAsB,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC7I,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAClC,IAAI,SAAS,CAAC,SAAS,KAAK,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,oBAAoB,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;IAClQ,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { type Agent } from '@deepseek-ai/dsh-agent';
|
|
3
|
+
import type { GoalScope, HostFailureTriggerEvidence } from '@dsh-enhanced/assistant-goals';
|
|
4
|
+
export interface OwnerRepairAgentInput {
|
|
5
|
+
id: string;
|
|
6
|
+
authorizationDigest: string;
|
|
7
|
+
scope: GoalScope;
|
|
8
|
+
ownerRouteId: string;
|
|
9
|
+
trigger: HostFailureTriggerEvidence;
|
|
10
|
+
objective: string;
|
|
11
|
+
maxGoalRounds: number;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
provider: string;
|
|
14
|
+
model: string;
|
|
15
|
+
maxModelCalls: number;
|
|
16
|
+
maxToolCalls: number;
|
|
17
|
+
maxOutputTokens: number;
|
|
18
|
+
maxDurationMs: number;
|
|
19
|
+
allowedTools: readonly string[];
|
|
20
|
+
iteration?: number;
|
|
21
|
+
initialModelCalls?: number;
|
|
22
|
+
initialToolCalls?: number;
|
|
23
|
+
recordUsage?: (kind: 'model' | 'tool') => void;
|
|
24
|
+
assertCurrent: () => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Owns short-lived Agents for already-authorized repair Goals. It deliberately
|
|
28
|
+
* does not submit a user message: the mounted native goal-round driver is the
|
|
29
|
+
* only continuation producer after Goals creates the armed native goal.
|
|
30
|
+
*/
|
|
31
|
+
export declare class OwnerRepairAgentRuntime {
|
|
32
|
+
#private;
|
|
33
|
+
private readonly ctx;
|
|
34
|
+
constructor(ctx: Context);
|
|
35
|
+
get(sessionId: string): Agent | undefined;
|
|
36
|
+
create(input: OwnerRepairAgentInput, signal?: AbortSignal): Promise<{
|
|
37
|
+
sessionId: string;
|
|
38
|
+
goalId: string;
|
|
39
|
+
}>;
|
|
40
|
+
closeSession(sessionId: string): Promise<void>;
|
|
41
|
+
closeAuthorization(authorizationId: string): Promise<void>;
|
|
42
|
+
dispose(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=repair-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-agent.d.ts","sourceRoot":"","sources":["../src/repair-agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAyB,KAAK,KAAK,EAAoB,MAAM,wBAAwB,CAAA;AAG5F,OAAO,KAAK,EAAE,SAAS,EAAE,0BAA0B,EAA8B,MAAM,+BAA+B,CAAA;AAItH,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,0BAA0B,CAAA;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B;AAuBD;;;;GAIG;AACH,qBAAa,uBAAuB;;IAUtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,OAAO;IAIzC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAEnC,MAAM,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAwH1G,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB/B"}
|