@agentshouse/mdruntime 0.1.0-c44866799613e → 0.1.0-c44d5cc00aee5

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 (314) hide show
  1. package/README.md +18 -17
  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 +110 -112
  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 +28 -51
  16. package/dist/bootstrap.d.ts +15 -18
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +252 -158
  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 +3 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +11 -0
  33. package/dist/client.d.ts +27 -21
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +36 -17
  36. package/dist/collection.d.ts +23 -7
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +13 -19
  39. package/dist/compile.d.ts +8 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +288 -329
  42. package/dist/connection.d.ts +5 -143
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +109 -5104
  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 +143 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +254 -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 +65 -48
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +987 -838
  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 +150 -0
  63. package/dist/durability.d.ts +19 -1
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/durability.js +4 -0
  66. package/dist/entry.d.ts +3 -2
  67. package/dist/entry.d.ts.map +1 -1
  68. package/dist/entry.js +19 -9
  69. package/dist/expectation.d.ts +26 -13
  70. package/dist/expectation.d.ts.map +1 -1
  71. package/dist/expectation.js +72 -19
  72. package/dist/failure.d.ts +3 -0
  73. package/dist/failure.d.ts.map +1 -1
  74. package/dist/failure.js +6 -0
  75. package/dist/figures.d.ts +49 -0
  76. package/dist/figures.d.ts.map +1 -0
  77. package/dist/figures.js +197 -0
  78. package/dist/holdings.d.ts +29 -0
  79. package/dist/holdings.d.ts.map +1 -0
  80. package/dist/holdings.js +95 -0
  81. package/dist/host.d.ts +21 -8
  82. package/dist/host.d.ts.map +1 -1
  83. package/dist/host.js +73 -40
  84. package/dist/identity.d.ts +0 -1
  85. package/dist/identity.d.ts.map +1 -1
  86. package/dist/identity.js +0 -3
  87. package/dist/index.d.ts +34 -12
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +16 -5
  90. package/dist/install.d.ts +54 -0
  91. package/dist/install.d.ts.map +1 -0
  92. package/dist/install.js +530 -0
  93. package/dist/lifecycle.d.ts +7 -0
  94. package/dist/lifecycle.d.ts.map +1 -0
  95. package/dist/lifecycle.js +277 -0
  96. package/dist/listing.d.ts +48 -0
  97. package/dist/listing.d.ts.map +1 -0
  98. package/dist/listing.js +139 -0
  99. package/dist/live.d.ts +5 -4
  100. package/dist/live.d.ts.map +1 -1
  101. package/dist/live.js +64 -23
  102. package/dist/locks.d.ts +7 -0
  103. package/dist/locks.d.ts.map +1 -0
  104. package/dist/locks.js +32 -0
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +49 -0
  108. package/dist/media.d.ts +2 -2
  109. package/dist/media.d.ts.map +1 -1
  110. package/dist/media.js +23 -13
  111. package/dist/memory.d.ts +17 -7
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +210 -97
  114. package/dist/messages.d.ts +33 -5
  115. package/dist/messages.d.ts.map +1 -1
  116. package/dist/messages.js +104 -36
  117. package/dist/model.d.ts +2 -11
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +0 -23
  120. package/dist/models.d.ts +10 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +153 -0
  123. package/dist/observation.d.ts +4 -3
  124. package/dist/observation.d.ts.map +1 -1
  125. package/dist/observation.js +23 -17
  126. package/dist/opened.d.ts +1 -1
  127. package/dist/opened.d.ts.map +1 -1
  128. package/dist/opened.js +5 -5
  129. package/dist/opening.d.ts +4 -0
  130. package/dist/opening.d.ts.map +1 -0
  131. package/dist/opening.js +53 -0
  132. package/dist/outcome.d.ts +7 -4
  133. package/dist/outcome.d.ts.map +1 -1
  134. package/dist/outcome.js +18 -0
  135. package/dist/overlay.d.ts +6 -1
  136. package/dist/overlay.d.ts.map +1 -1
  137. package/dist/overlay.js +47 -21
  138. package/dist/page-metadata.d.ts +8 -0
  139. package/dist/page-metadata.d.ts.map +1 -0
  140. package/dist/page-metadata.js +19 -0
  141. package/dist/parts.d.ts +4 -0
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/parts.js +13 -0
  144. package/dist/paths.d.ts +2 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +26 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +227 -0
  150. package/dist/presence.d.ts +52 -0
  151. package/dist/presence.d.ts.map +1 -0
  152. package/dist/presence.js +220 -0
  153. package/dist/queries.d.ts +16 -0
  154. package/dist/queries.d.ts.map +1 -0
  155. package/dist/queries.js +282 -0
  156. package/dist/query.d.ts +14 -210
  157. package/dist/query.d.ts.map +1 -1
  158. package/dist/query.js +3 -505
  159. package/dist/questions.d.ts +29 -0
  160. package/dist/questions.d.ts.map +1 -0
  161. package/dist/questions.js +115 -0
  162. package/dist/queue.d.ts +40 -0
  163. package/dist/queue.d.ts.map +1 -0
  164. package/dist/queue.js +450 -0
  165. package/dist/reach.d.ts +15 -12
  166. package/dist/reach.d.ts.map +1 -1
  167. package/dist/reach.js +240 -149
  168. package/dist/react.d.ts +15 -2
  169. package/dist/react.d.ts.map +1 -1
  170. package/dist/react.js +33 -1
  171. package/dist/read.d.ts +7 -0
  172. package/dist/read.d.ts.map +1 -0
  173. package/dist/read.js +17 -0
  174. package/dist/readiness.d.ts +4 -19
  175. package/dist/readiness.d.ts.map +1 -1
  176. package/dist/readiness.js +4 -10
  177. package/dist/reads.d.ts +38 -10
  178. package/dist/reads.d.ts.map +1 -1
  179. package/dist/reads.js +163 -85
  180. package/dist/recovery.d.ts +3 -0
  181. package/dist/recovery.d.ts.map +1 -1
  182. package/dist/recovery.js +57 -1
  183. package/dist/refresh.d.ts +7 -5
  184. package/dist/refresh.d.ts.map +1 -1
  185. package/dist/refresh.js +35 -7
  186. package/dist/refusal.d.ts +5 -0
  187. package/dist/refusal.d.ts.map +1 -0
  188. package/dist/refusal.js +55 -0
  189. package/dist/replica.d.ts +12 -18
  190. package/dist/replica.d.ts.map +1 -1
  191. package/dist/replica.js +64 -34
  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 +24 -10
  196. package/dist/room-draft.d.ts.map +1 -1
  197. package/dist/room-draft.js +142 -106
  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 +34 -0
  205. package/dist/runtime.d.ts.map +1 -0
  206. package/dist/runtime.js +1 -0
  207. package/dist/save.d.ts +42 -84
  208. package/dist/save.d.ts.map +1 -1
  209. package/dist/save.js +349 -170
  210. package/dist/saves.d.ts +32 -0
  211. package/dist/saves.d.ts.map +1 -0
  212. package/dist/saves.js +410 -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 -7
  220. package/dist/shared.d.ts.map +1 -1
  221. package/dist/shared.js +13 -105
  222. package/dist/shown.d.ts +33 -0
  223. package/dist/shown.d.ts.map +1 -0
  224. package/dist/shown.js +302 -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 +28 -0
  232. package/dist/socket/lanes.d.ts.map +1 -0
  233. package/dist/socket/lanes.js +103 -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 +67 -0
  241. package/dist/socket.d.ts.map +1 -0
  242. package/dist/socket.js +164 -0
  243. package/dist/source.d.ts +54 -0
  244. package/dist/source.d.ts.map +1 -0
  245. package/dist/source.js +82 -0
  246. package/dist/status.d.ts +4 -5
  247. package/dist/status.d.ts.map +1 -1
  248. package/dist/status.js +3 -7
  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 +214 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +438 -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 +120 -171
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +166 -414
  273. package/dist/stored.d.ts +62 -57
  274. package/dist/stored.d.ts.map +1 -1
  275. package/dist/stored.js +317 -239
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +220 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +535 -0
  282. package/dist/tables.d.ts +126 -65
  283. package/dist/tables.d.ts.map +1 -1
  284. package/dist/tables.js +250 -113
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +128 -0
  288. package/dist/transfer.d.ts +0 -5
  289. package/dist/transfer.d.ts.map +1 -1
  290. package/dist/validation.d.ts +3 -4
  291. package/dist/validation.d.ts.map +1 -1
  292. package/dist/validation.js +42 -100
  293. package/dist/windows.d.ts +1 -12
  294. package/dist/windows.d.ts.map +1 -1
  295. package/dist/windows.js +2 -75
  296. package/dist/wire.d.ts +65 -9
  297. package/dist/wire.d.ts.map +1 -1
  298. package/dist/wire.js +22 -5
  299. package/package.json +3 -2
  300. package/dist/attempt.d.ts +0 -16
  301. package/dist/attempt.d.ts.map +0 -1
  302. package/dist/attempt.js +0 -70
  303. package/dist/fence.d.ts +0 -6
  304. package/dist/fence.d.ts.map +0 -1
  305. package/dist/fence.js +0 -10
  306. package/dist/fulltext.d.ts +0 -27
  307. package/dist/fulltext.d.ts.map +0 -1
  308. package/dist/fulltext.js +0 -368
  309. package/dist/log.d.ts +0 -5
  310. package/dist/log.d.ts.map +0 -1
  311. package/dist/log.js +0 -14
  312. package/dist/words.d.ts +0 -19
  313. package/dist/words.d.ts.map +0 -1
  314. package/dist/words.js +0 -150
package/dist/reach.js CHANGED
@@ -1,12 +1,13 @@
1
+ import { QueryError } from '@agentshouse/mdmodel';
2
+ import { selected } from './collection.js';
1
3
  import { unheldView } from './conversation.js';
2
4
  import { modelTypes, NO_MODEL } from './model.js';
3
5
  import { changeOf, digestApplied, digestOf, observing, } from './observation.js';
4
- import { runtimeError } from './failure.js';
6
+ import { runtimeError, uncaught } from './failure.js';
5
7
  import { failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
6
8
  import { beneath } from './paths.js';
7
9
  import { moveTarget, readParts, staleWrite, } from './room-draft.js';
8
10
  import { documentKey } from './rows.js';
9
- import { undeclaredSearch } from './search.js';
10
11
  const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
11
12
  function unconversed(name) {
12
13
  return () => Promise.resolve(undeclared(name));
@@ -14,33 +15,41 @@ function unconversed(name) {
14
15
  const NO_CONVERSATION = {
15
16
  list: () => Promise.resolve([]),
16
17
  read: (conversation) => Promise.resolve(unheldView(conversation)),
17
- create: unconversed('conversation.create'),
18
- send: unconversed('conversation.send'),
19
- answer: unconversed('conversation.answer'),
20
- interrupt: unconversed('conversation.interrupt'),
21
- kill: unconversed('conversation.kill'),
22
- cancel: unconversed('conversation.cancel'),
23
- delete: unconversed('conversation.delete'),
18
+ create: unconversed('conversations/create'),
19
+ send: unconversed('conversations/send'),
20
+ answer: unconversed('conversations/interaction/answer'),
21
+ interrupt: unconversed('conversations/interrupt'),
22
+ kill: unconversed('conversations/kill'),
23
+ delete: unconversed('conversations/delete'),
24
+ takeOut: unconversed('conversations/take-out'),
25
+ decide: unconversed('agent-functions/decide'),
26
+ rename: unconversed('conversations/rename'),
27
+ option: unconversed('conversations/option/set'),
28
+ retry: unconversed('conversations/retry'),
29
+ pins: () => Promise.resolve([]),
30
+ pin: () => Promise.resolve(),
31
+ openedTurns: () => Promise.resolve({}),
32
+ openTurn: () => Promise.resolve(),
33
+ dismissSuggestion: () => Promise.resolve(),
24
34
  };
25
35
  const NO_CHAT_DRAFT = {
26
36
  write: () => Promise.resolve(),
27
37
  prepend: () => Promise.resolve(),
38
+ append: () => Promise.resolve(),
28
39
  discard: () => Promise.resolve(),
29
40
  };
30
41
  function areasOf(reach) {
31
42
  return reach.areas ?? [];
32
43
  }
33
- function typedAreas(reach, room) {
34
- return areasOf(reach).filter((area) => area.room === room && area.types.length > 0);
35
- }
36
44
  function fenced(reach, room, path) {
37
- return areasOf(reach).some((area) => area.room === room && beneath(area.path, path));
45
+ return areasOf(reach).some((area) => area.room === room &&
46
+ beneath(area.path, path) &&
47
+ !area.open.some((open) => beneath(open, path)));
38
48
  }
39
49
  export function holds(reach, room) {
40
50
  return (reach === null ||
41
51
  reach.rooms.includes(room) ||
42
- reach.documents.some((document) => document.room === room) ||
43
- typedAreas(reach, room).length > 0);
52
+ reach.documents.some((document) => document.room === room));
44
53
  }
45
54
  function wholly(reach, room) {
46
55
  return reach === null || reach.rooms.includes(room);
@@ -49,14 +58,11 @@ export function governs(reach, room) {
49
58
  if (wholly(reach, room.locator)) {
50
59
  return { collection: true, selection: room.typedSelection !== null };
51
60
  }
52
- const selected = (path) => room.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
53
- const paths = [
54
- ...reach.documents
55
- .filter((document) => document.room === room.locator)
56
- .map(({ path }) => path),
57
- ...typedAreas(reach, room.locator).map(({ path }) => path),
58
- ];
59
- return { collection: paths.some((path) => !selected(path)), selection: paths.some(selected) };
61
+ const within = (path) => selected({ selection: room.typedSelection }, path);
62
+ const paths = reach.documents
63
+ .filter((document) => document.room === room.locator)
64
+ .map(({ path }) => path);
65
+ return { collection: paths.some((path) => !within(path)), selection: paths.some(within) };
60
66
  }
61
67
  function covers(reach, room, path) {
62
68
  return (reach === null ||
@@ -67,6 +73,19 @@ function covers(reach, room, path) {
67
73
  function conversing(reach) {
68
74
  return reach === null || reach.conversations;
69
75
  }
76
+ function roomsAwaited(error, reach) {
77
+ return error.code === 'unknown-type' && reach !== null && reach.rooms.length === 0;
78
+ }
79
+ async function planInReach(runtime, input, reach, answered) {
80
+ try {
81
+ return await runtime.plan(input, reach);
82
+ }
83
+ catch (error) {
84
+ if (error instanceof QueryError && (answered || roomsAwaited(error, reach)))
85
+ return null;
86
+ throw error;
87
+ }
88
+ }
70
89
  export function planReach(reach) {
71
90
  return reach === null
72
91
  ? null
@@ -76,7 +95,7 @@ export function planReach(reach) {
76
95
  ...new Set(reach.documents.map(({ room, path }) => documentKey(room, path))),
77
96
  ].sort(),
78
97
  areas: areasOf(reach)
79
- .map(({ room, path, types }) => ({ room, path, types: [...new Set(types)].sort() }))
98
+ .map(({ room, path, open }) => ({ room, path, open: [...new Set(open)].sort() }))
80
99
  .sort((left, right) => documentKey(left.room, left.path) < documentKey(right.room, right.path) ? -1 : 1),
81
100
  };
82
101
  }
@@ -112,12 +131,13 @@ function writeWithin(reach, write) {
112
131
  function savedWithin(reach, room, result) {
113
132
  if (reach === null || result.outcome === 'saved')
114
133
  return result;
115
- const { file, location, referrers, ...refusal } = result;
134
+ const { file, location, line, referrers, ...refusal } = result;
116
135
  const hidden = file !== undefined && !covers(reach, room, file);
117
136
  return {
118
137
  ...refusal,
119
138
  ...(file === undefined || hidden ? {} : { file }),
120
139
  ...(location === undefined || hidden ? {} : { location }),
140
+ ...(line === undefined || hidden ? {} : { line }),
121
141
  ...(referrers === undefined
122
142
  ? {}
123
143
  : { referrers: referrers.filter((path) => covers(reach, room, path)) }),
@@ -126,7 +146,8 @@ function savedWithin(reach, room, result) {
126
146
  function statusWithin(reach, status) {
127
147
  return {
128
148
  ...status,
129
- attentionRequired: status.attentionRequired.filter((entry) => 'refusal' in entry ? wholly(reach, entry.room) : covers(reach, entry.room, entry.path)),
149
+ attentionRequired: status.attentionRequired.filter((entry) => covers(reach, entry.room, entry.path)),
150
+ unsent: status.unsent.filter((change) => covers(reach, change.room, change.path)),
130
151
  };
131
152
  }
132
153
  function queueWithin(reach, room, entries) {
@@ -143,13 +164,13 @@ function queueWithin(reach, room, entries) {
143
164
  });
144
165
  }
145
166
  function unreached(room) {
146
- return runtimeError('room-not-held', `No Local Replica for ${room}`);
167
+ return runtimeError('unknown-room', `Unknown Room ${room}`);
147
168
  }
148
169
  function lockedError(room) {
149
170
  return runtimeError(ROOM_LOCKED, `${room} is locked until House confirms its access`, true);
150
171
  }
151
172
  function deviceUnreached() {
152
- return runtimeError('device-unreached', 'Only the panel cleans up this device');
173
+ return runtimeError('device-unreached', 'Only the panel reaches this device');
153
174
  }
154
175
  const ATTACH_REQUIRED = 'attach-required';
155
176
  function attachRequired() {
@@ -158,10 +179,9 @@ function attachRequired() {
158
179
  function carriesFile(parts) {
159
180
  return parts !== null && typeof parts === 'object' && Object.hasOwn(parts, 'file');
160
181
  }
161
- export function narrowed(runtime, given, told) {
182
+ export function narrowed(runtime, given, port) {
162
183
  const { md, watch } = runtime;
163
184
  let reach = given;
164
- let port = told;
165
185
  const open = new Set();
166
186
  function following(begin, locking = false) {
167
187
  let stop = begin();
@@ -177,70 +197,133 @@ export function narrowed(runtime, given, told) {
177
197
  stop();
178
198
  };
179
199
  }
180
- const unlocking = (rooms) => {
181
- const locked = (rooms ?? []).filter((room) => runtime.locked(room));
182
- return locked.length === 0
183
- ? null
184
- : { pending: locked.map((room) => ({ room, awaits: 'unlock' })) };
200
+ const unlocking = (rooms, locked) => {
201
+ const held = (rooms ?? []).filter((room) => locked.includes(room));
202
+ return held.length === 0 ? null : { pending: held.map((room) => ({ room, awaits: 'unlock' })) };
185
203
  };
186
- const unlocked = (entries) => entries.filter((entry) => !runtime.locked(entry.room));
187
- const intoLocked = (held) => held.some((move) => move?.room !== undefined && runtime.locked(move.room));
188
- const within = (topic, input, deliver) => {
204
+ const unlocked = (entries, locked) => entries.filter((entry) => !locked.includes(entry.room));
205
+ const intoLocked = async (held) => {
206
+ for (const move of held) {
207
+ if (move?.room !== undefined && (await runtime.locked(move.room)))
208
+ return true;
209
+ }
210
+ return false;
211
+ };
212
+ function ordered(deliver) {
213
+ let open = true;
214
+ let shown = Promise.resolve();
215
+ return {
216
+ push(making) {
217
+ shown = shown.then(() => making.then((value) => {
218
+ if (open)
219
+ deliver(value);
220
+ }, uncaught), uncaught);
221
+ },
222
+ stop() {
223
+ open = false;
224
+ },
225
+ };
226
+ }
227
+ function unlockedWatch(topic, input, deliver, fail, within) {
228
+ const shown = ordered(deliver);
229
+ const stop = watch(topic, input, (message) => {
230
+ shown.push(runtime.lockedRooms().then((locked) => within(message, locked)));
231
+ }, fail);
232
+ return () => {
233
+ shown.stop();
234
+ stop();
235
+ };
236
+ }
237
+ function lockedFirst(room, start, shut) {
238
+ let open = true;
239
+ let stop = () => { };
240
+ void (async () => {
241
+ const closed = !holds(reach, room) || (await runtime.locked(room));
242
+ if (!open)
243
+ return;
244
+ if (closed)
245
+ shut();
246
+ else
247
+ stop = start();
248
+ })();
249
+ return () => {
250
+ open = false;
251
+ stop();
252
+ };
253
+ }
254
+ const within = (topic, input, deliver, fail) => {
255
+ if (topic === 'read' && reach !== null) {
256
+ fail(deviceUnreached());
257
+ return () => { };
258
+ }
189
259
  if (topic === 'rooms') {
190
- return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
260
+ return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms)), fail));
191
261
  }
192
262
  if (topic === 'readiness') {
193
263
  return following(() => runtime.watchReadiness(port, reach, deliver));
194
264
  }
195
265
  if (topic === 'sync-status') {
196
- return following(() => watch(topic, input, (status) => {
197
- const within = statusWithin(reach, status);
198
- deliver({ ...within, attentionRequired: unlocked(within.attentionRequired) });
266
+ return following(() => unlockedWatch(topic, input, deliver, fail, (status, locked) => {
267
+ const shown = statusWithin(reach, status);
268
+ return { ...shown, attentionRequired: unlocked(shown.attentionRequired, locked) };
199
269
  }), true);
200
270
  }
201
271
  if (topic === 'room-drafts') {
202
- return following(() => watch(topic, input, (drafts) => deliver(unlocked(draftsWithin(reach, drafts)))), true);
272
+ return following(() => unlockedWatch(topic, input, deliver, fail, (drafts, locked) => unlocked(draftsWithin(reach, drafts), locked)), true);
203
273
  }
204
274
  if (topic === 'queue') {
205
275
  const room = input[0];
206
- return following(() => {
207
- if (!holds(reach, room) || runtime.locked(room)) {
208
- deliver([]);
209
- return () => { };
210
- }
211
- return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
212
- }, true);
276
+ return following(() => lockedFirst(room, () => watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)), fail), () => deliver([])), true);
213
277
  }
214
278
  if (topic === 'query') {
215
- const plan = runtime.plan(input[0], reach);
216
279
  let held = null;
280
+ let planning = null;
281
+ const waiting = (result) => {
282
+ const answer = { result, keys: [] };
283
+ if (held === null || changeOf(held, answer) !== null)
284
+ deliver(answer);
285
+ held = digestOf(answer);
286
+ };
217
287
  return following(() => {
218
- const locked = unlocking(plan.rooms);
219
- if (locked !== null) {
220
- const answer = { result: locked, keys: [] };
221
- if (held === null || changeOf(held, answer) !== null)
222
- deliver(answer);
223
- held = digestOf(answer);
224
- return () => { };
225
- }
226
- let first = true;
227
288
  let open = true;
228
- const heard = (message) => {
229
- if (!first) {
230
- held = digestApplied(held, message);
231
- deliver(message);
289
+ let stop = () => { };
290
+ if (planning?.reach !== reach) {
291
+ planning = { reach, plan: planInReach(runtime, input[0], reach, held !== null) };
292
+ }
293
+ const planned = planning.plan;
294
+ void (async () => {
295
+ const plan = await planned;
296
+ const locked = await runtime.lockedRooms();
297
+ if (!open)
232
298
  return;
233
- }
234
- first = false;
235
- const change = held === null ? message : changeOf(held, message);
236
- held = digestOf(message);
237
- if (change !== null)
238
- deliver(change);
239
- };
240
- const current = { ...plan, reach: planReach(reach), locked: runtime.lockedRooms() };
241
- const stop = runtime.watchPlan(current, (message) => {
299
+ if (plan === null)
300
+ return waiting({ pending: [] });
301
+ const pending = unlocking(plan.rooms, locked);
302
+ if (pending !== null)
303
+ return waiting(pending);
304
+ let first = true;
305
+ const heard = (message) => {
306
+ if (!first) {
307
+ held = digestApplied(held, message);
308
+ deliver(message);
309
+ return;
310
+ }
311
+ first = false;
312
+ const change = held === null ? message : changeOf(held, message);
313
+ held = digestOf(message);
314
+ if (change !== null)
315
+ deliver(change);
316
+ };
317
+ stop = runtime.watchPlan({ ...plan, locked }, (message) => {
318
+ if (open)
319
+ heard(message);
320
+ }, (error) => {
321
+ if (open)
322
+ fail(error);
323
+ });
324
+ })().catch((error) => {
242
325
  if (open)
243
- heard(message);
326
+ fail(error);
244
327
  });
245
328
  return () => {
246
329
  open = false;
@@ -251,7 +334,7 @@ export function narrowed(runtime, given, told) {
251
334
  if (topic === 'conversation') {
252
335
  return following(() => {
253
336
  if (conversing(reach))
254
- return watch(topic, input, deliver);
337
+ return watch(topic, input, deliver, fail);
255
338
  deliver(unheldView(input[0]));
256
339
  return () => { };
257
340
  });
@@ -259,12 +342,18 @@ export function narrowed(runtime, given, told) {
259
342
  if (topic === 'conversations' || topic === 'agents') {
260
343
  return following(() => {
261
344
  if (conversing(reach))
262
- return watch(topic, input, deliver);
345
+ return watch(topic, input, deliver, fail);
263
346
  deliver([]);
264
347
  return () => { };
265
348
  });
266
349
  }
267
- return watch(topic, input, deliver);
350
+ if (topic === 'figures' || topic === 'holdings') {
351
+ if (reach === null)
352
+ return watch(topic, input, deliver, fail);
353
+ fail(deviceUnreached());
354
+ return () => { };
355
+ }
356
+ return watch(topic, input, deliver, fail);
268
357
  };
269
358
  const files = new Map();
270
359
  let handed = 0;
@@ -281,35 +370,36 @@ export function narrowed(runtime, given, told) {
281
370
  const chatDraft = () => (conversing(reach) ? md.chatDraft : NO_CHAT_DRAFT);
282
371
  const view = {
283
372
  ...md,
284
- rooms: () => roomsWithin(reach, md.rooms()),
285
- query: ((input) => {
286
- const plan = runtime.plan(input, reach);
287
- return Promise.resolve(unlocking(plan.rooms) ?? runtime.query({ ...plan, locked: runtime.lockedRooms() }));
373
+ rooms: () => md.rooms().then((rooms) => roomsWithin(reach, rooms)),
374
+ query: (async (input) => {
375
+ const plan = await planInReach(runtime, input, reach, false);
376
+ if (plan === null)
377
+ return { pending: [] };
378
+ const locked = await runtime.lockedRooms();
379
+ return unlocking(plan.rooms, locked) ?? runtime.query({ ...plan, locked });
288
380
  }),
289
- search: (input) => port.search === 'required'
290
- ? runtime.search(input, reach, runtime.lockedRooms())
291
- : Promise.resolve(undeclaredSearch()),
292
- types(room) {
293
- if (holds(reach, room) && runtime.locked(room))
381
+ search: (input) => runtime.search(input, reach),
382
+ async types(room) {
383
+ if (holds(reach, room) && (await runtime.locked(room)))
294
384
  throw lockedError(room);
295
385
  if (wholly(reach, room))
296
386
  return md.types(room);
297
387
  if (!holds(reach, room))
298
388
  return structuredClone(UNHELD_TYPES);
299
- const listed = md.rooms().find(({ locator }) => locator === room);
300
- return typesWithin(reach, listed, md.types(room));
389
+ return typesWithin(reach, await runtime.room(room), await md.types(room));
301
390
  },
302
391
  async save(room, roomDrafts, writtenBy) {
303
392
  if (!holds(reach, room))
304
393
  throw unreached(room);
305
- if (runtime.locked(room))
394
+ if (await runtime.locked(room)) {
306
395
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
396
+ }
307
397
  const held = (await Promise.all(roomDrafts.map(({ path }) => md.roomDraft.read(room, path)))).map((draft) => draft?.parts.move);
308
398
  const outside = roomDrafts.find(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]));
309
399
  if (outside !== undefined) {
310
400
  return { outcome: 'refused', code: 'stale', retryable: false, file: outside.path };
311
401
  }
312
- if (intoLocked(held))
402
+ if (await intoLocked(held))
313
403
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
314
404
  return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
315
405
  },
@@ -320,47 +410,48 @@ export function narrowed(runtime, given, told) {
320
410
  if (filed !== undefined) {
321
411
  return { outcome: 'refused', code: ATTACH_REQUIRED, retryable: false, file: filed.path };
322
412
  }
323
- if (runtime.locked(room))
413
+ if (await runtime.locked(room)) {
324
414
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
325
- const held = parts.map(({ parts: one }) => readParts(one).move);
415
+ }
416
+ const held = parts.map(({ path, parts: one }) => readParts(one, path).move);
326
417
  if (parts.some(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]))) {
327
418
  throw unreached(room);
328
419
  }
329
- if (intoLocked(held))
420
+ if (await intoLocked(held))
330
421
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
331
422
  return savedWithin(reach, room, await md.saveParts(room, parts, writtenBy));
332
423
  },
333
- resolve(room, path, destination) {
334
- const at = runtime.located(room, path, destination);
424
+ async resolve(room, path, destination) {
425
+ const at = await runtime.located(room, path, destination);
335
426
  return at !== null && !covers(reach, at.room, at.path)
336
- ? Promise.resolve(UNREADABLE)
427
+ ? UNREADABLE
337
428
  : md.resolve(room, path, destination);
338
429
  },
339
- history: (room, path, query) => !covers(reach, room, path)
340
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
341
- : runtime.locked(room)
342
- ? Promise.resolve(lockedRoom(room))
430
+ history: async (room, path, query) => !covers(reach, room, path)
431
+ ? failure({ kind: 'room-not-readable', locator: room })
432
+ : (await runtime.locked(room))
433
+ ? lockedRoom(room)
343
434
  : md.history(room, path, query),
344
435
  binaryFile: {
345
- read: (room, path, revision) => !covers(reach, room, path)
346
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
347
- : runtime.locked(room)
348
- ? Promise.resolve(lockedRoom(room))
436
+ read: async (room, path, revision) => !covers(reach, room, path)
437
+ ? failure({ kind: 'room-not-readable', locator: room })
438
+ : (await runtime.locked(room))
439
+ ? lockedRoom(room)
349
440
  : hand(md.binaryFile.read(room, path, revision)),
350
- link: (room, path, revision) => !covers(reach, room, path)
351
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
352
- : runtime.locked(room)
353
- ? Promise.resolve(lockedRoom(room))
441
+ link: async (room, path, revision) => !covers(reach, room, path)
442
+ ? failure({ kind: 'room-not-readable', locator: room })
443
+ : (await runtime.locked(room))
444
+ ? lockedRoom(room)
354
445
  : md.binaryFile.link(room, path, revision),
355
- show: (room, path, revision) => !covers(reach, room, path)
356
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
357
- : runtime.locked(room)
358
- ? Promise.resolve(lockedRoom(room))
446
+ show: async (room, path, revision) => !covers(reach, room, path)
447
+ ? failure({ kind: 'room-not-readable', locator: room })
448
+ : (await runtime.locked(room))
449
+ ? lockedRoom(room)
359
450
  : hand(md.binaryFile.show(room, path, revision)),
360
- attach: (room, file) => !wholly(reach, room)
361
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
362
- : runtime.locked(room)
363
- ? Promise.resolve(lockedRoom(room))
451
+ attach: async (room, file) => !wholly(reach, room)
452
+ ? failure({ kind: 'room-not-readable', locator: room })
453
+ : (await runtime.locked(room))
454
+ ? lockedRoom(room)
364
455
  : md.binaryFile.attach(room, file),
365
456
  async part(file, part) {
366
457
  const key = files.get(file);
@@ -373,42 +464,37 @@ export function narrowed(runtime, given, told) {
373
464
  },
374
465
  },
375
466
  reached: async (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
376
- !runtime.locked(room) &&
467
+ !(await runtime.locked(room)) &&
377
468
  (await md.reached(room, roomVersion, path)),
378
- log: () => (reach === null ? md.log() : ''),
379
469
  cleanUp: () => (reach === null ? md.cleanUp() : Promise.reject(deviceUnreached())),
470
+ unsent: () => (reach === null ? md.unsent() : Promise.reject(deviceUnreached())),
471
+ reset: () => (reach === null ? md.reset() : Promise.reject(deviceUnreached())),
472
+ readAgain: () => (reach === null ? md.readAgain() : Promise.reject(deviceUnreached())),
380
473
  roomDraft: {
381
- list: () => md.roomDraft.list().then((drafts) => unlocked(draftsWithin(reach, drafts))),
474
+ list: async () => unlocked(draftsWithin(reach, await md.roomDraft.list()), await runtime.lockedRooms()),
382
475
  async read(room, path) {
383
476
  if (!covers(reach, room, path))
384
477
  return null;
385
- if (runtime.locked(room))
478
+ if (await runtime.locked(room))
386
479
  throw lockedError(room);
387
480
  return shownDraft(reach, await md.roomDraft.read(room, path));
388
481
  },
389
- write(room, path, revision, parts, next) {
390
- try {
391
- if (reach !== null && carriesFile(parts))
392
- throw attachRequired();
393
- const move = readParts(parts).move;
394
- if (!covers(reach, room, path) || !moves(reach, room, move))
395
- throw unreached(room);
396
- if (runtime.locked(room))
397
- throw lockedError(room);
398
- if (intoLocked([move]))
399
- throw lockedError(move.room);
400
- }
401
- catch (error) {
402
- return Promise.reject(error);
403
- }
404
- return md.roomDraft
405
- .write(room, path, revision, parts, next)
406
- .then((written) => writeWithin(reach, written));
482
+ async write(room, path, revision, parts, next) {
483
+ if (reach !== null && carriesFile(parts))
484
+ throw attachRequired();
485
+ const move = readParts(parts, path).move;
486
+ if (!covers(reach, room, path) || !moves(reach, room, move))
487
+ throw unreached(room);
488
+ if (await runtime.locked(room))
489
+ throw lockedError(room);
490
+ if (await intoLocked([move]))
491
+ throw lockedError(move.room);
492
+ return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts, next));
407
493
  },
408
494
  async discard(room, path, revision) {
409
495
  if (!covers(reach, room, path))
410
496
  return staleWrite(null);
411
- if (runtime.locked(room))
497
+ if (await runtime.locked(room))
412
498
  throw lockedError(room);
413
499
  return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
414
500
  },
@@ -418,15 +504,25 @@ export function narrowed(runtime, given, told) {
418
504
  read: (id, options) => conversation().read(id, options),
419
505
  create: (input) => conversation().create(input),
420
506
  send: (id, operation, draft) => conversation().send(id, operation, draft),
421
- answer: (id, answer) => conversation().answer(id, answer),
422
- interrupt: (id) => conversation().interrupt(id),
423
- kill: (id) => conversation().kill(id),
424
- cancel: (id, turn) => conversation().cancel(id, turn),
425
- delete: (id) => conversation().delete(id),
507
+ answer: (id, answer, operation) => conversation().answer(id, answer, operation),
508
+ interrupt: (id, operation) => conversation().interrupt(id, operation),
509
+ kill: (id, operation) => conversation().kill(id, operation),
510
+ delete: (id, operation) => conversation().delete(id, operation),
511
+ takeOut: (id, message, operation) => conversation().takeOut(id, message, operation),
512
+ decide: (request, decision, operation) => conversation().decide(request, decision, operation),
513
+ rename: (id, name, operation) => conversation().rename(id, name, operation),
514
+ option: (id, option, value, operation) => conversation().option(id, option, value, operation),
515
+ retry: (id, message, operation) => conversation().retry(id, message, operation),
516
+ pins: () => conversation().pins(),
517
+ pin: (figures) => conversation().pin(figures),
518
+ openedTurns: () => conversation().openedTurns(),
519
+ openTurn: (id, turn) => conversation().openTurn(id, turn),
520
+ dismissSuggestion: (id, suggestion) => conversation().dismissSuggestion(id, suggestion),
426
521
  },
427
522
  chatDraft: {
428
523
  write: (id, draft, revision) => chatDraft().write(id, draft, revision),
429
524
  prepend: (id, draft) => chatDraft().prepend(id, draft),
525
+ append: (id, draft) => chatDraft().append(id, draft),
430
526
  discard: (id) => chatDraft().discard(id),
431
527
  },
432
528
  observe: observing(within),
@@ -439,10 +535,5 @@ export function narrowed(runtime, given, told) {
439
535
  for (const restart of [...open])
440
536
  restart();
441
537
  },
442
- facts(next) {
443
- port = next;
444
- for (const restart of [...open])
445
- restart();
446
- },
447
538
  };
448
539
  }
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;