@agentshouse/mdruntime 0.1.0-cf04ede9fb796 → 0.1.0-cf0c43fc48aad

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 (220) hide show
  1. package/README.md +12 -12
  2. package/dist/acceptance.d.ts +0 -3
  3. package/dist/acceptance.d.ts.map +1 -1
  4. package/dist/acceptance.js +74 -164
  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 +8 -2
  9. package/dist/actions.d.ts.map +1 -1
  10. package/dist/actions.js +118 -67
  11. package/dist/adapter.d.ts +27 -48
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/bootstrap.d.ts +1 -1
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +6 -19
  16. package/dist/change-set.d.ts +4 -0
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +6 -0
  19. package/dist/change.d.ts.map +1 -1
  20. package/dist/change.js +4 -2
  21. package/dist/client.d.ts +9 -18
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +32 -15
  24. package/dist/collection.d.ts +22 -4
  25. package/dist/collection.d.ts.map +1 -1
  26. package/dist/collection.js +12 -2
  27. package/dist/compile.d.ts +2 -0
  28. package/dist/compile.d.ts.map +1 -1
  29. package/dist/compile.js +31 -24
  30. package/dist/connection.d.ts.map +1 -1
  31. package/dist/connection.js +26 -21
  32. package/dist/conversation-live.d.ts +10 -6
  33. package/dist/conversation-live.d.ts.map +1 -1
  34. package/dist/conversation-live.js +8 -6
  35. package/dist/conversation.d.ts +28 -10
  36. package/dist/conversation.d.ts.map +1 -1
  37. package/dist/conversation.js +194 -141
  38. package/dist/declaration.d.ts +10 -0
  39. package/dist/declaration.d.ts.map +1 -0
  40. package/dist/declaration.js +24 -0
  41. package/dist/discovery.d.ts.map +1 -1
  42. package/dist/discovery.js +19 -44
  43. package/dist/durability.d.ts +3 -0
  44. package/dist/durability.d.ts.map +1 -1
  45. package/dist/entry.js +1 -1
  46. package/dist/expectation.d.ts +26 -13
  47. package/dist/expectation.d.ts.map +1 -1
  48. package/dist/expectation.js +72 -19
  49. package/dist/failure.d.ts +3 -0
  50. package/dist/failure.d.ts.map +1 -1
  51. package/dist/failure.js +6 -0
  52. package/dist/host.d.ts +17 -2
  53. package/dist/host.d.ts.map +1 -1
  54. package/dist/host.js +45 -11
  55. package/dist/index.d.ts +12 -8
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +10 -6
  58. package/dist/install.d.ts +2 -4
  59. package/dist/install.d.ts.map +1 -1
  60. package/dist/install.js +52 -78
  61. package/dist/lifecycle.d.ts +1 -1
  62. package/dist/lifecycle.d.ts.map +1 -1
  63. package/dist/lifecycle.js +40 -31
  64. package/dist/listing.d.ts +6 -11
  65. package/dist/listing.d.ts.map +1 -1
  66. package/dist/listing.js +25 -62
  67. package/dist/live.d.ts.map +1 -1
  68. package/dist/live.js +3 -3
  69. package/dist/locks.d.ts +2 -4
  70. package/dist/locks.d.ts.map +1 -1
  71. package/dist/locks.js +10 -39
  72. package/dist/lost.d.ts.map +1 -1
  73. package/dist/lost.js +10 -22
  74. package/dist/media.d.ts +1 -1
  75. package/dist/media.d.ts.map +1 -1
  76. package/dist/media.js +4 -4
  77. package/dist/memory.d.ts +4 -2
  78. package/dist/memory.d.ts.map +1 -1
  79. package/dist/memory.js +44 -23
  80. package/dist/messages.d.ts +9 -5
  81. package/dist/messages.d.ts.map +1 -1
  82. package/dist/messages.js +25 -35
  83. package/dist/model.d.ts +0 -1
  84. package/dist/model.d.ts.map +1 -1
  85. package/dist/model.js +0 -5
  86. package/dist/models.d.ts +4 -8
  87. package/dist/models.d.ts.map +1 -1
  88. package/dist/models.js +95 -137
  89. package/dist/observation.d.ts.map +1 -1
  90. package/dist/observation.js +12 -17
  91. package/dist/opened.d.ts +1 -1
  92. package/dist/opened.d.ts.map +1 -1
  93. package/dist/opened.js +5 -5
  94. package/dist/opening.d.ts.map +1 -1
  95. package/dist/opening.js +5 -9
  96. package/dist/outcome.d.ts +3 -0
  97. package/dist/outcome.d.ts.map +1 -1
  98. package/dist/outcome.js +15 -0
  99. package/dist/overlay.d.ts +5 -1
  100. package/dist/overlay.d.ts.map +1 -1
  101. package/dist/overlay.js +36 -21
  102. package/dist/page-metadata.d.ts +8 -0
  103. package/dist/page-metadata.d.ts.map +1 -0
  104. package/dist/page-metadata.js +19 -0
  105. package/dist/parts.d.ts +3 -59
  106. package/dist/parts.d.ts.map +1 -1
  107. package/dist/parts.js +10 -123
  108. package/dist/preparation.d.ts.map +1 -1
  109. package/dist/preparation.js +25 -24
  110. package/dist/presence.d.ts +52 -0
  111. package/dist/presence.d.ts.map +1 -0
  112. package/dist/presence.js +220 -0
  113. package/dist/queries.d.ts +1 -1
  114. package/dist/queries.d.ts.map +1 -1
  115. package/dist/queries.js +24 -14
  116. package/dist/query.d.ts +0 -1
  117. package/dist/query.d.ts.map +1 -1
  118. package/dist/questions.d.ts +0 -5
  119. package/dist/questions.d.ts.map +1 -1
  120. package/dist/questions.js +0 -7
  121. package/dist/queue.d.ts +40 -0
  122. package/dist/queue.d.ts.map +1 -0
  123. package/dist/queue.js +450 -0
  124. package/dist/reach.d.ts.map +1 -1
  125. package/dist/reach.js +67 -22
  126. package/dist/react.d.ts +5 -0
  127. package/dist/react.d.ts.map +1 -1
  128. package/dist/react.js +33 -1
  129. package/dist/reads.d.ts +3 -1
  130. package/dist/reads.d.ts.map +1 -1
  131. package/dist/reads.js +9 -2
  132. package/dist/recovery.d.ts +3 -1
  133. package/dist/recovery.d.ts.map +1 -1
  134. package/dist/recovery.js +29 -7
  135. package/dist/refresh.js +2 -2
  136. package/dist/refusal.d.ts.map +1 -1
  137. package/dist/refusal.js +5 -6
  138. package/dist/replica.d.ts +5 -11
  139. package/dist/replica.d.ts.map +1 -1
  140. package/dist/replica.js +13 -15
  141. package/dist/retried.d.ts +30 -0
  142. package/dist/retried.d.ts.map +1 -0
  143. package/dist/retried.js +72 -0
  144. package/dist/room-draft.d.ts +4 -6
  145. package/dist/room-draft.d.ts.map +1 -1
  146. package/dist/room-draft.js +46 -57
  147. package/dist/room-drafts.d.ts.map +1 -1
  148. package/dist/room-drafts.js +17 -16
  149. package/dist/rows.d.ts.map +1 -1
  150. package/dist/rows.js +3 -4
  151. package/dist/runtime.d.ts +9 -18
  152. package/dist/runtime.d.ts.map +1 -1
  153. package/dist/save.d.ts +42 -90
  154. package/dist/save.d.ts.map +1 -1
  155. package/dist/save.js +334 -167
  156. package/dist/saves.d.ts +2 -40
  157. package/dist/saves.d.ts.map +1 -1
  158. package/dist/saves.js +107 -705
  159. package/dist/seed.d.ts.map +1 -1
  160. package/dist/seed.js +2 -3
  161. package/dist/shared.d.ts +0 -5
  162. package/dist/shared.d.ts.map +1 -1
  163. package/dist/shared.js +4 -90
  164. package/dist/shown.d.ts +4 -3
  165. package/dist/shown.d.ts.map +1 -1
  166. package/dist/shown.js +26 -31
  167. package/dist/socket/lanes.d.ts +12 -4
  168. package/dist/socket/lanes.d.ts.map +1 -1
  169. package/dist/socket/lanes.js +34 -8
  170. package/dist/socket/session.d.ts +0 -1
  171. package/dist/socket/session.d.ts.map +1 -1
  172. package/dist/socket.d.ts +3 -6
  173. package/dist/socket.d.ts.map +1 -1
  174. package/dist/socket.js +5 -16
  175. package/dist/source.d.ts +0 -7
  176. package/dist/source.d.ts.map +1 -1
  177. package/dist/source.js +5 -4
  178. package/dist/store/records.d.ts +8 -6
  179. package/dist/store/records.d.ts.map +1 -1
  180. package/dist/store/records.js +13 -6
  181. package/dist/store/space.d.ts +1 -1
  182. package/dist/store/space.d.ts.map +1 -1
  183. package/dist/store/space.js +0 -2
  184. package/dist/store/watchers.js +1 -2
  185. package/dist/store.d.ts +11 -6
  186. package/dist/store.d.ts.map +1 -1
  187. package/dist/store.js +38 -13
  188. package/dist/stored.d.ts +2 -1
  189. package/dist/stored.d.ts.map +1 -1
  190. package/dist/stored.js +11 -11
  191. package/dist/surface.d.ts +1 -1
  192. package/dist/surface.d.ts.map +1 -1
  193. package/dist/surface.js +13 -16
  194. package/dist/sync.d.ts.map +1 -1
  195. package/dist/sync.js +88 -85
  196. package/dist/tables.d.ts +6 -8
  197. package/dist/tables.d.ts.map +1 -1
  198. package/dist/tables.js +41 -20
  199. package/dist/tallies.js +5 -5
  200. package/dist/validation.d.ts.map +1 -1
  201. package/dist/validation.js +2 -2
  202. package/dist/wire.d.ts +51 -7
  203. package/dist/wire.d.ts.map +1 -1
  204. package/dist/wire.js +15 -4
  205. package/package.json +3 -2
  206. package/dist/attempt.d.ts +0 -16
  207. package/dist/attempt.d.ts.map +0 -1
  208. package/dist/attempt.js +0 -70
  209. package/dist/job.d.ts +0 -33
  210. package/dist/job.d.ts.map +0 -1
  211. package/dist/job.js +0 -54
  212. package/dist/log.d.ts +0 -6
  213. package/dist/log.d.ts.map +0 -1
  214. package/dist/log.js +0 -14
  215. package/dist/socket/rooms.d.ts +0 -44
  216. package/dist/socket/rooms.d.ts.map +0 -1
  217. package/dist/socket/rooms.js +0 -90
  218. package/dist/store/fences.d.ts +0 -16
  219. package/dist/store/fences.d.ts.map +0 -1
  220. package/dist/store/fences.js +0 -26
package/dist/surface.js CHANGED
@@ -1,11 +1,12 @@
1
- import { called, located, readHistory, resolveReference } from './actions.js';
1
+ import { answeredCall, called, located, readHistory, resolveReference, } from './actions.js';
2
2
  import { chatDraftSurface, conversationSurface, watchConversation, watchConversationAgents, watchConversationList, } from './conversation.js';
3
+ import { uncaught } from './failure.js';
3
4
  import { CLEANED_TOPIC, watchHoldings } from './holdings.js';
4
5
  import { reachedBy, writtenAfter } from './install.js';
5
6
  import { declarationOf, listingNow, modelIn, shownRooms } from './listing.js';
6
7
  import { stop } from './lifecycle.js';
7
8
  import { locked, lockedRooms, watchLocks } from './locks.js';
8
- import { modelTypes, NO_MODEL } from './model.js';
9
+ import { modelTypes } from './model.js';
9
10
  import { observing } from './observation.js';
10
11
  import { watchReadiness } from './preparation.js';
11
12
  import { planned, rowsQuery, searched, watchPlan, watchPlanned } from './queries.js';
@@ -38,7 +39,7 @@ function watchMember({ store }, deliver) {
38
39
  .then(({ member }) => {
39
40
  if (watcher.held())
40
41
  deliver(member);
41
- }, () => { });
42
+ }, uncaught);
42
43
  return watcher.stop;
43
44
  }
44
45
  function watchQueue(runtime, locator, deliver) {
@@ -116,19 +117,17 @@ function roomsOnce(runtime) {
116
117
  async function typesOf(runtime, locator) {
117
118
  const { store, builtIn } = runtime;
118
119
  const held = (await store.rooms([locator])).get(locator);
119
- const fenced = store.fences.has(locator);
120
- const room = fenced ? undefined : declarationOf(runtime, locator, held)?.room;
120
+ const room = declarationOf(runtime, locator, held)?.room;
121
121
  return {
122
- collection: modelTypes(fenced ? NO_MODEL : modelIn(runtime, locator, held)),
122
+ collection: modelTypes(modelIn(runtime, locator, held)),
123
123
  typedSelection: (room?.typedSelection ?? null) === null ? null : modelTypes(builtIn),
124
124
  };
125
125
  }
126
126
  async function reauthorized(runtime) {
127
- const { store, socket, journal } = runtime;
127
+ const { store, socket } = runtime;
128
128
  const { refusal } = socket.session.now();
129
129
  if (refusal === null || !refusal.reauthorizationOffered)
130
130
  return;
131
- journal.record('connection reauthorize');
132
131
  await socket.lanes.current();
133
132
  await store.written();
134
133
  socket.session.set({ authorization: undefined, paused: false });
@@ -138,7 +137,7 @@ async function reauthorized(runtime) {
138
137
  await socket.lanes.task(OPENING_LANE, () => socket.authorize());
139
138
  }
140
139
  function mdRuntime(runtime, watch) {
141
- const { store, socket, journal, shell, conversations, lastAnswers } = runtime;
140
+ const { store, socket, shell, conversations, lastAnswers } = runtime;
142
141
  return {
143
142
  loaded: () => store.open().then(() => undefined),
144
143
  rooms: () => roomsOnce(runtime),
@@ -149,18 +148,18 @@ function mdRuntime(runtime, watch) {
149
148
  conversation: conversationSurface(conversations),
150
149
  chatDraft: chatDraftSurface(conversations),
151
150
  presentation: presentationSurface(runtime),
152
- save: (room, named, writtenBy) => store.exclusive(() => saveRoomDrafts(runtime, room, named, writtenBy)),
153
- saveParts: (room, parts, writtenBy) => store.exclusive(() => saveParts(runtime, room, parts, writtenBy)),
151
+ save: (room, named, writtenBy) => saveRoomDrafts(runtime, room, named, writtenBy),
152
+ saveParts: (room, parts, writtenBy) => saveParts(runtime, room, parts, writtenBy),
154
153
  history: (locator, path, query) => readHistory(runtime, locator, path, query),
155
154
  resolve: (room, path, destination) => resolveReference(runtime, room, path, destination),
156
155
  binaryFile: binaryFileSurface(runtime),
157
156
  call: (name, input) => called(runtime, name, input),
157
+ answered: (operation) => answeredCall(runtime, operation),
158
158
  async reached(locator, roomVersion, path) {
159
159
  return path === undefined
160
160
  ? reachedBy(runtime, locator, roomVersion)
161
161
  : writtenAfter(runtime, locator, roomVersion, path);
162
162
  },
163
- log: () => journal.export(),
164
163
  async cleanUp() {
165
164
  const freed = await store.ask({ kind: 'opened.clean' });
166
165
  const tidied = (await shell.cleanUp?.()) ?? 0;
@@ -174,8 +173,7 @@ function mdRuntime(runtime, watch) {
174
173
  },
175
174
  persistence: () => store.device.now().persistence === 'granted',
176
175
  async retry() {
177
- journal.record('retry');
178
- socket.rooms.standAll({ unpreparable: false });
176
+ store.prepareAgain();
179
177
  store.readiness.queue();
180
178
  if (store.space.full())
181
179
  await store.space.probe();
@@ -185,7 +183,7 @@ function mdRuntime(runtime, watch) {
185
183
  };
186
184
  }
187
185
  export function composedRuntime(runtime) {
188
- const { store, journal } = runtime;
186
+ const { store } = runtime;
189
187
  const watch = watching(runtime);
190
188
  const md = mdRuntime(runtime, watch);
191
189
  const reachable = {
@@ -211,7 +209,6 @@ export function composedRuntime(runtime) {
211
209
  if (answer === store.device.now().persistence)
212
210
  return;
213
211
  store.device.set({ persistence: answer });
214
- journal.record(`persistence ${answer}`);
215
212
  store.readiness.queue();
216
213
  },
217
214
  within(reach, port) {
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACX,MAAM,cAAc,CAAC;AAUtB,OAAO,EASL,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAOtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAE7D,eAAO,MAAM,YAAY,YAAY,CAAC;AA4FtC,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAI1B;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAkHD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,MAAM,iBAmBhB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,iBA0BX;AAuDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,iBAgCxF;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC/F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB7D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,QAK3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BxF;AAyDD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD7E"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACX,MAAM,cAAc,CAAC;AAUtB,OAAO,EASL,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAQtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAU5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAE7D,eAAO,MAAM,YAAY,YAAY,CAAC;AA2FtC,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAI1B;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AA2GD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,MAAM,iBAmBhB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,iBA0BX;AAsDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,iBA8BxF;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC/F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,QAK3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BxF;AAyDD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D7E"}
package/dist/sync.js CHANGED
@@ -1,22 +1,25 @@
1
- import { submitAll, submitLater } from './acceptance.js';
2
1
  import { resendCalls, resendLater } from './actions.js';
3
2
  import { catchUpConversations, reconcileConversations, resendConversations, } from './conversation.js';
3
+ import { declared, sameDeclaration } from './declaration.js';
4
4
  import { applyDiscovery, discoverRooms, malformed, signIn } from './discovery.js';
5
5
  import { behind, caughtUpTo, publish, pullBootstrap, pullRefresh, reachedBy, replaced, standingAt, } from './install.js';
6
- import { heldRooms, listHeld, name, readable } from './listing.js';
7
- import { declaredAsHeld, keepNaming, retainModel, revoked, scoped } from './models.js';
6
+ import { heldRooms, name } from './listing.js';
7
+ import { retainModel, revoked, scoped } from './models.js';
8
+ import { refusalError } from './failure.js';
8
9
  import { refuse } from './refusal.js';
9
- import { emitRooms, moveTo, rest, roomUnreadable, transferring, AUTHORITY_TOPIC } from './shown.js';
10
+ import { emitRooms, moveTo, rest, roomUnreadable, submissionDue, transferring, AUTHORITY_TOPIC, } from './shown.js';
10
11
  import { unconfirmed } from './transfer.js';
11
12
  export const OPENING_LANE = 'opening';
13
+ const FINISHING = 'finishing';
12
14
  async function advance(runtime, room, local, authorized, running, unheld) {
13
- const { store, socket } = runtime;
15
+ const { store, socket, presence } = runtime;
14
16
  const live = () => running() && !store.space.full();
15
17
  if (!live())
16
18
  return unconfirmed;
17
19
  const held = unheld === undefined ? await store.record(room.locator) : undefined;
18
20
  if (socket.streamed && (held !== undefined || !store.installs.of(room.locator).beyondHorizon)) {
19
- socket.rooms.stand(room.locator, { stale: false });
21
+ presence.stood(room.locator, false);
22
+ runtime.retries.succeeded('download', room.locator);
20
23
  await name(runtime, room.locator);
21
24
  return null;
22
25
  }
@@ -27,7 +30,7 @@ async function advance(runtime, room, local, authorized, running, unheld) {
27
30
  return advance(runtime, room, local, authorized, live);
28
31
  if (refreshed !== 'beyond-horizon')
29
32
  return refreshed;
30
- if (socket.rooms.standing(room.locator).reloadDue)
33
+ if (presence.standing(room.locator).reloadDue)
31
34
  return unconfirmed;
32
35
  replaced(store, [room.locator]);
33
36
  }
@@ -45,18 +48,15 @@ async function advance(runtime, room, local, authorized, running, unheld) {
45
48
  : advance(runtime, room, local, authorized, live);
46
49
  }
47
50
  async function refreshedRoom(runtime, room, local, authorized, held, live, hold, refresh) {
48
- const { store, socket } = runtime;
49
- const { rooms } = socket;
51
+ const { store, socket, presence } = runtime;
50
52
  const refreshed = await pullRefresh(runtime, authorized, held, live, hold, refresh);
51
53
  if (!live())
52
54
  return unconfirmed;
53
55
  if (refreshed.kind === 'still-current') {
54
- rooms.stand(room.locator, { stale: false });
55
- if (rooms.standing(room.locator).unreadable) {
56
- rooms.stand(room.locator, { refusal: null });
57
- readable(runtime, room);
56
+ presence.stood(room.locator, false);
57
+ runtime.retries.succeeded('download', room.locator);
58
+ if (presence.readable(room.locator))
58
59
  emitRooms(runtime);
59
- }
60
60
  return null;
61
61
  }
62
62
  if (refreshed.kind === 'advanced') {
@@ -70,7 +70,7 @@ async function refreshedRoom(runtime, room, local, authorized, held, live, hold,
70
70
  const reached = now !== undefined && socket.reads.reached(room.locator, now, refreshed.record.roomVersion);
71
71
  return reached ? null : 'behind';
72
72
  }
73
- await retainModel(runtime, local, room, null);
73
+ await retainModel(runtime, room.locator, declared(room), null);
74
74
  return null;
75
75
  }
76
76
  return refreshed.kind === 'beyond-horizon' ? 'beyond-horizon' : refreshed;
@@ -79,43 +79,44 @@ export function advanced(runtime, room, local, authorized) {
79
79
  return runtime.socket.lanes.inRoom(room.locator, (live) => advance(runtime, room, local, authorized, live));
80
80
  }
81
81
  export async function withhold(runtime, withheld, room, local, progress) {
82
- const { store, socket, journal } = runtime;
83
- const { rooms } = socket;
84
- if (withheld.kind === 'unconfirmed' || store.fences.has(room.locator))
82
+ const { presence } = runtime;
83
+ if (withheld.kind === 'unconfirmed' || presence.lost(room.locator))
85
84
  return;
86
85
  if (withheld.kind === 'not-ready') {
87
86
  progress.complete = false;
88
87
  askAgain(runtime, room.locator);
89
88
  return;
90
89
  }
91
- rooms.stand(room.locator, { stale: true });
90
+ if (withheld.kind === 'transport-uncertainty') {
91
+ runtime.retries.uncertain('download', room.locator, withheld);
92
+ }
93
+ else if (withheld.kind === 'retryable-refusal') {
94
+ runtime.retries.failed('download', room.locator, refusalError(withheld));
95
+ }
92
96
  if (withheld.kind === 'transport-uncertainty' || withheld.kind === 'retryable-refusal') {
93
97
  const reset = withheld.kind === 'retryable-refusal' ? withheld.reset : undefined;
94
- rooms.stand(room.locator, { repairable: { reset } });
98
+ presence.stood(room.locator, true, { reset });
95
99
  repairLater(runtime, room.locator, reset === undefined ? { again: true } : { at: Date.parse(reset) });
96
100
  }
97
101
  else
98
- rooms.stand(room.locator, { repairable: null });
102
+ presence.stood(room.locator, true, null);
99
103
  if (withheld.kind === 'scoped-refusal') {
100
- await scoped(runtime, withheld, room, local);
104
+ await scoped(runtime, withheld, room.locator, declared(room));
101
105
  }
102
106
  else if (withheld.kind === 'transport-uncertainty') {
103
107
  progress.reachable = false;
104
108
  }
105
- else if (withheld.kind === 'retryable-refusal') {
106
- journal.record(`refusal ${withheld.kind} ${withheld.code}`);
107
- }
108
109
  else if (withheld.kind === 'room-not-readable') {
109
- roomUnreadable(runtime, room);
110
+ roomUnreadable(runtime, room.locator);
110
111
  }
111
112
  else if (withheld.kind === 'revoked-authorization') {
112
113
  await refuse(runtime, 'revoked-authorization');
113
114
  }
114
115
  }
115
116
  function askAgain(runtime, locator) {
116
- const { store, socket } = runtime;
117
- socket.rooms.askAgain(locator, () => {
118
- const room = socket.rooms.discovered(locator);
117
+ const { store, socket, presence } = runtime;
118
+ presence.askAgain(locator, () => {
119
+ const room = presence.room(locator);
119
120
  if (socket.closed() ||
120
121
  socket.stopping() ||
121
122
  (socket.streamed && !socket.isOpen()) ||
@@ -128,25 +129,21 @@ function askAgain(runtime, locator) {
128
129
  .then(() => rest(runtime, progress), () => undefined);
129
130
  });
130
131
  }
131
- async function prepareRoom(runtime, room, local, progress, prior) {
132
- const { socket, journal } = runtime;
132
+ async function prepareRoom(runtime, room, progress, prior) {
133
+ const { socket } = runtime;
133
134
  const { session } = socket;
134
135
  if (socket.closed() || session.now().authorization === undefined) {
135
136
  progress.complete = false;
136
137
  return false;
137
138
  }
138
- if (prior !== undefined && prior.replica.selection !== room.replica.selection) {
139
- listHeld(runtime, room.locator);
139
+ if (prior !== undefined && prior.declaration.replica.selection !== room.replica.selection) {
140
140
  emitRooms(runtime);
141
- journal.record(`selection changed ${room.locator}`);
142
141
  progress.complete = false;
143
142
  return false;
144
143
  }
145
- if (prior !== undefined && !declaredAsHeld(prior, room)) {
146
- await retainModel(runtime, local, room, null);
147
- }
148
- if (prior !== undefined && (prior.name !== room.name || prior.handle !== room.handle)) {
149
- await keepNaming(runtime, local, room);
144
+ const declaration = declared(room);
145
+ if (prior !== undefined && !sameDeclaration(prior.declaration, declaration)) {
146
+ await retainModel(runtime, room.locator, declaration, null);
150
147
  }
151
148
  const { paused, authorization } = session.now();
152
149
  if (paused || authorization === undefined)
@@ -156,22 +153,22 @@ async function prepareRoom(runtime, room, local, progress, prior) {
156
153
  async function synchronize(runtime, listed, local, progress, attempt, live) {
157
154
  const { store, socket } = runtime;
158
155
  const heldNow = await store.rooms(listed.map(({ locator }) => locator));
159
- const prepared = await Promise.allSettled(listed.map((room) => prepareRoom(runtime, room, local, progress, heldNow.get(room.locator)?.record)));
156
+ const prepared = await Promise.allSettled(listed.map((room) => prepareRoom(runtime, room, progress, heldNow.get(room.locator)?.record)));
160
157
  if (!live())
161
158
  return;
162
159
  const ready = listed.filter((_, index) => {
163
160
  const outcome = prepared[index];
164
- return outcome?.status === 'fulfilled' && outcome.value;
161
+ return outcome.status === 'fulfilled' && outcome.value;
165
162
  });
166
- const held = await heldRooms(runtime, ready);
167
- if (!live())
168
- return;
169
163
  if (attempt === 'opened') {
164
+ const held = await heldRooms(runtime, ready);
165
+ if (!live())
166
+ return;
170
167
  socket.hand(held);
171
168
  }
172
- const kept = attempt === 'unstreamed'
173
- ? new Set()
174
- : new Set((await store.rooms(ready.map(({ locator }) => locator))).keys());
169
+ const kept = attempt === 'authorized'
170
+ ? new Set((await store.rooms(ready.map(({ locator }) => locator))).keys())
171
+ : new Set();
175
172
  for (const room of ready) {
176
173
  if (attempt === 'opened' || kept.has(room.locator)) {
177
174
  if (attempt === 'authorized')
@@ -204,7 +201,7 @@ export async function loadRoom(runtime, room, local, progress, live, unheld) {
204
201
  return;
205
202
  const prior = unheld === undefined ? await store.record(room.locator) : undefined;
206
203
  if (prior !== undefined) {
207
- if (!(await prepareRoom(runtime, room, local, progress, prior)))
204
+ if (!(await prepareRoom(runtime, room, progress, prior)))
208
205
  return;
209
206
  if (revoked(prior.model)) {
210
207
  await reload(runtime, room, local, progress, live);
@@ -219,10 +216,10 @@ export async function loadRoom(runtime, room, local, progress, live, unheld) {
219
216
  await caughtUp(runtime, room, local, progress, live);
220
217
  }
221
218
  export async function reload(runtime, room, local, progress, live) {
222
- const { store, socket } = runtime;
219
+ const { store, socket, presence } = runtime;
223
220
  try {
224
221
  if (live())
225
- socket.rooms.stand(room.locator, { reloadDue: false });
222
+ presence.reload(room.locator, false);
226
223
  const { authorization } = socket.session.now();
227
224
  if (!live() || authorization === undefined)
228
225
  return;
@@ -242,24 +239,23 @@ export async function reload(runtime, room, local, progress, live) {
242
239
  }
243
240
  }
244
241
  function repairLater(runtime, locator, when) {
245
- const { socket, recovery } = runtime;
246
- if (!socket.isOpen() || socket.rooms.standing(locator).repairing)
242
+ const { socket, presence, recovery } = runtime;
243
+ if (!socket.isOpen() || presence.standing(locator).repairing)
247
244
  return;
248
245
  void recovery.attempt(`repair ${locator}`, (signal) => repairPass(runtime, locator, signal), when);
249
246
  }
250
247
  async function repairPass(runtime, locator, signal) {
251
- const { store, socket } = runtime;
252
- const { rooms } = socket;
253
- const room = rooms.discovered(locator);
248
+ const { store, socket, presence } = runtime;
249
+ const room = presence.room(locator);
254
250
  if (!socket.isOpen() ||
255
251
  !socket.continuing() ||
256
252
  socket.stopping() ||
257
- !rooms.standing(locator).stale)
253
+ !presence.standing(locator).stale)
258
254
  return 'done';
259
255
  if (room === undefined || room.replica.admission !== 'admitted')
260
256
  return 'done';
261
257
  const progress = { complete: true, reachable: true };
262
- rooms.stand(locator, { repairing: true });
258
+ presence.repairing(locator, true);
263
259
  try {
264
260
  const local = await store.open();
265
261
  await socket.lanes.roomTask(locator, async (live) => {
@@ -272,36 +268,34 @@ async function repairPass(runtime, locator, signal) {
272
268
  });
273
269
  }
274
270
  catch {
275
- rooms.stand(locator, { stale: true });
271
+ presence.stood(locator, true);
276
272
  progress.reachable = false;
277
273
  }
278
274
  finally {
279
- rooms.stand(locator, { repairing: false });
275
+ presence.repairing(locator, false);
280
276
  }
281
277
  if (signal.aborted)
282
278
  return 'done';
283
279
  await rest(runtime, progress);
284
- if (!rooms.standing(locator).stale) {
285
- if ((await (await store.open()).order(locator)).length > 0)
286
- submitLater(runtime, locator);
280
+ if (!presence.standing(locator).stale) {
281
+ await submissionDue(runtime, [locator]);
287
282
  return 'done';
288
283
  }
289
- const { repairable } = rooms.standing(locator);
284
+ const { repairable } = presence.standing(locator);
290
285
  if (repairable === null)
291
286
  return 'done';
292
287
  return repairable.reset === undefined ? 'again' : { at: Date.parse(repairable.reset) };
293
288
  }
294
289
  export async function finishOpening(runtime, progress, live) {
295
- const { socket, conversations, recovery } = runtime;
290
+ const { socket, presence, conversations, recovery } = runtime;
296
291
  try {
297
292
  if (!live()) {
298
293
  progress.complete = false;
299
294
  return;
300
295
  }
301
- await submitAll(runtime);
302
- for (const locator of socket.rooms.standingWhere(({ stale, repairable }) => stale && repairable !== null)) {
296
+ await submissionDue(runtime);
297
+ for (const locator of presence.repairsOwed())
303
298
  repairLater(runtime, locator, {});
304
- }
305
299
  await reconcileConversations(conversations);
306
300
  const reading = { complete: true, reachable: true };
307
301
  await catchUpConversations(conversations, reading);
@@ -314,8 +308,10 @@ export async function finishOpening(runtime, progress, live) {
314
308
  progress.reachable = false;
315
309
  resendLater(runtime);
316
310
  }
311
+ runtime.retries.succeeded('conversations', FINISHING);
317
312
  }
318
- catch {
313
+ catch (error) {
314
+ runtime.retries.failed('conversations', FINISHING, error);
319
315
  progress.complete = false;
320
316
  }
321
317
  finally {
@@ -351,8 +347,10 @@ export function sync(runtime, attempt, found) {
351
347
  const listed = await discoverRooms(runtime, local, progress, live, found);
352
348
  if (listed !== null)
353
349
  await synchronize(runtime, listed, local, progress, attempt, live);
350
+ runtime.retries.succeeded('connection', OPENING_LANE);
354
351
  }
355
- catch {
352
+ catch (error) {
353
+ runtime.retries.failed('connection', OPENING_LANE, error);
356
354
  progress.complete = false;
357
355
  if (attempt === 'opened' && !socket.isHanded())
358
356
  progress.reachable = false;
@@ -373,7 +371,7 @@ export function sync(runtime, attempt, found) {
373
371
  });
374
372
  }
375
373
  export function resynchronize(runtime) {
376
- const { store, socket } = runtime;
374
+ const { store, socket, presence } = runtime;
377
375
  return socket.lanes.task(OPENING_LANE, async (live) => {
378
376
  if (!live() || !socket.isAnnounced())
379
377
  return;
@@ -383,9 +381,11 @@ export function resynchronize(runtime) {
383
381
  const local = await store.open();
384
382
  if (!live())
385
383
  return;
386
- await synchronize(runtime, socket.rooms.discoveredRooms(), local, progress, 'unstreamed', live);
384
+ await synchronize(runtime, presence.rooms(), local, progress, 'unstreamed', live);
385
+ runtime.retries.succeeded('download', OPENING_LANE);
387
386
  }
388
- catch {
387
+ catch (error) {
388
+ runtime.retries.failed('download', OPENING_LANE, error);
389
389
  progress.complete = false;
390
390
  }
391
391
  if (live())
@@ -399,7 +399,7 @@ export function countAuthorityChange({ store, socket, lastAnswers }) {
399
399
  lastAnswers.again();
400
400
  }
401
401
  export function changeAuthority(runtime, change) {
402
- const { store, socket, journal } = runtime;
402
+ const { store, socket } = runtime;
403
403
  const { session } = socket;
404
404
  return socket.lanes.task(OPENING_LANE, async (live) => {
405
405
  if (!live() || !socket.isAnnounced())
@@ -413,7 +413,6 @@ export function changeAuthority(runtime, change) {
413
413
  return;
414
414
  const invalid = malformed(change.rooms);
415
415
  if (invalid !== null) {
416
- journal.record(invalid);
417
416
  await refuse(runtime, 'missing-required-guarantee');
418
417
  return;
419
418
  }
@@ -423,8 +422,10 @@ export function changeAuthority(runtime, change) {
423
422
  session.set({ discoveries });
424
423
  const listed = await applyDiscovery(runtime, change.rooms, discoveries, change.left);
425
424
  await synchronize(runtime, listed, local, progress, 'authorized', live);
425
+ runtime.retries.succeeded('connection', OPENING_LANE);
426
426
  }
427
- catch {
427
+ catch (error) {
428
+ runtime.retries.failed('connection', OPENING_LANE, error);
428
429
  progress.complete = false;
429
430
  }
430
431
  if (!live())
@@ -469,8 +470,8 @@ async function installCarried(runtime, room, local, change, live, progress) {
469
470
  await publish(runtime, local, room, bootstrapped.record, { kind: 'bootstrapped', refreshed: bootstrapped.refreshed, from }, live);
470
471
  }
471
472
  export function applyRoom(runtime, change) {
472
- const { store, socket } = runtime;
473
- const { rooms, session } = socket;
473
+ const { store, socket, presence } = runtime;
474
+ const { session } = socket;
474
475
  const { locator } = change;
475
476
  if (socket.stopping())
476
477
  return Promise.resolve();
@@ -483,7 +484,7 @@ export function applyRoom(runtime, change) {
483
484
  for (;;) {
484
485
  if (!live())
485
486
  return null;
486
- const room = rooms.discovered(locator);
487
+ const room = presence.room(locator);
487
488
  if (room === undefined || room.replica.admission !== 'admitted')
488
489
  return null;
489
490
  const held = await store.record(locator);
@@ -493,7 +494,7 @@ export function applyRoom(runtime, change) {
493
494
  await installCarried(runtime, room, local, change, live, progress);
494
495
  return progress;
495
496
  }
496
- if (held.replica.selection !== room.replica.selection)
497
+ if (held.declaration.replica.selection !== room.replica.selection)
497
498
  return null;
498
499
  const at = held.roomVersion;
499
500
  if (socket.reads.reached(locator, at, change.roomVersion))
@@ -514,17 +515,19 @@ export function applyRoom(runtime, change) {
514
515
  remodelled: refreshed.remodelled,
515
516
  };
516
517
  if (await publish(runtime, local, room, refreshed.record, landing, writing)) {
517
- rooms.stand(locator, { stale: false });
518
- if (!declaredAsHeld(held, room))
519
- await retainModel(runtime, local, room, null);
518
+ presence.stood(locator, false);
519
+ const declaration = declared(room);
520
+ if (!sameDeclaration(held.declaration, declaration))
521
+ await retainModel(runtime, locator, declaration, null);
520
522
  return progress;
521
523
  }
522
524
  }
523
525
  }
524
- catch {
525
- if (!rooms.standing(locator).stale)
526
+ catch (error) {
527
+ runtime.retries.failed('download', locator, error);
528
+ if (!presence.standing(locator).stale)
526
529
  void name(runtime, locator);
527
- rooms.stand(locator, { stale: true });
530
+ presence.stood(locator, true);
528
531
  return progress;
529
532
  }
530
533
  })
package/dist/tables.d.ts CHANGED
@@ -1,15 +1,14 @@
1
1
  import { type QueryAnswer, type QueryRoom } from './compile.js';
2
2
  import type { Composed } from './collection.js';
3
3
  import type { UnsentWork } from './durability.js';
4
- import type { JobMarker } from './job.js';
5
- import { type ConversationWrite, type HeldConversation, type HeldRow, type MessageWindow } from './messages.js';
4
+ import { type ConversationWrite, type HeldConversation, type HeldFact, type HeldRow, type MessageWindow } from './messages.js';
6
5
  import type { GroupTotal, Plan } from './query.js';
7
6
  import { type ReadAt } from './reads.js';
8
7
  import { type ConversationTally, type RoomTally } from './tallies.js';
9
8
  import { type Committed, type Covering, type HeldEntry, type HeldLocators, type HeldRoomRow, type HeldRoomWork, type ReplicaOpened, type Referrer, type Resumed, type RoomCommit, type StoredEntry, type TypedEntry, type View } from './stored.js';
10
9
  export type { Committed, Covering, HeldEntry, HeldLocators, HeldRoomRow, HeldRoomWork, OverlayEntry, ReplicaOpened, Referrer, Resumed, RoomCommit, StoredEntry, TypedEntry, View, } from './stored.js';
11
10
  export type { QueryAnswer, QueryRoom } from './compile.js';
12
- export type { ConversationWrite, HeldConversation, HeldRow, MessageWindow } from './messages.js';
11
+ export type { ConversationFact, ConversationWrite, HeldConversation, HeldFact, HeldRow, MessageWindow, } from './messages.js';
13
12
  export type { ConversationTally, RoomTally } from './tallies.js';
14
13
  export type Value = string | number | bigint | Uint8Array | null;
15
14
  export type Row = Readonly<Record<string, Value>>;
@@ -249,7 +248,6 @@ export interface RuntimeRequests {
249
248
  }, readonly Referrer[]>;
250
249
  readonly 'replica.folders': Asked<{
251
250
  readonly key: number;
252
- readonly view: View;
253
251
  readonly paths: readonly string[];
254
252
  }, readonly string[]>;
255
253
  readonly 'replica.typedWithin': Asked<{
@@ -378,16 +376,16 @@ export interface RuntimeRequests {
378
376
  readonly 'conversation.rows': Asked<{
379
377
  readonly conversations: readonly string[];
380
378
  }, readonly HeldRow[]>;
381
- readonly 'conversation.jobs': Asked<{
382
- readonly conversation: string;
383
- }, readonly JobMarker[]>;
384
379
  readonly 'conversation.tallies': Asked<{
385
380
  readonly conversations: readonly string[] | null;
386
381
  readonly since: string;
387
382
  }, readonly ConversationTally[]>;
383
+ readonly 'conversation.facts': Asked<Nothing, readonly HeldFact[]>;
384
+ readonly 'conversation.fact': Asked<HeldFact, null>;
385
+ readonly 'conversation.stored': Asked<Nothing, readonly string[]>;
388
386
  readonly 'conversation.drop': Asked<{
389
387
  readonly conversations: readonly string[];
390
- }, null>;
388
+ }, readonly string[]>;
391
389
  readonly 'space.probe': Asked<Nothing, null>;
392
390
  readonly 'read.stored': Asked<ReadAt, string | null>;
393
391
  readonly 'read.keep': Asked<ReadAt & {