@agentshouse/mdruntime-adapter 0.1.0-cc63dd043d0e2 → 0.1.0-cc710a8825617

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.
Files changed (51) hide show
  1. package/AGENTS.md +270 -183
  2. package/README.md +3 -3
  3. package/dist/actions.d.ts +63 -2
  4. package/dist/actions.d.ts.map +1 -1
  5. package/dist/actions.js +154 -138
  6. package/dist/adapter.d.ts +1 -0
  7. package/dist/adapter.d.ts.map +1 -1
  8. package/dist/adapter.js +325 -166
  9. package/dist/discovery.d.ts +6 -12
  10. package/dist/discovery.d.ts.map +1 -1
  11. package/dist/discovery.js +32 -36
  12. package/dist/gather.d.ts +1 -0
  13. package/dist/gather.d.ts.map +1 -1
  14. package/dist/gather.js +11 -6
  15. package/dist/handed.d.ts +15 -0
  16. package/dist/handed.d.ts.map +1 -0
  17. package/dist/handed.js +38 -0
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/model.d.ts +7 -18
  22. package/dist/model.d.ts.map +1 -1
  23. package/dist/model.js +60 -39
  24. package/dist/read.d.ts +35 -7
  25. package/dist/read.d.ts.map +1 -1
  26. package/dist/read.js +164 -86
  27. package/dist/referrer.d.ts +7 -0
  28. package/dist/referrer.d.ts.map +1 -0
  29. package/dist/referrer.js +35 -0
  30. package/dist/refusal.d.ts +5 -9
  31. package/dist/refusal.d.ts.map +1 -1
  32. package/dist/refusal.js +31 -17
  33. package/dist/site.d.ts +1 -1
  34. package/dist/site.d.ts.map +1 -1
  35. package/dist/site.js +191 -107
  36. package/dist/stream.d.ts +10 -4
  37. package/dist/stream.d.ts.map +1 -1
  38. package/dist/stream.js +391 -47
  39. package/dist/transport.d.ts +79 -11
  40. package/dist/transport.d.ts.map +1 -1
  41. package/dist/transport.js +3 -1
  42. package/dist/version.d.ts +2 -0
  43. package/dist/version.d.ts.map +1 -1
  44. package/dist/version.js +10 -1
  45. package/dist/write.d.ts +2 -1
  46. package/dist/write.d.ts.map +1 -1
  47. package/dist/write.js +96 -14
  48. package/package.json +3 -4
  49. package/dist/links.d.ts +0 -12
  50. package/dist/links.d.ts.map +0 -1
  51. package/dist/links.js +0 -66
package/dist/site.js CHANGED
@@ -1,100 +1,150 @@
1
- import { actionOutcome } from './actions.js';
1
+ import { actionOutcome, SITE_SUBMIT } from './actions.js';
2
2
  import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
3
- import { MODEL_ABSENT, failedModel, heldModel, modelKey, modelShelf, } from './model.js';
4
- import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, schemaOf, schemaPath, viewOf, } from './read.js';
5
- import { classifyDoor, discoveryFailure, doorRefusal } from './refusal.js';
3
+ import { partModels, streamedModels, viewModels } from './model.js';
4
+ import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, siteBootstrapNext, siteBootstrapOffset, viewOf, wholeView, } from './read.js';
5
+ import { sha256Hex } from './digest.js';
6
+ import { classifyDoor, classifyRead, discoveryFailure } from './refusal.js';
6
7
  import { houseNotifications } from './stream.js';
7
- import { PRIVATE_LOCATOR, SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, } from './transport.js';
8
- import { logPosition, presented, reachedVersion, roomVersion, } from './version.js';
8
+ import { SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, SITE_FILE_RECORD, SITE_FILES, } from './transport.js';
9
+ import { houseReferrer } from './referrer.js';
10
+ import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
9
11
  const UNCERTAIN = { kind: 'transport-uncertainty' };
10
- function siteRoom(tracked, attachedModel) {
12
+ function siteRoom(tracked) {
11
13
  return {
12
14
  name: tracked.handle,
13
15
  locator: tracked.locator,
16
+ handle: tracked.handle,
14
17
  roomVersion: roomVersion(tracked),
15
18
  operations: { read: [''], sync: [''], write: [], delete: [] },
16
19
  replica: { selection: tracked.locator, admission: 'admitted' },
17
- attachedModel,
18
20
  providerOwnedPaths: [],
19
21
  };
20
22
  }
21
23
  function settled(refused) {
22
- return refused.kind === 'beyond-horizon' || refused.kind === 'retryable-refusal'
23
- ? UNCERTAIN
24
- : refused;
24
+ return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
25
25
  }
26
- export function createSiteAdapter(transport) {
26
+ export function createSiteAdapter(transport, snapshot = false) {
27
27
  const notifications = houseNotifications(transport, 'site');
28
28
  const tracked = new Map();
29
- const models = modelShelf();
30
- const acquired = new Map();
31
- let caught = new Map();
32
- async function enumeration(entry, from) {
29
+ function published(referrer) {
30
+ const named = houseReferrer(referrer, tracked);
31
+ return named === null || !tracked.has(named.locator) ? null : named;
32
+ }
33
+ async function enumerated(entry, from, page) {
33
34
  const answer = await transport.door(SITE_DOOR_ENUMERATE, {
34
- positions: [presented(entry.authority, from)],
35
+ positions: [
36
+ page === undefined
37
+ ? presented(entry.authority, from)
38
+ : {
39
+ ...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
40
+ page: { through: page.through, read: page.read },
41
+ },
42
+ ],
35
43
  });
36
- const behind = doorRefusal(answer.body);
37
- if (behind?.code === 'replica_behind' && behind.retryable) {
38
- return { kind: 'retryable-refusal', code: behind.code, fields: behind.fields };
39
- }
40
- const classified = classifyDoor(answer.status, answer.body, entry.locator);
44
+ const classified = classifyRead(answer.status, answer.body, entry.locator);
41
45
  if (classified !== null)
42
46
  return classified;
43
- return parseEnumeration(answer.body, 'site') ?? UNCERTAIN;
47
+ const found = parseEnumeration(answer.body, 'site');
48
+ if (found === null)
49
+ return UNCERTAIN;
50
+ return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
44
51
  }
45
- async function caughtUp(entry) {
46
- const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}`);
52
+ async function enumeration(entry, from) {
53
+ const first = await enumerated(entry, from);
54
+ return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
55
+ }
56
+ async function bootstrapPart(entry, after, offset) {
57
+ const query = [
58
+ ...(after === null ? [] : [`after=${encodeURIComponent(after)}`]),
59
+ ...(offset === null ? [] : [`offset=${offset}`]),
60
+ ];
61
+ const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}${query.length === 0 ? '' : `?${query.join('&')}`}`);
47
62
  const classified = classifyDoor(answer.status, answer.body, entry.locator);
48
63
  if (classified !== null)
49
- return { failure: settled(classified) };
64
+ return { failure: classified };
50
65
  const scope = parseSiteBootstrap(answer.body);
51
- if (scope === null)
52
- return { failure: UNCERTAIN };
53
- if (roomVersion(scope) === roomVersion(entry))
54
- return { scope };
55
- const found = await enumeration(entry, scope);
56
- if ('kind' in found)
57
- return { failure: settled(found) };
58
- const view = viewOf(found, entry);
59
- if (view === undefined)
60
- return { failure: { kind: 'room-not-readable', locator: entry.locator } };
61
- return { scope: advancedScope(scope, view) };
66
+ return scope === null ? { failure: UNCERTAIN } : { body: answer.body, scope };
67
+ }
68
+ async function assembled(entry, scope, path, offset) {
69
+ const opened = scope.contents.at(-1);
70
+ if (opened === undefined || opened.path !== path || opened.content.length !== offset) {
71
+ return UNCERTAIN;
72
+ }
73
+ let text = opened.content;
74
+ for (;;) {
75
+ const part = await bootstrapPart(entry, path, text.length);
76
+ if ('failure' in part)
77
+ return part.failure;
78
+ const [piece] = part.scope.contents;
79
+ if (piece === undefined ||
80
+ part.scope.contents.length !== 1 ||
81
+ piece.path !== path ||
82
+ piece.content.length === 0) {
83
+ return UNCERTAIN;
84
+ }
85
+ text += piece.content;
86
+ const more = siteBootstrapOffset(part.body);
87
+ if (more === null)
88
+ break;
89
+ if (more !== text.length)
90
+ return UNCERTAIN;
91
+ }
92
+ const file = scope.files.find((held) => held.path === path);
93
+ if (file === undefined || (await sha256Hex(text)) !== file.version)
94
+ return UNCERTAIN;
95
+ return { ...scope, contents: [...scope.contents.slice(0, -1), { path, content: text }] };
96
+ }
97
+ async function caughtUp(entry, after) {
98
+ const part = await bootstrapPart(entry, after, null);
99
+ if ('failure' in part)
100
+ return part;
101
+ const next = siteBootstrapNext(part.body);
102
+ const offset = siteBootstrapOffset(part.body);
103
+ if (offset !== null) {
104
+ if (next === null)
105
+ return { failure: UNCERTAIN };
106
+ const scope = await assembled(entry, part.scope, next, offset);
107
+ return 'kind' in scope ? { failure: scope } : { scope, next };
108
+ }
109
+ const { scope } = part;
110
+ if (after !== null || next !== null || roomVersion(scope) === roomVersion(entry)) {
111
+ return { scope, next };
112
+ }
113
+ const view = await enumeration(entry, scope);
114
+ if ('kind' in view)
115
+ return { failure: settled(view) };
116
+ return { scope: advancedScope(scope, view), next: null };
62
117
  }
63
118
  async function refreshed(entry, fromRoomVersion) {
64
119
  const from = logPosition(fromRoomVersion);
65
120
  if (from === null)
66
121
  return { kind: 'beyond-horizon' };
67
122
  const streamed = notifications.advance(entry, from);
68
- if (streamed !== null)
69
- return streamed.page;
70
- const found = await enumeration(entry, from);
71
- if ('kind' in found)
72
- return found;
73
- const view = viewOf(found, entry);
74
- if (view === undefined)
75
- return { kind: 'room-not-readable', locator: entry.locator };
76
- notifications.hold(entry.authority, view);
77
- return refreshFrom(view, fromRoomVersion);
78
- }
79
- async function acquire(entry, held) {
80
- if ('failure' in held)
81
- return { snapshot: failedModel(held.failure), identity: null };
82
- const model = await heldModel(schemaOf(held.scope, entry.schema), schemaPath(entry.handle, entry.schema), MODEL_ABSENT);
83
- acquired.set(entry.authority, { roomVersion: roomVersion(held.scope), model });
84
- return model;
123
+ if (streamed !== null) {
124
+ const models = await streamedModels(streamed.schemas, entry, 'site');
125
+ return models === undefined ? streamed.page : { ...streamed.page, models };
126
+ }
127
+ const view = await enumeration(entry, from);
128
+ if ('kind' in view)
129
+ return view;
130
+ notifications.reach(entry.authority, view);
131
+ const answer = refreshFrom(view, fromRoomVersion);
132
+ if (answer.kind !== 'net-advancement')
133
+ return answer;
134
+ const models = await viewModels(view, entry);
135
+ return models === undefined ? answer : { ...answer, models };
85
136
  }
86
137
  return {
138
+ localSaves: true,
139
+ exhaustiveDiscovery: true,
87
140
  async authorize() {
88
141
  return {};
89
142
  },
90
- async model(_authorization, request) {
91
- return models.answer(request);
92
- },
93
143
  async discover() {
94
144
  const answer = await transport.read(SITE_DOOR_DISCOVER);
95
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
96
- if (classified !== null)
97
- return discoveryFailure(classified);
145
+ const failed = discoveryFailure(answer.status, answer.body);
146
+ if (failed !== null)
147
+ return failed;
98
148
  const document = parseSiteDiscovery(answer.body);
99
149
  if (document === null)
100
150
  return UNCERTAIN;
@@ -103,42 +153,30 @@ export function createSiteAdapter(transport) {
103
153
  for (const entry of entries)
104
154
  tracked.set(entry.locator, entry);
105
155
  notifications.track(entries);
106
- const published = new Set(entries.map((entry) => entry.authority));
107
- for (const authority of [...acquired.keys()]) {
108
- if (!published.has(authority))
109
- acquired.delete(authority);
110
- }
111
- const fresh = new Map();
112
- const current = new Map();
113
- for (const entry of entries) {
114
- const kept = acquired.get(entry.authority);
115
- if (kept !== undefined && kept.roomVersion === roomVersion(entry)) {
116
- current.set(entry.authority, kept.model);
117
- continue;
118
- }
119
- const held = await caughtUp(entry);
120
- fresh.set(entry.authority, held);
121
- current.set(entry.authority, await acquire(entry, held));
122
- }
123
- caught = fresh;
124
- const rooms = entries.map((entry) => {
125
- const shelved = models.retain(modelKey(entry.locator, 'collection'), current.get(entry.authority));
126
- return siteRoom(entry, shelved?.identity ?? null);
127
- });
128
- models.keep(entries.map((entry) => entry.locator));
129
- return mapDiscovery(document, rooms, siteCapabilities());
156
+ return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
130
157
  },
131
158
  async bootstrap(_authorization, request) {
132
159
  const entry = tracked.get(request.locator);
133
160
  if (entry === undefined)
134
161
  return { kind: 'room-not-readable', locator: request.locator };
135
- if (request.pageToken !== undefined)
136
- return UNCERTAIN;
137
- const held = caught.get(entry.authority) ?? (await caughtUp(entry));
162
+ const continued = request.pageToken === undefined
163
+ ? null
164
+ : JSON.parse(request.pageToken);
165
+ const held = await caughtUp(entry, continued?.after ?? null);
138
166
  if ('failure' in held)
139
167
  return held.failure;
140
- notifications.hold(entry.authority, held.scope);
141
- return bootstrapOf(held.scope);
168
+ notifications.reach(entry.authority, held.scope);
169
+ const seen = [
170
+ ...(continued?.seen ?? []),
171
+ ...entry.schemas.filter((schema) => held.scope.files.some((file) => file.path === schema)),
172
+ ];
173
+ const models = await partModels(held.scope, entry, new Set(seen), held.next === null);
174
+ const continuation = held.next === null ? null : { after: held.next, seen };
175
+ return {
176
+ ...bootstrapOf(held.scope),
177
+ ...(models === undefined ? {} : { models }),
178
+ ...(continuation === null ? {} : { pageToken: JSON.stringify(continuation) }),
179
+ };
142
180
  },
143
181
  async refresh(_authorization, request) {
144
182
  const entry = tracked.get(request.locator);
@@ -146,39 +184,85 @@ export function createSiteAdapter(transport) {
146
184
  return { kind: 'room-not-readable', locator: request.locator };
147
185
  if (request.pageToken !== undefined)
148
186
  return UNCERTAIN;
149
- const result = await refreshed(entry, request.fromRoomVersion);
150
- if (result.kind === 'beyond-horizon')
151
- caught.delete(entry.authority);
152
- const answered = result.kind === 'net-advancement'
153
- ? result.roomVersion
154
- : result.kind === 'still-current'
155
- ? request.fromRoomVersion
156
- : null;
157
- if (request.minPosition !== undefined &&
158
- answered !== null &&
159
- !reachedVersion(answered, request.minPosition, entry.logEpoch)) {
160
- return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };
187
+ if (snapshot) {
188
+ return request.fromRoomVersion === roomVersion(entry)
189
+ ? { kind: 'still-current' }
190
+ : { kind: 'beyond-horizon' };
161
191
  }
162
- return result;
192
+ return refreshed(entry, request.fromRoomVersion);
163
193
  },
164
194
  async mutate() {
165
- return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {} };
195
+ return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
166
196
  },
167
197
  async history() {
168
198
  return { kind: 'no-history' };
169
199
  },
200
+ async binary(_authorization, request) {
201
+ const named = published(request.kind === 'path' ? { room: request.locator, path: request.path } : request.referrer);
202
+ if (named === null) {
203
+ return { kind: 'rejected', code: 'referrer_unknown', fields: {}, retryable: false };
204
+ }
205
+ if (request.fileRef === undefined) {
206
+ return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
207
+ }
208
+ const { room_ref, path, record } = named.referrer;
209
+ const read = await transport.download(`${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
210
+ ? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
211
+ : encodeURIComponent(path)}`);
212
+ if (read.status === 404) {
213
+ return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
214
+ }
215
+ return read.status === 200 && read.blob !== null
216
+ ? { kind: 'binary', blob: read.blob }
217
+ : UNCERTAIN;
218
+ },
219
+ referrerScope(referrer) {
220
+ const named = published(referrer);
221
+ if (named === null)
222
+ return null;
223
+ const { path } = named.referrer;
224
+ return { kind: 'room', locator: named.locator, ...(path === undefined ? {} : { path }) };
225
+ },
170
226
  reached(locator, version, target) {
171
227
  return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
172
228
  },
229
+ follows(_locator, version, next) {
230
+ return followsVersion(version, next);
231
+ },
173
232
  async action(_authorization, request) {
174
- if (request.name !== 'submit') {
175
- return { kind: 'rejected', code: 'action-unimplemented', fields: { name: request.name } };
233
+ if (request.name !== SITE_SUBMIT) {
234
+ return {
235
+ kind: 'rejected',
236
+ code: 'action-unimplemented',
237
+ fields: { name: request.name },
238
+ retryable: false,
239
+ };
176
240
  }
177
241
  if (!transport.online())
178
242
  return UNCERTAIN;
179
- return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), 'submit');
243
+ return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMIT);
180
244
  },
181
- roomVersions: notifications,
245
+ roomStream: snapshot
246
+ ? undefined
247
+ : {
248
+ hold(rooms) {
249
+ notifications.send(rooms.flatMap((room) => {
250
+ const entry = tracked.get(room.locator);
251
+ const at = logPosition(room.roomVersion);
252
+ if (entry === undefined || at === null)
253
+ return [];
254
+ notifications.reach(entry.authority, at);
255
+ return [presented(entry.authority, at)];
256
+ }), null);
257
+ },
258
+ reopen: notifications.reopen,
259
+ observe: notifications.observe,
260
+ published(locator, roomVersion) {
261
+ const at = logPosition(roomVersion);
262
+ if (at !== null)
263
+ notifications.published(locator, at);
264
+ },
265
+ },
182
266
  serviceMode: notifications.serviceMode,
183
267
  };
184
268
  }
package/dist/stream.d.ts CHANGED
@@ -1,15 +1,21 @@
1
- import type { ConversationStream, RefreshPage, SelectedRooms, ServiceModeSignal } from '@agentshouse/mdruntime';
1
+ import type { ConversationStream, RefreshPage, RoomStreamEvent, ServiceModeSignal, StreamReceipts } from '@agentshouse/mdruntime';
2
2
  import type { TrackedAuthority } from './discovery.js';
3
- import type { HouseDoor, HouseMode, HouseStreamEntry } from './transport.js';
3
+ import type { HouseDemand, HouseDoor, HouseHeldRoom, HouseMode, HouseStreamEntry } from './transport.js';
4
4
  import { type LogPosition } from './version.js';
5
5
  export type HeldRevision = (path: string, revision: string) => boolean;
6
6
  export type StreamedAdvancement = {
7
7
  page: RefreshPage;
8
8
  entries: readonly HouseStreamEntry[];
9
+ schemas: ReadonlyMap<string, HouseStreamEntry>;
9
10
  };
10
- export type HouseNotifications = SelectedRooms & {
11
+ export type HouseNotifications = {
12
+ runtime: string;
13
+ observe(notify: (event: RoomStreamEvent) => void, receipts: StreamReceipts): () => void;
14
+ send(rooms: readonly HouseHeldRoom[], demand: HouseDemand | null): void;
15
+ published(locator: string, at: LogPosition): void;
16
+ reopen(): void;
11
17
  track(authorities: readonly TrackedAuthority[]): void;
12
- hold(authority: string, at: LogPosition): void;
18
+ reach(authority: string, at: LogPosition): void;
13
19
  advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): StreamedAdvancement | null;
14
20
  conversations: ConversationStream;
15
21
  serviceMode: ServiceModeSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,WAAW,EAEX,aAAa,EAEb,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAoB,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB7D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/C,OAAO,CACL,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,mBAAmB,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAYF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA2P5F"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,kBAAkB,EAElB,WAAW,EACX,eAAe,EAEf,iBAAiB,EACjB,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,aAAa,EAEb,SAAS,EAET,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA0C7D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;IACxF,IAAI,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACxE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAClD,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,OAAO,CACL,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,mBAAmB,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAkFF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CAohB5F"}