@agentshouse/mdruntime 0.1.0-cc7bd7a53214e → 0.1.0-ccbe92df1c4f6

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 (261) hide show
  1. package/AGENTS.md +302 -200
  2. package/README.md +22 -11
  3. package/dist/adapter.d.ts +172 -49
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -9
  6. package/dist/attached-model.d.ts +14 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +57 -0
  9. package/dist/attempt.d.ts +16 -0
  10. package/dist/attempt.d.ts.map +1 -0
  11. package/dist/attempt.js +70 -0
  12. package/dist/binary.d.ts +18 -0
  13. package/dist/binary.d.ts.map +1 -0
  14. package/dist/binary.js +8 -0
  15. package/dist/bootstrap.d.ts +39 -6
  16. package/dist/bootstrap.d.ts.map +1 -1
  17. package/dist/bootstrap.js +188 -45
  18. package/dist/chain.d.ts +11 -0
  19. package/dist/chain.d.ts.map +1 -0
  20. package/dist/chain.js +64 -0
  21. package/dist/change-set.d.ts +9 -14
  22. package/dist/change-set.d.ts.map +1 -1
  23. package/dist/change-set.js +11 -56
  24. package/dist/change.d.ts +45 -0
  25. package/dist/change.d.ts.map +1 -1
  26. package/dist/change.js +34 -0
  27. package/dist/chat/acts.d.ts +33 -0
  28. package/dist/chat/acts.d.ts.map +1 -0
  29. package/dist/chat/acts.js +36 -0
  30. package/dist/chat/context.d.ts +3 -0
  31. package/dist/chat/context.d.ts.map +1 -0
  32. package/dist/chat/context.js +10 -0
  33. package/dist/chat/earlier.d.ts +10 -0
  34. package/dist/chat/earlier.d.ts.map +1 -0
  35. package/dist/chat/earlier.js +54 -0
  36. package/dist/chat/house.d.ts +25 -0
  37. package/dist/chat/house.d.ts.map +1 -0
  38. package/dist/chat/house.js +38 -0
  39. package/dist/chat/input.d.ts +11 -0
  40. package/dist/chat/input.d.ts.map +1 -0
  41. package/dist/chat/input.js +92 -0
  42. package/dist/chat/kit.d.ts +61 -0
  43. package/dist/chat/kit.d.ts.map +1 -0
  44. package/dist/chat/kit.js +123 -0
  45. package/dist/chat/lasting.d.ts +6 -0
  46. package/dist/chat/lasting.d.ts.map +1 -0
  47. package/dist/chat/lasting.js +19 -0
  48. package/dist/chat/list.d.ts +28 -0
  49. package/dist/chat/list.d.ts.map +1 -0
  50. package/dist/chat/list.js +103 -0
  51. package/dist/chat/markdown.d.ts +20 -0
  52. package/dist/chat/markdown.d.ts.map +1 -0
  53. package/dist/chat/markdown.js +229 -0
  54. package/dist/chat/message.d.ts +7 -0
  55. package/dist/chat/message.d.ts.map +1 -0
  56. package/dist/chat/message.js +254 -0
  57. package/dist/chat/messages.d.ts +35 -0
  58. package/dist/chat/messages.d.ts.map +1 -0
  59. package/dist/chat/messages.js +210 -0
  60. package/dist/chat/name.d.ts +7 -0
  61. package/dist/chat/name.d.ts.map +1 -0
  62. package/dist/chat/name.js +37 -0
  63. package/dist/chat/opened.d.ts +12 -0
  64. package/dist/chat/opened.d.ts.map +1 -0
  65. package/dist/chat/opened.js +19 -0
  66. package/dist/chat/overlay.d.ts +32 -0
  67. package/dist/chat/overlay.d.ts.map +1 -0
  68. package/dist/chat/overlay.js +103 -0
  69. package/dist/chat/parts.d.ts +58 -0
  70. package/dist/chat/parts.d.ts.map +1 -0
  71. package/dist/chat/parts.js +120 -0
  72. package/dist/chat/pieces.d.ts +62 -0
  73. package/dist/chat/pieces.d.ts.map +1 -0
  74. package/dist/chat/pieces.js +1110 -0
  75. package/dist/chat/process.d.ts +20 -0
  76. package/dist/chat/process.d.ts.map +1 -0
  77. package/dist/chat/process.js +32 -0
  78. package/dist/chat/provider.d.ts +70 -0
  79. package/dist/chat/provider.d.ts.map +1 -0
  80. package/dist/chat/provider.js +635 -0
  81. package/dist/chat/question.d.ts +9 -0
  82. package/dist/chat/question.d.ts.map +1 -0
  83. package/dist/chat/question.js +69 -0
  84. package/dist/chat/questions.d.ts +31 -0
  85. package/dist/chat/questions.d.ts.map +1 -0
  86. package/dist/chat/questions.js +111 -0
  87. package/dist/chat/read.d.ts +5 -0
  88. package/dist/chat/read.d.ts.map +1 -0
  89. package/dist/chat/read.js +13 -0
  90. package/dist/chat/ready.d.ts +37 -0
  91. package/dist/chat/ready.d.ts.map +1 -0
  92. package/dist/chat/ready.js +93 -0
  93. package/dist/chat/room-file.d.ts +8 -0
  94. package/dist/chat/room-file.d.ts.map +1 -0
  95. package/dist/chat/room-file.js +72 -0
  96. package/dist/chat/steady.d.ts +3 -0
  97. package/dist/chat/steady.d.ts.map +1 -0
  98. package/dist/chat/steady.js +26 -0
  99. package/dist/chat/style.d.ts +4 -0
  100. package/dist/chat/style.d.ts.map +1 -0
  101. package/dist/chat/style.js +307 -0
  102. package/dist/chat.d.ts +15 -0
  103. package/dist/chat.d.ts.map +1 -0
  104. package/dist/chat.js +8 -0
  105. package/dist/client.d.ts +35 -14
  106. package/dist/client.d.ts.map +1 -1
  107. package/dist/client.js +108 -26
  108. package/dist/collection.d.ts +9 -13
  109. package/dist/collection.d.ts.map +1 -1
  110. package/dist/collection.js +47 -56
  111. package/dist/compile.d.ts +16 -0
  112. package/dist/compile.d.ts.map +1 -0
  113. package/dist/compile.js +721 -0
  114. package/dist/connection.d.ts +61 -24
  115. package/dist/connection.d.ts.map +1 -1
  116. package/dist/connection.js +3786 -906
  117. package/dist/conversation.d.ts +56 -16
  118. package/dist/conversation.d.ts.map +1 -1
  119. package/dist/conversation.js +736 -242
  120. package/dist/digest.d.ts +7 -0
  121. package/dist/digest.d.ts.map +1 -0
  122. package/dist/digest.js +113 -0
  123. package/dist/durability.d.ts +5 -1
  124. package/dist/durability.d.ts.map +1 -1
  125. package/dist/durability.js +5 -0
  126. package/dist/entry.d.ts +19 -0
  127. package/dist/entry.d.ts.map +1 -0
  128. package/dist/entry.js +151 -0
  129. package/dist/expectation.d.ts +21 -0
  130. package/dist/expectation.d.ts.map +1 -0
  131. package/dist/expectation.js +70 -0
  132. package/dist/failure.d.ts +13 -0
  133. package/dist/failure.d.ts.map +1 -0
  134. package/dist/failure.js +19 -0
  135. package/dist/fence.d.ts +6 -0
  136. package/dist/fence.d.ts.map +1 -0
  137. package/dist/fence.js +10 -0
  138. package/dist/file.d.ts +2 -10
  139. package/dist/file.d.ts.map +1 -1
  140. package/dist/file.js +3 -120
  141. package/dist/fulltext.d.ts +27 -0
  142. package/dist/fulltext.d.ts.map +1 -0
  143. package/dist/fulltext.js +368 -0
  144. package/dist/host.d.ts +15 -2
  145. package/dist/host.d.ts.map +1 -1
  146. package/dist/host.js +113 -30
  147. package/dist/identity.d.ts +4 -0
  148. package/dist/identity.d.ts.map +1 -1
  149. package/dist/identity.js +16 -1
  150. package/dist/index.d.ts +20 -9
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +8 -0
  153. package/dist/live.d.ts +22 -0
  154. package/dist/live.d.ts.map +1 -0
  155. package/dist/live.js +123 -0
  156. package/dist/memory.d.ts +21 -7
  157. package/dist/memory.d.ts.map +1 -1
  158. package/dist/memory.js +171 -47
  159. package/dist/messages.d.ts +28 -0
  160. package/dist/messages.d.ts.map +1 -0
  161. package/dist/messages.js +90 -0
  162. package/dist/model.d.ts +17 -14
  163. package/dist/model.d.ts.map +1 -1
  164. package/dist/model.js +16 -4
  165. package/dist/name.d.ts +4 -0
  166. package/dist/name.d.ts.map +1 -0
  167. package/dist/name.js +122 -0
  168. package/dist/observation.d.ts +19 -2
  169. package/dist/observation.d.ts.map +1 -1
  170. package/dist/observation.js +113 -12
  171. package/dist/open.d.ts +2 -0
  172. package/dist/open.d.ts.map +1 -0
  173. package/dist/open.js +1 -0
  174. package/dist/opened.d.ts +22 -0
  175. package/dist/opened.d.ts.map +1 -0
  176. package/dist/opened.js +107 -0
  177. package/dist/outcome.d.ts +62 -3
  178. package/dist/outcome.d.ts.map +1 -1
  179. package/dist/outcome.js +67 -1
  180. package/dist/overlay.d.ts +15 -5
  181. package/dist/overlay.d.ts.map +1 -1
  182. package/dist/overlay.js +136 -180
  183. package/dist/paths.d.ts +0 -1
  184. package/dist/paths.d.ts.map +1 -1
  185. package/dist/paths.js +0 -16
  186. package/dist/query.d.ts +65 -5
  187. package/dist/query.d.ts.map +1 -1
  188. package/dist/query.js +122 -40
  189. package/dist/reach.d.ts +11 -4
  190. package/dist/reach.d.ts.map +1 -1
  191. package/dist/reach.js +202 -73
  192. package/dist/react.d.ts +43 -0
  193. package/dist/react.d.ts.map +1 -0
  194. package/dist/react.js +54 -0
  195. package/dist/readiness.d.ts +63 -0
  196. package/dist/readiness.d.ts.map +1 -0
  197. package/dist/readiness.js +33 -0
  198. package/dist/reads.d.ts +11 -0
  199. package/dist/reads.d.ts.map +1 -0
  200. package/dist/reads.js +100 -0
  201. package/dist/recovery.d.ts +25 -0
  202. package/dist/recovery.d.ts.map +1 -0
  203. package/dist/recovery.js +198 -0
  204. package/dist/refresh.d.ts +19 -7
  205. package/dist/refresh.d.ts.map +1 -1
  206. package/dist/refresh.js +129 -53
  207. package/dist/replica.d.ts +60 -33
  208. package/dist/replica.d.ts.map +1 -1
  209. package/dist/replica.js +319 -154
  210. package/dist/room-draft.d.ts +40 -9
  211. package/dist/room-draft.d.ts.map +1 -1
  212. package/dist/room-draft.js +153 -37
  213. package/dist/rows.d.ts +30 -34
  214. package/dist/rows.d.ts.map +1 -1
  215. package/dist/rows.js +168 -82
  216. package/dist/save.d.ts +72 -6
  217. package/dist/save.d.ts.map +1 -1
  218. package/dist/save.js +889 -178
  219. package/dist/search.d.ts +41 -29
  220. package/dist/search.d.ts.map +1 -1
  221. package/dist/search.js +37 -105
  222. package/dist/seed.d.ts +16 -0
  223. package/dist/seed.d.ts.map +1 -0
  224. package/dist/seed.js +75 -0
  225. package/dist/shared.d.ts +16 -0
  226. package/dist/shared.d.ts.map +1 -0
  227. package/dist/shared.js +431 -0
  228. package/dist/status.d.ts +6 -2
  229. package/dist/status.d.ts.map +1 -1
  230. package/dist/status.js +0 -8
  231. package/dist/store.d.ts +124 -58
  232. package/dist/store.d.ts.map +1 -1
  233. package/dist/store.js +359 -344
  234. package/dist/stored.d.ts +145 -0
  235. package/dist/stored.d.ts.map +1 -0
  236. package/dist/stored.js +567 -0
  237. package/dist/tables.d.ts +344 -0
  238. package/dist/tables.d.ts.map +1 -0
  239. package/dist/tables.js +580 -0
  240. package/dist/turn.d.ts +9 -0
  241. package/dist/turn.d.ts.map +1 -0
  242. package/dist/turn.js +75 -0
  243. package/dist/validation.d.ts +30 -0
  244. package/dist/validation.d.ts.map +1 -0
  245. package/dist/validation.js +162 -0
  246. package/dist/windows.d.ts +22 -0
  247. package/dist/windows.d.ts.map +1 -0
  248. package/dist/windows.js +89 -0
  249. package/dist/wire.d.ts +170 -45
  250. package/dist/wire.d.ts.map +1 -1
  251. package/dist/wire.js +69 -46
  252. package/dist/words.d.ts +19 -0
  253. package/dist/words.d.ts.map +1 -0
  254. package/dist/words.js +150 -0
  255. package/package.json +39 -9
  256. package/dist/attachment.d.ts +0 -3
  257. package/dist/attachment.d.ts.map +0 -1
  258. package/dist/attachment.js +0 -8
  259. package/dist/read-side.d.ts +0 -18
  260. package/dist/read-side.d.ts.map +0 -1
  261. package/dist/read-side.js +0 -377
package/dist/memory.js CHANGED
@@ -1,9 +1,7 @@
1
- import { ROOM_CONTRACT_VERSION, } from './adapter.js';
2
- import { MD_MODEL } from './collection.js';
3
1
  import { sameChange } from './overlay.js';
4
2
  const FIXTURE_RETENTION = {
5
3
  history: { kind: 'duration', seconds: 1 },
6
- outcome: 1,
4
+ outcome: 604_800,
7
5
  refreshHorizon: 1,
8
6
  };
9
7
  function declaredRetention(value) {
@@ -15,6 +13,19 @@ function declaredRetention(value) {
15
13
  }
16
14
  throw new Error('history retention duration must be a finite positive number of seconds');
17
15
  }
16
+ const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
17
+ function modelsOf(room) {
18
+ return {
19
+ collection: room.model ?? MODEL_ABSENT,
20
+ ...(room.typedSelection === undefined
21
+ ? {}
22
+ : { selection: room.selectionModel ?? MODEL_ABSENT }),
23
+ };
24
+ }
25
+ function changedModels(room, from) {
26
+ const now = modelsOf(room);
27
+ return JSON.stringify(now) === JSON.stringify(modelsOf(from)) ? undefined : now;
28
+ }
18
29
  function named(source, paths) {
19
30
  const taken = {};
20
31
  for (const path of paths) {
@@ -31,8 +42,6 @@ async function resolveScript(answer, fallback, request) {
31
42
  }
32
43
  export function createMemoryAdapter(options = {}) {
33
44
  let rooms = options.rooms === undefined ? [] : [...options.rooms];
34
- const mdModel = options.mdModel ?? MD_MODEL;
35
- const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];
36
45
  const capabilities = options.capabilities ?? [];
37
46
  const providerLimits = options.providerLimits ?? [];
38
47
  const retention = declaredRetention(options.retention);
@@ -46,8 +55,10 @@ export function createMemoryAdapter(options = {}) {
46
55
  const scripted = new Map();
47
56
  const unsealed = new Map();
48
57
  const sealed = new Set();
58
+ const sentTurns = new Map();
49
59
  const historyPageSize = options.historyPageSize;
50
- let selected = [];
60
+ let held = [];
61
+ let expiring = [];
51
62
  let replicated = [];
52
63
  let issued = 0;
53
64
  function scriptConversations(entries) {
@@ -89,37 +100,54 @@ export function createMemoryAdapter(options = {}) {
89
100
  return {
90
101
  name: room.name,
91
102
  locator: room.locator,
103
+ handle: room.handle,
92
104
  roomVersion: room.roomVersion,
93
105
  operations: room.operations,
94
106
  replica: room.replica,
95
- attachedModel: room.attachedModel,
96
107
  ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
97
108
  providerOwnedPaths: room.providerOwnedPaths,
98
109
  };
99
110
  }
100
- function page(room, from) {
111
+ function page(room, after) {
101
112
  const paths = Object.keys(room.documents ?? {}).sort();
113
+ const opening = after === undefined;
114
+ const from = opening ? 0 : paths.filter((path) => path <= after).length;
102
115
  const size = pageSize ?? paths.length;
103
116
  const taken = paths.slice(from, from + size);
104
117
  const next = from + taken.length;
105
- const targets = from === 0 ? (room.binaryTargets ?? []) : [];
118
+ const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
106
119
  return {
107
120
  kind: 'bootstrap',
108
121
  roomVersion: room.roomVersion,
122
+ ...(opening ? { models: modelsOf(room) } : {}),
109
123
  documents: named(room.documents ?? {}, taken),
110
- revisions: named(room.revisions ?? {}, taken),
124
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
125
+ ...(room.fileIds === undefined
126
+ ? {}
127
+ : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
111
128
  changes: named(room.changes ?? {}, [...taken, ...targets]),
112
- binaryTargets: targets,
113
- ...(from === 0 && room.attachments !== undefined ? { attachments: room.attachments } : {}),
114
- ...(next < paths.length ? { pageToken: String(next) } : {}),
129
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
130
+ ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
131
+ ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
132
+ };
133
+ }
134
+ function foldersMoved(room, from) {
135
+ const now = new Set(room.folders ?? []);
136
+ const before = new Set(from.folders ?? []);
137
+ const folders = [...now].filter((folder) => !before.has(folder)).sort();
138
+ const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
139
+ return {
140
+ ...(folders.length === 0 ? {} : { folders }),
141
+ ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
115
142
  };
116
143
  }
117
144
  function advancement(room, from, at) {
118
145
  const current = room.documents ?? {};
119
146
  const previous = from.documents ?? {};
120
- const currentTargets = new Set(room.binaryTargets ?? []);
121
- const previousTargets = new Set(from.binaryTargets ?? []);
147
+ const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
148
+ const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
122
149
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
150
+ room.fileIds?.[path] !== from.fileIds?.[path] ||
123
151
  !sameChange(room.changes?.[path], from.changes?.[path]);
124
152
  const changed = Object.keys(current)
125
153
  .filter((path) => current[path] !== previous[path] || headMoved(path))
@@ -134,22 +162,25 @@ export function createMemoryAdapter(options = {}) {
134
162
  const targets = opening
135
163
  ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
136
164
  : [];
137
- const attachments = room.attachments ?? [];
138
- const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
165
+ const models = opening ? changedModels(room, from) : undefined;
139
166
  return {
140
167
  kind: 'net-advancement',
141
168
  roomVersion: room.roomVersion,
169
+ ...(models === undefined ? {} : { models }),
142
170
  documents: named(current, taken),
143
- revisions: named(room.revisions ?? {}, taken),
171
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
172
+ ...(room.fileIds === undefined
173
+ ? {}
174
+ : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
144
175
  changes: named(room.changes ?? {}, [...taken, ...targets]),
145
- binaryTargets: targets,
176
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
177
+ ...(opening ? foldersMoved(room, from) : {}),
146
178
  removals: opening
147
179
  ? [
148
180
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
149
181
  ...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
150
182
  ].sort()
151
183
  : [],
152
- ...(declared ? { attachments } : {}),
153
184
  ...(pageToken === undefined ? {} : { pageToken }),
154
185
  };
155
186
  }
@@ -170,7 +201,7 @@ export function createMemoryAdapter(options = {}) {
170
201
  function historiesOf(input) {
171
202
  const asked = input?.conversations;
172
203
  if (!Array.isArray(asked))
173
- return { kind: 'rejected', code: 'invalid_request', fields: {} };
204
+ return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
174
205
  const histories = [];
175
206
  for (const entry of asked) {
176
207
  const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
@@ -198,21 +229,32 @@ export function createMemoryAdapter(options = {}) {
198
229
  const named = typeof input.conversation === 'string' ? input.conversation : '';
199
230
  const conversation = scripted.get(named);
200
231
  if (conversation === undefined) {
201
- return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };
232
+ return {
233
+ kind: 'rejected',
234
+ code: 'unknown-conversation',
235
+ fields: { conversation: named },
236
+ retryable: false,
237
+ };
202
238
  }
203
239
  const outcome = conversation.outcomes?.[name];
204
240
  if (outcome !== undefined)
205
241
  return outcome;
206
242
  if (name === 'conversation.send') {
243
+ const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
244
+ const answered = operation === null ? undefined : sentTurns.get(operation);
245
+ if (answered !== undefined)
246
+ return { kind: 'action', result: { turn: answered } };
207
247
  issued += 1;
208
248
  const turn = `turn-${issued}`;
209
249
  unsealed.set(turn, named);
250
+ if (operation !== null)
251
+ sentTurns.set(operation, turn);
210
252
  return { kind: 'action', result: { turn } };
211
253
  }
212
254
  if (name === 'conversation.cancel') {
213
255
  const turn = typeof input.turn === 'string' ? input.turn : '';
214
256
  if (sealed.has(turn) || !unsealed.has(turn)) {
215
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };
257
+ return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
216
258
  }
217
259
  unsealed.delete(turn);
218
260
  return { kind: 'action', result: { turn, cancelled: true } };
@@ -221,18 +263,23 @@ export function createMemoryAdapter(options = {}) {
221
263
  scripted.delete(named);
222
264
  return { kind: 'action', result: { conversation: named } };
223
265
  }
266
+ function announceList() {
267
+ const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
268
+ for (const listener of listeners)
269
+ listener({ kind: 'list', entries });
270
+ }
224
271
  function discovery() {
225
272
  return {
226
273
  kind: 'discovery',
227
- supportedVersions,
228
- mdModel,
229
274
  rooms: rooms.map(declared),
230
275
  capabilities,
231
276
  providerLimits,
232
277
  retention,
278
+ ...(options.member === undefined ? {} : { member: options.member }),
233
279
  };
234
280
  }
235
281
  return {
282
+ ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
236
283
  setRooms(next) {
237
284
  rooms = [...next];
238
285
  retain(rooms);
@@ -240,9 +287,28 @@ export function createMemoryAdapter(options = {}) {
240
287
  setConversations(next) {
241
288
  scriptConversations(next);
242
289
  },
243
- notifyRoomVersion(notification) {
290
+ open() {
291
+ announceList();
292
+ for (const observer of observers)
293
+ observer({ kind: 'opened' });
294
+ },
295
+ close({ revoked = false, lost = !revoked } = {}) {
244
296
  for (const observer of observers)
245
- observer(notification);
297
+ observer({ kind: 'closed', revoked, lost });
298
+ },
299
+ expire(locators) {
300
+ expiring = [...locators];
301
+ },
302
+ notifyRoomVersion({ locator, roomVersion }) {
303
+ for (const observer of observers)
304
+ observer({ kind: 'room-version', locator, roomVersion });
305
+ },
306
+ notifyAuthorityChanged(scope) {
307
+ for (const observer of observers) {
308
+ observer(scope === undefined
309
+ ? { kind: 'authority-changed' }
310
+ : { kind: 'authority-changed', scope });
311
+ }
246
312
  },
247
313
  notifyConversation(event) {
248
314
  if (event.kind === 'accepted-message') {
@@ -256,8 +322,8 @@ export function createMemoryAdapter(options = {}) {
256
322
  for (const observer of modeObservers)
257
323
  observer(mode);
258
324
  },
259
- selectedRooms() {
260
- return selected;
325
+ heldRooms() {
326
+ return held;
261
327
  },
262
328
  replicatedConversations() {
263
329
  return replicated;
@@ -281,12 +347,47 @@ export function createMemoryAdapter(options = {}) {
281
347
  };
282
348
  },
283
349
  },
284
- roomVersions: {
285
- select(locators) {
286
- selected = [...locators];
350
+ roomStream: {
351
+ hold(asked) {
352
+ held = asked.map((room) => room.locator);
353
+ const expired = expiring.filter((locator) => held.includes(locator));
354
+ expiring = [];
355
+ const moved = asked.flatMap((room) => {
356
+ const current = rooms.find((entry) => entry.locator === room.locator);
357
+ return current === undefined ||
358
+ expired.includes(room.locator) ||
359
+ current.roomVersion === room.roomVersion
360
+ ? []
361
+ : [{ locator: room.locator, roomVersion: current.roomVersion }];
362
+ });
363
+ queueMicrotask(() => {
364
+ for (const observer of observers) {
365
+ for (const room of moved)
366
+ observer({ kind: 'room-version', ...room });
367
+ observer({ kind: 'opening', expired });
368
+ }
369
+ });
370
+ },
371
+ reopen() {
372
+ queueMicrotask(() => {
373
+ for (const observer of observers) {
374
+ observer({ kind: 'closed', revoked: false, lost: false });
375
+ }
376
+ });
287
377
  },
378
+ published() { },
288
379
  observe(notify) {
289
380
  observers.add(notify);
381
+ queueMicrotask(() => {
382
+ if (!observers.has(notify))
383
+ return;
384
+ if (options.unopened === true) {
385
+ notify({ kind: 'closed', revoked: false, lost: true });
386
+ return;
387
+ }
388
+ announceList();
389
+ notify({ kind: 'opened' });
390
+ });
290
391
  return () => {
291
392
  observers.delete(notify);
292
393
  };
@@ -298,13 +399,6 @@ export function createMemoryAdapter(options = {}) {
298
399
  else
299
400
  scripts[operation] = answer;
300
401
  },
301
- async model(_authorization, request) {
302
- return resolveScript(scripts.model, () => {
303
- const room = rooms.find((entry) => entry.locator === request.locator);
304
- const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;
305
- return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };
306
- }, request);
307
- },
308
402
  async authorize() {
309
403
  return resolveScript(scripts.authorize, () => ({}), undefined);
310
404
  },
@@ -317,13 +411,21 @@ export function createMemoryAdapter(options = {}) {
317
411
  });
318
412
  },
319
413
  reached,
414
+ follows(locator, roomVersion, next) {
415
+ const scripted = scripts.follows;
416
+ if (typeof scripted === 'boolean')
417
+ return scripted;
418
+ if (scripted !== undefined)
419
+ return scripted(locator, roomVersion, next);
420
+ return true;
421
+ },
320
422
  async bootstrap(_authorization, request) {
321
423
  return resolveScript(scripts.bootstrap, () => {
322
424
  const room = rooms.find((entry) => entry.locator === request.locator);
323
425
  if (room === undefined) {
324
426
  return { kind: 'room-not-readable', locator: request.locator };
325
427
  }
326
- return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));
428
+ return page(room, request.pageToken);
327
429
  }, request).then((answer) => note(request.locator, answer));
328
430
  },
329
431
  async refresh(_authorization, request) {
@@ -341,10 +443,6 @@ export function createMemoryAdapter(options = {}) {
341
443
  }
342
444
  return advancement(continuation.room, continuation.from, continuation.at);
343
445
  }
344
- if (request.minPosition !== undefined &&
345
- !reached(room.locator, room.roomVersion, request.minPosition)) {
346
- return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };
347
- }
348
446
  if (request.fromRoomVersion === room.roomVersion) {
349
447
  return { kind: 'still-current' };
350
448
  }
@@ -360,8 +458,20 @@ export function createMemoryAdapter(options = {}) {
360
458
  if (room === undefined) {
361
459
  return { kind: 'room-not-readable', locator: request.locator };
362
460
  }
363
- return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };
364
- }, request).then((answer) => note(request.locator, answer));
461
+ return {
462
+ kind: 'rejected',
463
+ code: 'unscripted-mutation',
464
+ fields: {},
465
+ retryable: false,
466
+ affected: {},
467
+ };
468
+ }, request).then((answer) => {
469
+ const destination = request.changeBatch.between?.destination.room;
470
+ if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
471
+ note(destination, answer.destination);
472
+ }
473
+ return note(request.locator, answer);
474
+ });
365
475
  },
366
476
  async history(_authorization, request) {
367
477
  return resolveScript(scripts.history, () => {
@@ -375,11 +485,25 @@ export function createMemoryAdapter(options = {}) {
375
485
  };
376
486
  }, request);
377
487
  },
488
+ async binary(_authorization, request) {
489
+ return resolveScript(scripts.binary, () => {
490
+ const room = rooms.find((entry) => entry.locator === request.locator);
491
+ if (room === undefined)
492
+ return { kind: 'room-not-readable', locator: request.locator };
493
+ const blob = room.blobs?.[request.path];
494
+ return blob === undefined
495
+ ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
496
+ : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
497
+ }, request);
498
+ },
499
+ async link(_authorization, request) {
500
+ return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
501
+ },
378
502
  async action(_authorization, request) {
379
503
  return resolveScript(scripts.action, () => {
380
504
  if (request.name.startsWith('conversation.'))
381
505
  return conversationAction(request);
382
- return { kind: 'rejected', code: 'unscripted-action', fields: {} };
506
+ return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
383
507
  }, request).then((answer) => {
384
508
  if (answer.kind === 'action' && answer.at !== undefined)
385
509
  note(answer.at.locator, answer.at);
@@ -0,0 +1,28 @@
1
+ import type { AcceptedMessage } from './adapter.js';
2
+ import type { Connection } from './tables.js';
3
+ export declare const MESSAGE_TABLES: readonly string[];
4
+ export type HeldConversation = {
5
+ readonly conversation: string;
6
+ readonly read: string | null | undefined;
7
+ readonly partial: boolean;
8
+ };
9
+ export type MessageWindow = {
10
+ readonly messages: AcceptedMessage[];
11
+ readonly more: boolean;
12
+ };
13
+ export type ConversationWrite = {
14
+ readonly conversation: string;
15
+ readonly messages: readonly AcceptedMessage[];
16
+ readonly read?: {
17
+ readonly at: string | null;
18
+ readonly partial: boolean;
19
+ };
20
+ };
21
+ export declare function heldConversations(connection: Connection): HeldConversation[];
22
+ export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
23
+ export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null): MessageWindow;
24
+ export declare function messageCount(connection: Connection, conversation: string): number;
25
+ export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
26
+ export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
27
+ export declare function forgottenMessages(connection: Connection): void;
28
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3E,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAmB5E;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAClD,IAAI,CAoCN;AAYD,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GACvC,aAAa,CAUf;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAW9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
@@ -0,0 +1,90 @@
1
+ import { indexMessage, unindexMessages } from './fulltext.js';
2
+ export const MESSAGE_TABLES = [
3
+ 'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
4
+ 'CREATE TABLE conversation_messages (id INTEGER PRIMARY KEY, conversation TEXT NOT NULL, identity TEXT NOT NULL, turn TEXT NOT NULL, position TEXT NOT NULL, message TEXT NOT NULL, text TEXT NOT NULL)',
5
+ 'CREATE UNIQUE INDEX conversation_messages_identity ON conversation_messages (conversation, identity)',
6
+ 'CREATE INDEX conversation_messages_position ON conversation_messages (conversation, position, identity)',
7
+ 'CREATE INDEX conversation_messages_turn ON conversation_messages (conversation, turn)',
8
+ ];
9
+ function text(value) {
10
+ return typeof value === 'string' ? value : String(value);
11
+ }
12
+ export function heldConversations(connection) {
13
+ const held = new Map();
14
+ for (const row of connection.rows('SELECT conversation, read, partial FROM conversation_reads')) {
15
+ held.set(text(row.conversation), {
16
+ conversation: text(row.conversation),
17
+ read: row.read === null ? null : text(row.read),
18
+ partial: Number(row.partial) === 1,
19
+ });
20
+ }
21
+ for (const row of connection.rows('SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)')) {
22
+ held.set(text(row.conversation), {
23
+ conversation: text(row.conversation),
24
+ read: undefined,
25
+ partial: true,
26
+ });
27
+ }
28
+ return [...held.values()];
29
+ }
30
+ export function keptMessages(connection, { conversation, messages, read }) {
31
+ for (const message of messages) {
32
+ const [held] = connection.rows('SELECT id FROM conversation_messages WHERE conversation = ? AND identity = ?', [conversation, message.identity]);
33
+ const record = [
34
+ message.turn,
35
+ message.position,
36
+ JSON.stringify(message.message ?? null),
37
+ message.text,
38
+ ];
39
+ let id;
40
+ if (held === undefined) {
41
+ connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
42
+ id = Number(connection.rows('SELECT last_insert_rowid() AS id')[0].id);
43
+ }
44
+ else {
45
+ id = Number(held.id);
46
+ unindexMessages(connection, [id]);
47
+ connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, id]);
48
+ }
49
+ indexMessage(connection, id, message.text);
50
+ }
51
+ if (read !== undefined) {
52
+ connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
53
+ }
54
+ return null;
55
+ }
56
+ function accepted(row) {
57
+ return {
58
+ identity: text(row.identity),
59
+ turn: text(row.turn),
60
+ position: text(row.position),
61
+ text: text(row.text),
62
+ message: JSON.parse(text(row.message)),
63
+ };
64
+ }
65
+ export function messageWindow(connection, conversation, limit, before) {
66
+ const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
67
+ ? [conversation, limit + 1]
68
+ : [conversation, before[0], before[0], before[1], limit + 1]);
69
+ return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
70
+ }
71
+ export function messageCount(connection, conversation) {
72
+ const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
73
+ return Number(counted?.held ?? 0);
74
+ }
75
+ export function turnArrived(connection, conversation, turn) {
76
+ return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
77
+ }
78
+ export function droppedMessages(connection, conversations) {
79
+ for (const conversation of conversations) {
80
+ unindexMessages(connection, connection
81
+ .rows('SELECT id FROM conversation_messages WHERE conversation = ?', [conversation])
82
+ .map((row) => Number(row.id)));
83
+ connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
84
+ connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
85
+ }
86
+ }
87
+ export function forgottenMessages(connection) {
88
+ connection.run('DELETE FROM conversation_messages');
89
+ connection.run('DELETE FROM conversation_reads');
90
+ }
package/dist/model.d.ts CHANGED
@@ -1,31 +1,27 @@
1
- import type { Definition, FieldSpec, SectionSpec, VerifiedModel } from '@agentshouse/mdmodel';
1
+ import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
2
+ import type { Open } from './open.js';
2
3
  export type ModelIdentity = {
3
4
  identity: string;
4
5
  version: string;
5
6
  };
6
7
  export type ModelSnapshot = ModelIdentity & {
7
8
  schema: string | null;
9
+ revision: string | null;
8
10
  };
9
- export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'version-changed' | 'invalid';
11
+ export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired' | 'invalid'>;
10
12
  export type ModelResult = {
11
13
  kind: 'model';
12
14
  snapshot: ModelSnapshot;
13
15
  } | {
14
16
  kind: 'model-unavailable';
15
17
  reason: ModelUnavailableReason;
16
- } | {
17
- kind: 'transport-uncertainty';
18
- } | {
19
- kind: 'revoked-authorization';
20
- };
21
- export type MdType = {
22
- name: string;
23
- fields: Readonly<Record<string, FieldSpec>>;
24
- sections: Readonly<Record<string, SectionSpec>>;
25
18
  };
19
+ export type MdType = Definition;
26
20
  export type ModelState = {
27
21
  status: 'unavailable';
28
22
  reason: ModelUnavailableReason;
23
+ schema?: string | null;
24
+ revision?: string | null;
29
25
  } | {
30
26
  status: 'current' | 'cached';
31
27
  snapshot: ModelSnapshot;
@@ -33,23 +29,30 @@ export type ModelState = {
33
29
  types: VerifiedModel['types'];
34
30
  };
35
31
  export type TypesResult = {
36
- status: 'unavailable';
32
+ status: Open<'unavailable'>;
37
33
  reason: ModelUnavailableReason;
34
+ types: null;
35
+ schema?: string | null;
36
+ revision?: string | null;
38
37
  } | {
39
- status: 'current' | 'cached';
38
+ status: Open<'current' | 'cached'>;
40
39
  identity: string;
41
40
  version: string;
42
41
  verifiedWith: ModelIdentity;
43
42
  types: readonly MdType[];
43
+ schema: string | null;
44
+ revision: string | null;
44
45
  };
45
46
  export type ValidationReceipt = {
46
47
  identity: string;
47
48
  version: string;
48
- source: 'current' | 'cached';
49
+ source: Open<'current' | 'cached'>;
49
50
  };
50
51
  export declare const NO_MODEL: ModelState;
51
52
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
52
53
  export declare function modelTypes(state: ModelState): TypesResult;
53
54
  export declare function cached(state: ModelState): ModelState;
54
55
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
56
+ export declare function sameTyping(left: ModelState, right: ModelState): boolean;
57
+ export declare function referenceField(facts: ValueFacts | undefined): boolean;
55
58
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE9F,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,SAAS,CAAC;AACd,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACjD,CAAC;AACF,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AACpG,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAczD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AACnG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAgBzD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CASvE;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
package/dist/model.js CHANGED
@@ -6,15 +6,15 @@ export function definitionOf(state, type) {
6
6
  }
7
7
  export function modelTypes(state) {
8
8
  return state.status === 'unavailable'
9
- ? { ...state }
9
+ ? { ...state, types: null }
10
10
  : {
11
11
  status: state.status,
12
12
  identity: state.snapshot.identity,
13
13
  version: state.snapshot.version,
14
14
  verifiedWith: { ...state.verifiedWith },
15
- types: structuredClone(Object.values(state.types)
16
- .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0))
17
- .map(({ name, fields, sections }) => ({ name, fields, sections }))),
15
+ schema: state.snapshot.schema,
16
+ revision: state.snapshot.revision,
17
+ types: structuredClone(Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)),
18
18
  };
19
19
  }
20
20
  export function cached(state) {
@@ -23,3 +23,15 @@ export function cached(state) {
23
23
  export function sameModel(left, right) {
24
24
  return left.identity === right.identity && left.version === right.version;
25
25
  }
26
+ export function sameTyping(left, right) {
27
+ if (left === right)
28
+ return true;
29
+ if (left.status === 'unavailable' || right.status === 'unavailable') {
30
+ return left.status === right.status;
31
+ }
32
+ return (left.snapshot.schema === right.snapshot.schema &&
33
+ sameModel(left.verifiedWith, right.verifiedWith));
34
+ }
35
+ export function referenceField(facts) {
36
+ return facts?.reference !== undefined || facts?.items?.reference !== undefined;
37
+ }
package/dist/name.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function transliterated(text: string): string;
2
+ export declare function nameFrom(title: string): string;
3
+ export declare function cutName(name: string, most: number): string;
4
+ //# sourceMappingURL=name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAgHA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}