@agentshouse/mdruntime 0.1.0-alpha.8 → 0.1.0-c009335e08279

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 (121) hide show
  1. package/AGENTS.md +208 -0
  2. package/README.md +44 -0
  3. package/dist/adapter.d.ts +215 -25
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +2 -3
  6. package/dist/attachment.d.ts +3 -0
  7. package/dist/attachment.d.ts.map +1 -0
  8. package/dist/attachment.js +8 -0
  9. package/dist/bootstrap.d.ts +6 -7
  10. package/dist/bootstrap.d.ts.map +1 -1
  11. package/dist/bootstrap.js +31 -28
  12. package/dist/change-set.d.ts +33 -0
  13. package/dist/change-set.d.ts.map +1 -0
  14. package/dist/change-set.js +83 -0
  15. package/dist/change.d.ts +9 -0
  16. package/dist/change.d.ts.map +1 -1
  17. package/dist/change.js +6 -5
  18. package/dist/client.d.ts +69 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +165 -0
  21. package/dist/collection.d.ts +22 -15
  22. package/dist/collection.d.ts.map +1 -1
  23. package/dist/collection.js +60 -78
  24. package/dist/connection.d.ts +68 -40
  25. package/dist/connection.d.ts.map +1 -1
  26. package/dist/connection.js +1597 -961
  27. package/dist/conversation.d.ts +79 -0
  28. package/dist/conversation.d.ts.map +1 -0
  29. package/dist/conversation.js +557 -0
  30. package/dist/durability.d.ts +8 -3
  31. package/dist/durability.d.ts.map +1 -1
  32. package/dist/durability.js +7 -61
  33. package/dist/file.d.ts +20 -0
  34. package/dist/file.d.ts.map +1 -0
  35. package/dist/file.js +126 -0
  36. package/dist/host.d.ts +13 -0
  37. package/dist/host.d.ts.map +1 -0
  38. package/dist/host.js +175 -0
  39. package/dist/identity.d.ts +1 -0
  40. package/dist/identity.d.ts.map +1 -1
  41. package/dist/identity.js +10 -9
  42. package/dist/index.d.ts +14 -10
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -3
  45. package/dist/log.js +5 -6
  46. package/dist/memory.d.ts +17 -2
  47. package/dist/memory.d.ts.map +1 -1
  48. package/dist/memory.js +268 -113
  49. package/dist/model.d.ts +10 -25
  50. package/dist/model.d.ts.map +1 -1
  51. package/dist/model.js +18 -21
  52. package/dist/observation.d.ts +25 -0
  53. package/dist/observation.d.ts.map +1 -0
  54. package/dist/observation.js +85 -0
  55. package/dist/outcome.d.ts +12 -24
  56. package/dist/outcome.d.ts.map +1 -1
  57. package/dist/outcome.js +1 -13
  58. package/dist/overlay.d.ts +9 -2
  59. package/dist/overlay.d.ts.map +1 -1
  60. package/dist/overlay.js +187 -43
  61. package/dist/paths.d.ts +0 -1
  62. package/dist/paths.d.ts.map +1 -1
  63. package/dist/paths.js +12 -19
  64. package/dist/query.d.ts +210 -9
  65. package/dist/query.d.ts.map +1 -1
  66. package/dist/query.js +420 -15
  67. package/dist/read-side.d.ts +14 -0
  68. package/dist/read-side.d.ts.map +1 -0
  69. package/dist/read-side.js +371 -0
  70. package/dist/refresh.d.ts +4 -5
  71. package/dist/refresh.d.ts.map +1 -1
  72. package/dist/refresh.js +45 -30
  73. package/dist/replica.d.ts +27 -6
  74. package/dist/replica.d.ts.map +1 -1
  75. package/dist/replica.js +233 -30
  76. package/dist/room-draft.d.ts +124 -0
  77. package/dist/room-draft.d.ts.map +1 -0
  78. package/dist/room-draft.js +327 -0
  79. package/dist/rows.d.ts +41 -0
  80. package/dist/rows.d.ts.map +1 -0
  81. package/dist/rows.js +100 -0
  82. package/dist/save.d.ts +10 -6
  83. package/dist/save.d.ts.map +1 -1
  84. package/dist/save.js +266 -333
  85. package/dist/search.d.ts +61 -0
  86. package/dist/search.d.ts.map +1 -0
  87. package/dist/search.js +125 -0
  88. package/dist/status.d.ts +9 -2
  89. package/dist/status.d.ts.map +1 -1
  90. package/dist/status.js +11 -14
  91. package/dist/store.d.ts +75 -18
  92. package/dist/store.d.ts.map +1 -1
  93. package/dist/store.js +358 -97
  94. package/dist/transfer.d.ts +5 -0
  95. package/dist/transfer.d.ts.map +1 -1
  96. package/dist/transfer.js +1 -5
  97. package/dist/wire.d.ts +64 -0
  98. package/dist/wire.d.ts.map +1 -0
  99. package/dist/wire.js +118 -0
  100. package/package.json +15 -13
  101. package/dist/adapter.js.map +0 -1
  102. package/dist/bootstrap.js.map +0 -1
  103. package/dist/change.js.map +0 -1
  104. package/dist/collection.js.map +0 -1
  105. package/dist/connection.js.map +0 -1
  106. package/dist/durability.js.map +0 -1
  107. package/dist/identity.js.map +0 -1
  108. package/dist/index.js.map +0 -1
  109. package/dist/log.js.map +0 -1
  110. package/dist/memory.js.map +0 -1
  111. package/dist/model.js.map +0 -1
  112. package/dist/outcome.js.map +0 -1
  113. package/dist/overlay.js.map +0 -1
  114. package/dist/paths.js.map +0 -1
  115. package/dist/query.js.map +0 -1
  116. package/dist/refresh.js.map +0 -1
  117. package/dist/replica.js.map +0 -1
  118. package/dist/save.js.map +0 -1
  119. package/dist/status.js.map +0 -1
  120. package/dist/store.js.map +0 -1
  121. package/dist/transfer.js.map +0 -1
@@ -1,65 +1,11 @@
1
- const ASKED = 'mdruntime:persistent-storage';
2
- const GENERATION = 'mdruntime:generation';
3
- const STORAGE_LOSS_STATEMENT = 'Unsynchronized Drafts and Pending Changes were lost.';
4
- function remembered() {
5
- try {
6
- return window.localStorage.getItem(ASKED);
7
- } catch {
1
+ const STORAGE_LOSS_CODE = 'storage-loss';
2
+ export function detectStorageLoss(stored, reported) {
3
+ if (reported === null || reported === stored)
8
4
  return null;
9
- }
5
+ return STORAGE_LOSS_CODE;
10
6
  }
11
- function remember() {
12
- try {
13
- window.localStorage.setItem(ASKED, '1');
14
- } catch {
15
- return;
16
- }
17
- }
18
- async function ask() {
19
- if (remembered() !== null) return;
20
- const persist = window.navigator.storage?.persist;
21
- if (typeof persist !== 'function') return;
22
- remember();
23
- try {
24
- await persist.call(window.navigator.storage);
25
- } catch {
26
- return;
27
- }
28
- }
29
- export async function requestPersistentStorage() {
30
- if (typeof window === 'undefined') return;
31
- await window.navigator.locks.request('mdruntime-persist', ask);
32
- }
33
- function readGeneration() {
34
- if (typeof window === 'undefined') return null;
35
- try {
36
- return window.localStorage.getItem(GENERATION);
37
- } catch {
38
- return null;
39
- }
40
- }
41
- function writeGeneration(value) {
42
- if (typeof window === 'undefined') return;
43
- try {
44
- window.localStorage.setItem(GENERATION, value);
45
- } catch {
46
- return;
47
- }
48
- }
49
- export function detectStorageLoss(stored) {
50
- const remembered = readGeneration();
51
- if (remembered === null || remembered === stored) return null;
52
- return STORAGE_LOSS_STATEMENT;
53
- }
54
- export function nextGeneration(stored) {
55
- const remembered = readGeneration();
56
- if (stored !== null && (remembered === null || remembered === stored)) {
57
- writeGeneration(stored);
7
+ export function nextGeneration(stored, reported) {
8
+ if (stored !== null && (reported === null || reported === stored))
58
9
  return stored;
59
- }
60
- const next = crypto.randomUUID();
61
- writeGeneration(next);
62
- return next;
10
+ return crypto.randomUUID();
63
11
  }
64
-
65
- //# sourceMappingURL=durability.js.map
package/dist/file.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export type ChatDraftFile = {
2
+ name: string;
3
+ blob: Blob;
4
+ };
5
+ export type FileDeclaration = {
6
+ name: string;
7
+ mediaType: string;
8
+ byteLength: number;
9
+ contentHash: string;
10
+ width?: number;
11
+ height?: number;
12
+ };
13
+ export type Extent = {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ export declare function extentOf(bytes: Uint8Array): Extent | null;
18
+ export declare function hexDigest(digest: ArrayBuffer): string;
19
+ export declare function declaredFile(file: ChatDraftFile): Promise<FileDeclaration>;
20
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA2GvD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQzD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAErD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAUhF"}
package/dist/file.js ADDED
@@ -0,0 +1,126 @@
1
+ const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
2
+ const WEBP_SYNC = [0x9d, 0x01, 0x2a];
3
+ const SHAPELESS_JPEG_MARKERS = new Set([0xc4, 0xc8, 0xcc]);
4
+ const BMFF_CONTAINERS = new Set(['meta', 'iprp', 'ipco']);
5
+ function starts(bytes, signature, at = 0) {
6
+ return signature.every((value, index) => bytes[at + index] === value);
7
+ }
8
+ function text(bytes, at, length) {
9
+ return String.fromCharCode(...bytes.subarray(at, at + length));
10
+ }
11
+ function bigEndian(bytes, at, length) {
12
+ let value = 0;
13
+ for (let index = 0; index < length; index += 1)
14
+ value = value * 256 + (bytes[at + index] ?? 0);
15
+ return value;
16
+ }
17
+ function littleEndian(bytes, at, length) {
18
+ let value = 0;
19
+ for (let index = length - 1; index >= 0; index -= 1)
20
+ value = value * 256 + (bytes[at + index] ?? 0);
21
+ return value;
22
+ }
23
+ function pngExtent(bytes) {
24
+ if (bytes.length < 24 || !starts(bytes, PNG_SIGNATURE))
25
+ return null;
26
+ if (text(bytes, 12, 4) !== 'IHDR')
27
+ return null;
28
+ return { width: bigEndian(bytes, 16, 4), height: bigEndian(bytes, 20, 4) };
29
+ }
30
+ function gifExtent(bytes) {
31
+ if (bytes.length < 10 || text(bytes, 0, 3) !== 'GIF')
32
+ return null;
33
+ return { width: littleEndian(bytes, 6, 2), height: littleEndian(bytes, 8, 2) };
34
+ }
35
+ function jpegExtent(bytes) {
36
+ if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8)
37
+ return null;
38
+ let at = 2;
39
+ while (at + 9 < bytes.length) {
40
+ if (bytes[at] !== 0xff)
41
+ return null;
42
+ const marker = bytes[at + 1] ?? 0;
43
+ if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {
44
+ at += 2;
45
+ continue;
46
+ }
47
+ const length = bigEndian(bytes, at + 2, 2);
48
+ if (marker >= 0xc0 && marker <= 0xcf && !SHAPELESS_JPEG_MARKERS.has(marker)) {
49
+ return { width: bigEndian(bytes, at + 7, 2), height: bigEndian(bytes, at + 5, 2) };
50
+ }
51
+ if (length < 2)
52
+ return null;
53
+ at += 2 + length;
54
+ }
55
+ return null;
56
+ }
57
+ function webpExtent(bytes) {
58
+ if (bytes.length < 30 || text(bytes, 0, 4) !== 'RIFF' || text(bytes, 8, 4) !== 'WEBP')
59
+ return null;
60
+ const chunk = text(bytes, 12, 4);
61
+ if (chunk === 'VP8X') {
62
+ return {
63
+ width: littleEndian(bytes, 24, 3) + 1,
64
+ height: littleEndian(bytes, 27, 3) + 1,
65
+ };
66
+ }
67
+ if (chunk === 'VP8 ' && starts(bytes, WEBP_SYNC, 23)) {
68
+ return {
69
+ width: littleEndian(bytes, 26, 2) & 0x3fff,
70
+ height: littleEndian(bytes, 28, 2) & 0x3fff,
71
+ };
72
+ }
73
+ if (chunk === 'VP8L' && bytes[20] === 0x2f) {
74
+ const packed = littleEndian(bytes, 21, 4);
75
+ return { width: (packed & 0x3fff) + 1, height: ((packed >>> 14) & 0x3fff) + 1 };
76
+ }
77
+ return null;
78
+ }
79
+ function spatialExtent(bytes, from, to) {
80
+ let at = from;
81
+ while (at + 8 <= to) {
82
+ const size = bigEndian(bytes, at, 4);
83
+ const name = text(bytes, at + 4, 4);
84
+ const end = size === 0 ? to : at + size;
85
+ if (size === 1 || end <= at || end > to)
86
+ return null;
87
+ if (name === 'ispe') {
88
+ if (end < at + 20)
89
+ return null;
90
+ return { width: bigEndian(bytes, at + 12, 4), height: bigEndian(bytes, at + 16, 4) };
91
+ }
92
+ if (BMFF_CONTAINERS.has(name)) {
93
+ const inner = spatialExtent(bytes, at + (name === 'meta' ? 12 : 8), end);
94
+ if (inner !== null)
95
+ return inner;
96
+ }
97
+ at = end;
98
+ }
99
+ return null;
100
+ }
101
+ function bmffExtent(bytes) {
102
+ if (bytes.length < 16 || text(bytes, 4, 4) !== 'ftyp')
103
+ return null;
104
+ return spatialExtent(bytes, 0, bytes.length);
105
+ }
106
+ export function extentOf(bytes) {
107
+ return (pngExtent(bytes) ??
108
+ jpegExtent(bytes) ??
109
+ gifExtent(bytes) ??
110
+ webpExtent(bytes) ??
111
+ bmffExtent(bytes));
112
+ }
113
+ export function hexDigest(digest) {
114
+ return [...new Uint8Array(digest)].map((value) => value.toString(16).padStart(2, '0')).join('');
115
+ }
116
+ export async function declaredFile(file) {
117
+ const bytes = new Uint8Array(await file.blob.arrayBuffer());
118
+ const extent = file.blob.type.startsWith('image/') ? extentOf(bytes) : null;
119
+ return {
120
+ name: file.name,
121
+ mediaType: file.blob.type,
122
+ byteLength: bytes.byteLength,
123
+ contentHash: hexDigest(await crypto.subtle.digest('SHA-256', bytes)),
124
+ ...(extent === null ? {} : extent),
125
+ };
126
+ }
package/dist/host.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { type MdRuntimeOptions } from './connection.js';
2
+ import { type RuntimePort } from './wire.js';
3
+ export type MdRuntimeHostOptions = MdRuntimeOptions & {
4
+ deploymentFacts?: unknown;
5
+ };
6
+ export type MdRuntimeHost = {
7
+ attach(port: RuntimePort, app: string, release?: string): () => void;
8
+ endAuthorization(): Promise<void>;
9
+ stop(): Promise<void>;
10
+ };
11
+ export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
12
+ export type { RuntimePort } from './wire.js';
13
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAML,KAAK,WAAW,EAIjB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IACrE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AA0EF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwG3E;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/dist/host.js ADDED
@@ -0,0 +1,175 @@
1
+ import { composeRuntime, } from './connection.js';
2
+ import { removeRuntimeStore } from './store.js';
3
+ import { AUTHORIZATION_ENDED, carried, envelope, PROTOCOL_MISMATCH, request, } from './wire.js';
4
+ function answered(md, app, writtenBy, member, input) {
5
+ switch (member) {
6
+ case 'rooms':
7
+ return md.rooms();
8
+ case 'query':
9
+ return md.query(input[0]);
10
+ case 'search':
11
+ return md.search(input[0]);
12
+ case 'types':
13
+ return md.types(input[0]);
14
+ case 'save':
15
+ return md.save(input[0], input[1], writtenBy);
16
+ case 'history':
17
+ return md.history(input[0], input[1], input[2]);
18
+ case 'call':
19
+ return md.call(input[0], input[1]);
20
+ case 'reached':
21
+ return md.reached(input[0], input[1], input[2]);
22
+ case 'log':
23
+ return md.log();
24
+ case 'persistence':
25
+ return md.persistence();
26
+ case 'reauthorize':
27
+ return md.reauthorize();
28
+ case 'roomDraft.list':
29
+ return md.roomDraft.list();
30
+ case 'roomDraft.read':
31
+ return md.roomDraft.read(input[0], input[1]);
32
+ case 'roomDraft.write':
33
+ return md.roomDraft.write(input[0], input[1], input[2], input[3]);
34
+ case 'roomDraft.discard':
35
+ return md.roomDraft.discard(input[0], input[1], input[2]);
36
+ case 'presentation.read':
37
+ return md.presentation.read(app);
38
+ case 'presentation.write':
39
+ return md.presentation.write(app, input[0]);
40
+ case 'conversation.list':
41
+ return md.conversation.list();
42
+ case 'conversation.read':
43
+ return md.conversation.read(input[0], input[1]);
44
+ case 'conversation.create':
45
+ return md.conversation.create(input[0]);
46
+ case 'conversation.send':
47
+ return md.conversation.send(input[0]);
48
+ case 'conversation.answer':
49
+ return md.conversation.answer(input[0], input[1]);
50
+ case 'conversation.interrupt':
51
+ return md.conversation.interrupt(input[0]);
52
+ case 'conversation.kill':
53
+ return md.conversation.kill(input[0]);
54
+ case 'conversation.cancel':
55
+ return md.conversation.cancel(input[0], input[1]);
56
+ case 'conversation.delete':
57
+ return md.conversation.delete(input[0]);
58
+ case 'chatDraft.write':
59
+ return md.chatDraft.write(input[0], input[1]);
60
+ case 'chatDraft.discard':
61
+ return md.chatDraft.discard(input[0]);
62
+ }
63
+ }
64
+ export function serveMdRuntime(options) {
65
+ const deploymentFacts = structuredClone(options.deploymentFacts);
66
+ const closing = new AbortController();
67
+ const close = () => {
68
+ closing.abort();
69
+ };
70
+ options.signal?.addEventListener('abort', close, { once: true });
71
+ if (options.signal?.aborted === true)
72
+ close();
73
+ const runtime = composeRuntime({ ...options, signal: closing.signal });
74
+ const { md, watch } = runtime;
75
+ const attachments = new Map();
76
+ let authorized = true;
77
+ const watchFacts = (deliver) => {
78
+ deliver(structuredClone(deploymentFacts));
79
+ return () => { };
80
+ };
81
+ function attach(port, app, release) {
82
+ if (!authorized)
83
+ throw new Error(AUTHORIZATION_ENDED);
84
+ const writtenBy = release === undefined ? undefined : { app, release };
85
+ const subscriptions = new Map();
86
+ let serving = true;
87
+ const send = (message) => {
88
+ port.postMessage(envelope(message));
89
+ };
90
+ const detach = () => {
91
+ if (!serving)
92
+ return;
93
+ serving = false;
94
+ for (const end of subscriptions.values())
95
+ end();
96
+ subscriptions.clear();
97
+ attachments.delete(detach);
98
+ };
99
+ const serve = async (message) => {
100
+ if (message.kind === 'hello')
101
+ return;
102
+ if (message.kind === 'stop') {
103
+ subscriptions.get(message.id)?.();
104
+ subscriptions.delete(message.id);
105
+ return;
106
+ }
107
+ try {
108
+ if (message.kind !== 'observe' || message.topic !== 'room-drafts')
109
+ await md.loaded();
110
+ if (message.kind === 'observe') {
111
+ const { id, topic } = message;
112
+ let resolved = false;
113
+ const deliver = (value) => {
114
+ if (!serving)
115
+ return;
116
+ send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });
117
+ resolved = true;
118
+ };
119
+ subscriptions.set(id, topic === 'deployment-facts'
120
+ ? watchFacts(deliver)
121
+ : watch(topic, topic === 'presentation' ? [app] : message.input, deliver));
122
+ return;
123
+ }
124
+ const value = await answered(md, app, writtenBy, message.member, message.input);
125
+ if (serving)
126
+ send({ kind: 'result', id: message.id, value });
127
+ }
128
+ catch (error) {
129
+ if (serving) {
130
+ send({
131
+ kind: 'failure',
132
+ id: message.id,
133
+ message: error instanceof Error ? error.message : String(error),
134
+ });
135
+ }
136
+ }
137
+ };
138
+ port.addEventListener('message', (event) => {
139
+ if (!serving)
140
+ return;
141
+ const wire = carried(event.data);
142
+ if (wire === null)
143
+ return;
144
+ if (!wire.matching) {
145
+ send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });
146
+ detach();
147
+ return;
148
+ }
149
+ const message = request(wire.message);
150
+ if (message === null)
151
+ return;
152
+ void serve(message);
153
+ });
154
+ port.addEventListener('close', detach);
155
+ port.start();
156
+ attachments.set(detach, send);
157
+ return detach;
158
+ }
159
+ return {
160
+ attach,
161
+ async endAuthorization() {
162
+ authorized = false;
163
+ for (const [detach, send] of [...attachments]) {
164
+ send({ kind: 'ended' });
165
+ detach();
166
+ }
167
+ close();
168
+ await removeRuntimeStore();
169
+ await options.shell.dropGeneration();
170
+ },
171
+ stop() {
172
+ return runtime.stop();
173
+ },
174
+ };
175
+ }
@@ -1,2 +1,3 @@
1
1
  export declare function changeBatchIdentity(at?: number): string;
2
+ export declare function roomDraftRevision(): string;
2
3
  //# sourceMappingURL=identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C"}
package/dist/identity.js CHANGED
@@ -2,15 +2,16 @@ export function changeBatchIdentity(at = Date.now()) {
2
2
  const bytes = new Uint8Array(16);
3
3
  crypto.getRandomValues(bytes);
4
4
  const time = BigInt(at);
5
- for(let index = 0; index < 6; index += 1){
6
- bytes[index] = Number(time >> BigInt(8 * (5 - index)) & 0xffn);
5
+ for (let index = 0; index < 6; index += 1) {
6
+ bytes[index] = Number((time >> BigInt(8 * (5 - index))) & 0xffn);
7
7
  }
8
- bytes[6] = bytes[6] & 0x0f | 0x70;
9
- bytes[8] = bytes[8] & 0x3f | 0x80;
10
- const hex = [
11
- ...bytes
12
- ].map((byte)=>byte.toString(16).padStart(2, '0')).join('');
8
+ bytes[6] = (bytes[6] & 0x0f) | 0x70;
9
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
10
+ const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');
13
11
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
14
12
  }
15
-
16
- //# sourceMappingURL=identity.js.map
13
+ export function roomDraftRevision() {
14
+ const bytes = new Uint8Array(16);
15
+ crypto.getRandomValues(bytes);
16
+ return [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');
17
+ }
package/dist/index.d.ts CHANGED
@@ -1,13 +1,17 @@
1
- export type { ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, DiscoverResult, DiscoveredRoom, Discovery, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, MutationRequest, MutationResult, PageToken, ProviderLimit, RefreshPage, RefreshRequest, RefreshResult, Retention, RevokedAuthorization, RoomNotReadable, TransportUncertainty, } from './adapter.js';
2
- export type { Change, ChangeBatch, Precondition } from './change.js';
3
- export type { MdType } from './collection.js';
4
- export type { AppRoom, CallResult, ConnectionRefusal, ConnectionRefusalReason, DraftEntry, DraftSurface, HistoryQuery, MdRuntime, MdRuntimeOptions, QueueSurface, SaveResult, } from './connection.js';
5
- export type { AcceptedOutcome, AffectedState, QueueEntry, QueueOutcome, SubmissionOutcome, } from './outcome.js';
1
+ export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistories, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomAttachment, RoomNotReadable, RoomVersionAt, RoomVersionNotification, SelectedRooms, ServiceMode, ServiceModeSignal, TransportUncertainty, TypedSelection, WorkingNote, } from './adapter.js';
2
+ export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
3
+ export type { ChatDraft, ChatDraftSurface, ConversationEntry, ConversationOptions, ConversationSurface, ConversationView, GrowingText, } from './conversation.js';
4
+ export type { ChatDraftFile, FileDeclaration } from './file.js';
5
+ export type { AppRoom, AppTypedSelection, ConnectionRefusal, ConnectionRefusalReason, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomTypes, SavedRoomDraft, SaveResult, } from './connection.js';
6
+ export type { Observation } from './observation.js';
7
+ export type { CallResult, QueueEntry, Submission } from './outcome.js';
8
+ export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, } from './room-draft.js';
6
9
  export type { SaveRefusal } from './save.js';
7
- export { createMdRuntime } from './connection.js';
8
- export type { SyncStatus } from './status.js';
9
- export type { Backlink, QueryDocument, QueryGroup, QueryOptions, QueryResult, Selector, } from '@agentshouse/query';
10
- export type { AttachedModelBinding, ModelIdentity, ModelSnapshot, ModelState, ModelResult, ModelValidation, TypesResult, ValidationReceipt, } from './model.js';
10
+ export type { DocumentHit, DocumentPart, MessageHit, SearchRequest, SearchResult, } from './search.js';
11
+ export { changeBatchIdentity } from './identity.js';
12
+ export type { RuntimeShell } from './durability.js';
13
+ export type { AttentionEntry, SyncStatus } from './status.js';
14
+ export type { Backlink, Direction, DocumentQuery, DocumentResult, Filter, GroupQuery, GroupResult, Key, LocalQuery, OrderOptions, Predicate, QueryDocument, QueryGroup, QueryResult, Related, Select, Value, Where, } from './query.js';
15
+ export type { MdType, ModelIdentity, ModelSnapshot, ModelState, ModelResult, TypesResult, ValidationReceipt, } from './model.js';
11
16
  export type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';
12
- export type { QueryBinding, QueryInput } from './query.js';
13
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,eAAe,EACf,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EACV,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EACV,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1 @@
1
- export { createMdRuntime } from './connection.js';
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { changeBatchIdentity } from './identity.js';
package/dist/log.js CHANGED
@@ -2,14 +2,13 @@ const BOUND = 256;
2
2
  export function createLog() {
3
3
  const events = [];
4
4
  return {
5
- record (event) {
5
+ record(event) {
6
6
  events.push(event);
7
- if (events.length > BOUND) events.splice(0, events.length - BOUND);
7
+ if (events.length > BOUND)
8
+ events.splice(0, events.length - BOUND);
8
9
  },
9
- export () {
10
+ export() {
10
11
  return events.join('\n');
11
- }
12
+ },
12
13
  };
13
14
  }
14
-
15
- //# sourceMappingURL=log.js.map
package/dist/memory.d.ts CHANGED
@@ -1,24 +1,39 @@
1
1
  import type { ModelResult } from './model.js';
2
- import { type Adapter, type Capability, type DiscoveredRoom, type MdModelIdentity, type ProviderLimit, type Retention } from './adapter.js';
2
+ import { type AcceptedMessage, type ActionResult, type Adapter, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type MdModelIdentity, type ProviderLimit, type Retention, type RoomAttachment, type RoomVersionNotification, type ServiceMode } from './adapter.js';
3
3
  export type MemoryRoom = DiscoveredRoom & {
4
4
  model?: ModelResult;
5
+ selectionModel?: ModelResult;
5
6
  documents?: Readonly<Record<string, string>>;
6
7
  revisions?: Readonly<Record<string, string>>;
8
+ changes?: Readonly<Record<string, HeadChange>>;
7
9
  binaryTargets?: readonly string[];
10
+ attachments?: readonly RoomAttachment[];
11
+ };
12
+ export type MemoryConversation = {
13
+ conversation: string;
14
+ messages?: readonly AcceptedMessage[];
15
+ outcomes?: Partial<Record<ConversationAction, ActionResult>>;
8
16
  };
9
17
  export type MemoryAdapterOptions = {
10
18
  rooms?: readonly MemoryRoom[];
19
+ conversations?: readonly MemoryConversation[];
20
+ historyPageSize?: number;
11
21
  pageSize?: number;
12
22
  mdModel?: MdModelIdentity;
13
23
  supportedVersions?: readonly number[];
14
24
  capabilities?: readonly Capability[];
15
25
  providerLimits?: readonly ProviderLimit[];
16
26
  retention?: Retention;
17
- origins?: readonly string[];
18
27
  };
19
28
  export type MemoryAdapter = Adapter & {
20
29
  setRooms(rooms: readonly MemoryRoom[]): void;
30
+ setConversations(conversations: readonly MemoryConversation[]): void;
21
31
  script(operation: keyof Adapter, answer: unknown): void;
32
+ notifyRoomVersion(notification: RoomVersionNotification): void;
33
+ notifyConversation(event: ConversationEvent): void;
34
+ notifyServiceMode(mode: ServiceMode): void;
35
+ selectedRooms(): readonly string[];
36
+ replicatedConversations(): readonly string[];
22
37
  };
23
38
  export declare function createMemoryAdapter(options?: MemoryAdapterOptions): MemoryAdapter;
24
39
  //# sourceMappingURL=memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAIL,KAAK,OAAO,EAIZ,KAAK,UAAU,EAEf,KAAK,cAAc,EAGnB,KAAK,eAAe,EAGpB,KAAK,aAAa,EAGlB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAkBtB,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACzD,CAAC;AA+BF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAwNrF"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAItB,KAAK,cAAc,EACnB,KAAK,UAAU,EAGf,KAAK,eAAe,EAGpB,KAAK,aAAa,EAGlB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAmBtB,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC7C,gBAAgB,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAAC;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnD,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,aAAa,IAAI,SAAS,MAAM,EAAE,CAAC;IACnC,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AA+BF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAiZrF"}