@agentshouse/mdruntime 0.1.0-c967d1ca66fee → 0.1.0-c97456d63baba

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 (183) hide show
  1. package/AGENTS.md +257 -227
  2. package/README.md +11 -1
  3. package/dist/acquisition.d.ts +14 -0
  4. package/dist/acquisition.d.ts.map +1 -0
  5. package/dist/acquisition.js +24 -0
  6. package/dist/adapter.d.ts +69 -20
  7. package/dist/adapter.d.ts.map +1 -1
  8. package/dist/attempt.d.ts +16 -0
  9. package/dist/attempt.d.ts.map +1 -0
  10. package/dist/attempt.js +70 -0
  11. package/dist/binary.d.ts +23 -0
  12. package/dist/binary.d.ts.map +1 -0
  13. package/dist/binary.js +8 -0
  14. package/dist/bootstrap.d.ts +2 -2
  15. package/dist/bootstrap.d.ts.map +1 -1
  16. package/dist/bootstrap.js +33 -14
  17. package/dist/change-set.d.ts +2 -0
  18. package/dist/change-set.d.ts.map +1 -1
  19. package/dist/change-set.js +39 -13
  20. package/dist/change.d.ts +11 -0
  21. package/dist/change.d.ts.map +1 -1
  22. package/dist/change.js +26 -1
  23. package/dist/chat/acts.d.ts +33 -0
  24. package/dist/chat/acts.d.ts.map +1 -0
  25. package/dist/chat/acts.js +36 -0
  26. package/dist/chat/context.d.ts +3 -0
  27. package/dist/chat/context.d.ts.map +1 -0
  28. package/dist/chat/context.js +10 -0
  29. package/dist/chat/input.d.ts +9 -0
  30. package/dist/chat/input.d.ts.map +1 -0
  31. package/dist/chat/input.js +99 -0
  32. package/dist/chat/kit.d.ts +61 -0
  33. package/dist/chat/kit.d.ts.map +1 -0
  34. package/dist/chat/kit.js +123 -0
  35. package/dist/chat/lasting.d.ts +6 -0
  36. package/dist/chat/lasting.d.ts.map +1 -0
  37. package/dist/chat/lasting.js +19 -0
  38. package/dist/chat/list.d.ts +27 -0
  39. package/dist/chat/list.d.ts.map +1 -0
  40. package/dist/chat/list.js +63 -0
  41. package/dist/chat/markdown.d.ts +20 -0
  42. package/dist/chat/markdown.d.ts.map +1 -0
  43. package/dist/chat/markdown.js +188 -0
  44. package/dist/chat/message.d.ts +6 -0
  45. package/dist/chat/message.d.ts.map +1 -0
  46. package/dist/chat/message.js +192 -0
  47. package/dist/chat/messages.d.ts +22 -0
  48. package/dist/chat/messages.d.ts.map +1 -0
  49. package/dist/chat/messages.js +155 -0
  50. package/dist/chat/name.d.ts +6 -0
  51. package/dist/chat/name.d.ts.map +1 -0
  52. package/dist/chat/name.js +37 -0
  53. package/dist/chat/opened.d.ts +11 -0
  54. package/dist/chat/opened.d.ts.map +1 -0
  55. package/dist/chat/opened.js +17 -0
  56. package/dist/chat/overlay.d.ts +31 -0
  57. package/dist/chat/overlay.d.ts.map +1 -0
  58. package/dist/chat/overlay.js +97 -0
  59. package/dist/chat/parts.d.ts +57 -0
  60. package/dist/chat/parts.d.ts.map +1 -0
  61. package/dist/chat/parts.js +119 -0
  62. package/dist/chat/process.d.ts +20 -0
  63. package/dist/chat/process.d.ts.map +1 -0
  64. package/dist/chat/process.js +32 -0
  65. package/dist/chat/provider.d.ts +63 -0
  66. package/dist/chat/provider.d.ts.map +1 -0
  67. package/dist/chat/provider.js +629 -0
  68. package/dist/chat/question.d.ts +9 -0
  69. package/dist/chat/question.d.ts.map +1 -0
  70. package/dist/chat/question.js +80 -0
  71. package/dist/chat/questions.d.ts +31 -0
  72. package/dist/chat/questions.d.ts.map +1 -0
  73. package/dist/chat/questions.js +111 -0
  74. package/dist/chat/read.d.ts +5 -0
  75. package/dist/chat/read.d.ts.map +1 -0
  76. package/dist/chat/read.js +13 -0
  77. package/dist/chat/ready.d.ts +34 -0
  78. package/dist/chat/ready.d.ts.map +1 -0
  79. package/dist/chat/ready.js +91 -0
  80. package/dist/chat/style.d.ts +4 -0
  81. package/dist/chat/style.d.ts.map +1 -0
  82. package/dist/chat/style.js +302 -0
  83. package/dist/chat.d.ts +14 -0
  84. package/dist/chat.d.ts.map +1 -0
  85. package/dist/chat.js +8 -0
  86. package/dist/client.d.ts +21 -10
  87. package/dist/client.d.ts.map +1 -1
  88. package/dist/client.js +14 -2
  89. package/dist/collection.d.ts +17 -3
  90. package/dist/collection.d.ts.map +1 -1
  91. package/dist/collection.js +230 -19
  92. package/dist/connection.d.ts +32 -12
  93. package/dist/connection.d.ts.map +1 -1
  94. package/dist/connection.js +1482 -351
  95. package/dist/conversation.d.ts +23 -9
  96. package/dist/conversation.d.ts.map +1 -1
  97. package/dist/conversation.js +372 -142
  98. package/dist/durability.d.ts +7 -1
  99. package/dist/durability.d.ts.map +1 -1
  100. package/dist/entry.d.ts +17 -0
  101. package/dist/entry.d.ts.map +1 -0
  102. package/dist/entry.js +156 -0
  103. package/dist/expectation.d.ts +21 -0
  104. package/dist/expectation.d.ts.map +1 -0
  105. package/dist/expectation.js +70 -0
  106. package/dist/fence.d.ts +6 -0
  107. package/dist/fence.d.ts.map +1 -0
  108. package/dist/fence.js +10 -0
  109. package/dist/host.d.ts +13 -3
  110. package/dist/host.d.ts.map +1 -1
  111. package/dist/host.js +48 -11
  112. package/dist/identity.d.ts +4 -0
  113. package/dist/identity.d.ts.map +1 -1
  114. package/dist/identity.js +12 -0
  115. package/dist/index.d.ts +13 -7
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +4 -0
  118. package/dist/memory.d.ts +5 -3
  119. package/dist/memory.d.ts.map +1 -1
  120. package/dist/memory.js +47 -13
  121. package/dist/model.d.ts +4 -2
  122. package/dist/model.d.ts.map +1 -1
  123. package/dist/model.js +10 -1
  124. package/dist/observation.d.ts +5 -2
  125. package/dist/observation.d.ts.map +1 -1
  126. package/dist/observation.js +22 -11
  127. package/dist/outcome.d.ts +11 -1
  128. package/dist/outcome.d.ts.map +1 -1
  129. package/dist/outcome.js +7 -0
  130. package/dist/overlay.d.ts +14 -2
  131. package/dist/overlay.d.ts.map +1 -1
  132. package/dist/overlay.js +75 -62
  133. package/dist/query.d.ts +31 -3
  134. package/dist/query.d.ts.map +1 -1
  135. package/dist/reach.d.ts +8 -2
  136. package/dist/reach.d.ts.map +1 -1
  137. package/dist/reach.js +42 -8
  138. package/dist/react.d.ts +7 -4
  139. package/dist/react.d.ts.map +1 -1
  140. package/dist/read-side.d.ts +13 -6
  141. package/dist/read-side.d.ts.map +1 -1
  142. package/dist/read-side.js +291 -85
  143. package/dist/readiness.d.ts +53 -0
  144. package/dist/readiness.d.ts.map +1 -0
  145. package/dist/readiness.js +33 -0
  146. package/dist/recovery.d.ts +25 -0
  147. package/dist/recovery.d.ts.map +1 -0
  148. package/dist/recovery.js +197 -0
  149. package/dist/refresh.d.ts.map +1 -1
  150. package/dist/refresh.js +21 -25
  151. package/dist/replica.d.ts +6 -3
  152. package/dist/replica.d.ts.map +1 -1
  153. package/dist/replica.js +78 -45
  154. package/dist/room-draft.d.ts +20 -3
  155. package/dist/room-draft.d.ts.map +1 -1
  156. package/dist/room-draft.js +119 -1
  157. package/dist/rows.d.ts +6 -13
  158. package/dist/rows.d.ts.map +1 -1
  159. package/dist/rows.js +5 -13
  160. package/dist/save.d.ts +28 -0
  161. package/dist/save.d.ts.map +1 -1
  162. package/dist/save.js +343 -29
  163. package/dist/search.d.ts +28 -6
  164. package/dist/search.d.ts.map +1 -1
  165. package/dist/search.js +108 -45
  166. package/dist/shared.d.ts +11 -0
  167. package/dist/shared.d.ts.map +1 -0
  168. package/dist/shared.js +368 -0
  169. package/dist/status.d.ts +4 -0
  170. package/dist/status.d.ts.map +1 -1
  171. package/dist/store.d.ts +55 -21
  172. package/dist/store.d.ts.map +1 -1
  173. package/dist/store.js +424 -206
  174. package/dist/turn.d.ts +7 -0
  175. package/dist/turn.d.ts.map +1 -0
  176. package/dist/turn.js +45 -0
  177. package/dist/wire.d.ts +137 -30
  178. package/dist/wire.d.ts.map +1 -1
  179. package/dist/wire.js +49 -29
  180. package/package.json +26 -14
  181. package/dist/attachment.d.ts +0 -3
  182. package/dist/attachment.d.ts.map +0 -1
  183. package/dist/attachment.js +0 -8
@@ -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,EACL,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,kBAAkB,EACvB,KAAK,MAAM,EAGX,KAAK,aAAa,EAGlB,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAkBtB,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,MAAM,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAClD,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,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,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,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,iBAAiB,CAAC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnD,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,SAAS,IAAI,SAAS,MAAM,EAAE,CAAC;IAC/B,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AA+CF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAucrF"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
package/dist/memory.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { sameChange } from './overlay.js';
2
2
  const FIXTURE_RETENTION = {
3
3
  history: { kind: 'duration', seconds: 1 },
4
- outcome: 1,
4
+ outcome: 604_800,
5
5
  refreshHorizon: 1,
6
6
  };
7
7
  function declaredRetention(value) {
@@ -55,8 +55,10 @@ export function createMemoryAdapter(options = {}) {
55
55
  const scripted = new Map();
56
56
  const unsealed = new Map();
57
57
  const sealed = new Set();
58
+ const sentTurns = new Map();
58
59
  const historyPageSize = options.historyPageSize;
59
60
  let held = [];
61
+ let heldDemand = null;
60
62
  let expiring = [];
61
63
  let replicated = [];
62
64
  let issued = 0;
@@ -114,24 +116,23 @@ export function createMemoryAdapter(options = {}) {
114
116
  const size = pageSize ?? paths.length;
115
117
  const taken = paths.slice(from, from + size);
116
118
  const next = from + taken.length;
117
- const targets = opening ? (room.binaryTargets ?? []) : [];
119
+ const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
118
120
  return {
119
121
  kind: 'bootstrap',
120
122
  roomVersion: room.roomVersion,
121
123
  ...(opening ? { models: modelsOf(room) } : {}),
122
124
  documents: named(room.documents ?? {}, taken),
123
- revisions: named(room.revisions ?? {}, taken),
125
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
124
126
  changes: named(room.changes ?? {}, [...taken, ...targets]),
125
- binaryTargets: targets,
126
- ...(opening && room.attachments !== undefined ? { attachments: room.attachments } : {}),
127
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
127
128
  ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
128
129
  };
129
130
  }
130
131
  function advancement(room, from, at) {
131
132
  const current = room.documents ?? {};
132
133
  const previous = from.documents ?? {};
133
- const currentTargets = new Set(room.binaryTargets ?? []);
134
- const previousTargets = new Set(from.binaryTargets ?? []);
134
+ const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
135
+ const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
135
136
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
136
137
  !sameChange(room.changes?.[path], from.changes?.[path]);
137
138
  const changed = Object.keys(current)
@@ -147,24 +148,21 @@ export function createMemoryAdapter(options = {}) {
147
148
  const targets = opening
148
149
  ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
149
150
  : [];
150
- const attachments = room.attachments ?? [];
151
- const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
152
151
  const models = opening ? changedModels(room, from) : undefined;
153
152
  return {
154
153
  kind: 'net-advancement',
155
154
  roomVersion: room.roomVersion,
156
155
  ...(models === undefined ? {} : { models }),
157
156
  documents: named(current, taken),
158
- revisions: named(room.revisions ?? {}, taken),
157
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
159
158
  changes: named(room.changes ?? {}, [...taken, ...targets]),
160
- binaryTargets: targets,
159
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
161
160
  removals: opening
162
161
  ? [
163
162
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
164
163
  ...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
165
164
  ].sort()
166
165
  : [],
167
- ...(declared ? { attachments } : {}),
168
166
  ...(pageToken === undefined ? {} : { pageToken }),
169
167
  };
170
168
  }
@@ -224,9 +222,15 @@ export function createMemoryAdapter(options = {}) {
224
222
  if (outcome !== undefined)
225
223
  return outcome;
226
224
  if (name === 'conversation.send') {
225
+ const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
226
+ const answered = operation === null ? undefined : sentTurns.get(operation);
227
+ if (answered !== undefined)
228
+ return { kind: 'action', result: { turn: answered } };
227
229
  issued += 1;
228
230
  const turn = `turn-${issued}`;
229
231
  unsealed.set(turn, named);
232
+ if (operation !== null)
233
+ sentTurns.set(operation, turn);
230
234
  return { kind: 'action', result: { turn } };
231
235
  }
232
236
  if (name === 'conversation.cancel') {
@@ -257,6 +261,7 @@ export function createMemoryAdapter(options = {}) {
257
261
  };
258
262
  }
259
263
  return {
264
+ ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
260
265
  setRooms(next) {
261
266
  rooms = [...next];
262
267
  retain(rooms);
@@ -295,6 +300,9 @@ export function createMemoryAdapter(options = {}) {
295
300
  heldRooms() {
296
301
  return held;
297
302
  },
303
+ heldDemand() {
304
+ return heldDemand;
305
+ },
298
306
  replicatedConversations() {
299
307
  return replicated;
300
308
  },
@@ -318,8 +326,9 @@ export function createMemoryAdapter(options = {}) {
318
326
  },
319
327
  },
320
328
  roomStream: {
321
- hold(asked) {
329
+ hold(asked, demand) {
322
330
  held = asked.map((room) => room.locator);
331
+ heldDemand = demand;
323
332
  const expired = expiring.filter((locator) => held.includes(locator));
324
333
  expiring = [];
325
334
  const moved = asked.flatMap((room) => {
@@ -344,6 +353,7 @@ export function createMemoryAdapter(options = {}) {
344
353
  observer({ kind: 'closed', revoked: false });
345
354
  });
346
355
  },
356
+ published() { },
347
357
  observe(notify) {
348
358
  observers.add(notify);
349
359
  queueMicrotask(() => {
@@ -447,6 +457,30 @@ export function createMemoryAdapter(options = {}) {
447
457
  };
448
458
  }, request);
449
459
  },
460
+ async binary(_authorization, request) {
461
+ return resolveScript(scripts.binary, () => {
462
+ if (request.kind === 'reference') {
463
+ return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
464
+ }
465
+ const room = rooms.find((entry) => entry.locator === request.locator);
466
+ if (room === undefined)
467
+ return { kind: 'room-not-readable', locator: request.locator };
468
+ const blob = room.blobs?.[request.path];
469
+ return blob === undefined
470
+ ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
471
+ : { kind: 'binary', blob };
472
+ }, request);
473
+ },
474
+ referrerScope(referrer) {
475
+ if (typeof referrer !== 'object' || referrer === null)
476
+ return null;
477
+ const { room, path, message } = referrer;
478
+ if (typeof message === 'string')
479
+ return { kind: 'conversations' };
480
+ if (typeof room !== 'string')
481
+ return null;
482
+ return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
483
+ },
450
484
  async action(_authorization, request) {
451
485
  return resolveScript(scripts.action, () => {
452
486
  if (request.name.startsWith('conversation.'))
package/dist/model.d.ts CHANGED
@@ -29,12 +29,13 @@ export type ModelState = {
29
29
  types: VerifiedModel['types'];
30
30
  };
31
31
  export type TypesResult = {
32
- status: 'unavailable';
32
+ status: Open<'unavailable'>;
33
33
  reason: ModelUnavailableReason;
34
+ types: null;
34
35
  schema?: string | null;
35
36
  revision?: string | null;
36
37
  } | {
37
- status: 'current' | 'cached';
38
+ status: Open<'current' | 'cached'>;
38
39
  identity: string;
39
40
  version: string;
40
41
  verifiedWith: ModelIdentity;
@@ -52,5 +53,6 @@ export declare function definitionOf(state: ModelState, type: string | 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;
55
57
  export declare function referenceField(facts: ValueFacts | undefined): boolean;
56
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,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,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,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,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
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,7 +6,7 @@ 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,
@@ -23,6 +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
+ }
26
35
  export function referenceField(facts) {
27
36
  return facts?.reference !== undefined || facts?.items?.reference !== undefined;
28
37
  }
@@ -1,4 +1,4 @@
1
- import type { QueryDocument, QueryGroup, QueryResult } from './query.js';
1
+ import type { QueryCoverage, QueryDocument, QueryGroup, QueryResult } from './query.js';
2
2
  export type Observation<T> = {
3
3
  current(): T;
4
4
  subscribe(listener: (value: T) => void): () => void;
@@ -13,14 +13,17 @@ export type QueryChange = {
13
13
  changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];
14
14
  removed: readonly RowKey[];
15
15
  order: readonly RowKey[] | null;
16
+ coverage?: QueryCoverage;
16
17
  };
18
+ export type QueryMessage = KeyedResult | QueryChange;
17
19
  export type Observed = {
18
20
  observation: Observation<unknown>;
19
21
  receive(message: unknown): void;
20
22
  end(): void;
21
23
  };
22
24
  export declare function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[];
23
- export declare function applied(keyed: KeyedResult, change: QueryChange): KeyedResult;
25
+ export declare function whole(message: QueryMessage): message is KeyedResult;
26
+ export declare function applied(keyed: KeyedResult, message: QueryMessage): KeyedResult;
24
27
  export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
25
28
  export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
26
29
  export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CAc5E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E"}
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAGnF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,WAAW,CAEnE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAkB9E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E"}
@@ -1,19 +1,30 @@
1
1
  export function rowsOf(result) {
2
- return 'groups' in result ? result.groups : result.documents;
2
+ if ('groups' in result)
3
+ return result.groups;
4
+ return 'documents' in result ? result.documents : [];
3
5
  }
4
- export function applied(keyed, change) {
5
- const rows = rowsOf(keyed.result);
6
+ export function whole(message) {
7
+ return 'result' in message;
8
+ }
9
+ export function applied(keyed, message) {
10
+ if (whole(message))
11
+ return message;
12
+ const result = keyed.result;
13
+ if ('pending' in result)
14
+ return keyed;
15
+ const rows = rowsOf(result);
6
16
  const byKey = new Map(keyed.keys.map((key, index) => [key, rows[index]]));
7
- for (const key of change.removed)
17
+ for (const key of message.removed)
8
18
  byKey.delete(key);
9
- for (const [key, row] of change.changed)
19
+ for (const [key, row] of message.changed)
10
20
  byKey.set(key, row);
11
- const keys = change.order ?? keyed.keys.filter((key) => byKey.has(key));
21
+ const keys = message.order ?? keyed.keys.filter((key) => byKey.has(key));
12
22
  const next = keys.map((key) => byKey.get(key));
23
+ const coverage = message.coverage ?? result.coverage;
13
24
  return {
14
- result: 'groups' in keyed.result
15
- ? { groups: next }
16
- : { documents: next },
25
+ result: 'groups' in result
26
+ ? { groups: next, coverage }
27
+ : { documents: next, coverage },
17
28
  keys,
18
29
  };
19
30
  }
@@ -27,11 +38,11 @@ function keyedResult(first) {
27
38
  },
28
39
  };
29
40
  }
30
- function whole(first) {
41
+ function replaced(first) {
31
42
  return { value: first, next: (message) => message };
32
43
  }
33
44
  export function observed(first, stop, keyed) {
34
- const reducer = keyed ? keyedResult(first) : whole(first);
45
+ const reducer = keyed ? keyedResult(first) : replaced(first);
35
46
  let value = reducer.value;
36
47
  let open = true;
37
48
  const listeners = new Set();
package/dist/outcome.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ActionResult, AdapterFailure, HistoryResult, ProviderRefusal, RoomVersionAt, ScopedRefusal } from './adapter.js';
1
+ import type { ActionResult, AdapterFailure, BinaryResult, HistoryResult, ProviderRefusal, RoomVersionAt, ScopedRefusal } from './adapter.js';
2
2
  import type { ChangeBatch } from './change.js';
3
3
  type Refused<Kind extends string> = ProviderRefusal & {
4
4
  kind: Kind;
@@ -14,6 +14,16 @@ export type CallResult = {
14
14
  export type HistoryAnswer = Exclude<HistoryResult, {
15
15
  kind: Failure['kind'];
16
16
  }> | Failure;
17
+ export type BinaryAnswer = {
18
+ kind: 'binary';
19
+ blob: Blob;
20
+ } | Refused<'rejected'> | Refused<'absent'> | Failure;
21
+ export declare function absentBinary(path: string): BinaryAnswer;
22
+ export declare function binaryAnswer(result: BinaryResult): BinaryAnswer;
23
+ export type Offline = {
24
+ readonly kind: 'offline';
25
+ };
26
+ export declare const OFFLINE: Offline;
17
27
  export declare const UNCERTAIN: Failure;
18
28
  export declare function undeclared(name: string): CallResult;
19
29
  export declare function failure(result: AdapterFailure): Failure;
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,IAAI,eAAe,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,GAChC,OAAO,CAAC,uBAAuB,CAAC,GAChC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACvD,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC;AAExF,eAAO,MAAM,SAAS,EAAE,OAKvB,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAiBvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAE7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAIlE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,CACvD,UAAU,GACV;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAC/D,CAAC"}
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,IAAI,eAAe,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,GAChC,OAAO,CAAC,uBAAuB,CAAC,GAChC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACvD,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC;AAExF,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9B,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC;AAEZ,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAEvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnD,eAAO,MAAM,OAAO,EAAE,OAA6B,CAAC;AAEpD,eAAO,MAAM,SAAS,EAAE,OAKvB,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAiBvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAE7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAIlE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,CACvD,UAAU,GACV;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAC/D,CAAC"}
package/dist/outcome.js CHANGED
@@ -1,3 +1,10 @@
1
+ export function absentBinary(path) {
2
+ return { kind: 'absent', code: 'binary-file-absent', fields: { path }, retryable: false };
3
+ }
4
+ export function binaryAnswer(result) {
5
+ return result.kind === 'binary' || result.kind === 'rejected' ? result : failure(result);
6
+ }
7
+ export const OFFLINE = { kind: 'offline' };
1
8
  export const UNCERTAIN = {
2
9
  kind: 'transport-uncertainty',
3
10
  code: 'transport-uncertainty',
package/dist/overlay.d.ts CHANGED
@@ -1,15 +1,27 @@
1
- import type { HeadChange } from './adapter.js';
1
+ import type { BinaryFile, HeadChange } from './adapter.js';
2
2
  import type { ChangeBatch } from './change.js';
3
3
  export type Heads = {
4
4
  revisions: Readonly<Record<string, string>>;
5
5
  changes: Readonly<Record<string, HeadChange>>;
6
6
  };
7
+ export type HeldBinary = ({
8
+ readonly state: 'accepted';
9
+ } & BinaryFile) | {
10
+ readonly state: 'pending';
11
+ readonly localId: string;
12
+ readonly byteLength: number;
13
+ readonly mediaType: string;
14
+ readonly sha256: string;
15
+ };
7
16
  export type Layer = Heads & {
8
17
  documents: Readonly<Record<string, string>>;
9
- binaryTargets: readonly string[];
18
+ binaries: Readonly<Record<string, HeldBinary>>;
10
19
  };
20
+ export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Record<string, HeldBinary>;
21
+ export declare function sameBinary(left: HeldBinary | undefined, right: HeldBinary | undefined): boolean;
11
22
  export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
12
23
  export declare function overlay(base: Layer, queue: readonly ChangeBatch[], unapplied?: () => void): Layer;
13
24
  export declare function sameLayerText(left: Layer, right: Layer): boolean;
25
+ export declare function changedPaths(left: Layer, right: Layer): ReadonlySet<string>;
14
26
  export declare function overlayChanged(base: Layer, queue: readonly ChangeBatch[], previousBase: Layer, previousQueue: readonly ChangeBatch[], previousVisible: Layer): Layer;
15
27
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAsJD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,KAAK,CAmBjG;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAQhE;AAmBD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CA4FP"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAGrE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CAAC,GAC7C;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAC1C,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAI5B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAW/F;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAsKD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,KAAK,CAmBjG;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAKhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAO3E;AA6BD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CAwDP"}
package/dist/overlay.js CHANGED
@@ -1,4 +1,19 @@
1
1
  import { apply, parse, serialize } from '@agentshouse/mdmodel';
2
+ import { differing, drafted, patched, settled } from './shared.js';
3
+ export function acceptedBinaries(files) {
4
+ return Object.fromEntries(Object.entries(files).map(([path, file]) => [path, { state: 'accepted', ...file }]));
5
+ }
6
+ export function sameBinary(left, right) {
7
+ if (left === undefined || right === undefined)
8
+ return left === right;
9
+ return (left.state === right.state &&
10
+ left.byteLength === right.byteLength &&
11
+ left.mediaType === right.mediaType &&
12
+ left.sha256 === right.sha256 &&
13
+ (left.state === 'accepted'
14
+ ? right.state === 'accepted' && left.fileRef === right.fileRef
15
+ : right.state === 'pending' && left.localId === right.localId));
16
+ }
2
17
  export function sameChange(left, right) {
3
18
  if (left === undefined || right === undefined)
4
19
  return left === right;
@@ -92,8 +107,9 @@ function relocate(staged, from, to) {
92
107
  delete staged.documents[from];
93
108
  staged.documents[to] = text;
94
109
  }
95
- else if (staged.binaryTargets.delete(from)) {
96
- staged.binaryTargets.add(to);
110
+ else if (staged.binaries[from] !== undefined) {
111
+ staged.binaries[to] = staged.binaries[from];
112
+ delete staged.binaries[from];
97
113
  }
98
114
  else {
99
115
  return false;
@@ -116,10 +132,11 @@ function erase(staged, path) {
116
132
  delete staged.documents[path];
117
133
  delete staged.revisions[path];
118
134
  delete staged.changes[path];
119
- staged.binaryTargets.delete(path);
135
+ delete staged.binaries[path];
120
136
  }
121
137
  function stage(staged, change, priors) {
122
138
  if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
139
+ delete staged.revisions[change.path];
123
140
  return edit(staged, change, priors);
124
141
  }
125
142
  if (change.kind === 'create') {
@@ -129,11 +146,26 @@ function stage(staged, change, priors) {
129
146
  return true;
130
147
  }
131
148
  if (change.kind === 'replace') {
149
+ delete staged.revisions[change.path];
132
150
  if (staged.documents[change.path] === undefined)
133
151
  return false;
134
152
  staged.documents[change.path] = change.content;
135
153
  return true;
136
154
  }
155
+ if (change.kind === 'binary') {
156
+ if (staged.documents[change.path] !== undefined)
157
+ return false;
158
+ staged.binaries[change.path] = {
159
+ state: 'pending',
160
+ localId: change.localId,
161
+ byteLength: change.byteLength,
162
+ mediaType: change.mediaType,
163
+ sha256: change.sha256,
164
+ };
165
+ delete staged.revisions[change.path];
166
+ delete staged.changes[change.path];
167
+ return true;
168
+ }
137
169
  if (change.kind === 'move') {
138
170
  return relocate(staged, change.path, change.to);
139
171
  }
@@ -142,10 +174,10 @@ function stage(staged, change, priors) {
142
174
  }
143
175
  export function overlay(base, queue, unapplied) {
144
176
  const staged = {
145
- documents: { ...base.documents },
146
- binaryTargets: new Set(base.binaryTargets),
147
- revisions: { ...base.revisions },
148
- changes: { ...base.changes },
177
+ documents: drafted(base.documents),
178
+ binaries: drafted(base.binaries),
179
+ revisions: drafted(base.revisions),
180
+ changes: drafted(base.changes),
149
181
  };
150
182
  for (const batch of queue) {
151
183
  const priors = priorsOf(batch.preconditions);
@@ -155,24 +187,29 @@ export function overlay(base, queue, unapplied) {
155
187
  }
156
188
  }
157
189
  return {
158
- documents: staged.documents,
159
- binaryTargets: [...staged.binaryTargets].sort(),
160
- revisions: staged.revisions,
161
- changes: staged.changes,
190
+ documents: settled(staged.documents),
191
+ binaries: settled(staged.binaries),
192
+ revisions: settled(staged.revisions),
193
+ changes: settled(staged.changes),
162
194
  };
163
195
  }
164
196
  function pathsOf(batch) {
165
197
  return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
166
198
  }
167
199
  export function sameLayerText(left, right) {
168
- const paths = Object.keys(left.documents);
169
- return (paths.length === Object.keys(right.documents).length &&
170
- paths.every((path) => left.documents[path] === right.documents[path]) &&
171
- left.binaryTargets.length === right.binaryTargets.length &&
172
- left.binaryTargets.every((path) => right.binaryTargets.includes(path)));
200
+ return (differing(left.documents, right.documents).size === 0 &&
201
+ differing(left.binaries, right.binaries, sameBinary).size === 0);
202
+ }
203
+ export function changedPaths(left, right) {
204
+ return new Set([
205
+ ...differing(left.documents, right.documents),
206
+ ...differing(left.revisions, right.revisions),
207
+ ...differing(left.changes, right.changes, sameChange),
208
+ ...differing(left.binaries, right.binaries, sameBinary),
209
+ ]);
173
210
  }
174
211
  function replayHeads(base, queue) {
175
- const heads = { revisions: { ...base.revisions }, changes: { ...base.changes } };
212
+ const heads = { revisions: drafted(base.revisions), changes: drafted(base.changes) };
176
213
  for (const batch of queue) {
177
214
  for (const change of batch.changes) {
178
215
  if (change.kind === 'remove') {
@@ -182,12 +219,22 @@ function replayHeads(base, queue) {
182
219
  else if (change.kind === 'create') {
183
220
  delete heads.changes[change.path];
184
221
  }
222
+ else if (change.kind === 'replace' ||
223
+ change.kind === 'field' ||
224
+ change.kind === 'section' ||
225
+ change.kind === 'preamble') {
226
+ delete heads.revisions[change.path];
227
+ }
228
+ else if (change.kind === 'binary') {
229
+ delete heads.revisions[change.path];
230
+ delete heads.changes[change.path];
231
+ }
185
232
  else if (change.kind === 'move') {
186
233
  moveHead(heads, change.path, change.to);
187
234
  }
188
235
  }
189
236
  }
190
- return heads;
237
+ return { revisions: settled(heads.revisions), changes: settled(heads.changes) };
191
238
  }
192
239
  export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
193
240
  const before = previousQueue.map((batch) => JSON.stringify(batch));
@@ -197,28 +244,11 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
197
244
  sameLayerText(base, previousBase)) {
198
245
  return {
199
246
  documents: previousVisible.documents,
200
- binaryTargets: previousVisible.binaryTargets,
247
+ binaries: previousVisible.binaries,
201
248
  ...replayHeads(base, queue),
202
249
  };
203
250
  }
204
- const affected = new Set();
205
- const paths = new Set([
206
- ...Object.keys(base.documents),
207
- ...Object.keys(previousBase.documents),
208
- ...Object.keys(base.revisions),
209
- ...Object.keys(previousBase.revisions),
210
- ...Object.keys(base.changes),
211
- ...Object.keys(previousBase.changes),
212
- ...base.binaryTargets,
213
- ...previousBase.binaryTargets,
214
- ]);
215
- for (const path of paths) {
216
- if (base.documents[path] !== previousBase.documents[path] ||
217
- base.revisions[path] !== previousBase.revisions[path] ||
218
- !sameChange(base.changes[path], previousBase.changes[path]) ||
219
- base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path))
220
- affected.add(path);
221
- }
251
+ const affected = new Set(changedPaths(base, previousBase));
222
252
  const oldIds = new Set(before);
223
253
  const newIds = new Set(after);
224
254
  for (const batch of previousQueue) {
@@ -249,6 +279,7 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
249
279
  const documents = {};
250
280
  const revisions = {};
251
281
  const changes = {};
282
+ const binaries = {};
252
283
  for (const path of affected) {
253
284
  if (base.documents[path] !== undefined)
254
285
  documents[path] = base.documents[path];
@@ -256,32 +287,14 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
256
287
  revisions[path] = base.revisions[path];
257
288
  if (base.changes[path] !== undefined)
258
289
  changes[path] = base.changes[path];
290
+ if (base.binaries[path] !== undefined)
291
+ binaries[path] = base.binaries[path];
259
292
  }
260
- const staged = overlay({
261
- documents,
262
- revisions,
263
- changes,
264
- binaryTargets: base.binaryTargets.filter((path) => affected.has(path)),
265
- }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
266
- const mergedDocuments = { ...previousVisible.documents };
267
- const mergedRevisions = { ...previousVisible.revisions };
268
- const mergedChanges = { ...previousVisible.changes };
269
- const mergedTargets = new Set(previousVisible.binaryTargets);
270
- for (const path of affected) {
271
- delete mergedDocuments[path];
272
- delete mergedRevisions[path];
273
- delete mergedChanges[path];
274
- mergedTargets.delete(path);
275
- }
276
- Object.assign(mergedDocuments, staged.documents);
277
- Object.assign(mergedRevisions, staged.revisions);
278
- Object.assign(mergedChanges, staged.changes);
279
- for (const path of staged.binaryTargets)
280
- mergedTargets.add(path);
293
+ const staged = overlay({ documents, revisions, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
281
294
  return {
282
- documents: mergedDocuments,
283
- revisions: mergedRevisions,
284
- changes: mergedChanges,
285
- binaryTargets: [...mergedTargets].sort(),
295
+ documents: patched(previousVisible.documents, Object.entries(staged.documents), affected),
296
+ revisions: patched(previousVisible.revisions, Object.entries(staged.revisions), affected),
297
+ changes: patched(previousVisible.changes, Object.entries(staged.changes), affected),
298
+ binaries: patched(previousVisible.binaries, Object.entries(staged.binaries), affected),
286
299
  };
287
300
  }