@agentshouse/mdruntime 0.1.0-c5b50992a4193 → 0.1.0-c698c0ebd65bd

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 (169) hide show
  1. package/AGENTS.md +151 -96
  2. package/README.md +13 -3
  3. package/dist/adapter.d.ts +47 -14
  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 +92 -38
  14. package/dist/change-set.d.ts.map +1 -1
  15. package/dist/change-set.js +19 -12
  16. package/dist/change.d.ts +15 -0
  17. package/dist/change.d.ts.map +1 -1
  18. package/dist/change.js +26 -1
  19. package/dist/chat/acts.d.ts +33 -0
  20. package/dist/chat/acts.d.ts.map +1 -0
  21. package/dist/chat/acts.js +36 -0
  22. package/dist/chat/context.d.ts +3 -0
  23. package/dist/chat/context.d.ts.map +1 -0
  24. package/dist/chat/context.js +10 -0
  25. package/dist/chat/input.d.ts +9 -0
  26. package/dist/chat/input.d.ts.map +1 -0
  27. package/dist/chat/input.js +99 -0
  28. package/dist/chat/kit.d.ts +60 -0
  29. package/dist/chat/kit.d.ts.map +1 -0
  30. package/dist/chat/kit.js +123 -0
  31. package/dist/chat/lasting.d.ts +6 -0
  32. package/dist/chat/lasting.d.ts.map +1 -0
  33. package/dist/chat/lasting.js +19 -0
  34. package/dist/chat/list.d.ts +26 -0
  35. package/dist/chat/list.d.ts.map +1 -0
  36. package/dist/chat/list.js +62 -0
  37. package/dist/chat/markdown.d.ts +20 -0
  38. package/dist/chat/markdown.d.ts.map +1 -0
  39. package/dist/chat/markdown.js +188 -0
  40. package/dist/chat/message.d.ts +6 -0
  41. package/dist/chat/message.d.ts.map +1 -0
  42. package/dist/chat/message.js +192 -0
  43. package/dist/chat/messages.d.ts +21 -0
  44. package/dist/chat/messages.d.ts.map +1 -0
  45. package/dist/chat/messages.js +151 -0
  46. package/dist/chat/name.d.ts +6 -0
  47. package/dist/chat/name.d.ts.map +1 -0
  48. package/dist/chat/name.js +37 -0
  49. package/dist/chat/opened.d.ts +11 -0
  50. package/dist/chat/opened.d.ts.map +1 -0
  51. package/dist/chat/opened.js +17 -0
  52. package/dist/chat/overlay.d.ts +31 -0
  53. package/dist/chat/overlay.d.ts.map +1 -0
  54. package/dist/chat/overlay.js +97 -0
  55. package/dist/chat/parts.d.ts +57 -0
  56. package/dist/chat/parts.d.ts.map +1 -0
  57. package/dist/chat/parts.js +119 -0
  58. package/dist/chat/process.d.ts +20 -0
  59. package/dist/chat/process.d.ts.map +1 -0
  60. package/dist/chat/process.js +32 -0
  61. package/dist/chat/provider.d.ts +63 -0
  62. package/dist/chat/provider.d.ts.map +1 -0
  63. package/dist/chat/provider.js +620 -0
  64. package/dist/chat/question.d.ts +9 -0
  65. package/dist/chat/question.d.ts.map +1 -0
  66. package/dist/chat/question.js +80 -0
  67. package/dist/chat/questions.d.ts +31 -0
  68. package/dist/chat/questions.d.ts.map +1 -0
  69. package/dist/chat/questions.js +111 -0
  70. package/dist/chat/read.d.ts +5 -0
  71. package/dist/chat/read.d.ts.map +1 -0
  72. package/dist/chat/read.js +13 -0
  73. package/dist/chat/ready.d.ts +33 -0
  74. package/dist/chat/ready.d.ts.map +1 -0
  75. package/dist/chat/ready.js +91 -0
  76. package/dist/chat/style.d.ts +4 -0
  77. package/dist/chat/style.d.ts.map +1 -0
  78. package/dist/chat/style.js +302 -0
  79. package/dist/chat.d.ts +14 -0
  80. package/dist/chat.d.ts.map +1 -0
  81. package/dist/chat.js +8 -0
  82. package/dist/client.d.ts +15 -6
  83. package/dist/client.d.ts.map +1 -1
  84. package/dist/client.js +66 -16
  85. package/dist/collection.d.ts +6 -11
  86. package/dist/collection.d.ts.map +1 -1
  87. package/dist/collection.js +56 -19
  88. package/dist/connection.d.ts +22 -9
  89. package/dist/connection.d.ts.map +1 -1
  90. package/dist/connection.js +566 -175
  91. package/dist/conversation.d.ts +15 -5
  92. package/dist/conversation.d.ts.map +1 -1
  93. package/dist/conversation.js +189 -64
  94. package/dist/entry.d.ts +17 -0
  95. package/dist/entry.d.ts.map +1 -0
  96. package/dist/entry.js +156 -0
  97. package/dist/expectation.d.ts +21 -0
  98. package/dist/expectation.d.ts.map +1 -0
  99. package/dist/expectation.js +70 -0
  100. package/dist/failure.d.ts +13 -0
  101. package/dist/failure.d.ts.map +1 -0
  102. package/dist/failure.js +19 -0
  103. package/dist/fence.d.ts +6 -0
  104. package/dist/fence.d.ts.map +1 -0
  105. package/dist/fence.js +10 -0
  106. package/dist/host.d.ts +3 -1
  107. package/dist/host.d.ts.map +1 -1
  108. package/dist/host.js +16 -12
  109. package/dist/identity.d.ts +3 -0
  110. package/dist/identity.d.ts.map +1 -1
  111. package/dist/identity.js +13 -1
  112. package/dist/index.d.ts +9 -4
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +3 -0
  115. package/dist/memory.d.ts +5 -3
  116. package/dist/memory.d.ts.map +1 -1
  117. package/dist/memory.js +62 -20
  118. package/dist/model.d.ts +3 -2
  119. package/dist/model.d.ts.map +1 -1
  120. package/dist/open.d.ts +2 -0
  121. package/dist/open.d.ts.map +1 -0
  122. package/dist/open.js +1 -0
  123. package/dist/outcome.d.ts +32 -3
  124. package/dist/outcome.d.ts.map +1 -1
  125. package/dist/outcome.js +42 -1
  126. package/dist/overlay.d.ts +14 -3
  127. package/dist/overlay.d.ts.map +1 -1
  128. package/dist/overlay.js +75 -37
  129. package/dist/query.d.ts +4 -0
  130. package/dist/query.d.ts.map +1 -1
  131. package/dist/query.js +3 -0
  132. package/dist/reach.d.ts +2 -0
  133. package/dist/reach.d.ts.map +1 -1
  134. package/dist/reach.js +44 -20
  135. package/dist/react.d.ts +25 -16
  136. package/dist/react.d.ts.map +1 -1
  137. package/dist/react.js +8 -6
  138. package/dist/read-side.d.ts.map +1 -1
  139. package/dist/read-side.js +9 -2
  140. package/dist/refresh.d.ts +10 -0
  141. package/dist/refresh.d.ts.map +1 -1
  142. package/dist/refresh.js +42 -38
  143. package/dist/replica.d.ts +7 -4
  144. package/dist/replica.d.ts.map +1 -1
  145. package/dist/replica.js +74 -54
  146. package/dist/room-draft.d.ts +26 -9
  147. package/dist/room-draft.d.ts.map +1 -1
  148. package/dist/room-draft.js +132 -23
  149. package/dist/rows.d.ts +5 -1
  150. package/dist/rows.d.ts.map +1 -1
  151. package/dist/rows.js +10 -2
  152. package/dist/save.d.ts +26 -1
  153. package/dist/save.d.ts.map +1 -1
  154. package/dist/save.js +345 -37
  155. package/dist/search.d.ts +3 -2
  156. package/dist/search.d.ts.map +1 -1
  157. package/dist/status.d.ts +2 -2
  158. package/dist/status.d.ts.map +1 -1
  159. package/dist/status.js +0 -8
  160. package/dist/store.d.ts +48 -14
  161. package/dist/store.d.ts.map +1 -1
  162. package/dist/store.js +366 -170
  163. package/dist/wire.d.ts +7 -3
  164. package/dist/wire.d.ts.map +1 -1
  165. package/dist/wire.js +15 -2
  166. package/package.json +26 -14
  167. package/dist/attachment.d.ts +0 -3
  168. package/dist/attachment.d.ts.map +0 -1
  169. package/dist/attachment.js +0 -8
package/dist/react.d.ts CHANGED
@@ -1,29 +1,38 @@
1
1
  import type { MdRuntimeClient } from './client.js';
2
2
  import type { AppRoom, ConnectionRefusal, SaveResult } from './connection.js';
3
- import type { ServiceMode } from './adapter.js';
4
- import type { ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
3
+ import type { Member, ServiceMode } from './adapter.js';
4
+ import type { ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
5
+ import { type RuntimeError } from './failure.js';
5
6
  import type { QueueEntry } from './outcome.js';
6
7
  import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult } from './query.js';
7
8
  import type { RoomDraft, RoomDraftParts } from './room-draft.js';
8
9
  import type { SyncStatus } from './status.js';
9
10
  type Client = MdRuntimeClient | null;
10
- export declare function useObserve(client: Client, topic: 'deployment-facts'): unknown;
11
- export declare function useObserve(client: Client, topic: 'rooms'): readonly AppRoom[] | undefined;
12
- export declare function useObserve(client: Client, topic: 'connection-refusal'): ConnectionRefusal | null | undefined;
13
- export declare function useObserve(client: Client, topic: 'storage-loss'): string | null | undefined;
14
- export declare function useObserve(client: Client, topic: 'sync-status'): SyncStatus | undefined;
15
- export declare function useObserve(client: Client, topic: 'service-mode'): ServiceMode | undefined;
16
- export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): DocumentResult | undefined;
17
- export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): GroupResult | undefined;
18
- export declare function useObserve(client: Client, topic: 'queue', locator: string): readonly QueueEntry[] | undefined;
19
- export declare function useObserve(client: Client, topic: 'room-drafts'): readonly RoomDraft[] | undefined;
20
- export declare function useObserve(client: Client, topic: 'presentation'): unknown;
21
- export declare function useObserve(client: Client, topic: 'conversation', conversation: string, options: ConversationOptions): ConversationView | undefined;
22
- export declare function useObserve(client: Client, topic: 'conversations'): readonly ConversationEntry[] | undefined;
11
+ export type Observed<T> = {
12
+ readonly state: 'loading';
13
+ } | {
14
+ readonly state: 'ready';
15
+ readonly value: T;
16
+ };
17
+ export declare function useObserve(client: Client, topic: 'deployment-facts'): Observed<unknown>;
18
+ export declare function useObserve(client: Client, topic: 'rooms'): Observed<readonly AppRoom[]>;
19
+ export declare function useObserve(client: Client, topic: 'connection-refusal'): Observed<ConnectionRefusal | null>;
20
+ export declare function useObserve(client: Client, topic: 'storage-loss'): Observed<string | null>;
21
+ export declare function useObserve(client: Client, topic: 'sync-status'): Observed<SyncStatus>;
22
+ export declare function useObserve(client: Client, topic: 'service-mode'): Observed<ServiceMode>;
23
+ export declare function useObserve(client: Client, topic: 'member'): Observed<Member | null>;
24
+ export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): Observed<DocumentResult>;
25
+ export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): Observed<GroupResult>;
26
+ export declare function useObserve(client: Client, topic: 'queue', locator: string): Observed<readonly QueueEntry[]>;
27
+ export declare function useObserve(client: Client, topic: 'room-drafts'): Observed<readonly RoomDraft[]>;
28
+ export declare function useObserve(client: Client, topic: 'presentation'): Observed<unknown>;
29
+ export declare function useObserve(client: Client, topic: 'conversation', conversation: string, options: ConversationOptions): Observed<ConversationView>;
30
+ export declare function useObserve(client: Client, topic: 'conversations'): Observed<readonly ConversationEntry[]>;
31
+ export declare function useObserve(client: Client, topic: 'agents'): Observed<readonly ConversationAgent[]>;
23
32
  export type Saving = {
24
33
  readonly busy: boolean;
25
34
  readonly outcome: SaveResult | null;
26
- readonly failure: Error | null;
35
+ readonly failure: RuntimeError | null;
27
36
  save(room: string, roomDrafts: ReadonlyMap<string, RoomDraftParts>): Promise<SaveResult>;
28
37
  };
29
38
  export declare function saveRoomDrafts(client: MdRuntimeClient, room: string, roomDrafts: ReadonlyMap<string, RoomDraftParts>): Promise<SaveResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
package/dist/react.js CHANGED
@@ -1,10 +1,12 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react';
1
+ import { useCallback, useLayoutEffect, useRef, useState } from 'react';
2
+ import { failed, runtimeError } from './failure.js';
3
+ const LOADING = { state: 'loading' };
2
4
  export function useObserve(client, topic, ...input) {
3
5
  const key = JSON.stringify([topic, ...input]);
4
6
  const [held, setHeld] = useState(null);
5
7
  const opened = useRef(input);
6
8
  opened.current = input;
7
- useEffect(() => {
9
+ useLayoutEffect(() => {
8
10
  if (client === null)
9
11
  return;
10
12
  let live = true;
@@ -18,7 +20,7 @@ export function useObserve(client, topic, ...input) {
18
20
  observation = open;
19
21
  const take = (value) => {
20
22
  if (live)
21
- setHeld({ client, key, value });
23
+ setHeld({ client, key, observed: { state: 'ready', value } });
22
24
  };
23
25
  take(open.current());
24
26
  open.subscribe(take);
@@ -28,7 +30,7 @@ export function useObserve(client, topic, ...input) {
28
30
  observation?.close();
29
31
  };
30
32
  }, [client, key]);
31
- return held !== null && held.client === client && held.key === key ? held.value : undefined;
33
+ return held !== null && held.client === client && held.key === key ? held.observed : LOADING;
32
34
  }
33
35
  const IDLE = { busy: false, outcome: null, failure: null };
34
36
  export async function saveRoomDrafts(client, room, roomDrafts) {
@@ -37,7 +39,7 @@ export async function saveRoomDrafts(client, room, roomDrafts) {
37
39
  const prior = await client.roomDraft.read(room, path);
38
40
  const write = await client.roomDraft.write(room, path, prior?.revision ?? null, parts);
39
41
  if (write.outcome !== 'written' || write.roomDraft === null) {
40
- throw new Error(`the Room Draft at ${path} was not written`);
42
+ throw runtimeError(write.outcome === 'stale' ? write.code : 'room-draft-unwritten', `the Room Draft at ${path} was not written`);
41
43
  }
42
44
  kept.push({ path, revision: write.roomDraft.revision });
43
45
  }
@@ -53,7 +55,7 @@ export function useSave(client) {
53
55
  return outcome;
54
56
  }
55
57
  catch (error) {
56
- const failure = error instanceof Error ? error : new Error(String(error));
58
+ const failure = failed(error);
57
59
  setState({ busy: false, outcome: null, failure });
58
60
  throw failure;
59
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAIJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AA+UF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,GAChB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CA4BpD;AAED,wBAAgB,cAAc,IAAI,QAAQ,CA4HzC"}
1
+ {"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAIJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAuVF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,GAChB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CA4BpD;AAED,wBAAgB,cAAc,IAAI,QAAQ,CA4HzC"}
package/dist/read-side.js CHANGED
@@ -121,6 +121,7 @@ function documents(q, rows, plan, shape) {
121
121
  room: d.room,
122
122
  path: d.path,
123
123
  type: d.type,
124
+ binary: d.binary,
124
125
  ...(shape.fields === null ? {} : { fields: d.fields }),
125
126
  ...(shape.sections === 'all' ? { sections: b.sections } : {}),
126
127
  ...(Array.isArray(shape.sections) ? named('section', shape.sections, b.sections) : {}),
@@ -229,8 +230,14 @@ function selected(fields, pointers) {
229
230
  return (cut(fields, masked(pointers)) ?? {});
230
231
  }
231
232
  function documentOf(row, shape) {
232
- if (row.type === null)
233
- return { room: row.room, path: row.path };
233
+ if (row.type === null) {
234
+ const binary = row.binary;
235
+ return {
236
+ room: row.room,
237
+ path: row.path,
238
+ ...(binary === null ? {} : { binaryFile: binary }),
239
+ };
240
+ }
234
241
  return {
235
242
  room: row.room,
236
243
  path: row.path,
package/dist/refresh.d.ts CHANGED
@@ -1,7 +1,16 @@
1
1
  import type { Adapter, AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
2
2
  import type { Remodel } from './bootstrap.js';
3
3
  import { type ConfirmedLayer } from './replica.js';
4
+ import type { ReplicaRecord } from './store.js';
4
5
  import { type Refused, type Unconfirmed } from './transfer.js';
6
+ export type Advancement = {
7
+ kind: 'still-current';
8
+ } | {
9
+ kind: 'advanced';
10
+ record: ReplicaRecord;
11
+ } | {
12
+ kind: 'beyond-horizon';
13
+ } | RetryableRefusal | Unconfirmed | AdapterFailure;
5
14
  export type RefreshOutcome = {
6
15
  kind: 'still-current';
7
16
  } | {
@@ -10,5 +19,6 @@ export type RefreshOutcome = {
10
19
  } | {
11
20
  kind: 'beyond-horizon';
12
21
  } | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
22
+ export declare function advancement(adapter: Adapter, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean): Promise<Advancement>;
13
23
  export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, remodel: Remodel, continuing: () => boolean): Promise<RefreshOutcome>;
14
24
  //# sourceMappingURL=refresh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CA8EzB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,WAAW,CAAC,CAwEtB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CAKzB"}
package/dist/refresh.js CHANGED
@@ -1,51 +1,47 @@
1
- import { declaredAttachments } from './attachment.js';
1
+ import { acceptedBinaries } from './overlay.js';
2
2
  import { readStaged } from './replica.js';
3
3
  import { unconfirmed } from './transfer.js';
4
- export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
5
- const locator = confirmed.record.locator;
6
- const fromRoomVersion = confirmed.record.roomVersion;
4
+ export async function advancement(adapter, authorization, held, remodel, continuing) {
5
+ const locator = held.locator;
6
+ const fromRoomVersion = held.roomVersion;
7
7
  const first = await adapter.refresh(authorization, {
8
8
  locator,
9
- selection: confirmed.record.replica.selection,
9
+ selection: held.replica.selection,
10
10
  fromRoomVersion,
11
11
  });
12
12
  if (first.kind !== 'net-advancement')
13
13
  return first;
14
14
  const roomVersion = first.roomVersion;
15
15
  const models = remodel(first.models, {
16
- collection: confirmed.record.model,
17
- selection: confirmed.record.selectionModel,
16
+ collection: held.model,
17
+ selection: held.selectionModel,
18
18
  });
19
- const documents = { ...confirmed.record.documents };
20
- const revisions = { ...confirmed.record.revisions };
21
- const changes = { ...confirmed.record.changes };
22
- const written = { ...confirmed.record.written };
23
- const binaryTargets = new Set(confirmed.record.binaryTargets);
24
- const attachments = [];
19
+ const documents = { ...held.documents };
20
+ const revisions = { ...held.revisions };
21
+ const changes = { ...held.changes };
22
+ const written = { ...held.written };
23
+ const binaries = { ...held.binaries };
25
24
  const stage = (page) => {
26
- if (page.attachments !== undefined)
27
- attachments.push(page.attachments);
28
- Object.assign(documents, page.documents);
29
- Object.assign(revisions, page.revisions);
30
25
  for (const path of Object.keys(page.documents)) {
31
- binaryTargets.delete(path);
26
+ delete binaries[path];
32
27
  delete changes[path];
33
28
  written[path] = roomVersion;
34
29
  }
35
- for (const target of page.binaryTargets) {
36
- delete documents[target];
37
- delete revisions[target];
38
- delete changes[target];
39
- delete written[target];
40
- binaryTargets.add(target);
30
+ for (const path of Object.keys(page.binaryFiles)) {
31
+ delete documents[path];
32
+ delete changes[path];
33
+ delete written[path];
41
34
  }
35
+ Object.assign(documents, page.documents);
36
+ Object.assign(binaries, acceptedBinaries(page.binaryFiles));
37
+ Object.assign(revisions, page.revisions);
42
38
  Object.assign(changes, page.changes);
43
39
  for (const path of page.removals) {
44
40
  delete documents[path];
45
41
  delete revisions[path];
46
42
  delete changes[path];
47
43
  delete written[path];
48
- binaryTargets.delete(path);
44
+ delete binaries[path];
49
45
  }
50
46
  };
51
47
  stage(first);
@@ -55,7 +51,7 @@ export async function refreshRoom(adapter, authorization, confirmed, remodel, co
55
51
  return unconfirmed;
56
52
  const page = await adapter.refresh(authorization, {
57
53
  locator,
58
- selection: confirmed.record.replica.selection,
54
+ selection: held.replica.selection,
59
55
  fromRoomVersion,
60
56
  pageToken,
61
57
  });
@@ -68,17 +64,25 @@ export async function refreshRoom(adapter, authorization, confirmed, remodel, co
68
64
  stage(page);
69
65
  pageToken = page.pageToken;
70
66
  }
71
- const staged = readStaged({
72
- ...confirmed.record,
73
- model: models.collection,
74
- selectionModel: models.selection,
75
- roomVersion,
76
- documents,
77
- binaryTargets: [...binaryTargets].sort(),
78
- revisions,
79
- changes,
80
- written,
81
- attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),
82
- }, confirmed);
67
+ return {
68
+ kind: 'advanced',
69
+ record: {
70
+ ...held,
71
+ model: models.collection,
72
+ selectionModel: models.selection,
73
+ roomVersion,
74
+ documents,
75
+ binaries,
76
+ revisions,
77
+ changes,
78
+ written,
79
+ },
80
+ };
81
+ }
82
+ export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
83
+ const advanced = await advancement(adapter, authorization, confirmed.record, remodel, continuing);
84
+ if (advanced.kind !== 'advanced')
85
+ return advanced;
86
+ const staged = readStaged(advanced.record, confirmed);
83
87
  return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;
84
88
  }
package/dist/replica.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type ChangeBatch } from './change.js';
2
2
  import { type Collection, type Composition } from './collection.js';
3
3
  import { type Layer } from './overlay.js';
4
- import type { RoomAttachment } from './adapter.js';
4
+ import type { MutationResult } from './adapter.js';
5
5
  import type { ReplicaRecord } from './store.js';
6
6
  import type { Refused } from './transfer.js';
7
7
  export type ConfirmedLayer = {
@@ -29,15 +29,18 @@ type ReplayStep = {
29
29
  collection?: Collection;
30
30
  };
31
31
  export declare function compositionOf(record: ReplicaRecord): Composition;
32
- export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
32
+ export declare function confirmedOf(record: ReplicaRecord, previous?: ConfirmedLayer): ConfirmedLayer;
33
33
  export declare function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean;
34
34
  export declare function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
35
35
  export declare function readReclassified(record: ReplicaRecord, previous: ConfirmedLayer): Staged | {
36
36
  kind: 'deferred';
37
37
  };
38
- export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], attachments: readonly RoomAttachment[] | undefined, roomVersion: string, writtenAt: string): Staged;
38
+ type Accepted = Extract<MutationResult, {
39
+ kind: 'accepted';
40
+ }>;
41
+ export declare function applyReturned(confirmed: ConfirmedLayer, submitted: ChangeBatch, accepted: Accepted, roomVersion: string, writtenAt: string): Staged;
39
42
  export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], previous?: Replica): Replica;
40
43
  export declare function landed(batch: ChangeBatch, confirmed: ConfirmedLayer, current?: Readonly<Record<string, string>>): boolean;
41
- export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean): readonly ChangeBatch[];
44
+ export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean, local: boolean): readonly ChangeBatch[];
42
45
  export {};
43
46
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAGlF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAQhE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAKnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAM/B;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAClD,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CAmCR;AAsDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAgCT;AAkFD,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC7C,OAAO,CAaT;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,GAC5C,SAAS,WAAW,EAAE,CAmBxB"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AACnG,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,KAAK,KAAK,EACX,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAQhE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,CAK5F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAKnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA2BnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAW/B;AAoBD,KAAK,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAE9D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CA+BR;AAgDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA8BT;AA0ED,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC7C,OAAO,CAiBT;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,KAAK,EAAE,OAAO,GACb,SAAS,WAAW,EAAE,CA2BxB"}
package/dist/replica.js CHANGED
@@ -1,10 +1,8 @@
1
- import { parse } from '@agentshouse/mdmodel';
2
- import { immutable } from './change.js';
3
- import { parseCollection, readCollection, validateCollection, } from './collection.js';
4
- import { overlay, overlayChanged, sameLayerText } from './overlay.js';
1
+ import { equalValue, parse } from '@agentshouse/mdmodel';
2
+ import { immutable, landing } from './change.js';
3
+ import { collectionOf, unreadable, validateCollection, } from './collection.js';
4
+ import { acceptedBinaries, overlay, overlayChanged, sameLayerText, } from './overlay.js';
5
5
  import { providerRewritten } from './save.js';
6
- import { equalValue } from './room-draft.js';
7
- import { declaredAttachments } from './attachment.js';
8
6
  export function compositionOf(record) {
9
7
  return {
10
8
  model: record.model,
@@ -13,40 +11,66 @@ export function compositionOf(record) {
13
11
  : { roots: record.typedSelection.roots, model: record.selectionModel },
14
12
  };
15
13
  }
16
- export function readConfirmed(record, previous) {
17
- const read = readCollection(record.documents, compositionOf(record), previous === undefined
18
- ? undefined
19
- : { text: previous.record.documents, collection: previous.collection });
20
- return read.kind === 'read'
21
- ? { kind: 'staged', confirmed: { record, collection: read.collection } }
22
- : read;
14
+ export function confirmedOf(record, previous) {
15
+ return {
16
+ record,
17
+ collection: collectionOf(record.documents, compositionOf(record), previous?.collection),
18
+ };
23
19
  }
24
20
  export function sameMembership(record, other) {
25
21
  return (JSON.stringify(record.typedSelection?.roots ?? null) ===
26
22
  JSON.stringify(other.typedSelection?.roots ?? null));
27
23
  }
28
24
  export function readStaged(record, previous) {
29
- if ((record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable') &&
30
- (previous === undefined ||
31
- !sameLayerText(record, previous.record) ||
32
- record.model !== previous.record.model ||
33
- record.selectionModel !== previous.record.selectionModel)) {
34
- const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
25
+ const textChanged = previous === undefined || !sameLayerText(record, previous.record);
26
+ const modeled = record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable';
27
+ if (modeled &&
28
+ (textChanged ||
29
+ record.model !== previous?.record.model ||
30
+ record.selectionModel !== previous?.record.selectionModel)) {
31
+ const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
35
32
  if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
36
33
  return { kind: 'refused', refusal: verdict };
37
34
  }
35
+ if (verdict.verdict === 'refuse') {
36
+ const refused = unreadable(record.documents, previous?.record.documents);
37
+ if (refused !== null)
38
+ return refused;
39
+ }
40
+ }
41
+ else if (textChanged) {
42
+ const refused = unreadable(record.documents, previous?.record.documents);
43
+ if (refused !== null)
44
+ return refused;
38
45
  }
39
- return readConfirmed(record, previous);
46
+ return { kind: 'staged', confirmed: confirmedOf(record, previous) };
40
47
  }
41
48
  export function readReclassified(record, previous) {
42
- const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
49
+ const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
43
50
  if (verdict.verdict !== 'refuse')
44
- return readConfirmed(record, previous);
51
+ return { kind: 'staged', confirmed: confirmedOf(record, previous) };
45
52
  return verdict.rule === 'model-unavailable'
46
53
  ? { kind: 'deferred' }
47
54
  : { kind: 'refused', refusal: verdict };
48
55
  }
49
- export function applyReturned(confirmed, documents, revisions, removals, attachments, roomVersion, writtenAt) {
56
+ function returnedBinaries(held, submitted, accepted) {
57
+ const binaries = { ...held };
58
+ for (const change of submitted.changes) {
59
+ if (change.kind !== 'move')
60
+ continue;
61
+ const moved = binaries[change.path];
62
+ if (moved === undefined || accepted.revisions[change.to] === undefined)
63
+ continue;
64
+ binaries[change.to] = moved;
65
+ delete binaries[change.path];
66
+ }
67
+ Object.assign(binaries, acceptedBinaries(accepted.binaryFiles ?? {}));
68
+ for (const path of accepted.removals)
69
+ delete binaries[path];
70
+ return binaries;
71
+ }
72
+ export function applyReturned(confirmed, submitted, accepted, roomVersion, writtenAt) {
73
+ const { documents, revisions, changes, removals } = accepted;
50
74
  const nextDocuments = { ...confirmed.record.documents, ...documents };
51
75
  const nextRevisions = { ...confirmed.record.revisions, ...revisions };
52
76
  const nextChanges = { ...confirmed.record.changes };
@@ -54,17 +78,16 @@ export function applyReturned(confirmed, documents, revisions, removals, attachm
54
78
  ...confirmed.record.written,
55
79
  ...Object.fromEntries(Object.keys(documents).map((path) => [path, writtenAt])),
56
80
  };
57
- const binaryTargets = new Set(confirmed.record.binaryTargets);
58
81
  for (const [path, revision] of Object.entries(revisions)) {
59
82
  if (confirmed.record.revisions[path] !== revision)
60
83
  delete nextChanges[path];
61
84
  }
85
+ Object.assign(nextChanges, changes);
62
86
  for (const path of removals) {
63
87
  delete nextDocuments[path];
64
88
  delete nextRevisions[path];
65
89
  delete nextChanges[path];
66
90
  delete nextWritten[path];
67
- binaryTargets.delete(path);
68
91
  }
69
92
  return readStaged({
70
93
  ...confirmed.record,
@@ -73,10 +96,7 @@ export function applyReturned(confirmed, documents, revisions, removals, attachm
73
96
  revisions: nextRevisions,
74
97
  changes: nextChanges,
75
98
  written: nextWritten,
76
- binaryTargets: [...binaryTargets].sort(),
77
- attachments: attachments === undefined
78
- ? confirmed.record.attachments
79
- : declaredAttachments([attachments]),
99
+ binaries: returnedBinaries(confirmed.record.binaries, submitted, accepted),
80
100
  }, confirmed);
81
101
  }
82
102
  function predicted(confirmed, batches, previous) {
@@ -97,9 +117,7 @@ function predicted(confirmed, batches, previous) {
97
117
  const collection = hasMove
98
118
  ? reuseRewrite
99
119
  ? old.collection
100
- : parseCollection(before.documents, composition, old?.collection === undefined
101
- ? { text: confirmed.record.documents, collection: confirmed.collection }
102
- : { text: old.before.documents, collection: old.collection })
120
+ : collectionOf(before.documents, composition, old?.collection ?? confirmed.collection)
103
121
  : undefined;
104
122
  const effective = collection === undefined
105
123
  ? batch
@@ -128,7 +146,7 @@ export function replicaOf(confirmed, queue, previous) {
128
146
  queue: batches,
129
147
  visible: {
130
148
  documents: confirmed.record.documents,
131
- binaryTargets: confirmed.record.binaryTargets,
149
+ binaries: confirmed.record.binaries,
132
150
  revisions: confirmed.record.revisions,
133
151
  changes: confirmed.record.changes,
134
152
  collection: confirmed.collection,
@@ -143,14 +161,12 @@ export function replicaOf(confirmed, queue, previous) {
143
161
  replay,
144
162
  visible: {
145
163
  ...layer,
146
- collection: parseCollection(layer.documents, compositionOf(confirmed.record), previous === undefined
147
- ? undefined
148
- : { text: previous.visible.documents, collection: previous.visible.collection }),
164
+ collection: collectionOf(layer.documents, compositionOf(confirmed.record), previous?.visible.collection ?? confirmed.collection),
149
165
  },
150
166
  };
151
167
  }
152
168
  function present(layer, path) {
153
- return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);
169
+ return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
154
170
  }
155
171
  function holds(layer, preconditions) {
156
172
  const parsed = new Map();
@@ -171,6 +187,8 @@ function holds(layer, preconditions) {
171
187
  if (precondition.kind === 'revision') {
172
188
  return present(layer, path) && layer.revisions[path] === precondition.revision;
173
189
  }
190
+ if (precondition.kind === 'content')
191
+ return layer.documents[path] === precondition.content;
174
192
  const document = documentAt(path);
175
193
  if (document === null)
176
194
  return false;
@@ -215,36 +233,30 @@ function effects(change) {
215
233
  { kind: 'present', path: change.to },
216
234
  ];
217
235
  }
236
+ if (change.kind === 'binary')
237
+ return [{ kind: 'present', path }];
218
238
  return [{ kind: 'absent', path }];
219
239
  }
220
- function after(changes, index, path) {
221
- let at = path;
222
- for (const change of changes.slice(index + 1)) {
223
- if (change.path !== at)
224
- continue;
225
- if (change.kind === 'remove')
226
- return null;
227
- if (change.kind === 'move')
228
- at = change.to;
229
- }
230
- return at;
231
- }
232
240
  export function landed(batch, confirmed, current = {}) {
233
241
  const layer = { ...confirmed.record, documents: { ...confirmed.record.documents, ...current } };
234
242
  return batch.changes.every((change, index) => {
235
243
  if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
236
- const at = after(batch.changes, index, change.path);
244
+ const at = landing(batch.changes, index, change.path);
237
245
  return at === null || layer.documents[at] === change.content;
238
246
  }
247
+ if (change.kind === 'binary') {
248
+ const at = landing(batch.changes, index, change.path);
249
+ return at === null || layer.binaries[at]?.sha256 === change.sha256;
250
+ }
239
251
  return effects(change).every((effect) => {
240
252
  if (effect.kind === 'absent')
241
253
  return holds(layer, [effect]);
242
- const at = after(batch.changes, index, effect.path);
254
+ const at = landing(batch.changes, index, effect.path);
243
255
  return at === null || holds(layer, [{ ...effect, path: at }]);
244
256
  });
245
257
  });
246
258
  }
247
- export function withdrawals(confirmed, queue, withdrawable) {
259
+ export function withdrawals(confirmed, queue, withdrawable, local) {
248
260
  if (!queue.some(withdrawable))
249
261
  return [];
250
262
  const composition = compositionOf(confirmed.record);
@@ -258,10 +270,18 @@ export function withdrawals(confirmed, queue, withdrawable) {
258
270
  const effective = batch.changes.some((change) => change.kind === 'move')
259
271
  ? providerRewritten(batch, {
260
272
  ...layer,
261
- collection: parseCollection(layer.documents, composition),
273
+ collection: collectionOf(layer.documents, composition),
262
274
  })
263
275
  : batch;
264
- layer = overlay(layer, [effective]);
276
+ let unapplied = false;
277
+ const next = overlay(layer, [effective], () => {
278
+ unapplied = true;
279
+ });
280
+ if (local && unapplied) {
281
+ withdrawn.push(batch);
282
+ continue;
283
+ }
284
+ layer = next;
265
285
  }
266
286
  return withdrawn;
267
287
  }