@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad

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 (332) hide show
  1. package/README.md +21 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +156 -89
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -11
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +20 -60
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +9 -5
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +204 -85
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +2 -1
  26. package/dist/chain.d.ts.map +1 -1
  27. package/dist/change-set.d.ts +4 -0
  28. package/dist/change-set.d.ts.map +1 -1
  29. package/dist/change-set.js +6 -0
  30. package/dist/change.d.ts +5 -0
  31. package/dist/change.d.ts.map +1 -1
  32. package/dist/change.js +7 -2
  33. package/dist/chat-types.d.ts +3 -0
  34. package/dist/chat-types.d.ts.map +1 -0
  35. package/dist/chat-types.js +11 -0
  36. package/dist/client.d.ts +33 -23
  37. package/dist/client.d.ts.map +1 -1
  38. package/dist/client.js +43 -56
  39. package/dist/collection.d.ts +26 -4
  40. package/dist/collection.d.ts.map +1 -1
  41. package/dist/collection.js +19 -2
  42. package/dist/column.d.ts +5 -0
  43. package/dist/column.d.ts.map +1 -0
  44. package/dist/column.js +9 -0
  45. package/dist/compile.d.ts +8 -6
  46. package/dist/compile.d.ts.map +1 -1
  47. package/dist/compile.js +286 -336
  48. package/dist/connection.d.ts +5 -142
  49. package/dist/connection.d.ts.map +1 -1
  50. package/dist/connection.js +111 -4993
  51. package/dist/context.d.ts +2 -0
  52. package/dist/context.d.ts.map +1 -0
  53. package/dist/context.js +7 -0
  54. package/dist/conversation-live.d.ts +150 -0
  55. package/dist/conversation-live.d.ts.map +1 -0
  56. package/dist/conversation-live.js +259 -0
  57. package/dist/conversation-row.d.ts +40 -0
  58. package/dist/conversation-row.d.ts.map +1 -0
  59. package/dist/conversation-row.js +66 -0
  60. package/dist/conversation.d.ts +72 -51
  61. package/dist/conversation.d.ts.map +1 -1
  62. package/dist/conversation.js +1001 -926
  63. package/dist/declaration.d.ts +10 -0
  64. package/dist/declaration.d.ts.map +1 -0
  65. package/dist/declaration.js +24 -0
  66. package/dist/discovery.d.ts +11 -0
  67. package/dist/discovery.d.ts.map +1 -0
  68. package/dist/discovery.js +157 -0
  69. package/dist/download.d.ts +6 -0
  70. package/dist/download.d.ts.map +1 -0
  71. package/dist/download.js +42 -0
  72. package/dist/durability.d.ts +20 -0
  73. package/dist/durability.d.ts.map +1 -1
  74. package/dist/durability.js +7 -0
  75. package/dist/entry.d.ts +2 -2
  76. package/dist/entry.d.ts.map +1 -1
  77. package/dist/entry.js +18 -8
  78. package/dist/expectation.d.ts +26 -13
  79. package/dist/expectation.d.ts.map +1 -1
  80. package/dist/expectation.js +72 -19
  81. package/dist/failure.d.ts +3 -0
  82. package/dist/failure.d.ts.map +1 -1
  83. package/dist/failure.js +6 -0
  84. package/dist/figures.d.ts +49 -0
  85. package/dist/figures.d.ts.map +1 -0
  86. package/dist/figures.js +199 -0
  87. package/dist/file.d.ts +1 -1
  88. package/dist/file.d.ts.map +1 -1
  89. package/dist/file.js +3 -2
  90. package/dist/holdings.d.ts +29 -0
  91. package/dist/holdings.d.ts.map +1 -0
  92. package/dist/holdings.js +95 -0
  93. package/dist/host.d.ts +21 -7
  94. package/dist/host.d.ts.map +1 -1
  95. package/dist/host.js +83 -41
  96. package/dist/identity.d.ts +0 -1
  97. package/dist/identity.d.ts.map +1 -1
  98. package/dist/identity.js +0 -3
  99. package/dist/index.d.ts +37 -14
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +17 -5
  102. package/dist/install.d.ts +60 -0
  103. package/dist/install.d.ts.map +1 -0
  104. package/dist/install.js +537 -0
  105. package/dist/lifecycle.d.ts +7 -0
  106. package/dist/lifecycle.d.ts.map +1 -0
  107. package/dist/lifecycle.js +282 -0
  108. package/dist/listing.d.ts +52 -0
  109. package/dist/listing.d.ts.map +1 -0
  110. package/dist/listing.js +152 -0
  111. package/dist/live.d.ts +9 -6
  112. package/dist/live.d.ts.map +1 -1
  113. package/dist/live.js +118 -36
  114. package/dist/loaded.d.ts +5 -0
  115. package/dist/loaded.d.ts.map +1 -0
  116. package/dist/loaded.js +40 -0
  117. package/dist/locks.d.ts +7 -0
  118. package/dist/locks.d.ts.map +1 -0
  119. package/dist/locks.js +32 -0
  120. package/dist/lost.d.ts +5 -0
  121. package/dist/lost.d.ts.map +1 -0
  122. package/dist/lost.js +49 -0
  123. package/dist/media.d.ts +19 -2
  124. package/dist/media.d.ts.map +1 -1
  125. package/dist/media.js +105 -27
  126. package/dist/memory.d.ts +18 -6
  127. package/dist/memory.d.ts.map +1 -1
  128. package/dist/memory.js +214 -91
  129. package/dist/messages.d.ts +35 -5
  130. package/dist/messages.d.ts.map +1 -1
  131. package/dist/messages.js +109 -39
  132. package/dist/model.d.ts +2 -10
  133. package/dist/model.d.ts.map +1 -1
  134. package/dist/model.js +0 -14
  135. package/dist/models.d.ts +10 -0
  136. package/dist/models.d.ts.map +1 -0
  137. package/dist/models.js +153 -0
  138. package/dist/observation.d.ts +28 -13
  139. package/dist/observation.d.ts.map +1 -1
  140. package/dist/observation.js +185 -81
  141. package/dist/opened.d.ts +1 -1
  142. package/dist/opened.d.ts.map +1 -1
  143. package/dist/opened.js +5 -5
  144. package/dist/opening.d.ts +4 -0
  145. package/dist/opening.d.ts.map +1 -0
  146. package/dist/opening.js +53 -0
  147. package/dist/outcome.d.ts +17 -2
  148. package/dist/outcome.d.ts.map +1 -1
  149. package/dist/outcome.js +35 -2
  150. package/dist/overlay.d.ts +7 -2
  151. package/dist/overlay.d.ts.map +1 -1
  152. package/dist/overlay.js +48 -24
  153. package/dist/page-metadata.d.ts +8 -0
  154. package/dist/page-metadata.d.ts.map +1 -0
  155. package/dist/page-metadata.js +19 -0
  156. package/dist/parts.d.ts +4 -0
  157. package/dist/parts.d.ts.map +1 -0
  158. package/dist/parts.js +13 -0
  159. package/dist/paths.d.ts +1 -0
  160. package/dist/paths.d.ts.map +1 -1
  161. package/dist/paths.js +22 -0
  162. package/dist/preparation.d.ts +41 -0
  163. package/dist/preparation.d.ts.map +1 -0
  164. package/dist/preparation.js +314 -0
  165. package/dist/presence.d.ts +58 -0
  166. package/dist/presence.d.ts.map +1 -0
  167. package/dist/presence.js +231 -0
  168. package/dist/queries.d.ts +16 -0
  169. package/dist/queries.d.ts.map +1 -0
  170. package/dist/queries.js +308 -0
  171. package/dist/query.d.ts +14 -210
  172. package/dist/query.d.ts.map +1 -1
  173. package/dist/query.js +3 -505
  174. package/dist/questions.d.ts +30 -0
  175. package/dist/questions.d.ts.map +1 -0
  176. package/dist/questions.js +116 -0
  177. package/dist/queue.d.ts +40 -0
  178. package/dist/queue.d.ts.map +1 -0
  179. package/dist/queue.js +480 -0
  180. package/dist/reach.d.ts +16 -15
  181. package/dist/reach.d.ts.map +1 -1
  182. package/dist/reach.js +257 -148
  183. package/dist/react.d.ts +19 -3
  184. package/dist/react.d.ts.map +1 -1
  185. package/dist/react.js +33 -1
  186. package/dist/read.d.ts +7 -0
  187. package/dist/read.d.ts.map +1 -0
  188. package/dist/read.js +17 -0
  189. package/dist/readiness.d.ts +9 -6
  190. package/dist/readiness.d.ts.map +1 -1
  191. package/dist/readiness.js +3 -5
  192. package/dist/reads.d.ts +39 -0
  193. package/dist/reads.d.ts.map +1 -0
  194. package/dist/reads.js +178 -0
  195. package/dist/recovery.d.ts +3 -1
  196. package/dist/recovery.d.ts.map +1 -1
  197. package/dist/recovery.js +38 -8
  198. package/dist/refresh.d.ts +2 -1
  199. package/dist/refresh.d.ts.map +1 -1
  200. package/dist/refresh.js +31 -3
  201. package/dist/refusal.d.ts +5 -0
  202. package/dist/refusal.d.ts.map +1 -0
  203. package/dist/refusal.js +55 -0
  204. package/dist/replica.d.ts +11 -16
  205. package/dist/replica.d.ts.map +1 -1
  206. package/dist/replica.js +66 -32
  207. package/dist/retried.d.ts +30 -0
  208. package/dist/retried.d.ts.map +1 -0
  209. package/dist/retried.js +72 -0
  210. package/dist/room-draft.d.ts +34 -10
  211. package/dist/room-draft.d.ts.map +1 -1
  212. package/dist/room-draft.js +331 -111
  213. package/dist/room-drafts.d.ts +24 -0
  214. package/dist/room-drafts.d.ts.map +1 -0
  215. package/dist/room-drafts.js +220 -0
  216. package/dist/room-list.d.ts +10 -0
  217. package/dist/room-list.d.ts.map +1 -0
  218. package/dist/room-list.js +45 -0
  219. package/dist/rows.d.ts +16 -22
  220. package/dist/rows.d.ts.map +1 -1
  221. package/dist/rows.js +49 -186
  222. package/dist/runtime.d.ts +34 -0
  223. package/dist/runtime.d.ts.map +1 -0
  224. package/dist/runtime.js +1 -0
  225. package/dist/save.d.ts +42 -86
  226. package/dist/save.d.ts.map +1 -1
  227. package/dist/save.js +332 -228
  228. package/dist/saves.d.ts +34 -0
  229. package/dist/saves.d.ts.map +1 -0
  230. package/dist/saves.js +437 -0
  231. package/dist/search.d.ts +12 -63
  232. package/dist/search.d.ts.map +1 -1
  233. package/dist/search.js +9 -52
  234. package/dist/seed.d.ts +11 -2
  235. package/dist/seed.d.ts.map +1 -1
  236. package/dist/seed.js +71 -1
  237. package/dist/shared.d.ts +1 -6
  238. package/dist/shared.d.ts.map +1 -1
  239. package/dist/shared.js +13 -95
  240. package/dist/shown.d.ts +35 -0
  241. package/dist/shown.d.ts.map +1 -0
  242. package/dist/shown.js +313 -0
  243. package/dist/socket/admission.d.ts +7 -0
  244. package/dist/socket/admission.d.ts.map +1 -0
  245. package/dist/socket/admission.js +39 -0
  246. package/dist/socket/answers.d.ts +6 -0
  247. package/dist/socket/answers.d.ts.map +1 -0
  248. package/dist/socket/answers.js +20 -0
  249. package/dist/socket/lanes.d.ts +28 -0
  250. package/dist/socket/lanes.d.ts.map +1 -0
  251. package/dist/socket/lanes.js +103 -0
  252. package/dist/socket/reads.d.ts +10 -0
  253. package/dist/socket/reads.d.ts.map +1 -0
  254. package/dist/socket/reads.js +31 -0
  255. package/dist/socket/session.d.ts +38 -0
  256. package/dist/socket/session.d.ts.map +1 -0
  257. package/dist/socket/session.js +23 -0
  258. package/dist/socket.d.ts +67 -0
  259. package/dist/socket.d.ts.map +1 -0
  260. package/dist/socket.js +164 -0
  261. package/dist/source.d.ts +59 -0
  262. package/dist/source.d.ts.map +1 -0
  263. package/dist/source.js +93 -0
  264. package/dist/status.d.ts +0 -2
  265. package/dist/status.d.ts.map +1 -1
  266. package/dist/status.js +0 -6
  267. package/dist/store/installs.d.ts +30 -0
  268. package/dist/store/installs.d.ts.map +1 -0
  269. package/dist/store/installs.js +40 -0
  270. package/dist/store/readiness.d.ts +11 -0
  271. package/dist/store/readiness.d.ts.map +1 -0
  272. package/dist/store/readiness.js +68 -0
  273. package/dist/store/records.d.ts +224 -0
  274. package/dist/store/records.d.ts.map +1 -0
  275. package/dist/store/records.js +466 -0
  276. package/dist/store/room-held.d.ts +8 -0
  277. package/dist/store/room-held.d.ts.map +1 -0
  278. package/dist/store/room-held.js +17 -0
  279. package/dist/store/rooms-shown.d.ts +8 -0
  280. package/dist/store/rooms-shown.d.ts.map +1 -0
  281. package/dist/store/rooms-shown.js +13 -0
  282. package/dist/store/space.d.ts +11 -0
  283. package/dist/store/space.d.ts.map +1 -0
  284. package/dist/store/space.js +41 -0
  285. package/dist/store/watchers.d.ts +17 -0
  286. package/dist/store/watchers.d.ts.map +1 -0
  287. package/dist/store/watchers.js +56 -0
  288. package/dist/store/writes.d.ts +24 -0
  289. package/dist/store/writes.d.ts.map +1 -0
  290. package/dist/store/writes.js +125 -0
  291. package/dist/store.d.ts +115 -143
  292. package/dist/store.d.ts.map +1 -1
  293. package/dist/store.js +171 -364
  294. package/dist/stored.d.ts +72 -35
  295. package/dist/stored.d.ts.map +1 -1
  296. package/dist/stored.js +337 -197
  297. package/dist/surface.d.ts +92 -0
  298. package/dist/surface.d.ts.map +1 -0
  299. package/dist/surface.js +251 -0
  300. package/dist/sync.d.ts +19 -0
  301. package/dist/sync.d.ts.map +1 -0
  302. package/dist/sync.js +538 -0
  303. package/dist/tables.d.ts +118 -67
  304. package/dist/tables.d.ts.map +1 -1
  305. package/dist/tables.js +199 -278
  306. package/dist/tallies.d.ts +18 -0
  307. package/dist/tallies.d.ts.map +1 -0
  308. package/dist/tallies.js +128 -0
  309. package/dist/validation.d.ts.map +1 -1
  310. package/dist/validation.js +9 -12
  311. package/dist/windows.d.ts +1 -12
  312. package/dist/windows.d.ts.map +1 -1
  313. package/dist/windows.js +2 -75
  314. package/dist/wire.d.ts +72 -9
  315. package/dist/wire.d.ts.map +1 -1
  316. package/dist/wire.js +26 -5
  317. package/package.json +3 -2
  318. package/dist/attempt.d.ts +0 -16
  319. package/dist/attempt.d.ts.map +0 -1
  320. package/dist/attempt.js +0 -70
  321. package/dist/fence.d.ts +0 -6
  322. package/dist/fence.d.ts.map +0 -1
  323. package/dist/fence.js +0 -10
  324. package/dist/fulltext.d.ts +0 -27
  325. package/dist/fulltext.d.ts.map +0 -1
  326. package/dist/fulltext.js +0 -370
  327. package/dist/log.d.ts +0 -5
  328. package/dist/log.d.ts.map +0 -1
  329. package/dist/log.js +0 -14
  330. package/dist/words.d.ts +0 -19
  331. package/dist/words.d.ts.map +0 -1
  332. package/dist/words.js +0 -156
@@ -0,0 +1,5 @@
1
+ import type { ProviderRefusal } from './adapter.js';
2
+ import type { Runtime } from './runtime.js';
3
+ import type { RefusalReason } from './socket.js';
4
+ export declare function refuse(runtime: Runtime, reason: RefusalReason, provider?: ProviderRefusal | null): Promise<void>;
5
+ //# sourceMappingURL=refusal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,eAAe,GAAG,IAAW,iBAiDxC"}
@@ -0,0 +1,55 @@
1
+ import { changeSet, mergeChangeSets } from './change-set.js';
2
+ import { composedOf } from './collection.js';
3
+ import { uncaught } from './failure.js';
4
+ import { listedLocators } from './listing.js';
5
+ import { prepare } from './preparation.js';
6
+ import { storedRecord } from './replica.js';
7
+ import { emitRefusal } from './shown.js';
8
+ export async function refuse(runtime, reason, provider = null) {
9
+ const { store, socket, presence } = runtime;
10
+ socket.session.set({ paused: true });
11
+ socket.abortReads();
12
+ try {
13
+ if (reason === 'revoked-authorization') {
14
+ await store.exclusive(async () => {
15
+ const revoked = { status: 'unavailable', reason: 'revoked' };
16
+ let held = new Map();
17
+ try {
18
+ const local = await store.open();
19
+ held = await store.rooms();
20
+ await local.commit({
21
+ rooms: [...held.values()].map(({ record: kept }) => {
22
+ const record = { ...kept, model: revoked };
23
+ return {
24
+ locator: record.locator,
25
+ key: record.key,
26
+ record: storedRecord(record),
27
+ composed: composedOf(store.composed(record)),
28
+ };
29
+ }),
30
+ });
31
+ }
32
+ catch (error) {
33
+ uncaught(error);
34
+ }
35
+ const listedNow = listedLocators(runtime, held);
36
+ for (const locator of listedNow) {
37
+ if (!held.has(locator))
38
+ presence.modelled(locator, revoked);
39
+ }
40
+ store.changed(mergeChangeSets(listedNow.map((locator) => changeSet(locator, { documents: null, room: true }))));
41
+ prepare(runtime);
42
+ });
43
+ }
44
+ }
45
+ finally {
46
+ socket.session.set({
47
+ refusal: {
48
+ code: reason,
49
+ reauthorizationOffered: reason === 'revoked-authorization',
50
+ refusal: provider,
51
+ },
52
+ });
53
+ emitRefusal(runtime);
54
+ }
55
+ }
package/dist/replica.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { BootstrapInventory, MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
1
+ import { type TypedPath } from '@agentshouse/mdmodel';
2
+ import type { BootstrapInventory, SavedFacts, MutationResult, RoomDeclaration, TypedSelection } from './adapter.js';
2
3
  import { type ChangeBatch, type Precondition } from './change.js';
3
4
  import { type Collection, type Composition } from './collection.js';
4
5
  import { type ModelState } from './model.js';
@@ -6,13 +7,8 @@ import { type Layer } from './overlay.js';
6
7
  import type { HeldEntry, OverlayEntry, StoredEntry } from './tables.js';
7
8
  export type ReplicaRecord = {
8
9
  readonly locator: string;
9
- readonly name: string;
10
- readonly handle: string;
11
- readonly operations: OperationScopes;
12
- readonly replica: ReplicaAdmission;
10
+ readonly declaration: RoomDeclaration;
13
11
  readonly model: ModelState;
14
- readonly typedSelection: TypedSelection | null;
15
- readonly providerOwnedPaths: readonly string[];
16
12
  readonly roomVersion: string;
17
13
  readonly transfer: string;
18
14
  readonly inventory: BootstrapInventory;
@@ -22,23 +18,22 @@ export type HeldReplica = {
22
18
  readonly record: ReplicaRecord;
23
19
  readonly queue: readonly ChangeBatch[];
24
20
  readonly overlaid: ReadonlySet<string>;
25
- readonly count: number;
26
- readonly confirmed: number;
27
- readonly indexed: boolean;
28
21
  };
29
22
  export type VisibleLayer = Layer & {
30
23
  readonly collection: Collection;
31
24
  };
32
25
  export type Slice = Layer & {
33
26
  readonly written: Readonly<Record<string, string>>;
27
+ readonly facts: Readonly<Record<string, SavedFacts>>;
34
28
  readonly held: ReadonlySet<string>;
35
29
  };
36
- export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState): Composition;
30
+ export declare function compositionOf(model: ModelState, typedSelection: TypedSelection | null, builtIn: ModelState, typedPaths: readonly TypedPath[]): Composition;
37
31
  export declare function storedRecord(record: ReplicaRecord): string;
38
32
  export declare function slicing(entries: readonly HeldEntry[], paths: Iterable<string>): Generator<number, Slice, void>;
33
+ export type LayerEntry = Omit<StoredEntry, 'facts'>;
39
34
  export declare function entryAt(layer: Layer & {
40
35
  readonly written?: Readonly<Record<string, string>>;
41
- }, path: string): StoredEntry | null;
36
+ }, path: string): LayerEntry | null;
42
37
  export declare function slicingWith(slice: Slice, set: readonly StoredEntry[], removed: readonly string[]): Generator<number, Slice, void>;
43
38
  export declare function touchedBy(queue: readonly ChangeBatch[]): Set<string>;
44
39
  export declare function movedBy(queue: readonly ChangeBatch[], locator: string): Set<string>;
@@ -47,9 +42,9 @@ export type Replayed = {
47
42
  readonly touched: ReadonlySet<string>;
48
43
  };
49
44
  export declare function replaying(confirmed: Slice, queue: readonly ChangeBatch[], locator: string, composition: Composition): Generator<number, Replayed, void>;
50
- export declare function overlayOf(visible: Layer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
51
- export declare function holds(layer: Layer, preconditions: readonly Precondition[]): boolean;
52
- export declare function landed(batch: ChangeBatch, confirmed: Layer, current?: Readonly<Record<string, string>>): boolean;
45
+ export declare function overlayOf(visible: VisibleLayer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
46
+ export declare function holds(layer: Layer, preconditions: readonly Precondition[], composition: Composition): boolean;
47
+ export declare function landed(batch: ChangeBatch, confirmed: Layer, composition: Composition, current?: Readonly<Record<string, string>>): boolean;
53
48
  export type Standing = {
54
49
  readonly withdrawn: readonly ChangeBatch[];
55
50
  readonly kept: readonly ChangeBatch[];
@@ -63,6 +58,6 @@ export type Returned = {
63
58
  readonly removed: readonly string[];
64
59
  };
65
60
  export declare function returnedPaths(submitted: ChangeBatch, accepted: Accepted): Set<string>;
66
- export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string): Generator<number, Returned, void>;
61
+ export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string, composition: Composition): Generator<number, Returned, void>;
67
62
  export {};
68
63
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAElB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAmC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAiD,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC,CAAC;AAEF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,gBAAgB,CAAC,EACvD,OAAO,EAAE,UAAU,GAClB,WAAW,CAQb;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAG1D;AAsCD,wBAAiB,OAAO,CACtB,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GACtB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CA2BhC;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,KAAK,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,EACtE,IAAI,EAAE,MAAM,GACX,WAAW,GAAG,IAAI,CAapB;AAED,wBAAiB,WAAW,CAC1B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,SAAS,WAAW,EAAE,EAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAahC;AAMD,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAQpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAUnF;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEjG,wBAAiB,SAAS,CACxB,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,GACvB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAmBnC;AAED,wBAAiB,SAAS,CACxB,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GACxB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,CAqBzC;AAMD,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAkCnF;AAkCD,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,KAAK,EAChB,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC7C,OAAO,CAwBT;AAgBD,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;CACvC,CAAC;AAEF,wBAAiB,QAAQ,CACvB,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,GACvB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CA4BnC;AAED,KAAK,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAiBrF;AAED,wBAAiB,SAAS,CACxB,SAAS,EAAE,KAAK,EAChB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CA8EnC"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"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"}
package/dist/replica.js CHANGED
@@ -1,16 +1,17 @@
1
1
  import { equalValue, parse } from '@agentshouse/mdmodel';
2
- import { immutable, landing } from './change.js';
3
- import { collectionOf } from './collection.js';
2
+ import { immutable, isPart, landing, } from './change.js';
3
+ import { collectionOf, definitionsAt } from './collection.js';
4
4
  import { storedModel } from './model.js';
5
5
  import { acceptedBinaries, overlaying } from './overlay.js';
6
+ import { writtenFacts } from './rows.js';
6
7
  import { effectiveIn, rewriting } from './save.js';
8
+ import { guarding } from './shared.js';
7
9
  import { ROW_WEIGHT } from './turn.js';
8
- export function compositionOf(record, builtIn) {
10
+ export function compositionOf(model, typedSelection, builtIn, typedPaths) {
9
11
  return {
10
- model: record.model,
11
- selection: record.typedSelection === null
12
- ? null
13
- : { roots: record.typedSelection.roots, model: builtIn },
12
+ model,
13
+ selection: typedSelection === null ? null : { roots: typedSelection.roots, model: builtIn },
14
+ typedPaths,
14
15
  };
15
16
  }
16
17
  export function storedRecord(record) {
@@ -35,7 +36,7 @@ function strict(values, held) {
35
36
  throw new UnreadPath(property);
36
37
  }
37
38
  };
38
- return new Proxy(values, {
39
+ return guarding(values, {
39
40
  get(target, property, receiver) {
40
41
  guard(property);
41
42
  return Reflect.get(target, property, receiver);
@@ -58,9 +59,13 @@ export function* slicing(entries, paths) {
58
59
  const binaries = {};
59
60
  const revisions = {};
60
61
  const fileIds = {};
62
+ const created = {};
61
63
  const changes = {};
62
64
  const written = {};
65
+ const facts = {};
63
66
  for (const entry of entries) {
67
+ if (entry.facts !== null)
68
+ facts[entry.path] = entry.facts;
64
69
  if (entry.binary !== null)
65
70
  binaries[entry.path] = entry.binary;
66
71
  else if (entry.content !== null)
@@ -69,6 +74,8 @@ export function* slicing(entries, paths) {
69
74
  revisions[entry.path] = entry.revision;
70
75
  if (entry.fileId !== null)
71
76
  fileIds[entry.path] = entry.fileId;
77
+ if (entry.created !== null)
78
+ created[entry.path] = entry.created;
72
79
  if (entry.change !== null)
73
80
  changes[entry.path] = entry.change;
74
81
  if (entry.written !== null)
@@ -80,8 +87,10 @@ export function* slicing(entries, paths) {
80
87
  binaries: strict(binaries, held),
81
88
  revisions: strict(revisions, held),
82
89
  fileIds: strict(fileIds, held),
90
+ created: strict(created, held),
83
91
  changes: strict(changes, held),
84
92
  written: strict(written, held),
93
+ facts: strict(facts, held),
85
94
  held,
86
95
  };
87
96
  }
@@ -96,6 +105,7 @@ export function entryAt(layer, path) {
96
105
  binary: binary ?? null,
97
106
  revision: layer.revisions[path] ?? null,
98
107
  fileId: layer.fileIds[path] ?? null,
108
+ created: layer.created[path] ?? null,
99
109
  change: layer.changes[path] ?? null,
100
110
  written: layer.written?.[path] ?? null,
101
111
  };
@@ -104,8 +114,9 @@ export function* slicingWith(slice, set, removed) {
104
114
  const entries = new Map();
105
115
  for (const path of slice.held) {
106
116
  const entry = entryAt(slice, path);
107
- if (entry !== null)
108
- entries.set(path, { ...entry, type: null });
117
+ if (entry !== null) {
118
+ entries.set(path, { ...entry, type: null, facts: slice.facts[path] ?? null });
119
+ }
109
120
  yield ROW_WEIGHT;
110
121
  }
111
122
  for (const path of removed)
@@ -158,7 +169,7 @@ export function* replaying(confirmed, queue, locator, composition) {
158
169
  for (const change of effective.changes)
159
170
  for (const path of changePaths(change))
160
171
  touched.add(path);
161
- layer = yield* overlaying(layer, [effective]);
172
+ layer = yield* overlaying(layer, [effective], composition);
162
173
  yield ROW_WEIGHT;
163
174
  }
164
175
  return {
@@ -169,8 +180,9 @@ export function* replaying(confirmed, queue, locator, composition) {
169
180
  export function* overlayOf(visible, touched) {
170
181
  const rows = [];
171
182
  for (const path of touched) {
172
- yield ROW_WEIGHT;
173
183
  const entry = entryAt(visible, path);
184
+ yield ROW_WEIGHT + (entry?.content?.length ?? 0);
185
+ const text = entry?.binary === null ? entry.content : null;
174
186
  rows.push(entry === null
175
187
  ? {
176
188
  path,
@@ -179,22 +191,29 @@ export function* overlayOf(visible, touched) {
179
191
  binary: null,
180
192
  revision: null,
181
193
  fileId: null,
194
+ created: null,
182
195
  change: null,
183
196
  written: null,
197
+ facts: null,
184
198
  }
185
- : { ...entry, written: null, present: true });
199
+ : {
200
+ ...entry,
201
+ written: null,
202
+ present: true,
203
+ facts: text === null ? null : writtenFacts(path, text, visible.collection.composition),
204
+ });
186
205
  }
187
206
  return rows;
188
207
  }
189
208
  function present(layer, path) {
190
209
  return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
191
210
  }
192
- export function holds(layer, preconditions) {
211
+ export function holds(layer, preconditions, composition) {
193
212
  const parsed = new Map();
194
213
  const documentAt = (path) => {
195
214
  if (!parsed.has(path)) {
196
215
  const text = layer.documents[path];
197
- const opened = text === undefined ? null : parse(text, path);
216
+ const opened = text === undefined ? null : parse(text, path, definitionsAt(composition, path));
198
217
  parsed.set(path, opened?.ok === true ? opened.document : null);
199
218
  }
200
219
  return parsed.get(path) ?? null;
@@ -228,7 +247,7 @@ export function holds(layer, preconditions) {
228
247
  }
229
248
  function effects(change) {
230
249
  const path = change.path;
231
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
250
+ if (isPart(change)) {
232
251
  return [change];
233
252
  }
234
253
  if (change.kind === 'create' && !('content' in change)) {
@@ -254,11 +273,11 @@ function effects(change) {
254
273
  { kind: 'present', path: change.to },
255
274
  ];
256
275
  }
257
- if (change.kind === 'binary' || change.kind === 'arrival')
276
+ if (change.kind === 'arrival')
258
277
  return [{ kind: 'present', path }];
259
278
  return [{ kind: 'absent', path }];
260
279
  }
261
- export function landed(batch, confirmed, current = {}) {
280
+ export function landed(batch, confirmed, composition, current = {}) {
262
281
  const documents = new Proxy(confirmed.documents, {
263
282
  get(target, property, receiver) {
264
283
  if (typeof property === 'string' && Object.hasOwn(current, property))
@@ -278,9 +297,9 @@ export function landed(batch, confirmed, current = {}) {
278
297
  }
279
298
  return effects(change).every((effect) => {
280
299
  if (effect.kind === 'absent')
281
- return holds(layer, [effect]);
300
+ return holds(layer, [effect], composition);
282
301
  const at = landing(batch.changes, index, effect.path);
283
- return at === null || holds(layer, [{ ...effect, path: at }]);
302
+ return at === null || holds(layer, [{ ...effect, path: at }], composition);
284
303
  });
285
304
  });
286
305
  }
@@ -305,7 +324,7 @@ export function* standing(confirmed, queue, withdrawable, local, locator, compos
305
324
  const withdrawn = [];
306
325
  const kept = [];
307
326
  for (const batch of queue) {
308
- if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
327
+ if (withdrawable(batch) && !holds(layer, batch.preconditions, composition)) {
309
328
  withdrawn.push(batch);
310
329
  continue;
311
330
  }
@@ -316,7 +335,7 @@ export function* standing(confirmed, queue, withdrawable, local, locator, compos
316
335
  })
317
336
  : batch;
318
337
  let unapplied = false;
319
- const next = yield* overlaying(layer, [effective], () => {
338
+ const next = yield* overlaying(layer, [effective], composition, () => {
320
339
  unapplied = true;
321
340
  });
322
341
  if (local && unapplied) {
@@ -347,17 +366,20 @@ export function returnedPaths(submitted, accepted) {
347
366
  }
348
367
  return paths;
349
368
  }
350
- export function* returning(confirmed, submitted, accepted, writtenAt) {
369
+ export function* returning(confirmed, submitted, accepted, writtenAt, composition) {
351
370
  const documents = new Map();
352
371
  const binaries = new Map();
353
372
  const revisions = new Map();
354
373
  const fileIds = new Map();
374
+ const created = new Map();
355
375
  const changes = new Map();
356
376
  const written = new Map();
377
+ const facts = new Map();
357
378
  const read = (changed, held, path) => (changed.has(path) ? changed.get(path) : held[path]);
358
379
  for (const [path, content] of Object.entries(accepted.documents)) {
359
- yield ROW_WEIGHT;
380
+ yield ROW_WEIGHT + content.length;
360
381
  documents.set(path, content);
382
+ facts.set(path, writtenFacts(path, content, composition));
361
383
  fileIds.set(path, undefined);
362
384
  written.set(path, writtenAt);
363
385
  }
@@ -380,48 +402,60 @@ export function* returning(confirmed, submitted, accepted, writtenAt) {
380
402
  written.set(path, undefined);
381
403
  }
382
404
  for (const change of submitted.changes) {
383
- if (change.kind === 'arrival' && 'binary' in change) {
384
- if (accepted.revisions[change.path] !== undefined) {
405
+ if (change.kind === 'arrival') {
406
+ if (accepted.revisions[change.path] === undefined)
407
+ continue;
408
+ created.set(change.path, change.created);
409
+ if ('binary' in change)
385
410
  binaries.set(change.path, { state: 'accepted', ...change.binary });
386
- }
387
411
  continue;
388
412
  }
389
- if (change.kind !== 'move')
413
+ if (change.kind !== 'move' || accepted.revisions[change.to] === undefined)
390
414
  continue;
415
+ created.set(change.to, read(created, confirmed.created, change.path));
416
+ created.set(change.path, undefined);
391
417
  const moved = read(binaries, confirmed.binaries, change.path);
392
- if (moved === undefined || accepted.revisions[change.to] === undefined)
418
+ if (moved === undefined)
393
419
  continue;
394
420
  binaries.set(change.to, moved);
395
421
  binaries.set(change.path, undefined);
396
422
  }
397
423
  for (const [path, binary] of acceptedBinaries(accepted.binaryFiles ?? {}))
398
424
  binaries.set(path, binary);
399
- for (const path of accepted.removals)
425
+ for (const path of accepted.removals) {
400
426
  binaries.set(path, undefined);
427
+ created.set(path, undefined);
428
+ }
401
429
  const paths = new Set([
402
430
  ...documents.keys(),
403
431
  ...binaries.keys(),
404
432
  ...revisions.keys(),
405
433
  ...fileIds.keys(),
434
+ ...created.keys(),
406
435
  ...changes.keys(),
407
436
  ...written.keys(),
408
437
  ]);
409
438
  const set = [];
410
439
  const removed = [];
411
440
  for (const path of paths) {
412
- yield ROW_WEIGHT;
413
441
  const content = read(documents, confirmed.documents, path);
414
442
  const binary = read(binaries, confirmed.binaries, path);
443
+ yield ROW_WEIGHT;
415
444
  if (content === undefined && binary === undefined) {
416
445
  removed.push(path);
417
446
  continue;
418
447
  }
448
+ const text = binary === undefined ? (content ?? null) : null;
449
+ const fresh = confirmed.documents[path] === undefined && confirmed.binaries[path] === undefined;
419
450
  set.push({
420
451
  path,
421
- content: binary === undefined ? (content ?? null) : null,
452
+ content: text,
453
+ facts: text === null ? null : (read(facts, confirmed.facts, path) ?? null),
422
454
  binary: binary ?? null,
423
455
  revision: read(revisions, confirmed.revisions, path) ?? null,
424
456
  fileId: read(fileIds, confirmed.fileIds, path) ?? null,
457
+ created: read(created, confirmed.created, path) ??
458
+ (fresh ? (read(changes, confirmed.changes, path)?.time ?? null) : null),
425
459
  change: read(changes, confirmed.changes, path) ?? null,
426
460
  written: read(written, confirmed.written, path) ?? null,
427
461
  });
@@ -0,0 +1,30 @@
1
+ import { type RuntimeShell } from './durability.js';
2
+ export declare const STEPS: readonly ['database', 'sign_in', 'connection', 'code', 'download', 'conversations', 'sending', 'reading'];
3
+ export type Step = (typeof STEPS)[number];
4
+ export type RetriedFailure = {
5
+ readonly step: Step;
6
+ readonly answered: false;
7
+ } | {
8
+ readonly step: Step;
9
+ readonly answered: true;
10
+ readonly error: unknown;
11
+ };
12
+ export type Uncertain = {
13
+ readonly failure?: unknown;
14
+ };
15
+ export type Attempt = {
16
+ readonly step: Step;
17
+ readonly instance: string;
18
+ };
19
+ export declare class Unanswered extends Error {
20
+ }
21
+ export declare function uncertainError(uncertainty: Uncertain): unknown;
22
+ export type Retries = {
23
+ failed(step: Step, instance: string, error: unknown): void;
24
+ unanswered(step: Step, instance: string): void;
25
+ uncertain(step: Step, instance: string, uncertainty: Uncertain): void;
26
+ succeeded(step: Step, instance: string): void;
27
+ };
28
+ export declare function createRetries(shell: Pick<RuntimeShell, 'retried' | 'succeeded'>): Retries;
29
+ export declare function retrying<T>(retries: Retries, step: Step, instance: string, ask: () => Promise<T>): () => Promise<T>;
30
+ //# sourceMappingURL=retried.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retried.d.ts","sourceRoot":"","sources":["../src/retried.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAErE,eAAO,MAAM,KAAK,YAChB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,CACD,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3D,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IACtE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO,CA2CzF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,MAAM,OAAO,CAAC,CAAC,CAAC,CAYlB"}
@@ -0,0 +1,72 @@
1
+ import { refusedForSpace } from './durability.js';
2
+ export const STEPS = [
3
+ 'database',
4
+ 'sign_in',
5
+ 'connection',
6
+ 'code',
7
+ 'download',
8
+ 'conversations',
9
+ 'sending',
10
+ 'reading',
11
+ ];
12
+ export class Unanswered extends Error {
13
+ }
14
+ export function uncertainError(uncertainty) {
15
+ return 'failure' in uncertainty ? uncertainty.failure : new Unanswered();
16
+ }
17
+ export function createRetries(shell) {
18
+ const failing = new Map();
19
+ const handedErrors = new WeakSet();
20
+ function failingIn(step, instance) {
21
+ const instances = failing.get(step) ?? new Set();
22
+ instances.add(instance);
23
+ failing.set(step, instances);
24
+ }
25
+ function handed(failure, instance) {
26
+ failingIn(failure.step, instance);
27
+ shell.retried?.(failure);
28
+ }
29
+ const retries = {
30
+ failed(step, instance, error) {
31
+ if (refusedForSpace(error))
32
+ return;
33
+ if (typeof error === 'object' && error !== null) {
34
+ if (handedErrors.has(error)) {
35
+ failingIn(step, instance);
36
+ return;
37
+ }
38
+ handedErrors.add(error);
39
+ }
40
+ if (error instanceof Unanswered)
41
+ retries.unanswered(step, instance);
42
+ else
43
+ handed({ step, answered: true, error }, instance);
44
+ },
45
+ unanswered(step, instance) {
46
+ handed({ step, answered: false }, instance);
47
+ },
48
+ uncertain(step, instance, uncertainty) {
49
+ if ('failure' in uncertainty)
50
+ retries.failed(step, instance, uncertainty.failure);
51
+ else
52
+ retries.unanswered(step, instance);
53
+ },
54
+ succeeded(step, instance) {
55
+ const instances = failing.get(step);
56
+ if (instances === undefined || !instances.delete(instance) || instances.size > 0)
57
+ return;
58
+ failing.delete(step);
59
+ shell.succeeded?.(step);
60
+ },
61
+ };
62
+ return retries;
63
+ }
64
+ export function retrying(retries, step, instance, ask) {
65
+ return () => ask().then((answer) => {
66
+ retries.succeeded(step, instance);
67
+ return answer;
68
+ }, (error) => {
69
+ retries.failed(step, instance, error);
70
+ throw error;
71
+ });
72
+ }
@@ -1,6 +1,7 @@
1
- import type { ProviderRefusal } from './adapter.js';
1
+ import { type ApplyResult, type Definition, type DefinitionOf, type Document } from '@agentshouse/mdmodel';
2
+ import type { HeadChange, ProviderRefusal } from './adapter.js';
2
3
  import type { Open } from './open.js';
3
- import type { Change, Precondition } from './change.js';
4
+ import type { Change, PartChange, Precondition } from './change.js';
4
5
  import type { VisibleLayer } from './replica.js';
5
6
  export type FieldValue = {
6
7
  readonly value: unknown;
@@ -90,15 +91,30 @@ type ChangedUnderneath = {
90
91
  readonly file?: string | null;
91
92
  };
92
93
  export type ReturnReason = ProviderRefusal & {
93
- readonly kind: Open<'conflicted' | 'rejected' | 'expired' | 'withdrawn'>;
94
+ readonly kind: Open<'conflicted' | 'rejected' | 'withdrawn'>;
95
+ };
96
+ export declare function returnedBy(): ReturnReason;
97
+ type Mark = {
98
+ readonly change: HeadChange | null;
99
+ };
100
+ export type Marks = {
101
+ readonly fields?: Readonly<Record<string, Mark & {
102
+ readonly current: FieldValue;
103
+ }>>;
104
+ readonly sections?: Readonly<Record<string, Mark>>;
105
+ readonly preamble?: Mark;
106
+ readonly markdown?: Mark;
107
+ readonly file?: Mark & {
108
+ readonly current: string;
109
+ };
94
110
  };
95
- export declare function returnedBy(kind: 'expired' | 'withdrawn'): ReturnReason;
96
111
  export type RoomDraft = {
97
112
  readonly room: string;
98
113
  readonly path: string;
99
114
  readonly revision: string;
100
115
  readonly parts: HeldParts;
101
116
  readonly changedUnderneath: ChangedUnderneath;
117
+ readonly marks: Marks;
102
118
  readonly returned: ReturnReason | null;
103
119
  };
104
120
  export type RoomDraftWrite = {
@@ -106,8 +122,6 @@ export type RoomDraftWrite = {
106
122
  readonly roomDraft: RoomDraft | null;
107
123
  } | {
108
124
  readonly outcome: 'stale';
109
- readonly code: string;
110
- readonly retryable: boolean;
111
125
  readonly current: RoomDraft | null;
112
126
  };
113
127
  export declare function staleWrite(current: RoomDraft | null): RoomDraftWrite;
@@ -121,19 +135,30 @@ export type RoomDraftRecord = {
121
135
  readonly path: string;
122
136
  readonly revision: string;
123
137
  readonly parts: HeldParts;
138
+ readonly marks: Marks;
124
139
  readonly returned: ReturnReason | null;
125
140
  };
126
141
  export type SavedDraft = {
127
142
  readonly path: string;
128
143
  readonly parts: HeldParts;
129
144
  };
130
- export declare function readParts(value: unknown): RoomDraftParts;
145
+ export declare function readParts(value: unknown, path: string): RoomDraftParts;
131
146
  export declare function gatheredParts(earlier: unknown, later: unknown): unknown;
132
147
  export declare function held(current: HeldParts | undefined, parts: RoomDraftParts, file?: HeldFile): HeldParts;
133
148
  export declare function underneath(parts: HeldParts, path: string, visible: VisibleLayer | undefined): ChangedUnderneath;
134
149
  export declare function heldFile(blob: Blob, base: string | null): Promise<HeldFile>;
135
150
  export declare function binaryBase(visible: VisibleLayer | undefined, path: string): string | null;
136
151
  export declare function changedParts(path: string, parts: HeldParts, visible: VisibleLayer | undefined): readonly ChangedPart[];
152
+ export declare function marksOver(kept: Marks, under: Marks): Marks;
153
+ export declare function heldMarks(marks: Marks, parts: HeldParts): Marks;
154
+ export declare function partsBetween(path: string, before: Document, after: Document): PartChange[];
155
+ export declare function applyParts(document: Document, changes: readonly Change[], definition: Definition | undefined): ApplyResult;
156
+ type Joined = {
157
+ readonly parts: HeldParts;
158
+ readonly marks: Marks;
159
+ };
160
+ export declare function joinedOver(parts: HeldParts, marks: Marks, path: string, visible: VisibleLayer): Joined | null;
161
+ export declare function lineEnded(text: string): string;
137
162
  export type TextParts = {
138
163
  readonly fields?: Readonly<Record<string, {
139
164
  readonly value: unknown;
@@ -145,8 +170,8 @@ export type TextParts = {
145
170
  readonly value: string;
146
171
  };
147
172
  };
148
- export declare function partsAfter(markdown: string, parts: TextParts): string;
149
- export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts;
173
+ export declare function partsAfter(markdown: string, parts: TextParts, definitions?: DefinitionOf): string | null;
174
+ export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts, definitions?: DefinitionOf): HeldParts | null;
150
175
  export declare function moveTarget(move: {
151
176
  readonly to: string;
152
177
  }): string;
@@ -168,7 +193,6 @@ export declare function changesOf(path: string, parts: HeldParts): {
168
193
  changes: readonly Change[];
169
194
  bases: readonly Precondition[];
170
195
  };
171
- export declare function joinedDraft(carried: SavedDraft, saved: readonly SavedDraft[]): SavedDraft;
172
196
  export declare function withdrawnDrafts(drafts: readonly SavedDraft[], changes: readonly Change[]): readonly SavedDraft[];
173
197
  export {};
174
198
  //# sourceMappingURL=room-draft.d.ts.map