@agentshouse/mdruntime 0.1.0-c7bd7ca3faee4 → 0.1.0-c89fa07b05d4b

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 (185) hide show
  1. package/AGENTS.md +259 -216
  2. package/README.md +11 -1
  3. package/dist/adapter.d.ts +66 -16
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attempt.d.ts +16 -0
  6. package/dist/attempt.d.ts.map +1 -0
  7. package/dist/attempt.js +70 -0
  8. package/dist/binary.d.ts +23 -0
  9. package/dist/binary.d.ts.map +1 -0
  10. package/dist/binary.js +8 -0
  11. package/dist/bootstrap.d.ts +17 -5
  12. package/dist/bootstrap.d.ts.map +1 -1
  13. package/dist/bootstrap.js +109 -37
  14. package/dist/change-set.d.ts +2 -0
  15. package/dist/change-set.d.ts.map +1 -1
  16. package/dist/change-set.js +48 -16
  17. package/dist/change.d.ts +15 -0
  18. package/dist/change.d.ts.map +1 -1
  19. package/dist/change.js +26 -1
  20. package/dist/chat/acts.d.ts +33 -0
  21. package/dist/chat/acts.d.ts.map +1 -0
  22. package/dist/chat/acts.js +36 -0
  23. package/dist/chat/context.d.ts +3 -0
  24. package/dist/chat/context.d.ts.map +1 -0
  25. package/dist/chat/context.js +10 -0
  26. package/dist/chat/input.d.ts +9 -0
  27. package/dist/chat/input.d.ts.map +1 -0
  28. package/dist/chat/input.js +99 -0
  29. package/dist/chat/kit.d.ts +60 -0
  30. package/dist/chat/kit.d.ts.map +1 -0
  31. package/dist/chat/kit.js +123 -0
  32. package/dist/chat/lasting.d.ts +6 -0
  33. package/dist/chat/lasting.d.ts.map +1 -0
  34. package/dist/chat/lasting.js +19 -0
  35. package/dist/chat/list.d.ts +26 -0
  36. package/dist/chat/list.d.ts.map +1 -0
  37. package/dist/chat/list.js +62 -0
  38. package/dist/chat/markdown.d.ts +20 -0
  39. package/dist/chat/markdown.d.ts.map +1 -0
  40. package/dist/chat/markdown.js +188 -0
  41. package/dist/chat/message.d.ts +6 -0
  42. package/dist/chat/message.d.ts.map +1 -0
  43. package/dist/chat/message.js +192 -0
  44. package/dist/chat/messages.d.ts +21 -0
  45. package/dist/chat/messages.d.ts.map +1 -0
  46. package/dist/chat/messages.js +151 -0
  47. package/dist/chat/name.d.ts +6 -0
  48. package/dist/chat/name.d.ts.map +1 -0
  49. package/dist/chat/name.js +37 -0
  50. package/dist/chat/opened.d.ts +11 -0
  51. package/dist/chat/opened.d.ts.map +1 -0
  52. package/dist/chat/opened.js +17 -0
  53. package/dist/chat/overlay.d.ts +31 -0
  54. package/dist/chat/overlay.d.ts.map +1 -0
  55. package/dist/chat/overlay.js +97 -0
  56. package/dist/chat/parts.d.ts +57 -0
  57. package/dist/chat/parts.d.ts.map +1 -0
  58. package/dist/chat/parts.js +119 -0
  59. package/dist/chat/process.d.ts +20 -0
  60. package/dist/chat/process.d.ts.map +1 -0
  61. package/dist/chat/process.js +32 -0
  62. package/dist/chat/provider.d.ts +63 -0
  63. package/dist/chat/provider.d.ts.map +1 -0
  64. package/dist/chat/provider.js +620 -0
  65. package/dist/chat/question.d.ts +9 -0
  66. package/dist/chat/question.d.ts.map +1 -0
  67. package/dist/chat/question.js +80 -0
  68. package/dist/chat/questions.d.ts +31 -0
  69. package/dist/chat/questions.d.ts.map +1 -0
  70. package/dist/chat/questions.js +111 -0
  71. package/dist/chat/read.d.ts +5 -0
  72. package/dist/chat/read.d.ts.map +1 -0
  73. package/dist/chat/read.js +13 -0
  74. package/dist/chat/ready.d.ts +33 -0
  75. package/dist/chat/ready.d.ts.map +1 -0
  76. package/dist/chat/ready.js +91 -0
  77. package/dist/chat/style.d.ts +4 -0
  78. package/dist/chat/style.d.ts.map +1 -0
  79. package/dist/chat/style.js +302 -0
  80. package/dist/chat.d.ts +14 -0
  81. package/dist/chat.d.ts.map +1 -0
  82. package/dist/chat.js +8 -0
  83. package/dist/client.d.ts +18 -11
  84. package/dist/client.d.ts.map +1 -1
  85. package/dist/client.js +31 -16
  86. package/dist/collection.d.ts +21 -12
  87. package/dist/collection.d.ts.map +1 -1
  88. package/dist/collection.js +271 -23
  89. package/dist/connection.d.ts +28 -14
  90. package/dist/connection.d.ts.map +1 -1
  91. package/dist/connection.js +1218 -370
  92. package/dist/conversation.d.ts +23 -10
  93. package/dist/conversation.d.ts.map +1 -1
  94. package/dist/conversation.js +304 -136
  95. package/dist/entry.d.ts +17 -0
  96. package/dist/entry.d.ts.map +1 -0
  97. package/dist/entry.js +156 -0
  98. package/dist/expectation.d.ts +21 -0
  99. package/dist/expectation.d.ts.map +1 -0
  100. package/dist/expectation.js +70 -0
  101. package/dist/failure.d.ts +13 -0
  102. package/dist/failure.d.ts.map +1 -0
  103. package/dist/failure.js +19 -0
  104. package/dist/fence.d.ts +6 -0
  105. package/dist/fence.d.ts.map +1 -0
  106. package/dist/fence.js +10 -0
  107. package/dist/host.d.ts +4 -2
  108. package/dist/host.d.ts.map +1 -1
  109. package/dist/host.js +17 -13
  110. package/dist/identity.d.ts +5 -0
  111. package/dist/identity.d.ts.map +1 -1
  112. package/dist/identity.js +19 -1
  113. package/dist/index.d.ts +12 -6
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +4 -0
  116. package/dist/memory.d.ts +4 -3
  117. package/dist/memory.d.ts.map +1 -1
  118. package/dist/memory.js +63 -21
  119. package/dist/model.d.ts +4 -2
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +9 -0
  122. package/dist/observation.d.ts +5 -2
  123. package/dist/observation.d.ts.map +1 -1
  124. package/dist/observation.js +22 -11
  125. package/dist/open.d.ts +2 -0
  126. package/dist/open.d.ts.map +1 -0
  127. package/dist/open.js +1 -0
  128. package/dist/outcome.d.ts +32 -3
  129. package/dist/outcome.d.ts.map +1 -1
  130. package/dist/outcome.js +42 -1
  131. package/dist/overlay.d.ts +15 -3
  132. package/dist/overlay.d.ts.map +1 -1
  133. package/dist/overlay.js +94 -77
  134. package/dist/query.d.ts +32 -3
  135. package/dist/query.d.ts.map +1 -1
  136. package/dist/query.js +3 -0
  137. package/dist/reach.d.ts +2 -0
  138. package/dist/reach.d.ts.map +1 -1
  139. package/dist/reach.js +45 -21
  140. package/dist/react.d.ts +7 -5
  141. package/dist/react.d.ts.map +1 -1
  142. package/dist/react.js +3 -2
  143. package/dist/read-side.d.ts +13 -6
  144. package/dist/read-side.d.ts.map +1 -1
  145. package/dist/read-side.js +291 -85
  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 +10 -0
  150. package/dist/refresh.d.ts.map +1 -1
  151. package/dist/refresh.js +43 -38
  152. package/dist/replica.d.ts +8 -5
  153. package/dist/replica.d.ts.map +1 -1
  154. package/dist/replica.js +114 -67
  155. package/dist/room-draft.d.ts +26 -9
  156. package/dist/room-draft.d.ts.map +1 -1
  157. package/dist/room-draft.js +132 -23
  158. package/dist/rows.d.ts +8 -13
  159. package/dist/rows.d.ts.map +1 -1
  160. package/dist/rows.js +12 -14
  161. package/dist/save.d.ts +31 -1
  162. package/dist/save.d.ts.map +1 -1
  163. package/dist/save.js +376 -45
  164. package/dist/search.d.ts +31 -8
  165. package/dist/search.d.ts.map +1 -1
  166. package/dist/search.js +109 -44
  167. package/dist/shared.d.ts +11 -0
  168. package/dist/shared.d.ts.map +1 -0
  169. package/dist/shared.js +368 -0
  170. package/dist/status.d.ts +2 -2
  171. package/dist/status.d.ts.map +1 -1
  172. package/dist/status.js +0 -8
  173. package/dist/store.d.ts +64 -18
  174. package/dist/store.d.ts.map +1 -1
  175. package/dist/store.js +494 -195
  176. package/dist/turn.d.ts +7 -0
  177. package/dist/turn.d.ts.map +1 -0
  178. package/dist/turn.js +45 -0
  179. package/dist/wire.d.ts +6 -3
  180. package/dist/wire.d.ts.map +1 -1
  181. package/dist/wire.js +14 -2
  182. package/package.json +26 -14
  183. package/dist/attachment.d.ts +0 -3
  184. package/dist/attachment.d.ts.map +0 -1
  185. package/dist/attachment.js +0 -8
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,6 +55,7 @@ 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 = [];
60
61
  let expiring = [];
@@ -107,29 +108,30 @@ export function createMemoryAdapter(options = {}) {
107
108
  providerOwnedPaths: room.providerOwnedPaths,
108
109
  };
109
110
  }
110
- function page(room, from) {
111
+ function page(room, after) {
111
112
  const paths = Object.keys(room.documents ?? {}).sort();
113
+ const opening = after === undefined;
114
+ const from = opening ? 0 : paths.filter((path) => path <= after).length;
112
115
  const size = pageSize ?? paths.length;
113
116
  const taken = paths.slice(from, from + size);
114
117
  const next = from + taken.length;
115
- const targets = from === 0 ? (room.binaryTargets ?? []) : [];
118
+ const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
116
119
  return {
117
120
  kind: 'bootstrap',
118
121
  roomVersion: room.roomVersion,
119
- ...(from === 0 ? { models: modelsOf(room) } : {}),
122
+ ...(opening ? { models: modelsOf(room) } : {}),
120
123
  documents: named(room.documents ?? {}, taken),
121
- revisions: named(room.revisions ?? {}, taken),
124
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
122
125
  changes: named(room.changes ?? {}, [...taken, ...targets]),
123
- binaryTargets: targets,
124
- ...(from === 0 && room.attachments !== undefined ? { attachments: room.attachments } : {}),
125
- ...(next < paths.length ? { pageToken: String(next) } : {}),
126
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
127
+ ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
126
128
  };
127
129
  }
128
130
  function advancement(room, from, at) {
129
131
  const current = room.documents ?? {};
130
132
  const previous = from.documents ?? {};
131
- const currentTargets = new Set(room.binaryTargets ?? []);
132
- const previousTargets = new Set(from.binaryTargets ?? []);
133
+ const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
134
+ const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
133
135
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
134
136
  !sameChange(room.changes?.[path], from.changes?.[path]);
135
137
  const changed = Object.keys(current)
@@ -145,24 +147,21 @@ export function createMemoryAdapter(options = {}) {
145
147
  const targets = opening
146
148
  ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
147
149
  : [];
148
- const attachments = room.attachments ?? [];
149
- const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
150
150
  const models = opening ? changedModels(room, from) : undefined;
151
151
  return {
152
152
  kind: 'net-advancement',
153
153
  roomVersion: room.roomVersion,
154
154
  ...(models === undefined ? {} : { models }),
155
155
  documents: named(current, taken),
156
- revisions: named(room.revisions ?? {}, taken),
156
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
157
157
  changes: named(room.changes ?? {}, [...taken, ...targets]),
158
- binaryTargets: targets,
158
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
159
159
  removals: opening
160
160
  ? [
161
161
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
162
162
  ...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
163
163
  ].sort()
164
164
  : [],
165
- ...(declared ? { attachments } : {}),
166
165
  ...(pageToken === undefined ? {} : { pageToken }),
167
166
  };
168
167
  }
@@ -183,7 +182,7 @@ export function createMemoryAdapter(options = {}) {
183
182
  function historiesOf(input) {
184
183
  const asked = input?.conversations;
185
184
  if (!Array.isArray(asked))
186
- return { kind: 'rejected', code: 'invalid_request', fields: {} };
185
+ return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
187
186
  const histories = [];
188
187
  for (const entry of asked) {
189
188
  const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
@@ -211,21 +210,32 @@ export function createMemoryAdapter(options = {}) {
211
210
  const named = typeof input.conversation === 'string' ? input.conversation : '';
212
211
  const conversation = scripted.get(named);
213
212
  if (conversation === undefined) {
214
- return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };
213
+ return {
214
+ kind: 'rejected',
215
+ code: 'unknown-conversation',
216
+ fields: { conversation: named },
217
+ retryable: false,
218
+ };
215
219
  }
216
220
  const outcome = conversation.outcomes?.[name];
217
221
  if (outcome !== undefined)
218
222
  return outcome;
219
223
  if (name === 'conversation.send') {
224
+ const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
225
+ const answered = operation === null ? undefined : sentTurns.get(operation);
226
+ if (answered !== undefined)
227
+ return { kind: 'action', result: { turn: answered } };
220
228
  issued += 1;
221
229
  const turn = `turn-${issued}`;
222
230
  unsealed.set(turn, named);
231
+ if (operation !== null)
232
+ sentTurns.set(operation, turn);
223
233
  return { kind: 'action', result: { turn } };
224
234
  }
225
235
  if (name === 'conversation.cancel') {
226
236
  const turn = typeof input.turn === 'string' ? input.turn : '';
227
237
  if (sealed.has(turn) || !unsealed.has(turn)) {
228
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };
238
+ return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
229
239
  }
230
240
  unsealed.delete(turn);
231
241
  return { kind: 'action', result: { turn, cancelled: true } };
@@ -250,6 +260,7 @@ export function createMemoryAdapter(options = {}) {
250
260
  };
251
261
  }
252
262
  return {
263
+ ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
253
264
  setRooms(next) {
254
265
  rooms = [...next];
255
266
  retain(rooms);
@@ -337,6 +348,7 @@ export function createMemoryAdapter(options = {}) {
337
348
  observer({ kind: 'closed', revoked: false });
338
349
  });
339
350
  },
351
+ published() { },
340
352
  observe(notify) {
341
353
  observers.add(notify);
342
354
  queueMicrotask(() => {
@@ -386,7 +398,7 @@ export function createMemoryAdapter(options = {}) {
386
398
  if (room === undefined) {
387
399
  return { kind: 'room-not-readable', locator: request.locator };
388
400
  }
389
- return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));
401
+ return page(room, request.pageToken);
390
402
  }, request).then((answer) => note(request.locator, answer));
391
403
  },
392
404
  async refresh(_authorization, request) {
@@ -419,7 +431,13 @@ export function createMemoryAdapter(options = {}) {
419
431
  if (room === undefined) {
420
432
  return { kind: 'room-not-readable', locator: request.locator };
421
433
  }
422
- return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };
434
+ return {
435
+ kind: 'rejected',
436
+ code: 'unscripted-mutation',
437
+ fields: {},
438
+ retryable: false,
439
+ affected: {},
440
+ };
423
441
  }, request).then((answer) => note(request.locator, answer));
424
442
  },
425
443
  async history(_authorization, request) {
@@ -434,11 +452,35 @@ export function createMemoryAdapter(options = {}) {
434
452
  };
435
453
  }, request);
436
454
  },
455
+ async binary(_authorization, request) {
456
+ return resolveScript(scripts.binary, () => {
457
+ if (request.kind === 'reference') {
458
+ return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
459
+ }
460
+ const room = rooms.find((entry) => entry.locator === request.locator);
461
+ if (room === undefined)
462
+ return { kind: 'room-not-readable', locator: request.locator };
463
+ const blob = room.blobs?.[request.path];
464
+ return blob === undefined
465
+ ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
466
+ : { kind: 'binary', blob };
467
+ }, request);
468
+ },
469
+ referrerScope(referrer) {
470
+ if (typeof referrer !== 'object' || referrer === null)
471
+ return null;
472
+ const { room, path, message } = referrer;
473
+ if (typeof message === 'string')
474
+ return { kind: 'conversations' };
475
+ if (typeof room !== 'string')
476
+ return null;
477
+ return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
478
+ },
437
479
  async action(_authorization, request) {
438
480
  return resolveScript(scripts.action, () => {
439
481
  if (request.name.startsWith('conversation.'))
440
482
  return conversationAction(request);
441
- return { kind: 'rejected', code: 'unscripted-action', fields: {} };
483
+ return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
442
484
  }, request).then((answer) => {
443
485
  if (answer.kind === 'action' && answer.at !== undefined)
444
486
  note(answer.at.locator, answer.at);
package/dist/model.d.ts CHANGED
@@ -1,4 +1,5 @@
1
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;
@@ -7,7 +8,7 @@ export type ModelSnapshot = ModelIdentity & {
7
8
  schema: string | null;
8
9
  revision: string | null;
9
10
  };
10
- export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'invalid';
11
+ export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired' | 'invalid'>;
11
12
  export type ModelResult = {
12
13
  kind: 'model';
13
14
  snapshot: ModelSnapshot;
@@ -44,12 +45,13 @@ export type TypesResult = {
44
45
  export type ValidationReceipt = {
45
46
  identity: string;
46
47
  version: string;
47
- source: 'current' | 'cached';
48
+ source: Open<'current' | 'cached'>;
48
49
  };
49
50
  export declare const NO_MODEL: ModelState;
50
51
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
51
52
  export declare function modelTypes(state: ModelState): TypesResult;
52
53
  export declare function cached(state: ModelState): ModelState;
53
54
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
55
+ export declare function sameTyping(left: ModelState, right: ModelState): boolean;
54
56
  export declare function referenceField(facts: ValueFacts | undefined): boolean;
55
57
  //# 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;AAElF,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,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAC7F,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;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,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,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,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
@@ -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/open.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type Open<Value extends string> = Value | (string & {});
2
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../src/open.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC"}
package/dist/open.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/outcome.d.ts CHANGED
@@ -1,8 +1,34 @@
1
- import type { ActionResult } 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
- export type CallResult = ActionResult | {
4
- kind: 'undeclared';
3
+ type Refused<Kind extends string> = ProviderRefusal & {
4
+ kind: Kind;
5
5
  };
6
+ export type Failure = Refused<'transport-uncertainty'> | Refused<'revoked-authorization'> | (Refused<'room-not-readable'> & {
7
+ locator: string;
8
+ }) | ScopedRefusal;
9
+ export type CallResult = {
10
+ kind: 'action';
11
+ result: unknown;
12
+ at?: RoomVersionAt;
13
+ } | Refused<'rejected'> | Refused<'undeclared'> | Failure;
14
+ export type HistoryAnswer = Exclude<HistoryResult, {
15
+ kind: Failure['kind'];
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;
27
+ export declare const UNCERTAIN: Failure;
28
+ export declare function undeclared(name: string): CallResult;
29
+ export declare function failure(result: AdapterFailure): Failure;
30
+ export declare function calledResult(result: ActionResult): CallResult;
31
+ export declare function historyAnswer(result: HistoryResult): HistoryAnswer;
6
32
  export type Submission = {
7
33
  readonly state: 'waiting' | 'submitted';
8
34
  } | {
@@ -12,7 +38,10 @@ export type Submission = {
12
38
  export type QueueEntry = {
13
39
  readonly batch: ChangeBatch;
14
40
  } & (Submission | {
41
+ readonly state: 'local';
42
+ } | {
15
43
  readonly state: 'accepted';
16
44
  readonly roomVersion: string;
17
45
  });
46
+ export {};
18
47
  //# sourceMappingURL=outcome.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE/D,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,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 +1,42 @@
1
- export {};
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' };
8
+ export const UNCERTAIN = {
9
+ kind: 'transport-uncertainty',
10
+ code: 'transport-uncertainty',
11
+ fields: {},
12
+ retryable: true,
13
+ };
14
+ export function undeclared(name) {
15
+ return { kind: 'undeclared', code: 'action-undeclared', fields: { name }, retryable: false };
16
+ }
17
+ export function failure(result) {
18
+ switch (result.kind) {
19
+ case 'transport-uncertainty':
20
+ return UNCERTAIN;
21
+ case 'revoked-authorization':
22
+ return { kind: result.kind, code: result.kind, fields: {}, retryable: false };
23
+ case 'room-not-readable':
24
+ return {
25
+ kind: result.kind,
26
+ locator: result.locator,
27
+ code: result.kind,
28
+ fields: {},
29
+ retryable: false,
30
+ };
31
+ case 'scoped-refusal':
32
+ return result;
33
+ }
34
+ }
35
+ export function calledResult(result) {
36
+ return result.kind === 'action' || result.kind === 'rejected' ? result : failure(result);
37
+ }
38
+ export function historyAnswer(result) {
39
+ return result.kind === 'history' || result.kind === 'revision' || result.kind === 'no-history'
40
+ ? result
41
+ : failure(result);
42
+ }
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
- export declare function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer;
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;AAoJD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAiBzE;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"}