@agentshouse/mdruntime 0.1.0-ce41fec66d91b → 0.1.0-ce46f015571d6

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 (308) hide show
  1. package/README.md +10 -10
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +318 -0
  5. package/dist/act-lanes.d.ts +29 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +177 -0
  8. package/dist/actions.d.ts +25 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +261 -0
  11. package/dist/adapter.d.ts +71 -69
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +21 -56
  16. package/dist/bootstrap.d.ts +9 -5
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +204 -85
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +2 -1
  23. package/dist/chain.d.ts.map +1 -1
  24. package/dist/change-set.d.ts +4 -0
  25. package/dist/change-set.d.ts.map +1 -1
  26. package/dist/change-set.js +6 -0
  27. package/dist/change.d.ts +1 -0
  28. package/dist/change.d.ts.map +1 -1
  29. package/dist/change.js +4 -2
  30. package/dist/chat-types.d.ts +5 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +13 -0
  33. package/dist/client.d.ts +25 -14
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +32 -14
  36. package/dist/collection.d.ts +23 -4
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +12 -2
  39. package/dist/compile.d.ts +6 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +240 -315
  42. package/dist/connection.d.ts +5 -141
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +110 -5057
  45. package/dist/context.d.ts +2 -0
  46. package/dist/context.d.ts.map +1 -0
  47. package/dist/context.js +7 -0
  48. package/dist/conversation-live.d.ts +138 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +249 -0
  51. package/dist/conversation-row.d.ts +33 -0
  52. package/dist/conversation-row.d.ts.map +1 -0
  53. package/dist/conversation-row.js +53 -0
  54. package/dist/conversation.d.ts +54 -45
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +930 -899
  57. package/dist/declaration.d.ts +10 -0
  58. package/dist/declaration.d.ts.map +1 -0
  59. package/dist/declaration.js +24 -0
  60. package/dist/discovery.d.ts +10 -0
  61. package/dist/discovery.d.ts.map +1 -0
  62. package/dist/discovery.js +153 -0
  63. package/dist/durability.d.ts +18 -0
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/entry.d.ts +2 -2
  66. package/dist/entry.d.ts.map +1 -1
  67. package/dist/entry.js +17 -7
  68. package/dist/expectation.d.ts +26 -13
  69. package/dist/expectation.d.ts.map +1 -1
  70. package/dist/expectation.js +72 -19
  71. package/dist/failure.d.ts +3 -0
  72. package/dist/failure.d.ts.map +1 -1
  73. package/dist/failure.js +6 -0
  74. package/dist/figures.d.ts +49 -0
  75. package/dist/figures.d.ts.map +1 -0
  76. package/dist/figures.js +197 -0
  77. package/dist/holdings.d.ts +29 -0
  78. package/dist/holdings.d.ts.map +1 -0
  79. package/dist/holdings.js +95 -0
  80. package/dist/host.d.ts +20 -6
  81. package/dist/host.d.ts.map +1 -1
  82. package/dist/host.js +61 -30
  83. package/dist/identity.d.ts +0 -1
  84. package/dist/identity.d.ts.map +1 -1
  85. package/dist/identity.js +0 -3
  86. package/dist/index.d.ts +31 -10
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +13 -3
  89. package/dist/install.d.ts +54 -0
  90. package/dist/install.d.ts.map +1 -0
  91. package/dist/install.js +539 -0
  92. package/dist/lifecycle.d.ts +7 -0
  93. package/dist/lifecycle.d.ts.map +1 -0
  94. package/dist/lifecycle.js +279 -0
  95. package/dist/listing.d.ts +48 -0
  96. package/dist/listing.d.ts.map +1 -0
  97. package/dist/listing.js +139 -0
  98. package/dist/live.d.ts +5 -4
  99. package/dist/live.d.ts.map +1 -1
  100. package/dist/live.js +63 -21
  101. package/dist/locks.d.ts +7 -0
  102. package/dist/locks.d.ts.map +1 -0
  103. package/dist/locks.js +33 -0
  104. package/dist/log.d.ts +1 -0
  105. package/dist/log.d.ts.map +1 -1
  106. package/dist/lost.d.ts +5 -0
  107. package/dist/lost.d.ts.map +1 -0
  108. package/dist/lost.js +50 -0
  109. package/dist/media.d.ts +1 -1
  110. package/dist/media.d.ts.map +1 -1
  111. package/dist/media.js +4 -4
  112. package/dist/memory.d.ts +8 -2
  113. package/dist/memory.d.ts.map +1 -1
  114. package/dist/memory.js +83 -26
  115. package/dist/messages.d.ts +24 -3
  116. package/dist/messages.d.ts.map +1 -1
  117. package/dist/messages.js +92 -32
  118. package/dist/model.d.ts +2 -10
  119. package/dist/model.d.ts.map +1 -1
  120. package/dist/model.js +0 -14
  121. package/dist/models.d.ts +10 -0
  122. package/dist/models.d.ts.map +1 -0
  123. package/dist/models.js +156 -0
  124. package/dist/observation.d.ts +2 -2
  125. package/dist/observation.d.ts.map +1 -1
  126. package/dist/observation.js +14 -14
  127. package/dist/opened.d.ts +1 -1
  128. package/dist/opened.d.ts.map +1 -1
  129. package/dist/opened.js +5 -5
  130. package/dist/opening.d.ts +4 -0
  131. package/dist/opening.d.ts.map +1 -0
  132. package/dist/opening.js +59 -0
  133. package/dist/outcome.d.ts +7 -1
  134. package/dist/outcome.d.ts.map +1 -1
  135. package/dist/outcome.js +18 -0
  136. package/dist/overlay.d.ts +3 -1
  137. package/dist/overlay.d.ts.map +1 -1
  138. package/dist/overlay.js +43 -21
  139. package/dist/page-metadata.d.ts +8 -0
  140. package/dist/page-metadata.d.ts.map +1 -0
  141. package/dist/page-metadata.js +19 -0
  142. package/dist/parts.d.ts +11 -0
  143. package/dist/parts.d.ts.map +1 -0
  144. package/dist/parts.js +21 -0
  145. package/dist/paths.d.ts +1 -0
  146. package/dist/paths.d.ts.map +1 -1
  147. package/dist/paths.js +22 -0
  148. package/dist/preparation.d.ts +20 -0
  149. package/dist/preparation.d.ts.map +1 -0
  150. package/dist/preparation.js +233 -0
  151. package/dist/presence.d.ts +52 -0
  152. package/dist/presence.d.ts.map +1 -0
  153. package/dist/presence.js +220 -0
  154. package/dist/queries.d.ts +16 -0
  155. package/dist/queries.d.ts.map +1 -0
  156. package/dist/queries.js +270 -0
  157. package/dist/query.d.ts +13 -209
  158. package/dist/query.d.ts.map +1 -1
  159. package/dist/query.js +3 -505
  160. package/dist/questions.d.ts +34 -0
  161. package/dist/questions.d.ts.map +1 -0
  162. package/dist/questions.js +122 -0
  163. package/dist/queue.d.ts +40 -0
  164. package/dist/queue.d.ts.map +1 -0
  165. package/dist/queue.js +455 -0
  166. package/dist/reach.d.ts +14 -12
  167. package/dist/reach.d.ts.map +1 -1
  168. package/dist/reach.js +193 -121
  169. package/dist/react.d.ts +15 -2
  170. package/dist/react.d.ts.map +1 -1
  171. package/dist/react.js +33 -1
  172. package/dist/read.d.ts +7 -0
  173. package/dist/read.d.ts.map +1 -0
  174. package/dist/read.js +17 -0
  175. package/dist/readiness.d.ts +0 -3
  176. package/dist/readiness.d.ts.map +1 -1
  177. package/dist/reads.d.ts +39 -0
  178. package/dist/reads.d.ts.map +1 -0
  179. package/dist/reads.js +178 -0
  180. package/dist/recovery.d.ts +3 -1
  181. package/dist/recovery.d.ts.map +1 -1
  182. package/dist/recovery.js +38 -8
  183. package/dist/refresh.d.ts +1 -1
  184. package/dist/refresh.d.ts.map +1 -1
  185. package/dist/refresh.js +9 -2
  186. package/dist/refusal.d.ts +5 -0
  187. package/dist/refusal.d.ts.map +1 -0
  188. package/dist/refusal.js +57 -0
  189. package/dist/replica.d.ts +11 -16
  190. package/dist/replica.d.ts.map +1 -1
  191. package/dist/replica.js +64 -30
  192. package/dist/retried.d.ts +30 -0
  193. package/dist/retried.d.ts.map +1 -0
  194. package/dist/retried.js +72 -0
  195. package/dist/room-draft.d.ts +7 -8
  196. package/dist/room-draft.d.ts.map +1 -1
  197. package/dist/room-draft.js +100 -103
  198. package/dist/room-drafts.d.ts +24 -0
  199. package/dist/room-drafts.d.ts.map +1 -0
  200. package/dist/room-drafts.js +217 -0
  201. package/dist/rows.d.ts +14 -21
  202. package/dist/rows.d.ts.map +1 -1
  203. package/dist/rows.js +49 -186
  204. package/dist/runtime.d.ts +36 -0
  205. package/dist/runtime.d.ts.map +1 -0
  206. package/dist/runtime.js +1 -0
  207. package/dist/save.d.ts +41 -86
  208. package/dist/save.d.ts.map +1 -1
  209. package/dist/save.js +239 -116
  210. package/dist/saves.d.ts +32 -0
  211. package/dist/saves.d.ts.map +1 -0
  212. package/dist/saves.js +413 -0
  213. package/dist/search.d.ts +12 -63
  214. package/dist/search.d.ts.map +1 -1
  215. package/dist/search.js +9 -52
  216. package/dist/seed.d.ts +11 -2
  217. package/dist/seed.d.ts.map +1 -1
  218. package/dist/seed.js +71 -1
  219. package/dist/shared.d.ts +1 -6
  220. package/dist/shared.d.ts.map +1 -1
  221. package/dist/shared.js +13 -95
  222. package/dist/shown.d.ts +32 -0
  223. package/dist/shown.d.ts.map +1 -0
  224. package/dist/shown.js +290 -0
  225. package/dist/socket/admission.d.ts +7 -0
  226. package/dist/socket/admission.d.ts.map +1 -0
  227. package/dist/socket/admission.js +39 -0
  228. package/dist/socket/answers.d.ts +6 -0
  229. package/dist/socket/answers.d.ts.map +1 -0
  230. package/dist/socket/answers.js +20 -0
  231. package/dist/socket/lanes.d.ts +21 -0
  232. package/dist/socket/lanes.d.ts.map +1 -0
  233. package/dist/socket/lanes.js +80 -0
  234. package/dist/socket/reads.d.ts +10 -0
  235. package/dist/socket/reads.d.ts.map +1 -0
  236. package/dist/socket/reads.js +31 -0
  237. package/dist/socket/session.d.ts +38 -0
  238. package/dist/socket/session.d.ts.map +1 -0
  239. package/dist/socket/session.js +23 -0
  240. package/dist/socket.d.ts +68 -0
  241. package/dist/socket.d.ts.map +1 -0
  242. package/dist/socket.js +171 -0
  243. package/dist/source.d.ts +61 -0
  244. package/dist/source.d.ts.map +1 -0
  245. package/dist/source.js +82 -0
  246. package/dist/status.d.ts +0 -2
  247. package/dist/status.d.ts.map +1 -1
  248. package/dist/status.js +0 -6
  249. package/dist/store/installs.d.ts +30 -0
  250. package/dist/store/installs.d.ts.map +1 -0
  251. package/dist/store/installs.js +34 -0
  252. package/dist/store/readiness.d.ts +10 -0
  253. package/dist/store/readiness.d.ts.map +1 -0
  254. package/dist/store/readiness.js +52 -0
  255. package/dist/store/records.d.ts +212 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +430 -0
  258. package/dist/store/room-held.d.ts +8 -0
  259. package/dist/store/room-held.d.ts.map +1 -0
  260. package/dist/store/room-held.js +17 -0
  261. package/dist/store/space.d.ts +11 -0
  262. package/dist/store/space.d.ts.map +1 -0
  263. package/dist/store/space.js +41 -0
  264. package/dist/store/watchers.d.ts +17 -0
  265. package/dist/store/watchers.d.ts.map +1 -0
  266. package/dist/store/watchers.js +56 -0
  267. package/dist/store/writes.d.ts +24 -0
  268. package/dist/store/writes.d.ts.map +1 -0
  269. package/dist/store/writes.js +125 -0
  270. package/dist/store.d.ts +112 -145
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +167 -365
  273. package/dist/stored.d.ts +59 -33
  274. package/dist/stored.d.ts.map +1 -1
  275. package/dist/stored.js +279 -190
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +223 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +540 -0
  282. package/dist/tables.d.ts +116 -29
  283. package/dist/tables.d.ts.map +1 -1
  284. package/dist/tables.js +213 -54
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +129 -0
  288. package/dist/validation.d.ts.map +1 -1
  289. package/dist/validation.js +8 -5
  290. package/dist/windows.d.ts +1 -12
  291. package/dist/windows.d.ts.map +1 -1
  292. package/dist/windows.js +2 -75
  293. package/dist/wire.d.ts +57 -5
  294. package/dist/wire.d.ts.map +1 -1
  295. package/dist/wire.js +19 -3
  296. package/package.json +3 -2
  297. package/dist/attempt.d.ts +0 -16
  298. package/dist/attempt.d.ts.map +0 -1
  299. package/dist/attempt.js +0 -70
  300. package/dist/fence.d.ts +0 -6
  301. package/dist/fence.d.ts.map +0 -1
  302. package/dist/fence.js +0 -10
  303. package/dist/fulltext.d.ts +0 -27
  304. package/dist/fulltext.d.ts.map +0 -1
  305. package/dist/fulltext.js +0 -370
  306. package/dist/words.d.ts +0 -19
  307. package/dist/words.d.ts.map +0 -1
  308. package/dist/words.js +0 -156
package/dist/reach.js CHANGED
@@ -1,12 +1,12 @@
1
+ import { selected } from './collection.js';
1
2
  import { unheldView } from './conversation.js';
2
3
  import { modelTypes, NO_MODEL } from './model.js';
3
4
  import { changeOf, digestApplied, digestOf, observing, } from './observation.js';
4
- import { runtimeError } from './failure.js';
5
+ import { runtimeError, uncaught } from './failure.js';
5
6
  import { failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
6
7
  import { beneath } from './paths.js';
7
8
  import { moveTarget, readParts, staleWrite, } from './room-draft.js';
8
9
  import { documentKey } from './rows.js';
9
- import { undeclaredSearch } from './search.js';
10
10
  const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
11
11
  function unconversed(name) {
12
12
  return () => Promise.resolve(undeclared(name));
@@ -20,6 +20,15 @@ const NO_CONVERSATION = {
20
20
  interrupt: unconversed('conversations/interrupt'),
21
21
  kill: unconversed('conversations/kill'),
22
22
  delete: unconversed('conversations/delete'),
23
+ takeOut: unconversed('conversations/take-out'),
24
+ decide: unconversed('agent-functions/decide'),
25
+ rename: unconversed('conversations/rename'),
26
+ option: unconversed('conversations/option/set'),
27
+ retry: unconversed('conversations/retry'),
28
+ pins: () => Promise.resolve([]),
29
+ pin: () => Promise.resolve(),
30
+ openedTurns: () => Promise.resolve({}),
31
+ openTurn: () => Promise.resolve(),
23
32
  };
24
33
  const NO_CHAT_DRAFT = {
25
34
  write: () => Promise.resolve(),
@@ -46,11 +55,11 @@ export function governs(reach, room) {
46
55
  if (wholly(reach, room.locator)) {
47
56
  return { collection: true, selection: room.typedSelection !== null };
48
57
  }
49
- const selected = (path) => room.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
58
+ const within = (path) => selected({ selection: room.typedSelection }, path);
50
59
  const paths = reach.documents
51
60
  .filter((document) => document.room === room.locator)
52
61
  .map(({ path }) => path);
53
- return { collection: paths.some((path) => !selected(path)), selection: paths.some(selected) };
62
+ return { collection: paths.some((path) => !within(path)), selection: paths.some(within) };
54
63
  }
55
64
  function covers(reach, room, path) {
56
65
  return (reach === null ||
@@ -144,7 +153,7 @@ function lockedError(room) {
144
153
  return runtimeError(ROOM_LOCKED, `${room} is locked until House confirms its access`, true);
145
154
  }
146
155
  function deviceUnreached() {
147
- return runtimeError('device-unreached', 'Only the panel cleans up this device');
156
+ return runtimeError('device-unreached', 'Only the panel reaches this device');
148
157
  }
149
158
  const ATTACH_REQUIRED = 'attach-required';
150
159
  function attachRequired() {
@@ -153,10 +162,9 @@ function attachRequired() {
153
162
  function carriesFile(parts) {
154
163
  return parts !== null && typeof parts === 'object' && Object.hasOwn(parts, 'file');
155
164
  }
156
- export function narrowed(runtime, given, told) {
165
+ export function narrowed(runtime, given, port) {
157
166
  const { md, watch } = runtime;
158
167
  let reach = given;
159
- let port = told;
160
168
  const open = new Set();
161
169
  function following(begin, locking = false) {
162
170
  let stop = begin();
@@ -172,70 +180,127 @@ export function narrowed(runtime, given, told) {
172
180
  stop();
173
181
  };
174
182
  }
175
- const unlocking = (rooms) => {
176
- const locked = (rooms ?? []).filter((room) => runtime.locked(room));
177
- return locked.length === 0
178
- ? null
179
- : { pending: locked.map((room) => ({ room, awaits: 'unlock' })) };
183
+ const unlocking = (rooms, locked) => {
184
+ const held = (rooms ?? []).filter((room) => locked.includes(room));
185
+ return held.length === 0 ? null : { pending: held.map((room) => ({ room, awaits: 'unlock' })) };
180
186
  };
181
- const unlocked = (entries) => entries.filter((entry) => !runtime.locked(entry.room));
182
- const intoLocked = (held) => held.some((move) => move?.room !== undefined && runtime.locked(move.room));
183
- const within = (topic, input, deliver) => {
187
+ const unlocked = (entries, locked) => entries.filter((entry) => !locked.includes(entry.room));
188
+ const intoLocked = async (held) => {
189
+ for (const move of held) {
190
+ if (move?.room !== undefined && (await runtime.locked(move.room)))
191
+ return true;
192
+ }
193
+ return false;
194
+ };
195
+ function ordered(deliver) {
196
+ let open = true;
197
+ let shown = Promise.resolve();
198
+ return {
199
+ push(making) {
200
+ shown = shown.then(() => making.then((value) => {
201
+ if (open)
202
+ deliver(value);
203
+ }, uncaught), uncaught);
204
+ },
205
+ stop() {
206
+ open = false;
207
+ },
208
+ };
209
+ }
210
+ function unlockedWatch(topic, input, deliver, fail, within) {
211
+ const shown = ordered(deliver);
212
+ const stop = watch(topic, input, (message) => {
213
+ shown.push(runtime.lockedRooms().then((locked) => within(message, locked)));
214
+ }, fail);
215
+ return () => {
216
+ shown.stop();
217
+ stop();
218
+ };
219
+ }
220
+ function lockedFirst(room, start, shut) {
221
+ let open = true;
222
+ let stop = () => { };
223
+ void (async () => {
224
+ const closed = !holds(reach, room) || (await runtime.locked(room));
225
+ if (!open)
226
+ return;
227
+ if (closed)
228
+ shut();
229
+ else
230
+ stop = start();
231
+ })();
232
+ return () => {
233
+ open = false;
234
+ stop();
235
+ };
236
+ }
237
+ const within = (topic, input, deliver, fail) => {
238
+ if (topic === 'read' && reach !== null) {
239
+ fail(deviceUnreached());
240
+ return () => { };
241
+ }
184
242
  if (topic === 'rooms') {
185
- return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
243
+ return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms)), fail));
186
244
  }
187
245
  if (topic === 'readiness') {
188
246
  return following(() => runtime.watchReadiness(port, reach, deliver));
189
247
  }
190
248
  if (topic === 'sync-status') {
191
- return following(() => watch(topic, input, (status) => {
192
- const within = statusWithin(reach, status);
193
- deliver({ ...within, attentionRequired: unlocked(within.attentionRequired) });
249
+ return following(() => unlockedWatch(topic, input, deliver, fail, (status, locked) => {
250
+ const shown = statusWithin(reach, status);
251
+ return { ...shown, attentionRequired: unlocked(shown.attentionRequired, locked) };
194
252
  }), true);
195
253
  }
196
254
  if (topic === 'room-drafts') {
197
- return following(() => watch(topic, input, (drafts) => deliver(unlocked(draftsWithin(reach, drafts)))), true);
255
+ return following(() => unlockedWatch(topic, input, deliver, fail, (drafts, locked) => unlocked(draftsWithin(reach, drafts), locked)), true);
198
256
  }
199
257
  if (topic === 'queue') {
200
258
  const room = input[0];
201
- return following(() => {
202
- if (!holds(reach, room) || runtime.locked(room)) {
203
- deliver([]);
204
- return () => { };
205
- }
206
- return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
207
- }, true);
259
+ return following(() => lockedFirst(room, () => watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)), fail), () => deliver([])), true);
208
260
  }
209
261
  if (topic === 'query') {
210
- const plan = runtime.plan(input[0], reach);
262
+ const planning = runtime.plan(input[0], reach);
211
263
  let held = null;
212
264
  return following(() => {
213
- const locked = unlocking(plan.rooms);
214
- if (locked !== null) {
215
- const answer = { result: locked, keys: [] };
216
- if (held === null || changeOf(held, answer) !== null)
217
- deliver(answer);
218
- held = digestOf(answer);
219
- return () => { };
220
- }
221
- let first = true;
222
265
  let open = true;
223
- const heard = (message) => {
224
- if (!first) {
225
- held = digestApplied(held, message);
226
- deliver(message);
266
+ let stop = () => { };
267
+ void (async () => {
268
+ const plan = await planning;
269
+ const locked = await runtime.lockedRooms();
270
+ if (!open)
271
+ return;
272
+ const pending = unlocking(plan.rooms, locked);
273
+ if (pending !== null) {
274
+ const answer = { result: pending, keys: [] };
275
+ if (held === null || changeOf(held, answer) !== null)
276
+ deliver(answer);
277
+ held = digestOf(answer);
227
278
  return;
228
279
  }
229
- first = false;
230
- const change = held === null ? message : changeOf(held, message);
231
- held = digestOf(message);
232
- if (change !== null)
233
- deliver(change);
234
- };
235
- const current = { ...plan, reach: planReach(reach), locked: runtime.lockedRooms() };
236
- const stop = runtime.watchPlan(current, (message) => {
280
+ let first = true;
281
+ const heard = (message) => {
282
+ if (!first) {
283
+ held = digestApplied(held, message);
284
+ deliver(message);
285
+ return;
286
+ }
287
+ first = false;
288
+ const change = held === null ? message : changeOf(held, message);
289
+ held = digestOf(message);
290
+ if (change !== null)
291
+ deliver(change);
292
+ };
293
+ const current = { ...plan, reach: planReach(reach), locked };
294
+ stop = runtime.watchPlan(current, (message) => {
295
+ if (open)
296
+ heard(message);
297
+ }, (error) => {
298
+ if (open)
299
+ fail(error);
300
+ });
301
+ })().catch((error) => {
237
302
  if (open)
238
- heard(message);
303
+ fail(error);
239
304
  });
240
305
  return () => {
241
306
  open = false;
@@ -246,7 +311,7 @@ export function narrowed(runtime, given, told) {
246
311
  if (topic === 'conversation') {
247
312
  return following(() => {
248
313
  if (conversing(reach))
249
- return watch(topic, input, deliver);
314
+ return watch(topic, input, deliver, fail);
250
315
  deliver(unheldView(input[0]));
251
316
  return () => { };
252
317
  });
@@ -254,12 +319,18 @@ export function narrowed(runtime, given, told) {
254
319
  if (topic === 'conversations' || topic === 'agents') {
255
320
  return following(() => {
256
321
  if (conversing(reach))
257
- return watch(topic, input, deliver);
322
+ return watch(topic, input, deliver, fail);
258
323
  deliver([]);
259
324
  return () => { };
260
325
  });
261
326
  }
262
- return watch(topic, input, deliver);
327
+ if (topic === 'figures' || topic === 'holdings') {
328
+ if (reach === null)
329
+ return watch(topic, input, deliver, fail);
330
+ fail(deviceUnreached());
331
+ return () => { };
332
+ }
333
+ return watch(topic, input, deliver, fail);
263
334
  };
264
335
  const files = new Map();
265
336
  let handed = 0;
@@ -277,33 +348,33 @@ export function narrowed(runtime, given, told) {
277
348
  const view = {
278
349
  ...md,
279
350
  rooms: () => md.rooms().then((rooms) => roomsWithin(reach, rooms)),
280
- query: ((input) => {
281
- const plan = runtime.plan(input, reach);
282
- return Promise.resolve(unlocking(plan.rooms) ?? runtime.query({ ...plan, locked: runtime.lockedRooms() }));
351
+ query: (async (input) => {
352
+ const plan = await runtime.plan(input, reach);
353
+ const locked = await runtime.lockedRooms();
354
+ return unlocking(plan.rooms, locked) ?? runtime.query({ ...plan, locked });
283
355
  }),
284
- search: (input) => port.search === 'required'
285
- ? runtime.search(input, reach, runtime.lockedRooms())
286
- : Promise.resolve(undeclaredSearch()),
287
- types(room) {
288
- if (holds(reach, room) && runtime.locked(room))
356
+ search: (input) => runtime.search(input, reach),
357
+ async types(room) {
358
+ if (holds(reach, room) && (await runtime.locked(room)))
289
359
  throw lockedError(room);
290
360
  if (wholly(reach, room))
291
361
  return md.types(room);
292
362
  if (!holds(reach, room))
293
363
  return structuredClone(UNHELD_TYPES);
294
- return typesWithin(reach, runtime.room(room), md.types(room));
364
+ return typesWithin(reach, await runtime.room(room), await md.types(room));
295
365
  },
296
366
  async save(room, roomDrafts, writtenBy) {
297
367
  if (!holds(reach, room))
298
368
  throw unreached(room);
299
- if (runtime.locked(room))
369
+ if (await runtime.locked(room)) {
300
370
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
371
+ }
301
372
  const held = (await Promise.all(roomDrafts.map(({ path }) => md.roomDraft.read(room, path)))).map((draft) => draft?.parts.move);
302
373
  const outside = roomDrafts.find(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]));
303
374
  if (outside !== undefined) {
304
375
  return { outcome: 'refused', code: 'stale', retryable: false, file: outside.path };
305
376
  }
306
- if (intoLocked(held))
377
+ if (await intoLocked(held))
307
378
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
308
379
  return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
309
380
  },
@@ -314,47 +385,48 @@ export function narrowed(runtime, given, told) {
314
385
  if (filed !== undefined) {
315
386
  return { outcome: 'refused', code: ATTACH_REQUIRED, retryable: false, file: filed.path };
316
387
  }
317
- if (runtime.locked(room))
388
+ if (await runtime.locked(room)) {
318
389
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
319
- const held = parts.map(({ parts: one }) => readParts(one).move);
390
+ }
391
+ const held = parts.map(({ path, parts: one }) => readParts(one, path).move);
320
392
  if (parts.some(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]))) {
321
393
  throw unreached(room);
322
394
  }
323
- if (intoLocked(held))
395
+ if (await intoLocked(held))
324
396
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
325
397
  return savedWithin(reach, room, await md.saveParts(room, parts, writtenBy));
326
398
  },
327
- resolve(room, path, destination) {
328
- const at = runtime.located(room, path, destination);
399
+ async resolve(room, path, destination) {
400
+ const at = await runtime.located(room, path, destination);
329
401
  return at !== null && !covers(reach, at.room, at.path)
330
- ? Promise.resolve(UNREADABLE)
402
+ ? UNREADABLE
331
403
  : md.resolve(room, path, destination);
332
404
  },
333
- history: (room, path, query) => !covers(reach, room, path)
334
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
335
- : runtime.locked(room)
336
- ? Promise.resolve(lockedRoom(room))
405
+ history: async (room, path, query) => !covers(reach, room, path)
406
+ ? failure({ kind: 'room-not-readable', locator: room })
407
+ : (await runtime.locked(room))
408
+ ? lockedRoom(room)
337
409
  : md.history(room, path, query),
338
410
  binaryFile: {
339
- read: (room, path, revision) => !covers(reach, room, path)
340
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
341
- : runtime.locked(room)
342
- ? Promise.resolve(lockedRoom(room))
411
+ read: async (room, path, revision) => !covers(reach, room, path)
412
+ ? failure({ kind: 'room-not-readable', locator: room })
413
+ : (await runtime.locked(room))
414
+ ? lockedRoom(room)
343
415
  : hand(md.binaryFile.read(room, path, revision)),
344
- link: (room, path, revision) => !covers(reach, room, path)
345
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
346
- : runtime.locked(room)
347
- ? Promise.resolve(lockedRoom(room))
416
+ link: async (room, path, revision) => !covers(reach, room, path)
417
+ ? failure({ kind: 'room-not-readable', locator: room })
418
+ : (await runtime.locked(room))
419
+ ? lockedRoom(room)
348
420
  : md.binaryFile.link(room, path, revision),
349
- show: (room, path, revision) => !covers(reach, room, path)
350
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
351
- : runtime.locked(room)
352
- ? Promise.resolve(lockedRoom(room))
421
+ show: async (room, path, revision) => !covers(reach, room, path)
422
+ ? failure({ kind: 'room-not-readable', locator: room })
423
+ : (await runtime.locked(room))
424
+ ? lockedRoom(room)
353
425
  : hand(md.binaryFile.show(room, path, revision)),
354
- attach: (room, file) => !wholly(reach, room)
355
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
356
- : runtime.locked(room)
357
- ? Promise.resolve(lockedRoom(room))
426
+ attach: async (room, file) => !wholly(reach, room)
427
+ ? failure({ kind: 'room-not-readable', locator: room })
428
+ : (await runtime.locked(room))
429
+ ? lockedRoom(room)
358
430
  : md.binaryFile.attach(room, file),
359
431
  async part(file, part) {
360
432
  const key = files.get(file);
@@ -367,42 +439,38 @@ export function narrowed(runtime, given, told) {
367
439
  },
368
440
  },
369
441
  reached: async (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
370
- !runtime.locked(room) &&
442
+ !(await runtime.locked(room)) &&
371
443
  (await md.reached(room, roomVersion, path)),
372
444
  log: () => (reach === null ? md.log() : ''),
373
445
  cleanUp: () => (reach === null ? md.cleanUp() : Promise.reject(deviceUnreached())),
446
+ unsent: () => (reach === null ? md.unsent() : Promise.reject(deviceUnreached())),
447
+ reset: () => (reach === null ? md.reset() : Promise.reject(deviceUnreached())),
448
+ readAgain: () => (reach === null ? md.readAgain() : Promise.reject(deviceUnreached())),
374
449
  roomDraft: {
375
- list: () => md.roomDraft.list().then((drafts) => unlocked(draftsWithin(reach, drafts))),
450
+ list: async () => unlocked(draftsWithin(reach, await md.roomDraft.list()), await runtime.lockedRooms()),
376
451
  async read(room, path) {
377
452
  if (!covers(reach, room, path))
378
453
  return null;
379
- if (runtime.locked(room))
454
+ if (await runtime.locked(room))
380
455
  throw lockedError(room);
381
456
  return shownDraft(reach, await md.roomDraft.read(room, path));
382
457
  },
383
- write(room, path, revision, parts, next) {
384
- try {
385
- if (reach !== null && carriesFile(parts))
386
- throw attachRequired();
387
- const move = readParts(parts).move;
388
- if (!covers(reach, room, path) || !moves(reach, room, move))
389
- throw unreached(room);
390
- if (runtime.locked(room))
391
- throw lockedError(room);
392
- if (intoLocked([move]))
393
- throw lockedError(move.room);
394
- }
395
- catch (error) {
396
- return Promise.reject(error);
397
- }
398
- return md.roomDraft
399
- .write(room, path, revision, parts, next)
400
- .then((written) => writeWithin(reach, written));
458
+ async write(room, path, revision, parts, next) {
459
+ if (reach !== null && carriesFile(parts))
460
+ throw attachRequired();
461
+ const move = readParts(parts, path).move;
462
+ if (!covers(reach, room, path) || !moves(reach, room, move))
463
+ throw unreached(room);
464
+ if (await runtime.locked(room))
465
+ throw lockedError(room);
466
+ if (await intoLocked([move]))
467
+ throw lockedError(move.room);
468
+ return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts, next));
401
469
  },
402
470
  async discard(room, path, revision) {
403
471
  if (!covers(reach, room, path))
404
472
  return staleWrite(null);
405
- if (runtime.locked(room))
473
+ if (await runtime.locked(room))
406
474
  throw lockedError(room);
407
475
  return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
408
476
  },
@@ -412,10 +480,19 @@ export function narrowed(runtime, given, told) {
412
480
  read: (id, options) => conversation().read(id, options),
413
481
  create: (input) => conversation().create(input),
414
482
  send: (id, operation, draft) => conversation().send(id, operation, draft),
415
- answer: (id, answer) => conversation().answer(id, answer),
416
- interrupt: (id) => conversation().interrupt(id),
417
- kill: (id) => conversation().kill(id),
418
- delete: (id) => conversation().delete(id),
483
+ answer: (id, answer, operation) => conversation().answer(id, answer, operation),
484
+ interrupt: (id, operation) => conversation().interrupt(id, operation),
485
+ kill: (id, operation) => conversation().kill(id, operation),
486
+ delete: (id, operation) => conversation().delete(id, operation),
487
+ takeOut: (id, message, operation) => conversation().takeOut(id, message, operation),
488
+ decide: (request, decision, operation) => conversation().decide(request, decision, operation),
489
+ rename: (id, name, operation) => conversation().rename(id, name, operation),
490
+ option: (id, option, value, operation) => conversation().option(id, option, value, operation),
491
+ retry: (id, message, operation) => conversation().retry(id, message, operation),
492
+ pins: () => conversation().pins(),
493
+ pin: (figures) => conversation().pin(figures),
494
+ openedTurns: () => conversation().openedTurns(),
495
+ openTurn: (id, turn) => conversation().openTurn(id, turn),
419
496
  },
420
497
  chatDraft: {
421
498
  write: (id, draft, revision) => chatDraft().write(id, draft, revision),
@@ -432,10 +509,5 @@ export function narrowed(runtime, given, told) {
432
509
  for (const restart of [...open])
433
510
  restart();
434
511
  },
435
- facts(next) {
436
- port = next;
437
- for (const restart of [...open])
438
- restart();
439
- },
440
512
  };
441
513
  }
package/dist/react.d.ts CHANGED
@@ -1,10 +1,17 @@
1
+ import type { DocumentQuery, GroupQuery } from '@agentshouse/mdmodel';
2
+ import type { Acting, Lane, LaneShown } from './act-lanes.js';
1
3
  import type { MdRuntimeClient } from './client.js';
2
- import type { AppRoom, ConnectionRefusal, SavedRoomDraft, SaveResult } from './connection.js';
4
+ import type { AppRoom } from './listing.js';
5
+ import type { ConnectionRefusal } from './socket.js';
6
+ import type { SavedRoomDraft, SaveResult } from './saves.js';
3
7
  import type { Member, ServiceMode } from './adapter.js';
4
8
  import type { ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
5
9
  import { type RuntimeError } from './failure.js';
10
+ import type { FiguresResult } from './figures.js';
11
+ import type { Holdings } from './holdings.js';
12
+ import type { Descriptor, Expecting } from './expectation.js';
6
13
  import type { QueueEntry } from './outcome.js';
7
- import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
14
+ import type { DocumentResult, GroupResult, PendingResult } from './query.js';
8
15
  import type { Readiness } from './readiness.js';
9
16
  import type { RoomDraft, RoomDraftParts } from './room-draft.js';
10
17
  import type { SyncStatus } from './status.js';
@@ -23,6 +30,7 @@ export declare function useObserve(client: Client, topic: 'storage-loss'): Obser
23
30
  export declare function useObserve(client: Client, topic: 'sync-status'): Observed<SyncStatus>;
24
31
  export declare function useObserve(client: Client, topic: 'service-mode'): Observed<ServiceMode>;
25
32
  export declare function useObserve(client: Client, topic: 'member'): Observed<Member | null>;
33
+ export declare function useObserve(client: Client, topic: 'authority-changes'): Observed<number>;
26
34
  export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): Observed<DocumentResult | PendingResult>;
27
35
  export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): Observed<GroupResult | PendingResult>;
28
36
  export declare function useObserve(client: Client, topic: 'queue', locator: string): Observed<readonly QueueEntry[]>;
@@ -31,6 +39,11 @@ export declare function useObserve(client: Client, topic: 'presentation'): Obser
31
39
  export declare function useObserve(client: Client, topic: 'conversation', conversation: string, options: ConversationOptions): Observed<ConversationView>;
32
40
  export declare function useObserve(client: Client, topic: 'conversations'): Observed<readonly ConversationEntry[]>;
33
41
  export declare function useObserve(client: Client, topic: 'agents'): Observed<readonly ConversationAgent[]>;
42
+ export declare function useObserve(client: Client, topic: 'figures'): Observed<FiguresResult>;
43
+ export declare function useObserve(client: Client, topic: 'holdings'): Observed<Holdings>;
44
+ export declare function useExpected<A, T>(store: Expecting, descriptor: Descriptor<A, T>, places: readonly A[], held: ReadonlyMap<A, T> | null): (place: A, held: T) => T;
45
+ export type LaneHeld<O> = LaneShown<O> & Pick<Lane<O>, 'run' | 'forget'>;
46
+ export declare function useLane<O>(lanes: Acting<O>): LaneHeld<O>;
34
47
  export type Saving = {
35
48
  readonly busy: boolean;
36
49
  readonly outcome: SaveResult | null;
@@ -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,4 +1,4 @@
1
- import { useCallback, useLayoutEffect, useRef, useState } from 'react';
1
+ import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
2
2
  import { failed } from './failure.js';
3
3
  const LOADING = { state: 'loading' };
4
4
  export function useObserve(client, topic, ...input) {
@@ -32,6 +32,38 @@ export function useObserve(client, topic, ...input) {
32
32
  }, [client, key]);
33
33
  return held !== null && held.client === client && held.key === key ? held.observed : LOADING;
34
34
  }
35
+ function sameHeld(descriptor, was, now) {
36
+ if (was === now)
37
+ return true;
38
+ if (was === null || now === null || was.size !== now.size)
39
+ return false;
40
+ const before = new Map([...was].map(([place, value]) => [descriptor.place(place), value]));
41
+ return [...now].every(([place, value]) => {
42
+ const at = descriptor.place(place);
43
+ return before.has(at) && Object.is(before.get(at), value);
44
+ });
45
+ }
46
+ export function useExpected(store, descriptor, places, held) {
47
+ const reader = useId();
48
+ const version = useSyncExternalStore(store.subscribe, store.version);
49
+ const asked = JSON.stringify(places.map((one) => descriptor.place(one)));
50
+ const kept = useRef(held);
51
+ if (!sameHeld(descriptor, kept.current, held))
52
+ kept.current = held;
53
+ const shown = kept.current;
54
+ useLayoutEffect(() => store.reads(reader, descriptor, places), [store, reader, descriptor, asked]);
55
+ useLayoutEffect(() => () => store.left(reader), [store, reader]);
56
+ useEffect(() => {
57
+ if (shown !== null)
58
+ store.heard(reader, descriptor, shown);
59
+ }, [store, reader, descriptor, shown]);
60
+ return useCallback((place, value) => store.draw(descriptor, place, value), [store, descriptor, version]);
61
+ }
62
+ export function useLane(lanes) {
63
+ const lane = useMemo(() => lanes.open(), [lanes]);
64
+ const shown = useSyncExternalStore(lane.subscribe, lane.shown);
65
+ return useMemo(() => ({ ...shown, run: lane.run, forget: lane.forget }), [shown, lane]);
66
+ }
35
67
  const IDLE = { busy: false, outcome: null, failure: null };
36
68
  export function useSave(client) {
37
69
  const [state, setState] = useState(IDLE);
package/dist/read.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type Fields = Readonly<Record<string, unknown>>;
2
+ export declare const EXCERPT = 512;
3
+ export declare function excerpt(said: string): string;
4
+ export declare function record(entry: unknown): Fields;
5
+ export declare function text(fields: Fields, name: string): string | null;
6
+ export declare function list(fields: Fields, name: string): readonly unknown[];
7
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7C;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAGrE"}
package/dist/read.js ADDED
@@ -0,0 +1,17 @@
1
+ export const EXCERPT = 512;
2
+ export function excerpt(said) {
3
+ return [...said.slice(0, EXCERPT * 2)].slice(0, EXCERPT).join('');
4
+ }
5
+ export function record(entry) {
6
+ return typeof entry === 'object' && entry !== null && !Array.isArray(entry)
7
+ ? entry
8
+ : {};
9
+ }
10
+ export function text(fields, name) {
11
+ const value = fields[name];
12
+ return typeof value === 'string' && value !== '' ? value : null;
13
+ }
14
+ export function list(fields, name) {
15
+ const value = fields[name];
16
+ return Array.isArray(value) ? value : [];
17
+ }
@@ -6,13 +6,11 @@ export type RoomCoverage = {
6
6
  readonly state: RoomPreparation;
7
7
  };
8
8
  export type ConversationCoverage = Open<'complete' | 'acquiring' | 'undeclared'>;
9
- export type SearchObligation = Open<'required' | 'unused'>;
10
9
  export type TargetCoverage = {
11
10
  readonly complete: boolean;
12
11
  readonly listed: boolean;
13
12
  readonly rooms: readonly RoomCoverage[];
14
13
  readonly conversations: ConversationCoverage;
15
- readonly search: SearchObligation;
16
14
  };
17
15
  export type Persistence = Open<'granted' | 'denied' | 'unavailable'>;
18
16
  export type Durability = Open<'persistent' | 'best-effort'>;
@@ -26,7 +24,6 @@ export type InstallationAmount = {
26
24
  };
27
25
  export type Installation = {
28
26
  readonly step: InstallationStep | null;
29
- readonly rooms: InstallationAmount;
30
27
  readonly bytes: InstallationAmount;
31
28
  };
32
29
  export type ReadinessStatus = Open<'preparing' | 'paused' | 'ready' | 'lost'>;