@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad

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