@agentshouse/mdruntime 0.1.0-c6e4c19c13638 → 0.1.0-c6fd2cbbff187
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/AGENTS.md +277 -219
- package/README.md +20 -10
- package/dist/acquisition.d.ts +14 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +24 -0
- package/dist/adapter.d.ts +94 -20
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +15 -2
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +23 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +18 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +113 -37
- package/dist/change-set.d.ts +2 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +49 -16
- package/dist/change.d.ts +15 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +26 -1
- package/dist/chat/acts.d.ts +33 -0
- package/dist/chat/acts.d.ts.map +1 -0
- package/dist/chat/acts.js +36 -0
- package/dist/chat/context.d.ts +3 -0
- package/dist/chat/context.d.ts.map +1 -0
- package/dist/chat/context.js +10 -0
- package/dist/chat/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -0
- package/dist/chat/input.d.ts +9 -0
- package/dist/chat/input.d.ts.map +1 -0
- package/dist/chat/input.js +99 -0
- package/dist/chat/kit.d.ts +61 -0
- package/dist/chat/kit.d.ts.map +1 -0
- package/dist/chat/kit.js +123 -0
- package/dist/chat/lasting.d.ts +6 -0
- package/dist/chat/lasting.d.ts.map +1 -0
- package/dist/chat/lasting.js +19 -0
- package/dist/chat/list.d.ts +27 -0
- package/dist/chat/list.d.ts.map +1 -0
- package/dist/chat/list.js +99 -0
- package/dist/chat/markdown.d.ts +20 -0
- package/dist/chat/markdown.d.ts.map +1 -0
- package/dist/chat/markdown.js +188 -0
- package/dist/chat/message.d.ts +6 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +192 -0
- package/dist/chat/messages.d.ts +22 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +155 -0
- package/dist/chat/name.d.ts +6 -0
- package/dist/chat/name.d.ts.map +1 -0
- package/dist/chat/name.js +37 -0
- package/dist/chat/opened.d.ts +11 -0
- package/dist/chat/opened.d.ts.map +1 -0
- package/dist/chat/opened.js +17 -0
- package/dist/chat/overlay.d.ts +31 -0
- package/dist/chat/overlay.d.ts.map +1 -0
- package/dist/chat/overlay.js +97 -0
- package/dist/chat/parts.d.ts +57 -0
- package/dist/chat/parts.d.ts.map +1 -0
- package/dist/chat/parts.js +119 -0
- package/dist/chat/process.d.ts +20 -0
- package/dist/chat/process.d.ts.map +1 -0
- package/dist/chat/process.js +32 -0
- package/dist/chat/provider.d.ts +63 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +635 -0
- package/dist/chat/question.d.ts +9 -0
- package/dist/chat/question.d.ts.map +1 -0
- package/dist/chat/question.js +69 -0
- package/dist/chat/questions.d.ts +31 -0
- package/dist/chat/questions.d.ts.map +1 -0
- package/dist/chat/questions.js +111 -0
- package/dist/chat/read.d.ts +5 -0
- package/dist/chat/read.d.ts.map +1 -0
- package/dist/chat/read.js +13 -0
- package/dist/chat/ready.d.ts +34 -0
- package/dist/chat/ready.d.ts.map +1 -0
- package/dist/chat/ready.js +91 -0
- package/dist/chat/style.d.ts +4 -0
- package/dist/chat/style.d.ts.map +1 -0
- package/dist/chat/style.js +302 -0
- package/dist/chat.d.ts +14 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +8 -0
- package/dist/client.d.ts +27 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +77 -16
- package/dist/collection.d.ts +21 -12
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +271 -23
- package/dist/connection.d.ts +46 -15
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1946 -414
- package/dist/conversation.d.ts +30 -10
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +485 -159
- package/dist/durability.d.ts +7 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +156 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/host.d.ts +18 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +101 -19
- package/dist/identity.d.ts +5 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +19 -1
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/memory.d.ts +12 -4
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +94 -25
- package/dist/model.d.ts +14 -4
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +12 -1
- package/dist/observation.d.ts +7 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +29 -12
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/outcome.d.ts +38 -3
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +45 -1
- package/dist/overlay.d.ts +16 -3
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +118 -77
- package/dist/query.d.ts +60 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +41 -38
- package/dist/reach.d.ts +8 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +63 -24
- package/dist/react.d.ts +31 -18
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +15 -11
- package/dist/read-side.d.ts +13 -6
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +428 -94
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +98 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +197 -0
- package/dist/refresh.d.ts +13 -3
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +49 -38
- package/dist/replica.d.ts +13 -6
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +143 -70
- package/dist/room-draft.d.ts +38 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +134 -25
- package/dist/rows.d.ts +10 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +19 -14
- package/dist/save.d.ts +32 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +392 -45
- package/dist/search.d.ts +52 -8
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +192 -47
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +11 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +368 -0
- package/dist/status.d.ts +6 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +89 -18
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +573 -200
- package/dist/turn.d.ts +7 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +45 -0
- package/dist/windows.d.ts +19 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +83 -0
- package/dist/wire.d.ts +149 -33
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +63 -31
- package/package.json +26 -14
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
package/dist/query.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { pointerFacts, } from '@agentshouse/mdmodel';
|
|
2
2
|
import { referenceField } from './model.js';
|
|
3
3
|
import { normalize } from './paths.js';
|
|
4
|
+
import { decodedCursor } from './windows.js';
|
|
4
5
|
export class QueryError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
retryable = false;
|
|
5
8
|
constructor(code, at, problem) {
|
|
6
9
|
super(`${code} at ${at}: ${problem}`);
|
|
10
|
+
this.code = code;
|
|
7
11
|
}
|
|
8
12
|
}
|
|
9
13
|
const RANGE = ['$gt', '$gte', '$lt', '$lte'];
|
|
10
14
|
const SINGLE = ['$eq', '$ne', '$in', '$nin', '$all', '$size', '$exists'];
|
|
11
|
-
const FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'hop', 'backlinks'];
|
|
15
|
+
const FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'folder', 'paths', 'hop', 'backlinks'];
|
|
12
16
|
const RELATED = ['types', 'where', 'pathPrefix', 'field'];
|
|
13
|
-
const PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change'];
|
|
17
|
+
const PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change', 'fileId'];
|
|
14
18
|
const ORDER = ['by', 'direction', 'nulls', 'stringSort', 'locale', 'localeOptions'];
|
|
15
19
|
const CALENDAR_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
16
20
|
const STRAY_ESCAPE = /~(?![01])/u;
|
|
@@ -57,6 +61,13 @@ function names(input, at) {
|
|
|
57
61
|
invalid(at, 'expects a list of names');
|
|
58
62
|
return [...new Set(listed)].sort();
|
|
59
63
|
}
|
|
64
|
+
function pathsOf(input) {
|
|
65
|
+
const listed = list(input, 'paths');
|
|
66
|
+
if (listed.some((item) => typeof item !== 'string' || item === '' || normalize(item) !== item)) {
|
|
67
|
+
invalid('paths', 'expects a list of Paths');
|
|
68
|
+
}
|
|
69
|
+
return [...new Set(listed)].sort();
|
|
70
|
+
}
|
|
60
71
|
function directory(input, at) {
|
|
61
72
|
if (typeof input !== 'string' || normalize(input) !== input) {
|
|
62
73
|
invalid(at, 'expects a normalized directory');
|
|
@@ -117,39 +128,10 @@ function pointer(input, at) {
|
|
|
117
128
|
}
|
|
118
129
|
return input;
|
|
119
130
|
}
|
|
120
|
-
function stepped({ facts, through, conditional }, token) {
|
|
121
|
-
if (facts.type === 'array' && ARRAY_INDEX.test(token)) {
|
|
122
|
-
const item = itemFacts(facts, Number(token));
|
|
123
|
-
return item === undefined ? undefined : { facts: item, through, conditional };
|
|
124
|
-
}
|
|
125
|
-
let reached = facts;
|
|
126
|
-
let across = through;
|
|
127
|
-
while (reached?.type === 'array') {
|
|
128
|
-
reached = reached.items;
|
|
129
|
-
across = true;
|
|
130
|
-
}
|
|
131
|
-
const member = reached === undefined ? undefined : memberFacts(reached, token);
|
|
132
|
-
return member === undefined
|
|
133
|
-
? undefined
|
|
134
|
-
: { facts: member, through: across, conditional: conditional || member.conditional === true };
|
|
135
|
-
}
|
|
136
|
-
function specAt(type, field) {
|
|
137
|
-
let spec = {
|
|
138
|
-
facts: { ...type.frontmatter, properties: type.fields },
|
|
139
|
-
through: false,
|
|
140
|
-
conditional: false,
|
|
141
|
-
};
|
|
142
|
-
for (const token of pointerSegments(field)) {
|
|
143
|
-
if (spec === undefined)
|
|
144
|
-
return undefined;
|
|
145
|
-
spec = stepped(spec, token);
|
|
146
|
-
}
|
|
147
|
-
return spec;
|
|
148
|
-
}
|
|
149
131
|
function specs(typed, input, at) {
|
|
150
132
|
const field = pointer(input, at);
|
|
151
133
|
const declared = typed.types.flatMap((type) => {
|
|
152
|
-
const spec =
|
|
134
|
+
const spec = pointerFacts(type, field);
|
|
153
135
|
return spec === undefined ? [] : [spec];
|
|
154
136
|
});
|
|
155
137
|
if (declared.length === 0 && !typed.untyped) {
|
|
@@ -305,15 +287,16 @@ function backlinksOf(facts, rooms, input) {
|
|
|
305
287
|
return { types, where, pathPrefix, field };
|
|
306
288
|
}
|
|
307
289
|
function keyPlan(typed, input, at, path) {
|
|
308
|
-
if (input === 'room' || input === 'type' || (path && input === 'path'))
|
|
290
|
+
if (input === 'room' || input === 'type' || input === 'folder' || (path && input === 'path')) {
|
|
309
291
|
return { of: input };
|
|
292
|
+
}
|
|
310
293
|
if (plain(input) && Object.hasOwn(input, 'field') && Object.keys(input).length === 1) {
|
|
311
294
|
if (specs(typed, input.field, place(at, 'field')).some(several)) {
|
|
312
295
|
invalid(place(at, 'field'), 'a path that can hold several values');
|
|
313
296
|
}
|
|
314
297
|
return { of: 'field', field: input.field };
|
|
315
298
|
}
|
|
316
|
-
return invalid(at, path ? 'expects room, path, type or a field' : 'expects room, type or a field');
|
|
299
|
+
return invalid(at, path ? 'expects room, path, type, folder or a field' : 'expects room, type, folder or a field');
|
|
317
300
|
}
|
|
318
301
|
function direction(input, at) {
|
|
319
302
|
if (input === undefined)
|
|
@@ -375,7 +358,7 @@ function parts(typed, input, at, fields) {
|
|
|
375
358
|
});
|
|
376
359
|
return named;
|
|
377
360
|
}
|
|
378
|
-
function flag(input, at) {
|
|
361
|
+
export function flag(input, at) {
|
|
379
362
|
if (input === undefined)
|
|
380
363
|
return false;
|
|
381
364
|
if (input !== true)
|
|
@@ -403,6 +386,7 @@ function documentShape(typed, input) {
|
|
|
403
386
|
markdown: true,
|
|
404
387
|
backlinks: true,
|
|
405
388
|
change: true,
|
|
389
|
+
fileId: true,
|
|
406
390
|
orderBy,
|
|
407
391
|
};
|
|
408
392
|
}
|
|
@@ -417,6 +401,7 @@ function documentShape(typed, input) {
|
|
|
417
401
|
markdown: flag(select.markdown, 'select.markdown'),
|
|
418
402
|
backlinks: flag(select.backlinks, 'select.backlinks'),
|
|
419
403
|
change: flag(select.change, 'select.change'),
|
|
404
|
+
fileId: flag(select.fileId, 'select.fileId'),
|
|
420
405
|
orderBy,
|
|
421
406
|
};
|
|
422
407
|
}
|
|
@@ -447,20 +432,35 @@ export function planOf(input, facts, reach = null) {
|
|
|
447
432
|
invalid('select', 'a grouped query selects nothing');
|
|
448
433
|
if (!grouped && input.select === undefined)
|
|
449
434
|
invalid('select', 'a Document query must select');
|
|
450
|
-
known(input, [...FILTER, 'orderBy', 'limit', grouped ? 'groupBy' : 'select'], '');
|
|
435
|
+
known(input, [...FILTER, 'orderBy', 'limit', 'after', 'total', grouped ? 'groupBy' : 'select'], '');
|
|
451
436
|
const limit = limitOf(input.limit);
|
|
452
437
|
const rooms = input.rooms === undefined ? null : names(input.rooms, 'rooms');
|
|
453
438
|
const { typed, ...root } = scope(facts, rooms, input, '');
|
|
439
|
+
const shape = grouped ? groupShape(typed, input) : documentShape(typed, input);
|
|
454
440
|
return {
|
|
441
|
+
key: queryKey(input),
|
|
455
442
|
rooms,
|
|
456
443
|
reach,
|
|
457
444
|
root,
|
|
445
|
+
folder: input.folder === undefined ? null : directory(input.folder, 'folder'),
|
|
446
|
+
paths: input.paths === undefined ? null : pathsOf(input.paths),
|
|
458
447
|
hop: input.hop === undefined ? null : hopOf(facts, rooms, typed, input.hop),
|
|
459
448
|
backlinks: input.backlinks === undefined ? null : backlinksOf(facts, rooms, input.backlinks),
|
|
460
|
-
shape
|
|
449
|
+
shape,
|
|
461
450
|
limit,
|
|
451
|
+
after: continuationOf(input.after, shape.orderBy.length + 1),
|
|
452
|
+
total: flag(input.total, 'total'),
|
|
462
453
|
};
|
|
463
454
|
}
|
|
455
|
+
function continuationOf(input, arity) {
|
|
456
|
+
if (input === undefined)
|
|
457
|
+
return null;
|
|
458
|
+
const values = typeof input === 'string' ? decodedCursor(input) : null;
|
|
459
|
+
if (values === null || (values.length !== 0 && values.length !== arity)) {
|
|
460
|
+
invalid('after', 'expects the next an earlier result of this query returned');
|
|
461
|
+
}
|
|
462
|
+
return { text: input, values: values.length === 0 ? null : values };
|
|
463
|
+
}
|
|
464
464
|
export function limitOf(input) {
|
|
465
465
|
if (input === undefined)
|
|
466
466
|
return null;
|
|
@@ -475,6 +475,9 @@ export function filterOf(input, facts, reach = null) {
|
|
|
475
475
|
known(input, FILTER, '');
|
|
476
476
|
return planOf({ ...input, select: {} }, facts, reach);
|
|
477
477
|
}
|
|
478
|
+
export function queryKey(query) {
|
|
479
|
+
return canonical(query);
|
|
480
|
+
}
|
|
478
481
|
function canonical(value) {
|
|
479
482
|
if (Array.isArray(value))
|
|
480
483
|
return `[${value.map(canonical).join(',')}]`;
|
package/dist/reach.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReferrerScope } from './adapter.js';
|
|
2
|
+
import type { MdRuntime, ReadinessPort, RuntimeTopic } from './connection.js';
|
|
2
3
|
import type { Plan, PlanReach, QueryResult } from './query.js';
|
|
3
|
-
import type {
|
|
4
|
+
import type { Readiness } from './readiness.js';
|
|
5
|
+
import { type SearchResult } from './search.js';
|
|
4
6
|
export type ReachedDocument = {
|
|
5
7
|
readonly room: string;
|
|
6
8
|
readonly path: string;
|
|
@@ -18,12 +20,15 @@ export type RuntimeView = {
|
|
|
18
20
|
};
|
|
19
21
|
export type NarrowedView = RuntimeView & {
|
|
20
22
|
narrow(reach: PortReach | null): void;
|
|
23
|
+
facts(port: ReadinessPort): void;
|
|
21
24
|
};
|
|
22
25
|
export type Reachable = RuntimeView & {
|
|
23
26
|
plan(input: unknown, reach: PortReach | null): Plan;
|
|
24
27
|
query(plan: Plan): Promise<QueryResult>;
|
|
25
28
|
watchPlan(plan: Plan, deliver: (message: unknown) => void): () => void;
|
|
26
29
|
search(input: unknown, reach: PortReach | null): Promise<SearchResult>;
|
|
30
|
+
watchReadiness(port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
|
|
31
|
+
referrerScope(referrer: unknown): ReferrerScope | null;
|
|
27
32
|
};
|
|
28
33
|
export declare function holds(reach: PortReach | null, room: string): boolean;
|
|
29
34
|
export declare function governs(reach: PortReach | null, room: {
|
|
@@ -36,5 +41,5 @@ export declare function governs(reach: PortReach | null, room: {
|
|
|
36
41
|
readonly selection: boolean;
|
|
37
42
|
};
|
|
38
43
|
export declare function planReach(reach: PortReach | null): PlanReach | null;
|
|
39
|
-
export declare function narrowed(runtime: Reachable, given: PortReach | null): NarrowedView;
|
|
44
|
+
export declare function narrowed(runtime: Reachable, given: PortReach | null, told: ReadinessPort): NarrowedView;
|
|
40
45
|
//# sourceMappingURL=reach.d.ts.map
|
package/dist/reach.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"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"}
|
package/dist/reach.js
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import { unheldView } from './conversation.js';
|
|
2
2
|
import { modelTypes, NO_MODEL } from './model.js';
|
|
3
3
|
import { applied, observing } from './observation.js';
|
|
4
|
+
import { runtimeError } from './failure.js';
|
|
5
|
+
import { failure, undeclared, } from './outcome.js';
|
|
4
6
|
import { beneath } from './paths.js';
|
|
5
7
|
import { reconciled } from './read-side.js';
|
|
6
|
-
import { moveTarget, readParts } from './room-draft.js';
|
|
8
|
+
import { moveTarget, readParts, staleWrite, } from './room-draft.js';
|
|
7
9
|
import { documentKey } from './rows.js';
|
|
10
|
+
import { undeclaredSearch } from './search.js';
|
|
8
11
|
const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return Promise.resolve(UNDECLARED);
|
|
12
|
+
function unconversed(name) {
|
|
13
|
+
return () => Promise.resolve(undeclared(name));
|
|
12
14
|
}
|
|
13
15
|
const NO_CONVERSATION = {
|
|
14
16
|
list: () => Promise.resolve([]),
|
|
15
17
|
read: (conversation) => Promise.resolve(unheldView(conversation)),
|
|
16
|
-
create:
|
|
17
|
-
send:
|
|
18
|
-
answer:
|
|
19
|
-
interrupt:
|
|
20
|
-
kill:
|
|
21
|
-
cancel:
|
|
22
|
-
delete:
|
|
18
|
+
create: unconversed('conversation.create'),
|
|
19
|
+
send: unconversed('conversation.send'),
|
|
20
|
+
answer: unconversed('conversation.answer'),
|
|
21
|
+
interrupt: unconversed('conversation.interrupt'),
|
|
22
|
+
kill: unconversed('conversation.kill'),
|
|
23
|
+
cancel: unconversed('conversation.cancel'),
|
|
24
|
+
delete: unconversed('conversation.delete'),
|
|
23
25
|
};
|
|
24
26
|
const NO_CHAT_DRAFT = {
|
|
25
27
|
write: () => Promise.resolve(),
|
|
@@ -51,6 +53,20 @@ function covers(reach, room, path) {
|
|
|
51
53
|
function conversing(reach) {
|
|
52
54
|
return reach === null || reach.conversations;
|
|
53
55
|
}
|
|
56
|
+
function refers(reach, scope) {
|
|
57
|
+
if (reach === null)
|
|
58
|
+
return true;
|
|
59
|
+
if (scope === null)
|
|
60
|
+
return false;
|
|
61
|
+
if (scope.kind === 'conversations')
|
|
62
|
+
return reach.conversations;
|
|
63
|
+
return scope.path === undefined
|
|
64
|
+
? wholly(reach, scope.locator)
|
|
65
|
+
: covers(reach, scope.locator, scope.path);
|
|
66
|
+
}
|
|
67
|
+
function unreachedReference(fileRef) {
|
|
68
|
+
return { kind: 'absent', code: 'binary-file-absent', fields: { fileRef }, retryable: false };
|
|
69
|
+
}
|
|
54
70
|
export function planReach(reach) {
|
|
55
71
|
return reach === null
|
|
56
72
|
? null
|
|
@@ -88,7 +104,7 @@ function shownDraft(reach, draft) {
|
|
|
88
104
|
function writeWithin(reach, write) {
|
|
89
105
|
return write.outcome === 'written'
|
|
90
106
|
? { outcome: 'written', roomDraft: shownDraft(reach, write.roomDraft) }
|
|
91
|
-
:
|
|
107
|
+
: staleWrite(shownDraft(reach, write.current));
|
|
92
108
|
}
|
|
93
109
|
function savedWithin(reach, room, result) {
|
|
94
110
|
if (reach === null || result.outcome === 'saved')
|
|
@@ -107,7 +123,7 @@ function savedWithin(reach, room, result) {
|
|
|
107
123
|
function statusWithin(reach, status) {
|
|
108
124
|
return {
|
|
109
125
|
...status,
|
|
110
|
-
attentionRequired: status.attentionRequired.filter((entry) => covers(reach, entry.room, entry.path)),
|
|
126
|
+
attentionRequired: status.attentionRequired.filter((entry) => 'refusal' in entry ? wholly(reach, entry.room) : covers(reach, entry.room, entry.path)),
|
|
111
127
|
};
|
|
112
128
|
}
|
|
113
129
|
function queueWithin(reach, room, entries) {
|
|
@@ -115,11 +131,12 @@ function queueWithin(reach, room, entries) {
|
|
|
115
131
|
(change.kind !== 'move' || covers(reach, room, change.to))));
|
|
116
132
|
}
|
|
117
133
|
function unreached(room) {
|
|
118
|
-
return
|
|
134
|
+
return runtimeError('room-not-held', `No Local Replica for ${room}`);
|
|
119
135
|
}
|
|
120
|
-
export function narrowed(runtime, given) {
|
|
136
|
+
export function narrowed(runtime, given, told) {
|
|
121
137
|
const { md, watch } = runtime;
|
|
122
138
|
let reach = given;
|
|
139
|
+
let port = told;
|
|
123
140
|
const open = new Set();
|
|
124
141
|
function following(begin) {
|
|
125
142
|
let stop = begin();
|
|
@@ -137,6 +154,9 @@ export function narrowed(runtime, given) {
|
|
|
137
154
|
if (topic === 'rooms') {
|
|
138
155
|
return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
|
|
139
156
|
}
|
|
157
|
+
if (topic === 'readiness') {
|
|
158
|
+
return following(() => runtime.watchReadiness(port, reach, deliver));
|
|
159
|
+
}
|
|
140
160
|
if (topic === 'sync-status') {
|
|
141
161
|
return following(() => watch(topic, input, (status) => deliver(statusWithin(reach, status))));
|
|
142
162
|
}
|
|
@@ -174,7 +194,7 @@ export function narrowed(runtime, given) {
|
|
|
174
194
|
if (next === null)
|
|
175
195
|
return;
|
|
176
196
|
held = next.keyed;
|
|
177
|
-
deliver(next.
|
|
197
|
+
deliver(next.message);
|
|
178
198
|
});
|
|
179
199
|
});
|
|
180
200
|
}
|
|
@@ -186,7 +206,7 @@ export function narrowed(runtime, given) {
|
|
|
186
206
|
return () => { };
|
|
187
207
|
});
|
|
188
208
|
}
|
|
189
|
-
if (topic === 'conversations') {
|
|
209
|
+
if (topic === 'conversations' || topic === 'agents') {
|
|
190
210
|
return following(() => {
|
|
191
211
|
if (conversing(reach))
|
|
192
212
|
return watch(topic, input, deliver);
|
|
@@ -202,7 +222,9 @@ export function narrowed(runtime, given) {
|
|
|
202
222
|
...md,
|
|
203
223
|
rooms: () => roomsWithin(reach, md.rooms()),
|
|
204
224
|
query: ((input) => runtime.query(runtime.plan(input, reach))),
|
|
205
|
-
search: (input) =>
|
|
225
|
+
search: (input) => port.search === 'required'
|
|
226
|
+
? runtime.search(input, reach)
|
|
227
|
+
: Promise.resolve(undeclaredSearch()),
|
|
206
228
|
types(room) {
|
|
207
229
|
if (wholly(reach, room))
|
|
208
230
|
return md.types(room);
|
|
@@ -216,13 +238,25 @@ export function narrowed(runtime, given) {
|
|
|
216
238
|
throw unreached(room);
|
|
217
239
|
const outside = roomDrafts.find(({ path }) => !covers(reach, room, path) ||
|
|
218
240
|
!moves(reach, room, md.roomDraft.read(room, path)?.parts.move));
|
|
219
|
-
if (outside !== undefined)
|
|
220
|
-
return { outcome: 'refused',
|
|
241
|
+
if (outside !== undefined) {
|
|
242
|
+
return { outcome: 'refused', code: 'stale', retryable: false, file: outside.path };
|
|
243
|
+
}
|
|
221
244
|
return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
|
|
222
245
|
},
|
|
223
246
|
history: (room, path, query) => covers(reach, room, path)
|
|
224
247
|
? md.history(room, path, query)
|
|
225
|
-
: Promise.resolve({ kind: 'room-not-readable', locator: room }),
|
|
248
|
+
: Promise.resolve(failure({ kind: 'room-not-readable', locator: room })),
|
|
249
|
+
binaryFile: {
|
|
250
|
+
read: (room, path, revision) => covers(reach, room, path)
|
|
251
|
+
? md.binaryFile.read(room, path, revision)
|
|
252
|
+
: Promise.resolve(failure({ kind: 'room-not-readable', locator: room })),
|
|
253
|
+
link: (room, path, revision) => covers(reach, room, path)
|
|
254
|
+
? md.binaryFile.link(room, path, revision)
|
|
255
|
+
: Promise.resolve(failure({ kind: 'room-not-readable', locator: room })),
|
|
256
|
+
readReference: (reference) => refers(reach, runtime.referrerScope(reference.referrer))
|
|
257
|
+
? md.binaryFile.readReference(reference)
|
|
258
|
+
: Promise.resolve(unreachedReference(reference.fileRef)),
|
|
259
|
+
},
|
|
226
260
|
reached: (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
|
|
227
261
|
md.reached(room, roomVersion, path),
|
|
228
262
|
log: () => (reach === null ? md.log() : ''),
|
|
@@ -237,7 +271,7 @@ export function narrowed(runtime, given) {
|
|
|
237
271
|
},
|
|
238
272
|
async discard(room, path, revision) {
|
|
239
273
|
if (!covers(reach, room, path))
|
|
240
|
-
return
|
|
274
|
+
return staleWrite(null);
|
|
241
275
|
return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
|
|
242
276
|
},
|
|
243
277
|
},
|
|
@@ -245,7 +279,7 @@ export function narrowed(runtime, given) {
|
|
|
245
279
|
list: () => conversation().list(),
|
|
246
280
|
read: (id, options) => conversation().read(id, options),
|
|
247
281
|
create: (input) => conversation().create(input),
|
|
248
|
-
send: (id) => conversation().send(id),
|
|
282
|
+
send: (id, operation, draft) => conversation().send(id, operation, draft),
|
|
249
283
|
answer: (id, answer) => conversation().answer(id, answer),
|
|
250
284
|
interrupt: (id) => conversation().interrupt(id),
|
|
251
285
|
kill: (id) => conversation().kill(id),
|
|
@@ -253,7 +287,7 @@ export function narrowed(runtime, given) {
|
|
|
253
287
|
delete: (id) => conversation().delete(id),
|
|
254
288
|
},
|
|
255
289
|
chatDraft: {
|
|
256
|
-
write: (id, draft) => chatDraft().write(id, draft),
|
|
290
|
+
write: (id, draft, revision) => chatDraft().write(id, draft, revision),
|
|
257
291
|
discard: (id) => chatDraft().discard(id),
|
|
258
292
|
},
|
|
259
293
|
observe: observing(within),
|
|
@@ -266,5 +300,10 @@ export function narrowed(runtime, given) {
|
|
|
266
300
|
for (const restart of [...open])
|
|
267
301
|
restart();
|
|
268
302
|
},
|
|
303
|
+
facts(next) {
|
|
304
|
+
port = next;
|
|
305
|
+
for (const restart of [...open])
|
|
306
|
+
restart();
|
|
307
|
+
},
|
|
269
308
|
};
|
|
270
309
|
}
|
package/dist/react.d.ts
CHANGED
|
@@ -1,31 +1,44 @@
|
|
|
1
1
|
import type { MdRuntimeClient } from './client.js';
|
|
2
|
-
import type { AppRoom, ConnectionRefusal, SaveResult } from './connection.js';
|
|
3
|
-
import type { ServiceMode } from './adapter.js';
|
|
4
|
-
import type { ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
2
|
+
import type { AppRoom, ConnectionRefusal, SavedRoomDraft, SaveResult } from './connection.js';
|
|
3
|
+
import type { Member, ServiceMode } from './adapter.js';
|
|
4
|
+
import type { ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
5
|
+
import { type RuntimeError } from './failure.js';
|
|
5
6
|
import type { QueueEntry } from './outcome.js';
|
|
6
|
-
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult } from './query.js';
|
|
7
|
+
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
|
|
8
|
+
import type { Readiness } from './readiness.js';
|
|
7
9
|
import type { RoomDraft, RoomDraftParts } from './room-draft.js';
|
|
8
10
|
import type { SyncStatus } from './status.js';
|
|
9
11
|
type Client = MdRuntimeClient | null;
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export declare function useObserve(client: Client, topic: '
|
|
17
|
-
export declare function useObserve(client: Client, topic: '
|
|
18
|
-
export declare function useObserve(client: Client, topic: '
|
|
19
|
-
export declare function useObserve(client: Client, topic: '
|
|
20
|
-
export declare function useObserve(client: Client, topic: '
|
|
21
|
-
export declare function useObserve(client: Client, topic: '
|
|
22
|
-
export declare function useObserve(client: Client, topic: '
|
|
12
|
+
export type Observed<T> = {
|
|
13
|
+
readonly state: 'loading';
|
|
14
|
+
} | {
|
|
15
|
+
readonly state: 'ready';
|
|
16
|
+
readonly value: T;
|
|
17
|
+
};
|
|
18
|
+
export declare function useObserve(client: Client, topic: 'deployment-facts'): Observed<unknown>;
|
|
19
|
+
export declare function useObserve(client: Client, topic: 'rooms'): Observed<readonly AppRoom[]>;
|
|
20
|
+
export declare function useObserve(client: Client, topic: 'readiness'): Observed<Readiness>;
|
|
21
|
+
export declare function useObserve(client: Client, topic: 'connection-refusal'): Observed<ConnectionRefusal | null>;
|
|
22
|
+
export declare function useObserve(client: Client, topic: 'storage-loss'): Observed<string | null>;
|
|
23
|
+
export declare function useObserve(client: Client, topic: 'sync-status'): Observed<SyncStatus>;
|
|
24
|
+
export declare function useObserve(client: Client, topic: 'service-mode'): Observed<ServiceMode>;
|
|
25
|
+
export declare function useObserve(client: Client, topic: 'member'): Observed<Member | null>;
|
|
26
|
+
export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): Observed<DocumentResult | PendingResult>;
|
|
27
|
+
export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): Observed<GroupResult | PendingResult>;
|
|
28
|
+
export declare function useObserve(client: Client, topic: 'queue', locator: string): Observed<readonly QueueEntry[]>;
|
|
29
|
+
export declare function useObserve(client: Client, topic: 'room-drafts'): Observed<readonly RoomDraft[]>;
|
|
30
|
+
export declare function useObserve(client: Client, topic: 'presentation'): Observed<unknown>;
|
|
31
|
+
export declare function useObserve(client: Client, topic: 'conversation', conversation: string, options: ConversationOptions): Observed<ConversationView>;
|
|
32
|
+
export declare function useObserve(client: Client, topic: 'conversations'): Observed<readonly ConversationEntry[]>;
|
|
33
|
+
export declare function useObserve(client: Client, topic: 'agents'): Observed<readonly ConversationAgent[]>;
|
|
23
34
|
export type Saving = {
|
|
24
35
|
readonly busy: boolean;
|
|
25
36
|
readonly outcome: SaveResult | null;
|
|
26
|
-
readonly failure:
|
|
37
|
+
readonly failure: RuntimeError | null;
|
|
27
38
|
save(room: string, roomDrafts: ReadonlyMap<string, RoomDraftParts>): Promise<SaveResult>;
|
|
39
|
+
saveWritten(room: string, roomDrafts: readonly SavedRoomDraft[]): Promise<SaveResult>;
|
|
28
40
|
};
|
|
41
|
+
export declare function saveRoomDrafts(client: MdRuntimeClient, room: string, roomDrafts: ReadonlyMap<string, RoomDraftParts>): Promise<SaveResult>;
|
|
29
42
|
export declare function useSave(client: MdRuntimeClient): Saving;
|
|
30
43
|
export {};
|
|
31
44
|
//# sourceMappingURL=react.d.ts.map
|
package/dist/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
|
package/dist/react.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { useCallback,
|
|
1
|
+
import { useCallback, useLayoutEffect, useRef, useState } from 'react';
|
|
2
|
+
import { failed, runtimeError } from './failure.js';
|
|
3
|
+
const LOADING = { state: 'loading' };
|
|
2
4
|
export function useObserve(client, topic, ...input) {
|
|
3
5
|
const key = JSON.stringify([topic, ...input]);
|
|
4
6
|
const [held, setHeld] = useState(null);
|
|
5
7
|
const opened = useRef(input);
|
|
6
8
|
opened.current = input;
|
|
7
|
-
|
|
9
|
+
useLayoutEffect(() => {
|
|
8
10
|
if (client === null)
|
|
9
11
|
return;
|
|
10
12
|
let live = true;
|
|
@@ -18,7 +20,7 @@ export function useObserve(client, topic, ...input) {
|
|
|
18
20
|
observation = open;
|
|
19
21
|
const take = (value) => {
|
|
20
22
|
if (live)
|
|
21
|
-
setHeld({ client, key, value });
|
|
23
|
+
setHeld({ client, key, observed: { state: 'ready', value } });
|
|
22
24
|
};
|
|
23
25
|
take(open.current());
|
|
24
26
|
open.subscribe(take);
|
|
@@ -28,16 +30,16 @@ export function useObserve(client, topic, ...input) {
|
|
|
28
30
|
observation?.close();
|
|
29
31
|
};
|
|
30
32
|
}, [client, key]);
|
|
31
|
-
return held !== null && held.client === client && held.key === key ? held.
|
|
33
|
+
return held !== null && held.client === client && held.key === key ? held.observed : LOADING;
|
|
32
34
|
}
|
|
33
35
|
const IDLE = { busy: false, outcome: null, failure: null };
|
|
34
|
-
async function
|
|
36
|
+
export async function saveRoomDrafts(client, room, roomDrafts) {
|
|
35
37
|
const kept = [];
|
|
36
38
|
for (const [path, parts] of roomDrafts) {
|
|
37
39
|
const prior = await client.roomDraft.read(room, path);
|
|
38
40
|
const write = await client.roomDraft.write(room, path, prior?.revision ?? null, parts);
|
|
39
41
|
if (write.outcome !== 'written' || write.roomDraft === null) {
|
|
40
|
-
throw
|
|
42
|
+
throw runtimeError(write.outcome === 'stale' ? write.code : 'room-draft-unwritten', `the Room Draft at ${path} was not written`);
|
|
41
43
|
}
|
|
42
44
|
kept.push({ path, revision: write.roomDraft.revision });
|
|
43
45
|
}
|
|
@@ -45,18 +47,20 @@ async function written(client, room, roomDrafts) {
|
|
|
45
47
|
}
|
|
46
48
|
export function useSave(client) {
|
|
47
49
|
const [state, setState] = useState(IDLE);
|
|
48
|
-
const
|
|
50
|
+
const settled = useCallback(async (saving) => {
|
|
49
51
|
setState({ busy: true, outcome: null, failure: null });
|
|
50
52
|
try {
|
|
51
|
-
const outcome = await
|
|
53
|
+
const outcome = await saving();
|
|
52
54
|
setState({ busy: false, outcome, failure: null });
|
|
53
55
|
return outcome;
|
|
54
56
|
}
|
|
55
57
|
catch (error) {
|
|
56
|
-
const failure =
|
|
58
|
+
const failure = failed(error);
|
|
57
59
|
setState({ busy: false, outcome: null, failure });
|
|
58
60
|
throw failure;
|
|
59
61
|
}
|
|
60
|
-
}, [
|
|
61
|
-
|
|
62
|
+
}, []);
|
|
63
|
+
const save = useCallback((room, roomDrafts) => settled(() => saveRoomDrafts(client, room, roomDrafts)), [client, settled]);
|
|
64
|
+
const saveWritten = useCallback((room, roomDrafts) => settled(() => client.save(room, roomDrafts)), [client, settled]);
|
|
65
|
+
return { ...state, save, saveWritten };
|
|
62
66
|
}
|
package/dist/read-side.d.ts
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import type { ChangeSet } from './change-set.js';
|
|
2
|
-
import { type KeyedResult, type
|
|
3
|
-
import type { Plan,
|
|
2
|
+
import { type KeyedResult, type QueryMessage } from './observation.js';
|
|
3
|
+
import type { PendingResult, Plan, QueryCoverage, QueryRows } from './query.js';
|
|
4
4
|
import type { SearchedDocument } from './search.js';
|
|
5
|
+
export type Cover = {
|
|
6
|
+
coverage: QueryCoverage;
|
|
7
|
+
} | PendingResult;
|
|
5
8
|
export type ReadSide = {
|
|
6
9
|
apply(set: ChangeSet): void;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
recover(): void;
|
|
11
|
+
query<T>(plan: Plan, at: () => T): Promise<{
|
|
12
|
+
rows: QueryRows;
|
|
13
|
+
at: T;
|
|
14
|
+
}>;
|
|
15
|
+
watch(plan: Plan, identity: string, cover: () => Cover, deliver: (message: QueryMessage) => void): () => void;
|
|
16
|
+
room(room: string): readonly string[];
|
|
10
17
|
document(room: string, path: string): SearchedDocument | null;
|
|
11
18
|
close(): void;
|
|
12
19
|
};
|
|
13
20
|
export declare function reconciled(previous: KeyedResult, next: KeyedResult): {
|
|
14
21
|
keyed: KeyedResult;
|
|
15
|
-
|
|
22
|
+
message: QueryMessage;
|
|
16
23
|
} | null;
|
|
17
24
|
export declare function createReadSide(): ReadSide;
|
|
18
25
|
//# sourceMappingURL=read-side.d.ts.map
|
package/dist/read-side.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAOV,aAAa,EACb,IAAI,EAEJ,aAAa,EAGb,SAAS,EAIV,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkDpD,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,GAAG,aAAa,CAAC;AAwBhE,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACvE,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,KAAK,EAClB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GACvC,MAAM,IAAI,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAucF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,GAChB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CA+CtD;AA4BD,wBAAgB,cAAc,IAAI,QAAQ,CA8SzC"}
|