@agentplat/mesh-conformance 0.3.0-beta.1 → 0.3.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -3
- package/dist/control-fixtures.d.ts +4 -0
- package/dist/control-fixtures.d.ts.map +1 -0
- package/dist/control-fixtures.js +383 -0
- package/dist/control-fixtures.js.map +1 -0
- package/dist/control.d.ts +146 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +504 -0
- package/dist/control.js.map +1 -0
- package/dist/planning.d.ts +117 -0
- package/dist/planning.d.ts.map +1 -0
- package/dist/planning.js +656 -0
- package/dist/planning.js.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/package.json +15 -4
package/dist/control.js
ADDED
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { authorizeDelegationMandateAtV1, issueGovernedActionPermitV1, registerWorkContractV1, transitionGovernedActionPermitV1, validateCollectiveAuthorityStateV1, validateCollectiveDecisionRecordV1, validateCollectiveExecutionStateV1, validateWorkContractV1, } from "@agentplat/collective-control";
|
|
2
|
+
import { validateDelegationMandateProposalV1 } from "@agentplat/collective-control/rooms";
|
|
3
|
+
import { controlDigest, issueActionGrantV1, } from "@agentplat/inference-control/tools";
|
|
4
|
+
export { createControlConformanceFixturesV1 } from "./control-fixtures.js";
|
|
5
|
+
export const CONTROL_CONFORMANCE_VERSION = 1;
|
|
6
|
+
export const CONTROL_CONFORMANCE_CAPABILITIES = Object.freeze([
|
|
7
|
+
"control.portable",
|
|
8
|
+
"control.repositories",
|
|
9
|
+
"control.rooms",
|
|
10
|
+
"control.persistence",
|
|
11
|
+
]);
|
|
12
|
+
export const CONTROL_REQUIRED_CONFORMANCE_CAPABILITIES = Object.freeze([
|
|
13
|
+
"control.portable",
|
|
14
|
+
"control.repositories",
|
|
15
|
+
]);
|
|
16
|
+
export const CONTROL_CONFORMANCE_CASES_V1 = Object.freeze([
|
|
17
|
+
define("control.authority.unknown_digest", "control.portable"),
|
|
18
|
+
define("control.work.scope_widening", "control.portable"),
|
|
19
|
+
define("control.permit.single_use", "control.portable"),
|
|
20
|
+
define("control.permit.indeterminate_retained", "control.portable"),
|
|
21
|
+
define("control.authority.cas_stale", "control.repositories"),
|
|
22
|
+
define("control.execution.cas_stale", "control.repositories"),
|
|
23
|
+
define("control.grant.exact_idempotency", "control.repositories"),
|
|
24
|
+
define("control.grant.substitution_conflict", "control.repositories"),
|
|
25
|
+
define("control.grant.cas_stale", "control.repositories"),
|
|
26
|
+
define("control.evidence.chain", "control.repositories"),
|
|
27
|
+
define("control.evidence.conflict", "control.repositories"),
|
|
28
|
+
define("control.evidence.redaction", "control.repositories"),
|
|
29
|
+
define("control.rooms.proposal_inert", "control.rooms"),
|
|
30
|
+
define("control.persistence.restart", "control.persistence"),
|
|
31
|
+
]);
|
|
32
|
+
export async function runControlConformanceV1(options) {
|
|
33
|
+
const capabilities = normalizeCapabilities(options.declaredCapabilities);
|
|
34
|
+
for (const required of CONTROL_REQUIRED_CONFORMANCE_CAPABILITIES) {
|
|
35
|
+
if (!capabilities.has(required))
|
|
36
|
+
throw new TypeError("Required control conformance capability is missing");
|
|
37
|
+
}
|
|
38
|
+
if (typeof options.factory !== "function")
|
|
39
|
+
throw new TypeError("Control conformance factory is required");
|
|
40
|
+
const seed = boundedInteger(options.seed ?? 0, "seed", 0, 0xffff_ffff);
|
|
41
|
+
const timeoutMs = boundedInteger(options.timeoutMs ?? 5_000, "timeoutMs", 10, 60_000);
|
|
42
|
+
const cleanupTimeoutMs = boundedInteger(options.cleanupTimeoutMs ?? 2_000, "cleanupTimeoutMs", 10, 30_000);
|
|
43
|
+
const clock = options.clock ?? Date.now;
|
|
44
|
+
const results = [];
|
|
45
|
+
for (const definition of CONTROL_CONFORMANCE_CASES_V1) {
|
|
46
|
+
if (!capabilities.has(definition.capability)) {
|
|
47
|
+
results.push(result(definition, "not_declared", null, 0));
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
results.push(await runCase({
|
|
51
|
+
definition,
|
|
52
|
+
factory: options.factory,
|
|
53
|
+
seed,
|
|
54
|
+
timeoutMs,
|
|
55
|
+
cleanupTimeoutMs,
|
|
56
|
+
signal: options.signal,
|
|
57
|
+
clock,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return Object.freeze(results);
|
|
61
|
+
}
|
|
62
|
+
export function createControlConformanceReportV1(input) {
|
|
63
|
+
exactRecord(input, [
|
|
64
|
+
"suiteDigest",
|
|
65
|
+
"fixtureManifestDigest",
|
|
66
|
+
"implementation",
|
|
67
|
+
"declaredCapabilities",
|
|
68
|
+
"seed",
|
|
69
|
+
"cases",
|
|
70
|
+
]);
|
|
71
|
+
exactRecord(input.implementation, ["name", "version"]);
|
|
72
|
+
if (!input.implementation?.name ||
|
|
73
|
+
!input.implementation.version ||
|
|
74
|
+
input.implementation.name.length > 128 ||
|
|
75
|
+
input.implementation.version.length > 64)
|
|
76
|
+
throw new TypeError("Control conformance implementation is invalid");
|
|
77
|
+
const capabilities = [
|
|
78
|
+
...normalizeCapabilities(input.declaredCapabilities),
|
|
79
|
+
].sort();
|
|
80
|
+
const suiteDigest = boundedDigest(input.suiteDigest);
|
|
81
|
+
const fixtureManifestDigest = boundedDigest(input.fixtureManifestDigest);
|
|
82
|
+
const seed = boundedInteger(input.seed, "seed", 0, 0xffff_ffff);
|
|
83
|
+
if (input.cases.length !== CONTROL_CONFORMANCE_CASES_V1.length)
|
|
84
|
+
throw new TypeError("Control conformance case coverage is incomplete");
|
|
85
|
+
const byId = new Map(input.cases.map((entry) => [entry.caseId, entry]));
|
|
86
|
+
if (byId.size !== input.cases.length)
|
|
87
|
+
throw new TypeError("Control conformance case is duplicated");
|
|
88
|
+
const cases = CONTROL_CONFORMANCE_CASES_V1.map((definition) => {
|
|
89
|
+
const entry = byId.get(definition.caseId);
|
|
90
|
+
if (entry)
|
|
91
|
+
exactRecord(entry, [
|
|
92
|
+
"caseId",
|
|
93
|
+
"capability",
|
|
94
|
+
"outcome",
|
|
95
|
+
"reasonCode",
|
|
96
|
+
"durationMs",
|
|
97
|
+
]);
|
|
98
|
+
if (!entry ||
|
|
99
|
+
entry.capability !== definition.capability ||
|
|
100
|
+
!["passed", "failed", "not_declared"].includes(entry.outcome) ||
|
|
101
|
+
!Number.isSafeInteger(entry.durationMs) ||
|
|
102
|
+
entry.durationMs < 0 ||
|
|
103
|
+
entry.durationMs > 60_000 ||
|
|
104
|
+
(entry.outcome === "failed") !== (entry.reasonCode !== null) ||
|
|
105
|
+
(entry.reasonCode !== null &&
|
|
106
|
+
!/^[a-z][a-z0-9._:-]{0,63}$/u.test(entry.reasonCode)) ||
|
|
107
|
+
(capabilities.includes(entry.capability) &&
|
|
108
|
+
entry.outcome === "not_declared") ||
|
|
109
|
+
(!capabilities.includes(entry.capability) &&
|
|
110
|
+
entry.outcome !== "not_declared"))
|
|
111
|
+
throw new TypeError("Control conformance case result is invalid");
|
|
112
|
+
return Object.freeze({ ...entry });
|
|
113
|
+
});
|
|
114
|
+
const counts = Object.freeze({
|
|
115
|
+
passed: cases.filter((entry) => entry.outcome === "passed").length,
|
|
116
|
+
failed: cases.filter((entry) => entry.outcome === "failed").length,
|
|
117
|
+
notDeclared: cases.filter((entry) => entry.outcome === "not_declared")
|
|
118
|
+
.length,
|
|
119
|
+
total: cases.length,
|
|
120
|
+
});
|
|
121
|
+
return Object.freeze({
|
|
122
|
+
schemaVersion: 1,
|
|
123
|
+
conformanceVersion: CONTROL_CONFORMANCE_VERSION,
|
|
124
|
+
suiteDigest,
|
|
125
|
+
fixtureManifestDigest,
|
|
126
|
+
implementation: Object.freeze({ ...input.implementation }),
|
|
127
|
+
declaredCapabilities: Object.freeze(capabilities),
|
|
128
|
+
seed,
|
|
129
|
+
cases: Object.freeze(cases),
|
|
130
|
+
counts,
|
|
131
|
+
verdict: counts.failed === 0 ? "passed" : "failed",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export function validateControlConformanceReportV1(value) {
|
|
135
|
+
exactRecord(value, [
|
|
136
|
+
"schemaVersion",
|
|
137
|
+
"conformanceVersion",
|
|
138
|
+
"suiteDigest",
|
|
139
|
+
"fixtureManifestDigest",
|
|
140
|
+
"implementation",
|
|
141
|
+
"declaredCapabilities",
|
|
142
|
+
"seed",
|
|
143
|
+
"cases",
|
|
144
|
+
"counts",
|
|
145
|
+
"verdict",
|
|
146
|
+
]);
|
|
147
|
+
const report = value;
|
|
148
|
+
if (report.schemaVersion !== 1 ||
|
|
149
|
+
report.conformanceVersion !== CONTROL_CONFORMANCE_VERSION)
|
|
150
|
+
throw new TypeError("Control conformance report version is unsupported");
|
|
151
|
+
const normalized = createControlConformanceReportV1({
|
|
152
|
+
suiteDigest: report.suiteDigest,
|
|
153
|
+
fixtureManifestDigest: report.fixtureManifestDigest,
|
|
154
|
+
implementation: report.implementation,
|
|
155
|
+
declaredCapabilities: report.declaredCapabilities,
|
|
156
|
+
seed: report.seed,
|
|
157
|
+
cases: report.cases,
|
|
158
|
+
});
|
|
159
|
+
exactRecord(report.counts, ["passed", "failed", "notDeclared", "total"]);
|
|
160
|
+
if (normalized.counts.passed !== report.counts.passed ||
|
|
161
|
+
normalized.counts.failed !== report.counts.failed ||
|
|
162
|
+
normalized.counts.notDeclared !== report.counts.notDeclared ||
|
|
163
|
+
normalized.counts.total !== report.counts.total ||
|
|
164
|
+
normalized.verdict !== report.verdict)
|
|
165
|
+
throw new TypeError("Control conformance report aggregate is inconsistent");
|
|
166
|
+
return normalized;
|
|
167
|
+
}
|
|
168
|
+
async function runCase(input) {
|
|
169
|
+
const started = input.clock();
|
|
170
|
+
const controller = new AbortController();
|
|
171
|
+
const relay = () => controller.abort(new Error("aborted"));
|
|
172
|
+
input.signal?.addEventListener("abort", relay, { once: true });
|
|
173
|
+
let adapter;
|
|
174
|
+
let timeout;
|
|
175
|
+
let outcome = "passed";
|
|
176
|
+
let reasonCode = null;
|
|
177
|
+
try {
|
|
178
|
+
if (input.signal?.aborted)
|
|
179
|
+
throw new Error("aborted");
|
|
180
|
+
timeout = setTimeout(() => controller.abort(new Error("timeout")), input.timeoutMs);
|
|
181
|
+
adapter = await raceAbort(input.factory(input.definition.caseId, {
|
|
182
|
+
seed: input.seed,
|
|
183
|
+
signal: controller.signal,
|
|
184
|
+
}), controller.signal);
|
|
185
|
+
validateAdapter(adapter);
|
|
186
|
+
await raceAbort(verifyCase(input.definition.caseId, adapter), controller.signal);
|
|
187
|
+
if (controller.signal.aborted)
|
|
188
|
+
throw controller.signal.reason;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
outcome = "failed";
|
|
192
|
+
reasonCode =
|
|
193
|
+
error instanceof Error && error.message === "timeout"
|
|
194
|
+
? "timeout"
|
|
195
|
+
: error instanceof Error && error.message === "aborted"
|
|
196
|
+
? "aborted"
|
|
197
|
+
: "assertion_failed";
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
if (timeout !== undefined)
|
|
201
|
+
clearTimeout(timeout);
|
|
202
|
+
input.signal?.removeEventListener("abort", relay);
|
|
203
|
+
if (adapter?.cleanup) {
|
|
204
|
+
let cleanupTimer;
|
|
205
|
+
try {
|
|
206
|
+
await Promise.race([
|
|
207
|
+
Promise.resolve().then(adapter.cleanup),
|
|
208
|
+
new Promise((_resolve, reject) => {
|
|
209
|
+
cleanupTimer = setTimeout(() => reject(new Error("cleanup_timeout")), input.cleanupTimeoutMs);
|
|
210
|
+
}),
|
|
211
|
+
]);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
outcome = "failed";
|
|
215
|
+
reasonCode = "cleanup_failed";
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
if (cleanupTimer !== undefined)
|
|
219
|
+
clearTimeout(cleanupTimer);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return result(input.definition, outcome, reasonCode, duration(started, input.clock()));
|
|
224
|
+
}
|
|
225
|
+
async function verifyCase(caseId, adapter) {
|
|
226
|
+
const fixture = adapter.fixtures;
|
|
227
|
+
switch (caseId) {
|
|
228
|
+
case "control.authority.unknown_digest": {
|
|
229
|
+
const state = validateCollectiveAuthorityStateV1(await adapter.authorityRepository.read());
|
|
230
|
+
const decision = authorizeDelegationMandateAtV1(state, {
|
|
231
|
+
mandateId: fixture.mandate.statement.mandateId,
|
|
232
|
+
mandateDigest: changedDigest(fixture.mandate.mandateDigest),
|
|
233
|
+
at: "2026-08-01T00:01:00.000Z",
|
|
234
|
+
});
|
|
235
|
+
assert(!decision.authorized, "unknown mandate digest was accepted");
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
case "control.work.scope_widening": {
|
|
239
|
+
const valid = registerWorkContractV1(fixture.emptyExecutionState, {
|
|
240
|
+
mandate: fixture.mandate,
|
|
241
|
+
workContract: fixture.validWorkContract,
|
|
242
|
+
authorizedAt: "2026-08-01T00:01:00.000Z",
|
|
243
|
+
acceptedAtLogicalMs: 10,
|
|
244
|
+
});
|
|
245
|
+
const widened = registerWorkContractV1(fixture.emptyExecutionState, {
|
|
246
|
+
mandate: fixture.mandate,
|
|
247
|
+
workContract: fixture.widenedWorkContract,
|
|
248
|
+
authorizedAt: "2026-08-01T00:01:00.000Z",
|
|
249
|
+
acceptedAtLogicalMs: 10,
|
|
250
|
+
});
|
|
251
|
+
assert(valid.accepted && !widened.accepted, "work narrowing was not enforced");
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
case "control.permit.single_use": {
|
|
255
|
+
let state = issuePermit(fixture);
|
|
256
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "reserved", null, 21);
|
|
257
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "dispatching", null, 22);
|
|
258
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "dispatched", "outcome:conformance", 23);
|
|
259
|
+
const prior = state.actionPermits.find((permit) => permit.permitId === fixture.actionPermit.permitId);
|
|
260
|
+
const replay = transitionGovernedActionPermitV1(state, {
|
|
261
|
+
permitId: prior.permitId,
|
|
262
|
+
expectedGeneration: prior.generation,
|
|
263
|
+
expectedDigest: prior.permitDigest,
|
|
264
|
+
nextStatus: "dispatched",
|
|
265
|
+
outcomeId: "outcome:conformance",
|
|
266
|
+
logicalTimeMs: 24,
|
|
267
|
+
});
|
|
268
|
+
assert(!replay.accepted && replay.state.stateDigest === state.stateDigest, "permit replay was accepted");
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
case "control.permit.indeterminate_retained": {
|
|
272
|
+
let state = issuePermit(fixture);
|
|
273
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "reserved", null, 21);
|
|
274
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "dispatching", null, 22);
|
|
275
|
+
state = transitionPermit(state, fixture.actionPermit.permitId, "indeterminate", "outcome:unknown", 23);
|
|
276
|
+
const reservation = state.budgetReservations.find((entry) => entry.reservationId === fixture.budgetReservation.reservationId);
|
|
277
|
+
assert(reservation.status === "indeterminate" &&
|
|
278
|
+
reservation.outcomeId === "outcome:unknown", "indeterminate budget was released");
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
case "control.authority.cas_stale": {
|
|
282
|
+
const current = validateCollectiveAuthorityStateV1(await adapter.authorityRepository.read());
|
|
283
|
+
const written = await adapter.authorityRepository.compareAndSwap({
|
|
284
|
+
expectedGeneration: current.generation - 1,
|
|
285
|
+
expectedStateDigest: current.stateDigest,
|
|
286
|
+
nextState: current,
|
|
287
|
+
});
|
|
288
|
+
assert(!written, "stale authority CAS committed");
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
case "control.execution.cas_stale": {
|
|
292
|
+
const current = validateCollectiveExecutionStateV1(await adapter.executionRepository.read());
|
|
293
|
+
const written = await adapter.executionRepository.compareAndSwap({
|
|
294
|
+
expectedGeneration: current.generation - 1,
|
|
295
|
+
expectedStateDigest: current.stateDigest,
|
|
296
|
+
nextState: current,
|
|
297
|
+
});
|
|
298
|
+
assert(!written, "stale execution CAS committed");
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
case "control.grant.exact_idempotency": {
|
|
302
|
+
const first = await issueActionGrantV1(adapter.actionGrantRepository, fixture.actionGrant);
|
|
303
|
+
const second = await issueActionGrantV1(adapter.actionGrantRepository, fixture.actionGrant);
|
|
304
|
+
assert(grantDigest(first) === grantDigest(second), "grant retry changed durable state");
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
case "control.grant.substitution_conflict": {
|
|
308
|
+
await issueActionGrantV1(adapter.actionGrantRepository, fixture.actionGrant);
|
|
309
|
+
let rejected = false;
|
|
310
|
+
try {
|
|
311
|
+
await issueActionGrantV1(adapter.actionGrantRepository, fixture.conflictingActionGrant);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
rejected = true;
|
|
315
|
+
}
|
|
316
|
+
assert(rejected, "grant substitution was accepted");
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
case "control.grant.cas_stale": {
|
|
320
|
+
const grant = await issueActionGrantV1(adapter.actionGrantRepository, fixture.actionGrant);
|
|
321
|
+
const cas = await adapter.actionGrantRepository.compareAndSwapGrant({
|
|
322
|
+
grantId: grant.grantId,
|
|
323
|
+
expectedStateGeneration: grant.stateGeneration,
|
|
324
|
+
expectedGrantDigest: changedDigest(grantDigest(grant)),
|
|
325
|
+
nextGrant: grant,
|
|
326
|
+
nextIdempotency: idempotency(grant),
|
|
327
|
+
});
|
|
328
|
+
assert(cas.status === "conflict", "stale grant CAS committed");
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
case "control.evidence.chain": {
|
|
332
|
+
const [first, second] = fixture.evidenceRecords.map(validateCollectiveDecisionRecordV1);
|
|
333
|
+
const one = await adapter.evidenceSink.append(first);
|
|
334
|
+
const duplicate = await adapter.evidenceSink.append(first);
|
|
335
|
+
const two = await adapter.evidenceSink.append(second);
|
|
336
|
+
const anchor = await adapter.evidenceSink.anchor();
|
|
337
|
+
assert(one.code === "appended" &&
|
|
338
|
+
duplicate.code === "duplicate" &&
|
|
339
|
+
two.code === "appended" &&
|
|
340
|
+
anchor.recordCount === 2 &&
|
|
341
|
+
anchor.latestRecordDigest === second.recordDigest, "evidence chain is not exact-idempotent");
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
case "control.evidence.conflict": {
|
|
345
|
+
const first = fixture.evidenceRecords[0];
|
|
346
|
+
await adapter.evidenceSink.append(first);
|
|
347
|
+
const conflict = await adapter.evidenceSink.append(fixture.conflictingEvidenceRecord);
|
|
348
|
+
assert(conflict.code === "chain_conflict", "evidence conflict was accepted");
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
case "control.evidence.redaction": {
|
|
352
|
+
assert(fixture.secretCanary.length >= 16, "secret canary is not sensitive");
|
|
353
|
+
await adapter.evidenceSink.append(fixture.evidenceRecords[0]);
|
|
354
|
+
const persisted = await adapter.inspectEvidence();
|
|
355
|
+
assert(!JSON.stringify(persisted).includes(fixture.secretCanary), "raw secret was retained in evidence");
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
case "control.rooms.proposal_inert": {
|
|
359
|
+
const proposal = validateDelegationMandateProposalV1(fixture.roomProposal);
|
|
360
|
+
assert(!("proof" in proposal) && !("mandateDigest" in proposal), "Room proposal installed authority");
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
case "control.persistence.restart": {
|
|
364
|
+
assert(adapter.restart !== undefined, "persistence restart is unavailable");
|
|
365
|
+
await issueActionGrantV1(adapter.actionGrantRepository, fixture.actionGrant);
|
|
366
|
+
await adapter.evidenceSink.append(fixture.evidenceRecords[0]);
|
|
367
|
+
const restarted = await adapter.restart();
|
|
368
|
+
const authority = await restarted.authorityRepository.read();
|
|
369
|
+
const execution = await restarted.executionRepository.read();
|
|
370
|
+
const grant = await restarted.actionGrantRepository.loadGrant(fixture.actionGrant.grantId);
|
|
371
|
+
const anchor = await restarted.evidenceSink.anchor();
|
|
372
|
+
assert(authority.stateDigest === fixture.authorityState.stateDigest &&
|
|
373
|
+
execution.stateDigest === fixture.executionState.stateDigest &&
|
|
374
|
+
grant !== undefined &&
|
|
375
|
+
grantDigest(grant) === grantDigest(fixture.actionGrant) &&
|
|
376
|
+
anchor.latestRecordDigest === fixture.evidenceRecords[0].recordDigest, "restart did not preserve exact durable state");
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
function issuePermit(fixture) {
|
|
382
|
+
const decision = issueGovernedActionPermitV1(fixture.executionState, {
|
|
383
|
+
mandate: fixture.mandate,
|
|
384
|
+
budgetReservation: fixture.budgetReservation,
|
|
385
|
+
actionPermit: fixture.actionPermit,
|
|
386
|
+
authorizedAt: "2026-08-01T00:01:00.000Z",
|
|
387
|
+
acceptedAtLogicalMs: 20,
|
|
388
|
+
});
|
|
389
|
+
assert(decision.accepted, "fixture permit could not be issued");
|
|
390
|
+
return decision.state;
|
|
391
|
+
}
|
|
392
|
+
function transitionPermit(state, permitId, nextStatus, outcomeId, logicalTimeMs) {
|
|
393
|
+
const prior = state.actionPermits.find((permit) => permit.permitId === permitId);
|
|
394
|
+
const decision = transitionGovernedActionPermitV1(state, {
|
|
395
|
+
permitId,
|
|
396
|
+
expectedGeneration: prior.generation,
|
|
397
|
+
expectedDigest: prior.permitDigest,
|
|
398
|
+
nextStatus,
|
|
399
|
+
outcomeId,
|
|
400
|
+
logicalTimeMs,
|
|
401
|
+
});
|
|
402
|
+
assert(decision.accepted, `permit transition ${nextStatus} failed`);
|
|
403
|
+
return decision.state;
|
|
404
|
+
}
|
|
405
|
+
function normalizeCapabilities(values) {
|
|
406
|
+
if (!Array.isArray(values) ||
|
|
407
|
+
values.length > CONTROL_CONFORMANCE_CAPABILITIES.length)
|
|
408
|
+
throw new TypeError("Control conformance capabilities are invalid");
|
|
409
|
+
const result = new Set();
|
|
410
|
+
for (const value of values) {
|
|
411
|
+
if (!CONTROL_CONFORMANCE_CAPABILITIES.includes(value) || result.has(value))
|
|
412
|
+
throw new TypeError("Control conformance capability is invalid");
|
|
413
|
+
result.add(value);
|
|
414
|
+
}
|
|
415
|
+
return result;
|
|
416
|
+
}
|
|
417
|
+
function validateAdapter(adapter) {
|
|
418
|
+
if (!adapter?.authorityRepository ||
|
|
419
|
+
!adapter.executionRepository ||
|
|
420
|
+
!adapter.actionGrantRepository ||
|
|
421
|
+
!adapter.evidenceSink ||
|
|
422
|
+
typeof adapter.inspectEvidence !== "function" ||
|
|
423
|
+
!adapter.fixtures)
|
|
424
|
+
throw new TypeError("Control conformance adapter is incomplete");
|
|
425
|
+
validateCollectiveAuthorityStateV1(adapter.fixtures.authorityState);
|
|
426
|
+
validateCollectiveExecutionStateV1(adapter.fixtures.emptyExecutionState);
|
|
427
|
+
validateCollectiveExecutionStateV1(adapter.fixtures.executionState);
|
|
428
|
+
validateWorkContractV1(adapter.fixtures.validWorkContract);
|
|
429
|
+
validateWorkContractV1(adapter.fixtures.widenedWorkContract);
|
|
430
|
+
}
|
|
431
|
+
async function raceAbort(operation, signal) {
|
|
432
|
+
if (signal.aborted)
|
|
433
|
+
throw signal.reason;
|
|
434
|
+
let listener;
|
|
435
|
+
try {
|
|
436
|
+
return await Promise.race([
|
|
437
|
+
Promise.resolve(operation),
|
|
438
|
+
new Promise((_resolve, reject) => {
|
|
439
|
+
listener = () => reject(signal.reason);
|
|
440
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
441
|
+
}),
|
|
442
|
+
]);
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
if (listener)
|
|
446
|
+
signal.removeEventListener("abort", listener);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function result(definition, outcome, reasonCode, durationMs) {
|
|
450
|
+
return Object.freeze({
|
|
451
|
+
caseId: definition.caseId,
|
|
452
|
+
capability: definition.capability,
|
|
453
|
+
outcome,
|
|
454
|
+
reasonCode,
|
|
455
|
+
durationMs,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
function define(caseId, capability) {
|
|
459
|
+
return Object.freeze({ caseId, capability });
|
|
460
|
+
}
|
|
461
|
+
function boundedDigest(value) {
|
|
462
|
+
if (!/^sha256:[0-9a-f]{64}$/u.test(value))
|
|
463
|
+
throw new TypeError("Control conformance digest is invalid");
|
|
464
|
+
return value;
|
|
465
|
+
}
|
|
466
|
+
function exactRecord(value, keys) {
|
|
467
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
468
|
+
throw new TypeError("Control conformance value must be an exact record");
|
|
469
|
+
const actual = Object.keys(value).sort();
|
|
470
|
+
const expected = [...keys].sort();
|
|
471
|
+
if (actual.length !== expected.length ||
|
|
472
|
+
actual.some((key, index) => key !== expected[index]))
|
|
473
|
+
throw new TypeError("Control conformance value must have exact shape");
|
|
474
|
+
}
|
|
475
|
+
function changedDigest(value) {
|
|
476
|
+
const last = value.at(-1) === "0" ? "1" : "0";
|
|
477
|
+
return `${value.slice(0, -1)}${last}`;
|
|
478
|
+
}
|
|
479
|
+
function grantDigest(grant) {
|
|
480
|
+
return controlDigest("grant", grant);
|
|
481
|
+
}
|
|
482
|
+
function idempotency(grant) {
|
|
483
|
+
return Object.freeze({
|
|
484
|
+
schemaVersion: 1,
|
|
485
|
+
scopeDigest: grant.scopeDigest,
|
|
486
|
+
idempotencyKey: grant.idempotencyKey,
|
|
487
|
+
actionDigest: grant.actionDigest,
|
|
488
|
+
grantId: grant.grantId,
|
|
489
|
+
retainedOutcome: grant.status,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
function assert(condition, message) {
|
|
493
|
+
if (condition !== true)
|
|
494
|
+
throw new TypeError(message);
|
|
495
|
+
}
|
|
496
|
+
function boundedInteger(value, label, minimum, maximum) {
|
|
497
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
|
|
498
|
+
throw new TypeError(`${label} is invalid`);
|
|
499
|
+
return value;
|
|
500
|
+
}
|
|
501
|
+
function duration(started, ended) {
|
|
502
|
+
return Math.min(60_000, Math.max(0, Math.trunc(ended - started)));
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EAClC,kCAAkC,EAClC,kCAAkC,EAClC,sBAAsB,GAYvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EACL,aAAa,EACb,kBAAkB,GAKnB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAU,CAAC;AAEtD,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5D,kBAAkB;IAClB,sBAAsB;IACtB,eAAe;IACf,qBAAqB;CACb,CAAC,CAAC;AAKZ,MAAM,CAAC,MAAM,yCAAyC,GAAG,MAAM,CAAC,MAAM,CAAC;IACrE,kBAAkB;IAClB,sBAAsB;CACoC,CAAC,CAAC;AAO9D,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,MAAM,CAAC,kCAAkC,EAAE,kBAAkB,CAAC;IAC9D,MAAM,CAAC,6BAA6B,EAAE,kBAAkB,CAAC;IACzD,MAAM,CAAC,2BAA2B,EAAE,kBAAkB,CAAC;IACvD,MAAM,CAAC,uCAAuC,EAAE,kBAAkB,CAAC;IACnE,MAAM,CAAC,6BAA6B,EAAE,sBAAsB,CAAC;IAC7D,MAAM,CAAC,6BAA6B,EAAE,sBAAsB,CAAC;IAC7D,MAAM,CAAC,iCAAiC,EAAE,sBAAsB,CAAC;IACjE,MAAM,CAAC,qCAAqC,EAAE,sBAAsB,CAAC;IACrE,MAAM,CAAC,yBAAyB,EAAE,sBAAsB,CAAC;IACzD,MAAM,CAAC,wBAAwB,EAAE,sBAAsB,CAAC;IACxD,MAAM,CAAC,2BAA2B,EAAE,sBAAsB,CAAC;IAC3D,MAAM,CAAC,4BAA4B,EAAE,sBAAsB,CAAC;IAC5D,MAAM,CAAC,8BAA8B,EAAE,eAAe,CAAC;IACvD,MAAM,CAAC,6BAA6B,EAAE,qBAAqB,CAAC;CACI,CAAC,CAAC;AA8FpE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAoC;IAEpC,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE,KAAK,MAAM,QAAQ,IAAI,yCAAyC,EAAE,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC7B,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU;QACvC,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,cAAc,CAC9B,OAAO,CAAC,SAAS,IAAI,KAAK,EAC1B,WAAW,EACX,EAAE,EACF,MAAM,CACP,CAAC;IACF,MAAM,gBAAgB,GAAG,cAAc,CACrC,OAAO,CAAC,gBAAgB,IAAI,KAAK,EACjC,kBAAkB,EAClB,EAAE,EACF,MAAM,CACP,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACxC,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,KAAK,MAAM,UAAU,IAAI,4BAA4B,EAAE,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CACV,MAAM,OAAO,CAAC;YACZ,UAAU;YACV,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI;YACJ,SAAS;YACT,gBAAgB;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK;SACN,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAUhD;IACC,WAAW,CAAC,KAAK,EAAE;QACjB,aAAa;QACb,uBAAuB;QACvB,gBAAgB;QAChB,sBAAsB;QACtB,MAAM;QACN,OAAO;KACR,CAAC,CAAC;IACH,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,IACE,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI;QAC3B,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO;QAC7B,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG;QACtC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE;QAExC,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG;QACnB,GAAG,qBAAqB,CAAC,KAAK,CAAC,oBAAoB,CAAC;KACrD,CAAC,IAAI,EAAE,CAAC;IACT,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,qBAAqB,GAAG,aAAa,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,4BAA4B,CAAC,MAAM;QAC5D,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM;QAClC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,KAAK;YACP,WAAW,CAAC,KAAK,EAAE;gBACjB,QAAQ;gBACR,YAAY;gBACZ,SAAS;gBACT,YAAY;gBACZ,YAAY;aACb,CAAC,CAAC;QACL,IACE,CAAC,KAAK;YACN,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU;YAC1C,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;YAC7D,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;YACvC,KAAK,CAAC,UAAU,GAAG,CAAC;YACpB,KAAK,CAAC,UAAU,GAAG,MAAM;YACzB,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;YAC5D,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI;gBACxB,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvD,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;gBACtC,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC;YACnC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;gBACvC,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC;YAEnC,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,MAAM;QAClE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,MAAM;QAClE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC;aACnE,MAAM;QACT,KAAK,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,kBAAkB,EAAE,2BAA2B;QAC/C,WAAW;QACX,qBAAqB;QACrB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1D,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;QACjD,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;KACnD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,WAAW,CAAC,KAAK,EAAE;QACjB,eAAe;QACf,oBAAoB;QACpB,aAAa;QACb,uBAAuB;QACvB,gBAAgB;QAChB,sBAAsB;QACtB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,KAA8C,CAAC;IAC9D,IACE,MAAM,CAAC,aAAa,KAAK,CAAC;QAC1B,MAAM,CAAC,kBAAkB,KAAK,2BAA2B;QAEzD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,gCAAgC,CAAC;QAClD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,IACE,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM;QACjD,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM;QACjD,UAAU,CAAC,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW;QAC3D,UAAU,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK;QAC/C,UAAU,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;QAErC,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,KAQtB;IACC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,IAAI,OAAgD,CAAC;IACrD,IAAI,OAAkD,CAAC;IACvD,IAAI,OAAO,GAA8C,QAAQ,CAAC;IAClE,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO,GAAG,UAAU,CAClB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAC5C,KAAK,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,GAAG,MAAM,SAAS,CACvB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;YACrC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,EACF,UAAU,CAAC,MAAM,CAClB,CAAC;QACF,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,SAAS,CACb,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,UAAU,CAAC,MAAM,CAClB,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,QAAQ,CAAC;QACnB,UAAU;YACR,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;gBACnD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;oBACrD,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,kBAAkB,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,KAAK,SAAS;YAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACjD,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,YAAuD,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;oBACvC,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;wBACtC,YAAY,GAAG,UAAU,CACvB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAC1C,KAAK,CAAC,gBAAgB,CACvB,CAAC;oBACJ,CAAC,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,QAAQ,CAAC;gBACnB,UAAU,GAAG,gBAAgB,CAAC;YAChC,CAAC;oBAAS,CAAC;gBACT,IAAI,YAAY,KAAK,SAAS;oBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CACX,KAAK,CAAC,UAAU,EAChB,OAAO,EACP,UAAU,EACV,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAkC,EAClC,OAAoC;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,kCAAkC,CAAC,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,kCAAkC,CAC9C,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CACzC,CAAC;YACF,MAAM,QAAQ,GAAG,8BAA8B,CAAC,KAAK,EAAE;gBACrD,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS;gBAC9C,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC3D,EAAE,EAAE,0BAA0B;aAC/B,CAAC,CAAC;YACH,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,mBAAmB,EAAE;gBAChE,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,YAAY,EAAE,OAAO,CAAC,iBAAiB;gBACvC,YAAY,EAAE,0BAA0B;gBACxC,mBAAmB,EAAE,EAAE;aACxB,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,mBAAmB,EAAE;gBAClE,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,YAAY,EAAE,OAAO,CAAC,mBAAmB;gBACzC,YAAY,EAAE,0BAA0B;gBACxC,mBAAmB,EAAE,EAAE;aACxB,CAAC,CAAC;YACH,MAAM,CACJ,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,EACnC,iCAAiC,CAClC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,2BAA2B,CAAC,CAAC,CAAC;YACjC,IAAI,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,UAAU,EACV,IAAI,EACJ,EAAE,CACH,CAAC;YACF,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,aAAa,EACb,IAAI,EACJ,EAAE,CACH,CAAC;YACF,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,YAAY,EACZ,qBAAqB,EACrB,EAAE,CACH,CAAC;YACF,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,YAAY,CAAC,QAAQ,CAC7D,CAAC;YACH,MAAM,MAAM,GAAG,gCAAgC,CAAC,KAAK,EAAE;gBACrD,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,kBAAkB,EAAE,KAAK,CAAC,UAAU;gBACpC,cAAc,EAAE,KAAK,CAAC,YAAY;gBAClC,UAAU,EAAE,YAAY;gBACxB,SAAS,EAAE,qBAAqB;gBAChC,aAAa,EAAE,EAAE;aAClB,CAAC,CAAC;YACH,MAAM,CACJ,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAClE,4BAA4B,CAC7B,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,uCAAuC,CAAC,CAAC,CAAC;YAC7C,IAAI,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,UAAU,EACV,IAAI,EACJ,EAAE,CACH,CAAC;YACF,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,aAAa,EACb,IAAI,EACJ,EAAE,CACH,CAAC;YACF,KAAK,GAAG,gBAAgB,CACtB,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,QAAQ,EAC7B,eAAe,EACf,iBAAiB,EACjB,EAAE,CACH,CAAC;YACF,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAC/C,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,iBAAiB,CAAC,aAAa,CACjE,CAAC;YACH,MAAM,CACJ,WAAW,CAAC,MAAM,KAAK,eAAe;gBACpC,WAAW,CAAC,SAAS,KAAK,iBAAiB,EAC7C,mCAAmC,CACpC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,kCAAkC,CAChD,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CACzC,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC;gBAC/D,kBAAkB,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC;gBAC1C,mBAAmB,EAAE,OAAO,CAAC,WAAW;gBACxC,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,kCAAkC,CAChD,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CACzC,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC;gBAC/D,kBAAkB,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC;gBAC1C,mBAAmB,EAAE,OAAO,CAAC,WAAW;gBACxC,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,KAAK,iCAAiC,CAAC,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CACpC,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,WAAW,CACpB,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,WAAW,CACpB,CAAC;YACF,MAAM,CACJ,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,EAC1C,mCAAmC,CACpC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,qCAAqC,CAAC,CAAC,CAAC;YAC3C,MAAM,kBAAkB,CACtB,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,WAAW,CACpB,CAAC;YACF,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,kBAAkB,CACtB,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,sBAAsB,CAC/B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CACpC,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,WAAW,CACpB,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,mBAAmB,CAAC;gBAClE,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,uBAAuB,EAAE,KAAK,CAAC,eAAe;gBAC9C,mBAAmB,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACtD,SAAS,EAAE,KAAK;gBAChB,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC;aACpC,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,2BAA2B,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CACjD,kCAAkC,CACyB,CAAC;YAC9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,CACJ,GAAG,CAAC,IAAI,KAAK,UAAU;gBACrB,SAAS,CAAC,IAAI,KAAK,WAAW;gBAC9B,GAAG,CAAC,IAAI,KAAK,UAAU;gBACvB,MAAM,CAAC,WAAW,KAAK,CAAC;gBACxB,MAAM,CAAC,kBAAkB,KAAK,MAAM,CAAC,YAAY,EACnD,wCAAwC,CACzC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,2BAA2B,CAAC,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAChD,OAAO,CAAC,yBAAyB,CAClC,CAAC;YACF,MAAM,CACJ,QAAQ,CAAC,IAAI,KAAK,gBAAgB,EAClC,gCAAgC,CACjC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,4BAA4B,CAAC,CAAC,CAAC;YAClC,MAAM,CACJ,OAAO,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,EACjC,gCAAgC,CACjC,CAAC;YACF,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,CACJ,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,EACzD,qCAAqC,CACtC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,8BAA8B,CAAC,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,mCAAmC,CAClD,OAAO,CAAC,YAAY,CACrB,CAAC;YACF,MAAM,CACJ,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,QAAQ,CAAC,EACxD,mCAAmC,CACpC,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACnC,MAAM,CACJ,OAAO,CAAC,OAAO,KAAK,SAAS,EAC7B,oCAAoC,CACrC,CAAC;YACF,MAAM,kBAAkB,CACtB,OAAO,CAAC,qBAAqB,EAC7B,OAAO,CAAC,WAAW,CACpB,CAAC;YACF,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAC3D,OAAO,CAAC,WAAW,CAAC,OAAO,CAC5B,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,CACJ,SAAS,CAAC,WAAW,KAAK,OAAO,CAAC,cAAc,CAAC,WAAW;gBAC1D,SAAS,CAAC,WAAW,KAAK,OAAO,CAAC,cAAc,CAAC,WAAW;gBAC5D,KAAK,KAAK,SAAS;gBACnB,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC;gBACvD,MAAM,CAAC,kBAAkB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,EACvE,8CAA8C,CAC/C,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAqC;IACxD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,OAAO,CAAC,cAAc,EAAE;QACnE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,0BAA0B;QACxC,mBAAmB,EAAE,EAAE;KACxB,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAiC,EACjC,QAAgB,EAChB,UAA4C,EAC5C,SAAwB,EACxB,aAAqB;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CACxC,CAAC;IACH,MAAM,QAAQ,GAAG,gCAAgC,CAAC,KAAK,EAAE;QACvD,QAAQ;QACR,kBAAkB,EAAE,KAAK,CAAC,UAAU;QACpC,cAAc,EAAE,KAAK,CAAC,YAAY;QAClC,UAAU;QACV,SAAS;QACT,aAAa;KACd,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,UAAU,SAAS,CAAC,CAAC;IACpE,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAA+C;IAE/C,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,gCAAgC,CAAC,MAAM;QAEvD,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,OAAoC;IAC3D,IACE,CAAC,OAAO,EAAE,mBAAmB;QAC7B,CAAC,OAAO,CAAC,mBAAmB;QAC5B,CAAC,OAAO,CAAC,qBAAqB;QAC9B,CAAC,OAAO,CAAC,YAAY;QACrB,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU;QAC7C,CAAC,OAAO,CAAC,QAAQ;QAEjB,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,kCAAkC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACpE,kCAAkC,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACzE,kCAAkC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACpE,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC3D,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,SAA6B,EAC7B,MAAmB;IAEnB,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,MAAM,CAAC,MAAM,CAAC;IACxC,IAAI,QAAkC,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1B,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACtC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,UAA8C,EAC9C,OAAkD,EAClD,UAAyB,EACzB,UAAkB;IAElB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,UAAU,CAAC,MAAoC;QACvD,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,OAAO;QACP,UAAU;QACV,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAIb,MAAc,EACd,UAAsB;IAEtB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;QACvC,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC/D,OAAO,KAA2B,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAuB;IAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IACE,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEpD,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,EAAwB,CAAC;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB;IACrC,OAAO,aAAa,CAAC,OAAO,EAAE,KAA+B,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,eAAe,EAAE,KAAK,CAAC,MAAM;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,SAAkB,EAAE,OAAe;IACjD,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,KAAa,EACb,OAAe,EACf,OAAe;IAEf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO;QACpE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,KAAa;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { type PlanningDigestV1, type PlanningJson } from "@agentplat/collective-planning";
|
|
2
|
+
/** Version of the portable planning conformance contract. */
|
|
3
|
+
export declare const PLANNING_CONFORMANCE_VERSION_V1: 1;
|
|
4
|
+
/**
|
|
5
|
+
* Closed declarations. A declaration states which public case groups were
|
|
6
|
+
* executed; it never grants authority to a planner or its runner.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PLANNING_CONFORMANCE_CAPABILITIES_V1: readonly ["planning.portable", "planning.reducer", "planning.snapshot", "planning.replanning", "planning.fencing", "planning.mesh-projection", "planning.evaluation", "planning.durable"];
|
|
9
|
+
export type PlanningConformanceCapabilityV1 = (typeof PLANNING_CONFORMANCE_CAPABILITIES_V1)[number];
|
|
10
|
+
export declare const PLANNING_REQUIRED_CONFORMANCE_CAPABILITIES_V1: readonly ["planning.portable", "planning.reducer"];
|
|
11
|
+
export type PlanningConformanceCaseIdV1 = "planning.intent.closed-record" | "planning.proposal.scope-widening" | "planning.reducer.dependency-cycle" | "planning.reducer.exact-replay" | "planning.snapshot.cross-scope" | "planning.snapshot.rollback" | "planning.replanning.causal-predecessor" | "planning.fencing.stale-result" | "planning.mesh-projection.assignment-bound" | "planning.evaluation.public-artifact" | "planning.durable.restart-high-water";
|
|
12
|
+
export type PlanningConformanceExpectedVerdictV1 = "accepted" | "rejected";
|
|
13
|
+
export interface PlanningConformanceCaseDefinitionV1 {
|
|
14
|
+
readonly caseId: PlanningConformanceCaseIdV1;
|
|
15
|
+
readonly capability: PlanningConformanceCapabilityV1;
|
|
16
|
+
readonly expectedVerdict: PlanningConformanceExpectedVerdictV1;
|
|
17
|
+
readonly expectedReasonCode: string | null;
|
|
18
|
+
}
|
|
19
|
+
/** The complete public suite. Case identifiers and capability membership are closed. */
|
|
20
|
+
export declare const PLANNING_CONFORMANCE_CASES_V1: readonly [PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1, PlanningConformanceCaseDefinitionV1];
|
|
21
|
+
export interface PlanningConformanceChallengeV1 {
|
|
22
|
+
readonly schemaVersion: 1;
|
|
23
|
+
readonly caseId: PlanningConformanceCaseIdV1;
|
|
24
|
+
readonly fixtureDigest: PlanningDigestV1;
|
|
25
|
+
/** Public test data only. It must not contain keys, credentials or raw evidence. */
|
|
26
|
+
readonly input: PlanningJson;
|
|
27
|
+
}
|
|
28
|
+
export interface PlanningConformanceAssessmentV1 {
|
|
29
|
+
readonly schemaVersion: 1;
|
|
30
|
+
readonly caseId: PlanningConformanceCaseIdV1;
|
|
31
|
+
readonly fixtureDigest: PlanningDigestV1;
|
|
32
|
+
readonly verdict: PlanningConformanceExpectedVerdictV1;
|
|
33
|
+
readonly reasonCode: string | null;
|
|
34
|
+
/** Commitment to the implementation's public, redacted execution evidence. */
|
|
35
|
+
readonly evidenceDigest: PlanningDigestV1;
|
|
36
|
+
}
|
|
37
|
+
export interface PlanningConformanceFactoryContextV1 {
|
|
38
|
+
readonly seed: number;
|
|
39
|
+
readonly signal: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The adapter is the only implementation-controlled execution boundary. The
|
|
43
|
+
* runner supplies all fixtures and checks its returned public assessment; it
|
|
44
|
+
* does not receive a private state handle, a persistence handle or authority.
|
|
45
|
+
* This is executable adapter conformance, not a cryptographic proof that an
|
|
46
|
+
* implementation cannot special-case a public fixture.
|
|
47
|
+
*/
|
|
48
|
+
export interface PlanningConformanceAdapterV1 {
|
|
49
|
+
assess(challenge: PlanningConformanceChallengeV1, signal: AbortSignal): PlanningConformanceAssessmentV1 | Promise<PlanningConformanceAssessmentV1>;
|
|
50
|
+
cleanup?(): void | Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export type PlanningConformanceFactoryV1 = (context: PlanningConformanceFactoryContextV1) => PlanningConformanceAdapterV1 | Promise<PlanningConformanceAdapterV1>;
|
|
53
|
+
export interface PlanningConformanceOptionsV1 {
|
|
54
|
+
readonly factory: PlanningConformanceFactoryV1;
|
|
55
|
+
readonly declaredCapabilities: readonly PlanningConformanceCapabilityV1[];
|
|
56
|
+
readonly seed?: number;
|
|
57
|
+
readonly timeoutMs?: number;
|
|
58
|
+
readonly totalTimeoutMs?: number;
|
|
59
|
+
readonly cleanupTimeoutMs?: number;
|
|
60
|
+
readonly signal?: AbortSignal;
|
|
61
|
+
readonly clock?: () => number;
|
|
62
|
+
}
|
|
63
|
+
export interface PlanningConformanceCaseResultV1 {
|
|
64
|
+
readonly caseId: PlanningConformanceCaseIdV1;
|
|
65
|
+
readonly capability: PlanningConformanceCapabilityV1;
|
|
66
|
+
readonly outcome: "passed" | "failed" | "not_declared";
|
|
67
|
+
readonly reasonCode: string | null;
|
|
68
|
+
readonly durationMs: number;
|
|
69
|
+
readonly fixtureDigest: PlanningDigestV1;
|
|
70
|
+
readonly evidenceDigest: PlanningDigestV1 | null;
|
|
71
|
+
}
|
|
72
|
+
export interface PlanningConformanceReportV1 {
|
|
73
|
+
readonly schemaVersion: 1;
|
|
74
|
+
readonly conformanceVersion: 1;
|
|
75
|
+
readonly suiteDigest: PlanningDigestV1;
|
|
76
|
+
readonly fixtureManifestDigest: PlanningDigestV1;
|
|
77
|
+
readonly implementation: Readonly<{
|
|
78
|
+
name: string;
|
|
79
|
+
version: string;
|
|
80
|
+
}>;
|
|
81
|
+
readonly declaredCapabilities: readonly PlanningConformanceCapabilityV1[];
|
|
82
|
+
readonly seed: number;
|
|
83
|
+
readonly cases: readonly PlanningConformanceCaseResultV1[];
|
|
84
|
+
readonly counts: Readonly<{
|
|
85
|
+
passed: number;
|
|
86
|
+
failed: number;
|
|
87
|
+
notDeclared: number;
|
|
88
|
+
total: number;
|
|
89
|
+
}>;
|
|
90
|
+
readonly verdict: "passed" | "failed";
|
|
91
|
+
}
|
|
92
|
+
export interface PlanningConformanceReportInputV1 {
|
|
93
|
+
readonly implementation: Readonly<{
|
|
94
|
+
name: string;
|
|
95
|
+
version: string;
|
|
96
|
+
}>;
|
|
97
|
+
readonly declaredCapabilities: readonly PlanningConformanceCapabilityV1[];
|
|
98
|
+
readonly seed: number;
|
|
99
|
+
readonly cases: readonly PlanningConformanceCaseResultV1[];
|
|
100
|
+
}
|
|
101
|
+
/** Stable commitment to the public case definitions. */
|
|
102
|
+
export declare const PLANNING_CONFORMANCE_SUITE_DIGEST_V1: `sha256:${string}`;
|
|
103
|
+
/**
|
|
104
|
+
* Runs every case against a fresh caller-supplied adapter. No adapter is
|
|
105
|
+
* allowed to share implicit state between cases, and undeclared groups are
|
|
106
|
+
* recorded instead of silently omitted.
|
|
107
|
+
*/
|
|
108
|
+
export declare function runPlanningConformanceV1(options: PlanningConformanceOptionsV1): Promise<readonly PlanningConformanceCaseResultV1[]>;
|
|
109
|
+
/** Builds a sealed, canonical public report from a complete suite execution. */
|
|
110
|
+
export declare function createPlanningConformanceReportV1(input: PlanningConformanceReportInputV1): PlanningConformanceReportV1;
|
|
111
|
+
/** Rejects a tampered, incomplete, undisclosed-capability or aggregate-inconsistent report. */
|
|
112
|
+
export declare function validatePlanningConformanceReportV1(value: unknown): PlanningConformanceReportV1;
|
|
113
|
+
/** Public deterministic fixtures; each one is a bounded, redacted challenge. */
|
|
114
|
+
export declare function createPlanningConformanceFixturesV1(): ReadonlyMap<PlanningConformanceCaseIdV1, PlanningConformanceChallengeV1>;
|
|
115
|
+
export declare function planningConformanceFixtureManifestDigestV1(): PlanningDigestV1;
|
|
116
|
+
export declare function validatePlanningConformanceAssessmentV1(value: unknown): PlanningConformanceAssessmentV1;
|
|
117
|
+
//# sourceMappingURL=planning.d.ts.map
|