borgmcp-shared 0.2.2
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/CONTRIBUTING.md +40 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +159 -0
- package/SECURITY.md +25 -0
- package/dist/conformance/adapter.d.ts +112 -0
- package/dist/conformance/adapter.d.ts.map +1 -0
- package/dist/conformance/adapter.js +417 -0
- package/dist/conformance/adapter.js.map +1 -0
- package/dist/conformance/index.d.ts +15 -0
- package/dist/conformance/index.d.ts.map +1 -0
- package/dist/conformance/index.js +49 -0
- package/dist/conformance/index.js.map +1 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/drone-address.d.ts +3 -0
- package/dist/drone-address.d.ts.map +1 -0
- package/dist/drone-address.js +7 -0
- package/dist/drone-address.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/log-stream-hwm.d.ts +6 -0
- package/dist/log-stream-hwm.d.ts.map +1 -0
- package/dist/log-stream-hwm.js +12 -0
- package/dist/log-stream-hwm.js.map +1 -0
- package/dist/protocol/contract.d.ts +127 -0
- package/dist/protocol/contract.d.ts.map +1 -0
- package/dist/protocol/contract.js +434 -0
- package/dist/protocol/contract.js.map +1 -0
- package/dist/protocol/coordination.d.ts +38 -0
- package/dist/protocol/coordination.d.ts.map +1 -0
- package/dist/protocol/coordination.js +176 -0
- package/dist/protocol/coordination.js.map +1 -0
- package/dist/protocol/errors.d.ts +33 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +26 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +8 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +7 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/sse.d.ts +44 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +246 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/types.d.ts +174 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/protocol/version.d.ts +11 -0
- package/dist/protocol/version.d.ts.map +1 -0
- package/dist/protocol/version.js +14 -0
- package/dist/protocol/version.js.map +1 -0
- package/dist/role-section.d.ts +24 -0
- package/dist/role-section.d.ts.map +1 -0
- package/dist/role-section.js +114 -0
- package/dist/role-section.js.map +1 -0
- package/dist/templates.d.ts +44 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +771 -0
- package/dist/templates.js.map +1 -0
- package/docs/compatibility.md +38 -0
- package/docs/releasing.md +220 -0
- package/package.json +89 -0
- package/src/conformance/adapter.ts +717 -0
- package/src/conformance/index.ts +68 -0
- package/src/domain/index.ts +9 -0
- package/src/drone-address.ts +25 -0
- package/src/index.ts +4 -0
- package/src/log-stream-hwm.ts +16 -0
- package/src/protocol/contract.ts +608 -0
- package/src/protocol/coordination.ts +249 -0
- package/src/protocol/errors.ts +36 -0
- package/src/protocol/index.ts +7 -0
- package/src/protocol/sse.ts +295 -0
- package/src/protocol/types.ts +201 -0
- package/src/protocol/version.ts +31 -0
- package/src/role-section.ts +270 -0
- package/src/templates.ts +953 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { ErrorCode, ProtocolContractError, compareLogCursor, createProtocolEnvelope, decodeAppendLogResultEnvelope, decodeDecisionResultEnvelope, decodeDecisionsResultEnvelope, decodeEnrollmentExchangeResponseEnvelope, decodeProtocolErrorEnvelope, decodeProtocolInfoEnvelope, decodeReadLogResultEnvelope, decodeSseFrames, negotiateProtocol, utf8ByteLength, } from '../protocol/index.js';
|
|
2
|
+
export const ADAPTER_CONFORMANCE_FIXTURES = [
|
|
3
|
+
{ id: 'http.unauthenticated-liveness', area: 'http' },
|
|
4
|
+
{ id: 'protocol.enrollment-auth', area: 'protocol' },
|
|
5
|
+
{ id: 'security.adapter-boundary-injection', area: 'security' },
|
|
6
|
+
{ id: 'security.oversize-request', area: 'security' },
|
|
7
|
+
{ id: 'security.cross-cube-isolation', area: 'security' },
|
|
8
|
+
{ id: 'log.read-cursor-tuple', area: 'cursor' },
|
|
9
|
+
{ id: 'sse.replay-live-transition', area: 'sse' },
|
|
10
|
+
{ id: 'cursor.explicit-expiry', area: 'cursor' },
|
|
11
|
+
{ id: 'acks.idempotent', area: 'acks' },
|
|
12
|
+
{ id: 'claims.durable-noncursor', area: 'claims' },
|
|
13
|
+
{ id: 'decisions.topic-supersession', area: 'decisions' },
|
|
14
|
+
{ id: 'capabilities.unsupported-fails-closed', area: 'capabilities' },
|
|
15
|
+
{ id: 'security.active-stream-revocation', area: 'security' },
|
|
16
|
+
];
|
|
17
|
+
const DEFAULT_STREAM_DEADLINE_MS = 5_000;
|
|
18
|
+
const DEFAULT_PENDING_PROBE_MS = 25;
|
|
19
|
+
function invariant(condition, message) {
|
|
20
|
+
if (!condition)
|
|
21
|
+
throw new Error(message);
|
|
22
|
+
}
|
|
23
|
+
function protocolError(response) {
|
|
24
|
+
try {
|
|
25
|
+
return decodeProtocolErrorEnvelope(response.body).error.code;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function delay(milliseconds) {
|
|
32
|
+
const setTimeoutValue = globalThis.setTimeout;
|
|
33
|
+
if (!setTimeoutValue)
|
|
34
|
+
throw new Error('Conformance runner requires a timer implementation.');
|
|
35
|
+
return new Promise((resolve) => setTimeoutValue(resolve, milliseconds));
|
|
36
|
+
}
|
|
37
|
+
async function within(promise, description, deadlineMs) {
|
|
38
|
+
const timers = globalThis;
|
|
39
|
+
if (!timers.setTimeout || !timers.clearTimeout) {
|
|
40
|
+
throw new Error('Conformance runner requires timer cancellation support.');
|
|
41
|
+
}
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const timer = timers.setTimeout(() => {
|
|
44
|
+
reject(new Error(`${description} did not settle within ${deadlineMs}ms.`));
|
|
45
|
+
}, deadlineMs);
|
|
46
|
+
promise.then((value) => {
|
|
47
|
+
timers.clearTimeout(timer);
|
|
48
|
+
resolve(value);
|
|
49
|
+
}, (error) => {
|
|
50
|
+
timers.clearTimeout(timer);
|
|
51
|
+
reject(error);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async function provePending(promise, description, probeMs) {
|
|
56
|
+
const settled = await Promise.race([
|
|
57
|
+
promise.then(() => true, () => true),
|
|
58
|
+
delay(probeMs).then(() => false),
|
|
59
|
+
]);
|
|
60
|
+
invariant(!settled, `${description} settled before new activity.`);
|
|
61
|
+
}
|
|
62
|
+
class SseEventReader {
|
|
63
|
+
iterator;
|
|
64
|
+
buffer = '';
|
|
65
|
+
ended = false;
|
|
66
|
+
constructor(stream) {
|
|
67
|
+
this.iterator = stream[Symbol.asyncIterator]();
|
|
68
|
+
}
|
|
69
|
+
async next() {
|
|
70
|
+
while (true) {
|
|
71
|
+
this.buffer = this.buffer
|
|
72
|
+
.replace(/\r\n/g, '\n')
|
|
73
|
+
.replace(this.ended ? /\r/g : /\r(?!$)/g, '\n');
|
|
74
|
+
const boundary = this.buffer.search(/\n\n+/);
|
|
75
|
+
if (boundary >= 0) {
|
|
76
|
+
const match = this.buffer.slice(boundary).match(/^\n\n+/);
|
|
77
|
+
invariant(match, 'Internal SSE frame boundary error.');
|
|
78
|
+
const frame = this.buffer.slice(0, boundary);
|
|
79
|
+
this.buffer = this.buffer.slice(boundary + match[0].length);
|
|
80
|
+
if (frame.trim() === '')
|
|
81
|
+
continue;
|
|
82
|
+
const events = decodeSseFrames(`${frame}\n\n`);
|
|
83
|
+
invariant(events.length === 1, 'Expected exactly one SSE event per frame.');
|
|
84
|
+
return events[0];
|
|
85
|
+
}
|
|
86
|
+
if (this.ended) {
|
|
87
|
+
if (this.buffer.trim() !== '')
|
|
88
|
+
throw new Error('SSE stream ended with an incomplete frame.');
|
|
89
|
+
throw new Error('SSE stream ended while an event was expected.');
|
|
90
|
+
}
|
|
91
|
+
const chunk = await this.iterator.next();
|
|
92
|
+
if (chunk.done) {
|
|
93
|
+
this.ended = true;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
invariant(typeof chunk.value === 'string', 'SSE stream yielded a non-string chunk.');
|
|
97
|
+
this.buffer += chunk.value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async close() {
|
|
101
|
+
if (this.iterator.return)
|
|
102
|
+
await this.iterator.return();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function expectStatus(response, status, operation) {
|
|
106
|
+
invariant(response.status === status, `${operation} returned HTTP ${response.status}; expected ${status}.`);
|
|
107
|
+
}
|
|
108
|
+
function expectError(response, status, code, operation) {
|
|
109
|
+
expectStatus(response, status, operation);
|
|
110
|
+
invariant(protocolError(response) === code, `${operation} did not return ${code}.`);
|
|
111
|
+
}
|
|
112
|
+
function logEvent(event, description) {
|
|
113
|
+
invariant(event.type === 'log', `${description} produced ${event.type}, not a log event.`);
|
|
114
|
+
return event;
|
|
115
|
+
}
|
|
116
|
+
function same(left, right) {
|
|
117
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
118
|
+
}
|
|
119
|
+
export async function runAdapterConformance(environment, options = {}) {
|
|
120
|
+
const streamDeadlineMs = options.streamDeadlineMs ?? DEFAULT_STREAM_DEADLINE_MS;
|
|
121
|
+
const pendingProbeMs = options.pendingProbeMs ?? DEFAULT_PENDING_PROBE_MS;
|
|
122
|
+
invariant(streamDeadlineMs > 0, 'streamDeadlineMs must be positive.');
|
|
123
|
+
invariant(pendingProbeMs > 0, 'pendingProbeMs must be positive.');
|
|
124
|
+
const results = [];
|
|
125
|
+
const record = async (id, execute) => {
|
|
126
|
+
try {
|
|
127
|
+
results.push({ id, ok: true, observations: await execute() });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
results.push({
|
|
131
|
+
id,
|
|
132
|
+
ok: false,
|
|
133
|
+
observations: {},
|
|
134
|
+
error: error instanceof Error ? error.message : String(error),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
await environment.admin.reset();
|
|
139
|
+
const principalA = await environment.admin.createPrincipal('principal-a');
|
|
140
|
+
const principalB = await environment.admin.createPrincipal('principal-b');
|
|
141
|
+
const cubeA = await environment.admin.createCube('cube-a');
|
|
142
|
+
const cubeB = await environment.admin.createCube('cube-b');
|
|
143
|
+
await environment.admin.grantCube(principalA, cubeA);
|
|
144
|
+
await environment.admin.grantCube(principalB, cubeB);
|
|
145
|
+
const invitationA = await environment.admin.issueSingleUseInvitation(principalA);
|
|
146
|
+
const invitationB = await environment.admin.issueSingleUseInvitation(principalB);
|
|
147
|
+
let credentialA = '';
|
|
148
|
+
let credentialB = '';
|
|
149
|
+
let protocolBody;
|
|
150
|
+
let protocolInfo = null;
|
|
151
|
+
await record('http.unauthenticated-liveness', async () => {
|
|
152
|
+
const response = await environment.operations.health();
|
|
153
|
+
expectStatus(response, 204, 'Unauthenticated liveness');
|
|
154
|
+
invariant(response.body === '' || response.body === undefined, 'Unauthenticated liveness exposed a response body.');
|
|
155
|
+
return { status: 204, bodyless: true };
|
|
156
|
+
});
|
|
157
|
+
await record('protocol.enrollment-auth', async () => {
|
|
158
|
+
expectError(await environment.operations.protocol(null), 401, ErrorCode.AUTH_MISSING, 'Unauthenticated protocol request');
|
|
159
|
+
const enrollmentARequest = createProtocolEnvelope('enroll-a1', {
|
|
160
|
+
invitation: invitationA,
|
|
161
|
+
client_name: 'conformance-a',
|
|
162
|
+
});
|
|
163
|
+
const enrollmentBRequest = createProtocolEnvelope('enroll-b1', {
|
|
164
|
+
invitation: invitationB,
|
|
165
|
+
client_name: 'conformance-b',
|
|
166
|
+
});
|
|
167
|
+
const enrolledAResponse = await environment.operations.enroll(enrollmentARequest);
|
|
168
|
+
const enrolledBResponse = await environment.operations.enroll(enrollmentBRequest);
|
|
169
|
+
expectStatus(enrolledAResponse, 201, 'Principal A enrollment');
|
|
170
|
+
expectStatus(enrolledBResponse, 201, 'Principal B enrollment');
|
|
171
|
+
credentialA = decodeEnrollmentExchangeResponseEnvelope(enrolledAResponse.body).payload.credential;
|
|
172
|
+
credentialB = decodeEnrollmentExchangeResponseEnvelope(enrolledBResponse.body).payload.credential;
|
|
173
|
+
invariant(credentialA !== credentialB, 'Enrollment issued the same credential to two principals.');
|
|
174
|
+
expectError(await environment.operations.enroll(enrollmentARequest), 401, ErrorCode.AUTH_INVALID, 'Invitation reuse');
|
|
175
|
+
const protocolResponse = await environment.operations.protocol(credentialA);
|
|
176
|
+
expectStatus(protocolResponse, 200, 'Authenticated protocol request');
|
|
177
|
+
protocolBody = protocolResponse.body;
|
|
178
|
+
protocolInfo = negotiateProtocol(decodeProtocolInfoEnvelope(protocolBody).payload, [
|
|
179
|
+
'log.cursor',
|
|
180
|
+
'stream.sse',
|
|
181
|
+
'stream.replay',
|
|
182
|
+
'acks',
|
|
183
|
+
'claims',
|
|
184
|
+
'decisions',
|
|
185
|
+
]);
|
|
186
|
+
return {
|
|
187
|
+
unauthenticated: ErrorCode.AUTH_MISSING,
|
|
188
|
+
enrollment_status: 201,
|
|
189
|
+
invitation_reuse: ErrorCode.AUTH_INVALID,
|
|
190
|
+
protocol_version: protocolInfo.protocol_version,
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
await record('security.adapter-boundary-injection', async () => {
|
|
194
|
+
invariant(protocolInfo, 'Protocol fixture did not produce request limits.');
|
|
195
|
+
const injectedMessage = "'); DROP TABLE log_entries; --\r\ndata: forged-sse-frame";
|
|
196
|
+
const injectedBody = JSON.stringify(createProtocolEnvelope('inject-b1', { message: injectedMessage }));
|
|
197
|
+
invariant(utf8ByteLength(injectedBody) <= protocolInfo.limits.max_request_bytes &&
|
|
198
|
+
utf8ByteLength(injectedMessage) <= protocolInfo.limits.max_log_message_bytes, 'Injection fixture exceeded an advertised request limit.');
|
|
199
|
+
const injected = await environment.operations.appendRaw(credentialB, cubeB, injectedBody);
|
|
200
|
+
expectStatus(injected, 201, 'Adapter-boundary injection append');
|
|
201
|
+
const injectedEntry = decodeAppendLogResultEnvelope(injected.body).payload.entry;
|
|
202
|
+
invariant(injectedEntry.message === injectedMessage, 'Adapter altered or interpreted injection-shaped log data.');
|
|
203
|
+
const sentinel = await environment.operations.append(credentialB, cubeB, createProtocolEnvelope('inject-b2', { message: 'post-injection-sentinel' }));
|
|
204
|
+
expectStatus(sentinel, 201, 'Post-injection sentinel append');
|
|
205
|
+
const read = await environment.operations.read(credentialB, cubeB, createProtocolEnvelope('inject-read', { cursor: null, limit: 10 }));
|
|
206
|
+
expectStatus(read, 200, 'Post-injection read');
|
|
207
|
+
const messages = decodeReadLogResultEnvelope(read.body).payload.entries.map((entry) => entry.message);
|
|
208
|
+
invariant(same(messages, [injectedMessage, 'post-injection-sentinel']), 'Injection-shaped input was not persisted inertly and exactly.');
|
|
209
|
+
const opened = await environment.operations.openStream(credentialB, cubeB, null);
|
|
210
|
+
expectStatus(opened, 200, 'Post-injection stream open');
|
|
211
|
+
invariant(opened.stream, 'Post-injection stream omitted its AsyncIterable.');
|
|
212
|
+
const reader = new SseEventReader(opened.stream);
|
|
213
|
+
try {
|
|
214
|
+
const first = logEvent(await within(reader.next(), 'Injected SSE event', streamDeadlineMs), 'Injected SSE event');
|
|
215
|
+
const second = logEvent(await within(reader.next(), 'Post-injection sentinel SSE event', streamDeadlineMs), 'Post-injection sentinel SSE event');
|
|
216
|
+
invariant(first.entry.message === injectedMessage && second.entry.message === 'post-injection-sentinel', 'Injection-shaped input escaped or split its SSE frame.');
|
|
217
|
+
const bookmark = await within(reader.next(), 'Post-injection bookmark', streamDeadlineMs);
|
|
218
|
+
invariant(bookmark.type === 'bookmark', 'Post-injection stream produced an extra forged event.');
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
await reader.close();
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
status: 201,
|
|
225
|
+
preserved_exactly: true,
|
|
226
|
+
subsequent_write_succeeded: true,
|
|
227
|
+
ordered_messages: 2,
|
|
228
|
+
sse_events: 2,
|
|
229
|
+
};
|
|
230
|
+
});
|
|
231
|
+
await record('security.oversize-request', async () => {
|
|
232
|
+
invariant(protocolInfo, 'Protocol fixture did not produce request limits.');
|
|
233
|
+
const baseBody = JSON.stringify(createProtocolEnvelope('oversize-a1', { message: 'must-not-persist' }));
|
|
234
|
+
const oversizedBody = baseBody + ' '.repeat(Math.max(0, protocolInfo.limits.max_request_bytes - utf8ByteLength(baseBody) + 1));
|
|
235
|
+
invariant(utf8ByteLength(oversizedBody) > protocolInfo.limits.max_request_bytes, 'Oversize fixture did not exceed max_request_bytes.');
|
|
236
|
+
const response = await environment.operations.appendRaw(credentialA, cubeA, oversizedBody);
|
|
237
|
+
expectError(response, 413, ErrorCode.CONTENT_TOO_LARGE, 'Oversized append request');
|
|
238
|
+
const read = await environment.operations.read(credentialA, cubeA, createProtocolEnvelope('oversize-read', { cursor: null, limit: 10 }));
|
|
239
|
+
expectStatus(read, 200, 'Post-oversize read');
|
|
240
|
+
invariant(decodeReadLogResultEnvelope(read.body).payload.entries.length === 0, 'Oversized request was persisted before rejection.');
|
|
241
|
+
return { status: 413, code: ErrorCode.CONTENT_TOO_LARGE, persisted_entries: 0 };
|
|
242
|
+
});
|
|
243
|
+
await record('security.cross-cube-isolation', async () => {
|
|
244
|
+
const secretAppend = await environment.operations.append(credentialB, cubeB, createProtocolEnvelope('append-b1', { message: 'principal-b-secret' }));
|
|
245
|
+
expectStatus(secretAppend, 201, 'Principal B append');
|
|
246
|
+
const denied = await environment.operations.read(credentialA, cubeB, createProtocolEnvelope('read-cross', { cursor: null, limit: 10 }));
|
|
247
|
+
expectError(denied, 404, ErrorCode.NOT_FOUND, 'Cross-cube read');
|
|
248
|
+
return { status: 404, code: ErrorCode.NOT_FOUND };
|
|
249
|
+
});
|
|
250
|
+
const entries = [];
|
|
251
|
+
let readCursor = null;
|
|
252
|
+
await record('log.read-cursor-tuple', async () => {
|
|
253
|
+
for (const [index, message] of ['alpha', 'beta', 'gamma'].entries()) {
|
|
254
|
+
const response = await environment.operations.append(credentialA, cubeA, createProtocolEnvelope(`append-a${index + 1}`, { message }));
|
|
255
|
+
expectStatus(response, 201, `Append ${message}`);
|
|
256
|
+
const entry = decodeAppendLogResultEnvelope(response.body).payload.entry;
|
|
257
|
+
entries.push({ id: entry.id, created_at: entry.created_at, message: entry.message });
|
|
258
|
+
}
|
|
259
|
+
const response = await environment.operations.read(credentialA, cubeA, createProtocolEnvelope('read-page1', { cursor: null, limit: 2 }));
|
|
260
|
+
expectStatus(response, 200, 'First paged read');
|
|
261
|
+
const page = decodeReadLogResultEnvelope(response.body).payload;
|
|
262
|
+
invariant(same(page.entries.map((entry) => entry.message), ['alpha', 'beta']), 'Read did not honor limit and tuple ordering.');
|
|
263
|
+
invariant(page.has_more && page.behind_by === 1, 'Read pagination metadata is incorrect.');
|
|
264
|
+
invariant(page.cursor !== null, 'Read did not return a cursor.');
|
|
265
|
+
invariant(page.cursor.id === entries[1].id && page.cursor.created_at === entries[1].created_at, 'Read cursor does not equal the final delivered entry tuple.');
|
|
266
|
+
readCursor = page.cursor;
|
|
267
|
+
return { messages: ['alpha', 'beta'], has_more: true, behind_by: 1, cursor_matches_last_entry: true };
|
|
268
|
+
});
|
|
269
|
+
let liveCursor = null;
|
|
270
|
+
await record('sse.replay-live-transition', async () => {
|
|
271
|
+
invariant(readCursor, 'Cursor fixture did not produce a cursor.');
|
|
272
|
+
const barrier = environment.admin.armReplayTransition();
|
|
273
|
+
const openPromise = environment.operations.openStream(credentialA, cubeA, readCursor);
|
|
274
|
+
await within(barrier.reached, 'Replay transition boundary', streamDeadlineMs);
|
|
275
|
+
try {
|
|
276
|
+
const appendDelta = environment.operations.append(credentialA, cubeA, createProtocolEnvelope('append-a4', { message: 'delta' }));
|
|
277
|
+
expectStatus(await appendDelta, 201, 'Transition append');
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
barrier.release();
|
|
281
|
+
}
|
|
282
|
+
const opened = await within(openPromise, 'Cursor stream open', streamDeadlineMs);
|
|
283
|
+
expectStatus(opened, 200, 'Cursor stream open');
|
|
284
|
+
invariant(opened.stream, 'Successful stream response omitted its AsyncIterable.');
|
|
285
|
+
const reader = new SseEventReader(opened.stream);
|
|
286
|
+
try {
|
|
287
|
+
const replay = logEvent(await within(reader.next(), 'Replay event', streamDeadlineMs), 'Replay');
|
|
288
|
+
invariant(replay.entry.message === 'gamma', 'Stream ignored its cursor or replayed the wrong entry.');
|
|
289
|
+
invariant(compareLogCursor(readCursor, replay.cursor) < 0, 'Replay cursor did not advance.');
|
|
290
|
+
const delta = logEvent(await within(reader.next(), 'Transition delta event', streamDeadlineMs), 'Replay transition');
|
|
291
|
+
invariant(delta.entry.message === 'delta', 'Entry appended at the replay/live boundary was lost.');
|
|
292
|
+
invariant(compareLogCursor(replay.cursor, delta.cursor) < 0, 'Transition cursor did not advance.');
|
|
293
|
+
const bookmark = await within(reader.next(), 'Replay-complete bookmark', streamDeadlineMs);
|
|
294
|
+
invariant(bookmark.type === 'bookmark' && bookmark.replay_complete, 'Stream omitted its replay-complete bookmark.');
|
|
295
|
+
const noDuplicate = reader.next();
|
|
296
|
+
await provePending(noDuplicate, 'Live stream after delta', pendingProbeMs);
|
|
297
|
+
const epsilonResponse = await environment.operations.append(credentialA, cubeA, createProtocolEnvelope('append-a5', { message: 'epsilon' }));
|
|
298
|
+
expectStatus(epsilonResponse, 201, 'Live append');
|
|
299
|
+
const epsilon = logEvent(await within(noDuplicate, 'Live epsilon event', streamDeadlineMs), 'Live append');
|
|
300
|
+
invariant(epsilon.entry.message === 'epsilon', 'Live stream duplicated or reordered an event.');
|
|
301
|
+
invariant(compareLogCursor(delta.cursor, epsilon.cursor) < 0, 'Live stream cursors are not ordered.');
|
|
302
|
+
invariant(new Set([replay.entry.id, delta.entry.id, epsilon.entry.id]).size === 3, 'Stream delivered a duplicate entry.');
|
|
303
|
+
liveCursor = epsilon.cursor;
|
|
304
|
+
return { replay: ['gamma'], transition: 'bookmark', live: ['delta', 'epsilon'], duplicates: 0 };
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
await reader.close();
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
await record('cursor.explicit-expiry', async () => {
|
|
311
|
+
invariant(readCursor, 'Cursor fixture did not produce a cursor.');
|
|
312
|
+
await environment.admin.expireCursor(cubeA, readCursor);
|
|
313
|
+
const response = await environment.operations.read(credentialA, cubeA, createProtocolEnvelope('read-expired', { cursor: readCursor, limit: 10 }));
|
|
314
|
+
expectError(response, 410, ErrorCode.CURSOR_EXPIRED, 'Expired cursor read');
|
|
315
|
+
const stream = await environment.operations.openStream(credentialA, cubeA, readCursor);
|
|
316
|
+
expectError(stream, 410, ErrorCode.CURSOR_EXPIRED, 'Expired cursor stream');
|
|
317
|
+
invariant(stream.stream === null, 'Expired cursor stream exposed a body stream.');
|
|
318
|
+
return { read_status: 410, stream_status: 410, code: ErrorCode.CURSOR_EXPIRED };
|
|
319
|
+
});
|
|
320
|
+
await record('acks.idempotent', async () => {
|
|
321
|
+
invariant(entries[0], 'Append fixture did not produce an entry.');
|
|
322
|
+
const request = createProtocolEnvelope('ack-entry1', { entry_id: entries[0].id, kind: 'ack' });
|
|
323
|
+
const first = await environment.operations.ack(credentialA, cubeA, request);
|
|
324
|
+
const second = await environment.operations.ack(credentialA, cubeA, request);
|
|
325
|
+
expectStatus(first, 204, 'First acknowledgement');
|
|
326
|
+
expectStatus(second, 204, 'Repeated acknowledgement');
|
|
327
|
+
invariant((first.body === '' || first.body === undefined) && (second.body === '' || second.body === undefined), 'Acknowledgement responses must be bodyless.');
|
|
328
|
+
return { first_status: 204, repeated_status: 204, bodyless: true };
|
|
329
|
+
});
|
|
330
|
+
await record('claims.durable-noncursor', async () => {
|
|
331
|
+
invariant(entries[1] && liveCursor, 'Log fixtures did not produce claim state.');
|
|
332
|
+
const claim = await environment.operations.ack(credentialA, cubeA, createProtocolEnvelope('claim-entry2', { entry_id: entries[1].id, kind: 'claim' }));
|
|
333
|
+
expectStatus(claim, 204, 'Claim');
|
|
334
|
+
const read = await environment.operations.read(credentialA, cubeA, createProtocolEnvelope('read-claims', { cursor: liveCursor, limit: 10 }));
|
|
335
|
+
expectStatus(read, 200, 'Claim-state read');
|
|
336
|
+
const page = decodeReadLogResultEnvelope(read.body).payload;
|
|
337
|
+
invariant(page.entries.length === 0, 'Claim unexpectedly created a log entry.');
|
|
338
|
+
invariant(page.cursor !== null && compareLogCursor(page.cursor, liveCursor) === 0, 'Claim advanced the log cursor.');
|
|
339
|
+
invariant(page.claims.some((item) => item.log_entry_id === entries[1].id), 'Claim was not durable in a later read.');
|
|
340
|
+
return { durable_claims: 1, entries: 0, cursor_advanced: false };
|
|
341
|
+
});
|
|
342
|
+
await record('decisions.topic-supersession', async () => {
|
|
343
|
+
const firstResponse = await environment.operations.recordDecision(credentialA, cubeA, createProtocolEnvelope('decision1', { topic: 'runtime', decision: 'first' }));
|
|
344
|
+
expectStatus(firstResponse, 201, 'First decision');
|
|
345
|
+
const first = decodeDecisionResultEnvelope(firstResponse.body).payload.decision;
|
|
346
|
+
const secondResponse = await environment.operations.recordDecision(credentialA, cubeA, createProtocolEnvelope('decision2', { topic: 'runtime', decision: 'second', rationale: 'new evidence' }));
|
|
347
|
+
expectStatus(secondResponse, 201, 'Superseding decision');
|
|
348
|
+
const second = decodeDecisionResultEnvelope(secondResponse.body).payload.decision;
|
|
349
|
+
const listResponse = await environment.operations.listDecisions(credentialA, cubeA, createProtocolEnvelope('decisions', {}));
|
|
350
|
+
expectStatus(listResponse, 200, 'Decision list');
|
|
351
|
+
const active = decodeDecisionsResultEnvelope(listResponse.body).payload.decisions;
|
|
352
|
+
invariant(active.length === 1 && active[0].decision === 'second', 'Decision list did not contain only the active superseding decision.');
|
|
353
|
+
invariant(second.supersedes === first.id, 'Superseding decision did not reference its predecessor.');
|
|
354
|
+
return { active_count: 1, active_decision: 'second', supersedes_first: true };
|
|
355
|
+
});
|
|
356
|
+
await record('capabilities.unsupported-fails-closed', async () => {
|
|
357
|
+
invariant(protocolBody, 'Protocol fixture did not produce an envelope.');
|
|
358
|
+
let code = null;
|
|
359
|
+
try {
|
|
360
|
+
negotiateProtocol(decodeProtocolInfoEnvelope(protocolBody).payload, ['future.required']);
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
if (error instanceof ProtocolContractError)
|
|
364
|
+
code = error.code;
|
|
365
|
+
else
|
|
366
|
+
throw error;
|
|
367
|
+
}
|
|
368
|
+
invariant(code === ErrorCode.UNSUPPORTED_CAPABILITY, 'Unsupported capability did not fail closed client-side.');
|
|
369
|
+
return { code };
|
|
370
|
+
});
|
|
371
|
+
await record('security.active-stream-revocation', async () => {
|
|
372
|
+
invariant(liveCursor, 'Stream fixture did not produce a live cursor.');
|
|
373
|
+
const opened = await environment.operations.openStream(credentialA, cubeA, liveCursor);
|
|
374
|
+
expectStatus(opened, 200, 'Revocation stream open');
|
|
375
|
+
invariant(opened.stream, 'Successful revocation stream omitted its AsyncIterable.');
|
|
376
|
+
const reader = new SseEventReader(opened.stream);
|
|
377
|
+
try {
|
|
378
|
+
const bookmark = await within(reader.next(), 'Initial replay-complete bookmark', streamDeadlineMs);
|
|
379
|
+
invariant(bookmark.type === 'bookmark' && bookmark.replay_complete, 'Fresh live stream did not complete replay.');
|
|
380
|
+
const pending = reader.next();
|
|
381
|
+
await provePending(pending, 'Idle live stream', pendingProbeMs);
|
|
382
|
+
await environment.admin.revokePrincipal(principalA);
|
|
383
|
+
let terminated = false;
|
|
384
|
+
try {
|
|
385
|
+
await within(pending, 'Revoked stream termination', streamDeadlineMs);
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
if (error instanceof Error && error.message.includes('did not settle'))
|
|
389
|
+
throw error;
|
|
390
|
+
terminated = true;
|
|
391
|
+
}
|
|
392
|
+
invariant(terminated, 'Revoked stream yielded data instead of terminating.');
|
|
393
|
+
}
|
|
394
|
+
finally {
|
|
395
|
+
await reader.close();
|
|
396
|
+
}
|
|
397
|
+
const rejected = await environment.operations.read(credentialA, cubeA, createProtocolEnvelope('read-revoked', { cursor: liveCursor, limit: 10 }));
|
|
398
|
+
expectError(rejected, 401, ErrorCode.SESSION_REVOKED, 'Post-revocation request');
|
|
399
|
+
return { stream_terminated: true, subsequent_status: 401, subsequent_code: ErrorCode.SESSION_REVOKED };
|
|
400
|
+
});
|
|
401
|
+
const normalizedTranscript = results.map(({ id, observations }) => ({ id, observations }));
|
|
402
|
+
return { ok: results.every((result) => result.ok), results, normalizedTranscript };
|
|
403
|
+
}
|
|
404
|
+
export async function runEquivalentAdapterConformance(cloud, local, options = {}) {
|
|
405
|
+
const [cloudReport, localReport] = await Promise.all([
|
|
406
|
+
runAdapterConformance(cloud, options),
|
|
407
|
+
runAdapterConformance(local, options),
|
|
408
|
+
]);
|
|
409
|
+
const equivalent = same(cloudReport.normalizedTranscript, localReport.normalizedTranscript);
|
|
410
|
+
return {
|
|
411
|
+
ok: cloudReport.ok && localReport.ok && equivalent,
|
|
412
|
+
cloud: cloudReport,
|
|
413
|
+
local: localReport,
|
|
414
|
+
equivalent,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/conformance/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BroadcastHwm } from '../log-stream-hwm.js';
|
|
2
|
+
export * from './adapter.js';
|
|
3
|
+
export interface ConformanceVector<Input, Output> {
|
|
4
|
+
name: string;
|
|
5
|
+
input: Input;
|
|
6
|
+
expected: Output;
|
|
7
|
+
}
|
|
8
|
+
export interface BroadcastHwmComparisonInput {
|
|
9
|
+
a: BroadcastHwm;
|
|
10
|
+
b: BroadcastHwm;
|
|
11
|
+
}
|
|
12
|
+
export declare const BROADCAST_HWM_CONFORMANCE: readonly ConformanceVector<BroadcastHwmComparisonInput, -1 | 0 | 1>[];
|
|
13
|
+
export declare const DRONE_ADDRESS_CONFORMANCE: readonly ConformanceVector<string, string>[];
|
|
14
|
+
export declare const ROLE_SECTION_ROUND_TRIP_CONFORMANCE: readonly string[];
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,cAAc,cAAc,CAAC;AAG7B,MAAM,WAAW,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;CACjB;AAED,eAAO,MAAM,yBAAyB,EAAE,SAAS,iBAAiB,CAChE,2BAA2B,EAC3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CACX,EAiCA,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,EAMjF,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,SAAS,MAAM,EAKhE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export * from './adapter.js';
|
|
2
|
+
export const BROADCAST_HWM_CONFORMANCE = [
|
|
3
|
+
{
|
|
4
|
+
name: 'orders by timestamp',
|
|
5
|
+
input: {
|
|
6
|
+
a: { id: 'z', created_at: '2026-05-29T09:59:59.000Z' },
|
|
7
|
+
b: { id: 'a', created_at: '2026-05-29T10:00:00.000Z' },
|
|
8
|
+
},
|
|
9
|
+
expected: -1,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: 'breaks equal-timestamp ties by id',
|
|
13
|
+
input: {
|
|
14
|
+
a: { id: 'a', created_at: '2026-05-29T10:00:00.000Z' },
|
|
15
|
+
b: { id: 'b', created_at: '2026-05-29T10:00:00.000Z' },
|
|
16
|
+
},
|
|
17
|
+
expected: -1,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'compares identical tuples as equal',
|
|
21
|
+
input: {
|
|
22
|
+
a: { id: 'a', created_at: '2026-05-29T10:00:00.000Z' },
|
|
23
|
+
b: { id: 'a', created_at: '2026-05-29T10:00:00.000Z' },
|
|
24
|
+
},
|
|
25
|
+
expected: 0,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'falls back to raw timestamp ordering for invalid dates',
|
|
29
|
+
input: {
|
|
30
|
+
a: { id: 'a', created_at: 'not-a-date-a' },
|
|
31
|
+
b: { id: 'a', created_at: 'not-a-date-b' },
|
|
32
|
+
},
|
|
33
|
+
expected: -1,
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
export const DRONE_ADDRESS_CONFORMANCE = [
|
|
37
|
+
{
|
|
38
|
+
name: 'formats the stable lowercase eight-character id prefix',
|
|
39
|
+
input: '3336CDE1-a76e-4e89-8bc2-77c149bb6a74',
|
|
40
|
+
expected: '`id:3336cde1`',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
export const ROLE_SECTION_ROUND_TRIP_CONFORMANCE = [
|
|
44
|
+
'',
|
|
45
|
+
'Preamble only.',
|
|
46
|
+
'Preamble.\n\nWorkflow:\n- step one\n\nProject conventions:\n- TDD.\n',
|
|
47
|
+
'**Markdown heading:**\nMust remain part of the preamble.\n',
|
|
48
|
+
];
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conformance/index.ts"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAc7B,MAAM,CAAC,MAAM,yBAAyB,GAGhC;IACJ;QACE,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;YACtD,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;SACvD;QACD,QAAQ,EAAE,CAAC,CAAC;KACb;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;YACtD,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;SACvD;QACD,QAAQ,EAAE,CAAC,CAAC;KACb;IACD;QACE,IAAI,EAAE,oCAAoC;QAC1C,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;YACtD,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,EAAE;SACvD;QACD,QAAQ,EAAE,CAAC;KACZ;IACD;QACE,IAAI,EAAE,wDAAwD;QAC9D,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE;YAC1C,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE;SAC3C;QACD,QAAQ,EAAE,CAAC,CAAC;KACb;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAiD;IACrF;QACE,IAAI,EAAE,wDAAwD;QAC9D,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,eAAe;KAC1B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAsB;IACpE,EAAE;IACF,gBAAgB;IAChB,sEAAsE;IACtE,4DAA4D;CAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-address.d.ts","sourceRoot":"","sources":["../src/drone-address.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AASD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drone-address.js","sourceRoot":"","sources":["../src/drone-address.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC;AASD,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,QAAQ,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;AAC3C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-stream-hwm.d.ts","sourceRoot":"","sources":["../src/log-stream-hwm.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAU5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function compareBroadcastHwm(a, b) {
|
|
2
|
+
const aTime = Date.parse(a.created_at);
|
|
3
|
+
const bTime = Date.parse(b.created_at);
|
|
4
|
+
if (Number.isFinite(aTime) && Number.isFinite(bTime) && aTime !== bTime) {
|
|
5
|
+
return aTime - bTime;
|
|
6
|
+
}
|
|
7
|
+
if (a.created_at !== b.created_at) {
|
|
8
|
+
return a.created_at < b.created_at ? -1 : 1;
|
|
9
|
+
}
|
|
10
|
+
return a.id.localeCompare(b.id);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=log-stream-hwm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-stream-hwm.js","sourceRoot":"","sources":["../src/log-stream-hwm.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,mBAAmB,CAAC,CAAe,EAAE,CAAe;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACxE,OAAO,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC"}
|