@agentshouse/mdruntime 0.1.0-c0105dbd22806 → 0.1.0-c0136de3edfbe

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 (356) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +248 -0
  8. package/dist/adapter.d.ts +153 -58
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +7 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +40 -41
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +31 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +323 -93
  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 +12 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +64 -0
  25. package/dist/change-set.d.ts +9 -14
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -63
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +10 -1
  31. package/dist/chat-types.d.ts +3 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +2 -0
  34. package/dist/client.d.ts +41 -16
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +101 -12
  37. package/dist/collection.d.ts +11 -7
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +38 -79
  40. package/dist/compile.d.ts +16 -0
  41. package/dist/compile.d.ts.map +1 -0
  42. package/dist/compile.js +717 -0
  43. package/dist/connection.d.ts +8 -117
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +101 -2483
  46. package/dist/context.d.ts +2 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/{chat/context.js → context.js} +1 -4
  49. package/dist/conversation-row.d.ts +33 -0
  50. package/dist/conversation-row.d.ts.map +1 -0
  51. package/dist/conversation-row.js +47 -0
  52. package/dist/conversation.d.ts +50 -20
  53. package/dist/conversation.d.ts.map +1 -1
  54. package/dist/conversation.js +897 -303
  55. package/dist/digest.d.ts +7 -0
  56. package/dist/digest.d.ts.map +1 -0
  57. package/dist/digest.js +113 -0
  58. package/dist/discovery.d.ts +10 -0
  59. package/dist/discovery.d.ts.map +1 -0
  60. package/dist/discovery.js +175 -0
  61. package/dist/durability.d.ts +10 -1
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +5 -0
  64. package/dist/entry.d.ts +7 -4
  65. package/dist/entry.d.ts.map +1 -1
  66. package/dist/entry.js +33 -28
  67. package/dist/figures.d.ts +48 -0
  68. package/dist/figures.d.ts.map +1 -0
  69. package/dist/figures.js +197 -0
  70. package/dist/file.d.ts +2 -19
  71. package/dist/file.d.ts.map +1 -1
  72. package/dist/file.js +7 -122
  73. package/dist/host.d.ts +11 -3
  74. package/dist/host.d.ts.map +1 -1
  75. package/dist/host.js +128 -21
  76. package/dist/index.d.ts +31 -11
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +10 -0
  79. package/dist/install.d.ts +56 -0
  80. package/dist/install.d.ts.map +1 -0
  81. package/dist/install.js +560 -0
  82. package/dist/job.d.ts +33 -0
  83. package/dist/job.d.ts.map +1 -0
  84. package/dist/job.js +54 -0
  85. package/dist/lifecycle.d.ts +7 -0
  86. package/dist/lifecycle.d.ts.map +1 -0
  87. package/dist/lifecycle.js +267 -0
  88. package/dist/listing.d.ts +53 -0
  89. package/dist/listing.d.ts.map +1 -0
  90. package/dist/listing.js +175 -0
  91. package/dist/live.d.ts +23 -0
  92. package/dist/live.d.ts.map +1 -0
  93. package/dist/live.js +165 -0
  94. package/dist/locks.d.ts +9 -0
  95. package/dist/locks.d.ts.map +1 -0
  96. package/dist/locks.js +61 -0
  97. package/dist/log.d.ts +1 -0
  98. package/dist/log.d.ts.map +1 -1
  99. package/dist/lost.d.ts +5 -0
  100. package/dist/lost.d.ts.map +1 -0
  101. package/dist/lost.js +61 -0
  102. package/dist/media.d.ts +8 -0
  103. package/dist/media.d.ts.map +1 -0
  104. package/dist/media.js +218 -0
  105. package/dist/memory.d.ts +19 -6
  106. package/dist/memory.d.ts.map +1 -1
  107. package/dist/memory.js +253 -95
  108. package/dist/messages.d.ts +52 -0
  109. package/dist/messages.d.ts.map +1 -0
  110. package/dist/messages.js +168 -0
  111. package/dist/model.d.ts +11 -11
  112. package/dist/model.d.ts.map +1 -1
  113. package/dist/model.js +7 -10
  114. package/dist/models.d.ts +14 -0
  115. package/dist/models.d.ts.map +1 -0
  116. package/dist/models.js +193 -0
  117. package/dist/name.d.ts +4 -0
  118. package/dist/name.d.ts.map +1 -0
  119. package/dist/name.js +122 -0
  120. package/dist/observation.d.ts +22 -4
  121. package/dist/observation.d.ts.map +1 -1
  122. package/dist/observation.js +120 -14
  123. package/dist/opened.d.ts +22 -0
  124. package/dist/opened.d.ts.map +1 -0
  125. package/dist/opened.js +107 -0
  126. package/dist/opening.d.ts +4 -0
  127. package/dist/opening.d.ts.map +1 -0
  128. package/dist/opening.js +56 -0
  129. package/dist/outcome.d.ts +50 -7
  130. package/dist/outcome.d.ts.map +1 -1
  131. package/dist/outcome.js +43 -0
  132. package/dist/overlay.d.ts +4 -4
  133. package/dist/overlay.d.ts.map +1 -1
  134. package/dist/overlay.js +111 -182
  135. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  136. package/dist/parts.d.ts.map +1 -0
  137. package/dist/{chat/parts.js → parts.js} +45 -46
  138. package/dist/paths.d.ts +1 -0
  139. package/dist/paths.d.ts.map +1 -1
  140. package/dist/paths.js +4 -0
  141. package/dist/preparation.d.ts +20 -0
  142. package/dist/preparation.d.ts.map +1 -0
  143. package/dist/preparation.js +226 -0
  144. package/dist/queries.d.ts +16 -0
  145. package/dist/queries.d.ts.map +1 -0
  146. package/dist/queries.js +272 -0
  147. package/dist/query.d.ts +50 -183
  148. package/dist/query.d.ts.map +1 -1
  149. package/dist/query.js +3 -464
  150. package/dist/{chat/questions.d.ts → questions.d.ts} +3 -2
  151. package/dist/questions.d.ts.map +1 -0
  152. package/dist/{chat/questions.js → questions.js} +8 -1
  153. package/dist/reach.d.ts +21 -7
  154. package/dist/reach.d.ts.map +1 -1
  155. package/dist/reach.js +289 -89
  156. package/dist/react.d.ts +12 -6
  157. package/dist/react.d.ts.map +1 -1
  158. package/dist/react.js +7 -17
  159. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  160. package/dist/read.d.ts.map +1 -0
  161. package/dist/{chat/read.js → read.js} +4 -0
  162. package/dist/readiness.d.ts +50 -0
  163. package/dist/readiness.d.ts.map +1 -0
  164. package/dist/readiness.js +27 -0
  165. package/dist/reads.d.ts +36 -0
  166. package/dist/reads.d.ts.map +1 -0
  167. package/dist/reads.js +136 -0
  168. package/dist/recovery.d.ts +26 -0
  169. package/dist/recovery.d.ts.map +1 -0
  170. package/dist/recovery.js +232 -0
  171. package/dist/refresh.d.ts +17 -14
  172. package/dist/refresh.d.ts.map +1 -1
  173. package/dist/refresh.js +143 -51
  174. package/dist/refusal.d.ts +5 -0
  175. package/dist/refusal.d.ts.map +1 -0
  176. package/dist/refusal.js +56 -0
  177. package/dist/replica.d.ts +55 -33
  178. package/dist/replica.d.ts.map +1 -1
  179. package/dist/replica.js +332 -154
  180. package/dist/room-draft.d.ts +37 -6
  181. package/dist/room-draft.d.ts.map +1 -1
  182. package/dist/room-draft.js +161 -74
  183. package/dist/room-drafts.d.ts +24 -0
  184. package/dist/room-drafts.d.ts.map +1 -0
  185. package/dist/room-drafts.js +216 -0
  186. package/dist/rows.d.ts +30 -37
  187. package/dist/rows.d.ts.map +1 -1
  188. package/dist/rows.js +59 -126
  189. package/dist/runtime.d.ts +42 -0
  190. package/dist/runtime.d.ts.map +1 -0
  191. package/dist/runtime.js +1 -0
  192. package/dist/save.d.ts +53 -9
  193. package/dist/save.d.ts.map +1 -1
  194. package/dist/save.js +542 -172
  195. package/dist/saves.d.ts +70 -0
  196. package/dist/saves.d.ts.map +1 -0
  197. package/dist/saves.js +1004 -0
  198. package/dist/search.d.ts +15 -55
  199. package/dist/search.d.ts.map +1 -1
  200. package/dist/search.js +10 -121
  201. package/dist/seed.d.ts +25 -0
  202. package/dist/seed.d.ts.map +1 -0
  203. package/dist/seed.js +146 -0
  204. package/dist/shared.d.ts +15 -0
  205. package/dist/shared.d.ts.map +1 -0
  206. package/dist/shared.js +421 -0
  207. package/dist/shown.d.ts +31 -0
  208. package/dist/shown.d.ts.map +1 -0
  209. package/dist/shown.js +294 -0
  210. package/dist/socket/admission.d.ts +7 -0
  211. package/dist/socket/admission.d.ts.map +1 -0
  212. package/dist/socket/admission.js +39 -0
  213. package/dist/socket/answers.d.ts +6 -0
  214. package/dist/socket/answers.d.ts.map +1 -0
  215. package/dist/socket/answers.js +20 -0
  216. package/dist/socket/lanes.d.ts +20 -0
  217. package/dist/socket/lanes.d.ts.map +1 -0
  218. package/dist/socket/lanes.js +77 -0
  219. package/dist/socket/reads.d.ts +10 -0
  220. package/dist/socket/reads.d.ts.map +1 -0
  221. package/dist/socket/reads.js +31 -0
  222. package/dist/socket/rooms.d.ts +43 -0
  223. package/dist/socket/rooms.d.ts.map +1 -0
  224. package/dist/socket/rooms.js +90 -0
  225. package/dist/socket/session.d.ts +39 -0
  226. package/dist/socket/session.d.ts.map +1 -0
  227. package/dist/socket/session.js +23 -0
  228. package/dist/socket.d.ts +70 -0
  229. package/dist/socket.d.ts.map +1 -0
  230. package/dist/socket.js +175 -0
  231. package/dist/source.d.ts +61 -0
  232. package/dist/source.d.ts.map +1 -0
  233. package/dist/source.js +81 -0
  234. package/dist/status.d.ts +5 -2
  235. package/dist/status.d.ts.map +1 -1
  236. package/dist/status.js +3 -7
  237. package/dist/store/fences.d.ts +16 -0
  238. package/dist/store/fences.d.ts.map +1 -0
  239. package/dist/store/fences.js +26 -0
  240. package/dist/store/installs.d.ts +30 -0
  241. package/dist/store/installs.d.ts.map +1 -0
  242. package/dist/store/installs.js +34 -0
  243. package/dist/store/readiness.d.ts +10 -0
  244. package/dist/store/readiness.d.ts.map +1 -0
  245. package/dist/store/readiness.js +52 -0
  246. package/dist/store/records.d.ts +212 -0
  247. package/dist/store/records.d.ts.map +1 -0
  248. package/dist/store/records.js +408 -0
  249. package/dist/store/room-held.d.ts +8 -0
  250. package/dist/store/room-held.d.ts.map +1 -0
  251. package/dist/store/room-held.js +17 -0
  252. package/dist/store/space.d.ts +11 -0
  253. package/dist/store/space.d.ts.map +1 -0
  254. package/dist/store/space.js +43 -0
  255. package/dist/store/watchers.d.ts +17 -0
  256. package/dist/store/watchers.d.ts.map +1 -0
  257. package/dist/store/watchers.js +57 -0
  258. package/dist/store/writes.d.ts +24 -0
  259. package/dist/store/writes.d.ts.map +1 -0
  260. package/dist/store/writes.js +125 -0
  261. package/dist/store.d.ts +106 -120
  262. package/dist/store.d.ts.map +1 -1
  263. package/dist/store.js +136 -556
  264. package/dist/stored.d.ts +156 -0
  265. package/dist/stored.d.ts.map +1 -0
  266. package/dist/stored.js +637 -0
  267. package/dist/surface.d.ts +86 -0
  268. package/dist/surface.d.ts.map +1 -0
  269. package/dist/surface.js +217 -0
  270. package/dist/sync.d.ts +20 -0
  271. package/dist/sync.d.ts.map +1 -0
  272. package/dist/sync.js +531 -0
  273. package/dist/tables.d.ts +407 -0
  274. package/dist/tables.d.ts.map +1 -0
  275. package/dist/tables.js +724 -0
  276. package/dist/tallies.d.ts +18 -0
  277. package/dist/tallies.d.ts.map +1 -0
  278. package/dist/tallies.js +129 -0
  279. package/dist/transfer.d.ts +0 -5
  280. package/dist/transfer.d.ts.map +1 -1
  281. package/dist/turn.d.ts +9 -0
  282. package/dist/turn.d.ts.map +1 -0
  283. package/dist/turn.js +75 -0
  284. package/dist/validation.d.ts +29 -0
  285. package/dist/validation.d.ts.map +1 -0
  286. package/dist/validation.js +104 -0
  287. package/dist/windows.d.ts +11 -0
  288. package/dist/windows.d.ts.map +1 -0
  289. package/dist/windows.js +16 -0
  290. package/dist/wire.d.ts +180 -33
  291. package/dist/wire.d.ts.map +1 -1
  292. package/dist/wire.js +61 -31
  293. package/package.json +18 -19
  294. package/AGENTS.md +0 -299
  295. package/dist/chat/acts.d.ts +0 -34
  296. package/dist/chat/acts.d.ts.map +0 -1
  297. package/dist/chat/acts.js +0 -36
  298. package/dist/chat/context.d.ts +0 -3
  299. package/dist/chat/context.d.ts.map +0 -1
  300. package/dist/chat/input.d.ts +0 -9
  301. package/dist/chat/input.d.ts.map +0 -1
  302. package/dist/chat/input.js +0 -99
  303. package/dist/chat/kit.d.ts +0 -60
  304. package/dist/chat/kit.d.ts.map +0 -1
  305. package/dist/chat/kit.js +0 -123
  306. package/dist/chat/lasting.d.ts +0 -6
  307. package/dist/chat/lasting.d.ts.map +0 -1
  308. package/dist/chat/lasting.js +0 -19
  309. package/dist/chat/list.d.ts +0 -26
  310. package/dist/chat/list.d.ts.map +0 -1
  311. package/dist/chat/list.js +0 -62
  312. package/dist/chat/markdown.d.ts +0 -20
  313. package/dist/chat/markdown.d.ts.map +0 -1
  314. package/dist/chat/markdown.js +0 -188
  315. package/dist/chat/message.d.ts +0 -6
  316. package/dist/chat/message.d.ts.map +0 -1
  317. package/dist/chat/message.js +0 -192
  318. package/dist/chat/messages.d.ts +0 -21
  319. package/dist/chat/messages.d.ts.map +0 -1
  320. package/dist/chat/messages.js +0 -151
  321. package/dist/chat/name.d.ts +0 -6
  322. package/dist/chat/name.d.ts.map +0 -1
  323. package/dist/chat/name.js +0 -37
  324. package/dist/chat/opened.d.ts +0 -11
  325. package/dist/chat/opened.d.ts.map +0 -1
  326. package/dist/chat/opened.js +0 -17
  327. package/dist/chat/overlay.d.ts +0 -31
  328. package/dist/chat/overlay.d.ts.map +0 -1
  329. package/dist/chat/overlay.js +0 -97
  330. package/dist/chat/parts.d.ts.map +0 -1
  331. package/dist/chat/process.d.ts +0 -20
  332. package/dist/chat/process.d.ts.map +0 -1
  333. package/dist/chat/process.js +0 -32
  334. package/dist/chat/provider.d.ts +0 -63
  335. package/dist/chat/provider.d.ts.map +0 -1
  336. package/dist/chat/provider.js +0 -645
  337. package/dist/chat/question.d.ts +0 -9
  338. package/dist/chat/question.d.ts.map +0 -1
  339. package/dist/chat/question.js +0 -80
  340. package/dist/chat/questions.d.ts.map +0 -1
  341. package/dist/chat/read.d.ts.map +0 -1
  342. package/dist/chat/ready.d.ts +0 -33
  343. package/dist/chat/ready.d.ts.map +0 -1
  344. package/dist/chat/ready.js +0 -91
  345. package/dist/chat/style.d.ts +0 -4
  346. package/dist/chat/style.d.ts.map +0 -1
  347. package/dist/chat/style.js +0 -302
  348. package/dist/chat.d.ts +0 -14
  349. package/dist/chat.d.ts.map +0 -1
  350. package/dist/chat.js +0 -8
  351. package/dist/fence.d.ts +0 -6
  352. package/dist/fence.d.ts.map +0 -1
  353. package/dist/fence.js +0 -10
  354. package/dist/read-side.d.ts +0 -18
  355. package/dist/read-side.d.ts.map +0 -1
  356. package/dist/read-side.js +0 -440
@@ -0,0 +1,248 @@
1
+ import { roomTarget, target } from '@agentshouse/mdmodel';
2
+ import { listingNow } from './listing.js';
3
+ import { locked, lockedRooms } from './locks.js';
4
+ import { scoped } from './models.js';
5
+ import { ABSENT_TARGET, calledResult, failure, historyAnswer, LOCKED_UNREADABLE, lockedRoom, undeclared, UNCERTAIN, UNREADABLE, } from './outcome.js';
6
+ import { refuse } from './refusal.js';
7
+ function operationOf(input) {
8
+ const operation = input?.operation_id;
9
+ return typeof operation === 'string' ? operation : null;
10
+ }
11
+ export async function readHistory(runtime, locator, path, query = {}) {
12
+ const { store, socket, journal } = runtime;
13
+ const { session } = socket;
14
+ if (socket.closed() || session.now().refusal !== null)
15
+ return UNCERTAIN;
16
+ await socket.firstDiscovery;
17
+ if (!session.now().roomsNamed)
18
+ return UNCERTAIN;
19
+ try {
20
+ await socket.authorize();
21
+ }
22
+ catch {
23
+ return UNCERTAIN;
24
+ }
25
+ const { closed, authorization, refusal } = session.now();
26
+ if (closed || authorization === undefined || refusal !== null)
27
+ return UNCERTAIN;
28
+ const since = store.fences.count();
29
+ const transfer = ['transfer', 'history', locator, path];
30
+ if (query.revision !== undefined)
31
+ transfer.push(query.revision);
32
+ if (query.pageToken !== undefined)
33
+ transfer.push(query.pageToken);
34
+ journal.record(transfer.join(' '));
35
+ try {
36
+ const result = await socket.history(authorization, {
37
+ locator,
38
+ path,
39
+ ...(query.revision === undefined ? {} : { revision: query.revision }),
40
+ ...(query.pageToken === undefined ? {} : { pageToken: query.pageToken }),
41
+ });
42
+ journal.record(`outcome history ${result.kind}`);
43
+ if (store.fences.since(locator, since))
44
+ return failure({ kind: 'room-not-readable', locator });
45
+ if (result.kind === 'scoped-refusal') {
46
+ const room = await store.record(result.locator);
47
+ if (room !== undefined)
48
+ await scoped(runtime, result, room, await store.open());
49
+ }
50
+ if (result.kind === 'revoked-authorization')
51
+ await refuse(runtime, 'revoked-authorization');
52
+ return historyAnswer(result);
53
+ }
54
+ catch {
55
+ journal.record('outcome history transport-uncertainty');
56
+ return UNCERTAIN;
57
+ }
58
+ }
59
+ export async function located(runtime, room, path, destination) {
60
+ const crossing = roomTarget(destination);
61
+ const listing = await listingNow(runtime);
62
+ if (crossing === null) {
63
+ const named = target(path, destination);
64
+ return named === null || !listing.has(room) ? null : { room, path: named };
65
+ }
66
+ const held = [...listing.values()].find((listed) => listed.handle === crossing.handle);
67
+ return held === undefined ? null : { room: held.locator, path: crossing.path };
68
+ }
69
+ export async function resolveReference(runtime, room, path, destination) {
70
+ const { store } = runtime;
71
+ if (roomTarget(destination) === null && target(path, destination) === null) {
72
+ return ABSENT_TARGET;
73
+ }
74
+ const at = await located(runtime, room, path, destination);
75
+ if (at === null)
76
+ return UNREADABLE;
77
+ if (await locked(runtime, at.room))
78
+ return LOCKED_UNREADABLE;
79
+ const held = await store.record(at.room);
80
+ if (held !== undefined &&
81
+ (await (await store.open()).entries(held.key, 'visible', [at.path])).length > 0) {
82
+ return { kind: 'document', ...at };
83
+ }
84
+ const history = await readHistory(runtime, at.room, at.path);
85
+ if (history.kind === 'no-history' || history.kind === 'revision')
86
+ return ABSENT_TARGET;
87
+ if (history.kind !== 'history')
88
+ return history;
89
+ const [last] = history.revisions;
90
+ if (last === undefined)
91
+ return ABSENT_TARGET;
92
+ return history.deleted === true
93
+ ? { kind: 'deleted', ...at, revision: last }
94
+ : { kind: 'document', ...at };
95
+ }
96
+ async function declaredAction({ store }, name) {
97
+ for (const capability of (await (await store.open()).facts()).capabilities) {
98
+ for (const action of capability.actions ?? []) {
99
+ if (action.name === name)
100
+ return action;
101
+ }
102
+ }
103
+ return undefined;
104
+ }
105
+ async function calledRooms(runtime, name, input) {
106
+ const member = (await declaredAction(runtime, name))?.room;
107
+ if (member === undefined || input === null || typeof input !== 'object')
108
+ return [];
109
+ const named = input[member];
110
+ return (Array.isArray(named) ? named : [named]).filter((room) => typeof room === 'string');
111
+ }
112
+ export async function invokeAction(runtime, name, input, dispatching) {
113
+ const { store, socket, journal } = runtime;
114
+ const { session } = socket;
115
+ await socket.ready;
116
+ if (socket.closed() || session.now().refusal !== null)
117
+ return UNCERTAIN;
118
+ if ((await declaredAction(runtime, name)) === undefined)
119
+ return undeclared(name);
120
+ try {
121
+ await socket.authorize();
122
+ }
123
+ catch {
124
+ return UNCERTAIN;
125
+ }
126
+ const { closed, authorization, refusal } = session.now();
127
+ if (closed || authorization === undefined || refusal !== null)
128
+ return UNCERTAIN;
129
+ await dispatching?.();
130
+ journal.record(`transfer action ${name}`);
131
+ try {
132
+ const result = await socket.action(authorization, { name, input });
133
+ if (result.kind === 'scoped-refusal') {
134
+ const room = await store.record(result.locator);
135
+ if (room !== undefined)
136
+ await scoped(runtime, result, room, await store.open());
137
+ }
138
+ if (result.kind === 'revoked-authorization')
139
+ await refuse(runtime, 'revoked-authorization');
140
+ journal.record(`outcome action ${result.kind}`);
141
+ if (result.kind === 'rejected')
142
+ journal.record(`refusal rejected ${result.code}`);
143
+ return calledResult(result);
144
+ }
145
+ catch {
146
+ journal.record('outcome action transport-uncertainty');
147
+ return UNCERTAIN;
148
+ }
149
+ }
150
+ export async function readConversationHistory(runtime, request) {
151
+ const { socket, journal } = runtime;
152
+ await socket.ready;
153
+ const stream = socket.conversations();
154
+ if (socket.closed() || socket.session.now().refusal !== null || stream?.history === undefined) {
155
+ return UNCERTAIN;
156
+ }
157
+ journal.record('transfer conversation history');
158
+ try {
159
+ const result = await stream.history(request);
160
+ if (result.kind === 'revoked-authorization')
161
+ await refuse(runtime, 'revoked-authorization');
162
+ journal.record(`outcome conversation history ${result.kind}`);
163
+ return calledResult(result);
164
+ }
165
+ catch {
166
+ journal.record('outcome conversation history transport-uncertainty');
167
+ return UNCERTAIN;
168
+ }
169
+ }
170
+ function unsettled(result) {
171
+ return result.kind !== 'action' && result.retryable;
172
+ }
173
+ async function recoveredAction(runtime, name, input) {
174
+ const { store, socket, recovery } = runtime;
175
+ const { lanes } = socket;
176
+ const operation = operationOf(input);
177
+ if (operation === null)
178
+ return invokeAction(runtime, name, input);
179
+ const kept = async () => (await store.open()).keepCall({ operation, name, input });
180
+ lanes.call(operation);
181
+ try {
182
+ let result = await invokeAction(runtime, name, input, kept);
183
+ if (unsettled(result)) {
184
+ await recovery.attempt(`action ${operation}`, async () => {
185
+ if (socket.closed() || socket.session.now().refusal !== null)
186
+ return 'done';
187
+ if (!socket.isOpen())
188
+ return 'again';
189
+ result = await invokeAction(runtime, name, input, kept);
190
+ return unsettled(result) ? 'again' : 'done';
191
+ }, { again: true });
192
+ }
193
+ if (!unsettled(result))
194
+ await (await store.open()).dropCall(operation);
195
+ return result;
196
+ }
197
+ finally {
198
+ lanes.called(operation);
199
+ }
200
+ }
201
+ export async function called(runtime, name, input) {
202
+ await runtime.socket.ready;
203
+ const lockedNow = await lockedRooms(runtime);
204
+ const room = (await calledRooms(runtime, name, input)).find((one) => lockedNow.includes(one));
205
+ return room === undefined ? recoveredAction(runtime, name, input) : lockedRoom(room);
206
+ }
207
+ export async function resendCalls(runtime, signal) {
208
+ const { store, socket } = runtime;
209
+ const { lanes } = socket;
210
+ if (!socket.isOpen() || socket.closed() || socket.stopping())
211
+ return 'done';
212
+ const local = await store.open();
213
+ for (const held of await local.calls()) {
214
+ if (lanes.calling(held.operation))
215
+ continue;
216
+ if (socket.closed() || signal.aborted)
217
+ return 'done';
218
+ lanes.call(held.operation);
219
+ try {
220
+ if (unsettled(await invokeAction(runtime, held.name, held.input)))
221
+ return 'again';
222
+ await local.dropCall(held.operation);
223
+ }
224
+ finally {
225
+ lanes.called(held.operation);
226
+ }
227
+ }
228
+ return 'done';
229
+ }
230
+ async function resendPass({ socket, conversations }, signal) {
231
+ if (!socket.continuing() || !socket.isOpen() || socket.stopping())
232
+ return 'done';
233
+ const reading = { complete: true, reachable: true };
234
+ try {
235
+ await conversations.resend(reading);
236
+ }
237
+ catch {
238
+ reading.reachable = false;
239
+ }
240
+ if (signal.aborted)
241
+ return 'done';
242
+ return reading.reachable && reading.complete ? 'done' : 'again';
243
+ }
244
+ export function resendLater(runtime) {
245
+ if (!runtime.socket.isOpen())
246
+ return;
247
+ void runtime.recovery.attempt('resend', (signal) => resendPass(runtime, signal), { again: true });
248
+ }
package/dist/adapter.d.ts CHANGED
@@ -1,4 +1,6 @@
1
+ import type { SavedFacts, TypedPath } from '@agentshouse/mdmodel';
1
2
  import type { ModelResult } from './model.js';
3
+ export type { SavedFacts, TypedPath };
2
4
  import type { Open } from './open.js';
3
5
  import type { ChangeBatch } from './change.js';
4
6
  export type Authorization = object;
@@ -10,14 +12,13 @@ export type TypedSelection = {
10
12
  roots: readonly string[];
11
13
  };
12
14
  export type OperationScopes = {
13
- read: readonly string[];
14
- sync: readonly string[];
15
15
  write: readonly string[];
16
- delete: readonly string[];
16
+ erase: readonly string[];
17
17
  };
18
18
  export type ReplicaAdmission = {
19
19
  selection: string;
20
20
  admission: Open<'admitted' | 'unavailable'>;
21
+ offline: Open<'locked' | 'open'>;
21
22
  };
22
23
  export type DiscoveredRoom = {
23
24
  name: string;
@@ -33,24 +34,21 @@ export type Capability = {
33
34
  name: string;
34
35
  limits?: readonly ProviderLimit[];
35
36
  actions?: readonly ActionDeclaration[];
36
- conversationAgents?: ConversationAgents;
37
- };
38
- export type ConversationAgents = {
39
- locator: string;
40
- type: string;
41
- identity: string;
42
- name: string;
43
- retired?: string;
44
37
  };
45
38
  export type ListedConversation = {
46
39
  conversation: string;
47
40
  agent: string;
41
+ agentName: string;
42
+ agentRetired: boolean;
48
43
  name: string;
49
44
  created: string;
50
45
  finished: string | null;
51
46
  outcome: string | null;
47
+ waiting: boolean;
48
+ newest: string | null;
49
+ processEnded: string | null;
52
50
  };
53
- export type ConversationAction = 'conversation.create' | 'conversation.send' | 'conversation.answer' | 'conversation.interrupt' | 'conversation.kill' | 'conversation.cancel' | 'conversation.delete' | 'conversation.history';
51
+ export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete';
54
52
  export type ConversationMessage = {
55
53
  identity: string;
56
54
  turn: string;
@@ -141,6 +139,10 @@ export type SessionOption = (SessionOptionNaming & {
141
139
  type: 'boolean';
142
140
  currentValue: boolean;
143
141
  });
142
+ export type RunningSubagent = {
143
+ description: string;
144
+ activity: string | null;
145
+ };
144
146
  export type ConversationEvent = {
145
147
  kind: 'turn';
146
148
  conversation: string;
@@ -162,6 +164,22 @@ export type ConversationEvent = {
162
164
  kind: 'options';
163
165
  conversation: string;
164
166
  options: readonly SessionOption[];
167
+ } | {
168
+ kind: 'starting';
169
+ conversation: string;
170
+ step: string | null;
171
+ } | {
172
+ kind: 'subagents';
173
+ conversation: string;
174
+ subagents: readonly RunningSubagent[];
175
+ } | {
176
+ kind: 'link';
177
+ conversation: string;
178
+ connected: boolean;
179
+ } | {
180
+ kind: 'deliveries';
181
+ conversation: string;
182
+ unknown: readonly string[];
165
183
  } | {
166
184
  kind: 'accepted-message';
167
185
  conversation: string;
@@ -172,6 +190,9 @@ export type ConversationEvent = {
172
190
  } | {
173
191
  kind: 'list';
174
192
  entries: readonly ListedConversation[];
193
+ whole: boolean;
194
+ more: boolean;
195
+ cursor: string | null;
175
196
  } | {
176
197
  kind: 'listed';
177
198
  entry: ListedConversation;
@@ -179,14 +200,23 @@ export type ConversationEvent = {
179
200
  kind: 'unlisted';
180
201
  conversation: string;
181
202
  };
203
+ export type ListedAgent = {
204
+ agent: string;
205
+ name: string;
206
+ retired: boolean;
207
+ };
182
208
  export type ConversationStream = {
183
209
  replicate(conversations: readonly string[]): void;
210
+ hold(cursor: string | null): void;
184
211
  observe(notify: (event: ConversationEvent) => void): () => void;
212
+ agents?(): Promise<readonly ListedAgent[] | null>;
213
+ history?(request: ConversationHistoryRequest): Promise<ActionResult>;
185
214
  };
186
215
  export type ActionDeclaration = {
187
216
  name: string;
188
217
  inputShape: unknown;
189
218
  resultKind: unknown;
219
+ room?: string;
190
220
  };
191
221
  export type ProviderLimit = {
192
222
  name: string;
@@ -200,7 +230,6 @@ export type HistoryRetention = {
200
230
  };
201
231
  export type Retention = {
202
232
  history: HistoryRetention;
203
- outcome: number;
204
233
  refreshHorizon: number;
205
234
  };
206
235
  export type Discovery = {
@@ -229,7 +258,7 @@ export type ProviderRefusal = {
229
258
  export type ScopedRefusal = ProviderRefusal & {
230
259
  kind: 'scoped-refusal';
231
260
  locator: string;
232
- scope: Open<'content' | 'sync' | 'model' | 'operation' | 'undisclosed'>;
261
+ scope: Open<'content' | 'model' | 'operation' | 'undisclosed'>;
233
262
  };
234
263
  export type AdapterFailure = TransportUncertainty | RoomNotReadable | RevokedAuthorization | ScopedRefusal;
235
264
  export type ContractUnavailable = ProviderRefusal & {
@@ -238,23 +267,20 @@ export type ContractUnavailable = ProviderRefusal & {
238
267
  export type DiscoverResult = Discovery | TransportUncertainty | RevokedAuthorization | ContractUnavailable;
239
268
  export type PageToken = string;
240
269
  export type ChangeAuthor = {
241
- kind: 'user';
270
+ kind: Open<'user' | 'site' | 'inbox' | 'app'>;
242
271
  id: string;
243
272
  name: string;
244
- } | {
245
- kind: 'site';
273
+ };
274
+ export type Member = {
275
+ kind: Open<'user'>;
246
276
  id: string;
247
277
  name: string;
248
278
  };
249
- export type Member = Extract<ChangeAuthor, {
250
- kind: 'user';
251
- }>;
252
279
  export type HeadChange = {
253
280
  author: ChangeAuthor | null;
254
281
  time: string;
255
282
  };
256
283
  export type BinaryFile = {
257
- fileRef: string;
258
284
  byteLength: number;
259
285
  mediaType: string;
260
286
  sha256: string;
@@ -263,22 +289,41 @@ export type BootstrapRequest = {
263
289
  locator: string;
264
290
  selection: string;
265
291
  pageToken?: PageToken;
292
+ arriving?: (bytes: number) => void;
293
+ signal?: AbortSignal;
294
+ };
295
+ export type BootstrapPart = {
296
+ readonly id: string;
297
+ readonly bytes: number;
298
+ };
299
+ export type BootstrapInventory = {
300
+ readonly bytes: number;
266
301
  };
267
302
  export type RoomModels = {
268
303
  collection?: ModelResult;
269
- selection?: ModelResult;
270
304
  };
271
305
  export type BootstrapPage = {
272
306
  kind: 'bootstrap';
273
307
  roomVersion: string;
274
308
  models?: RoomModels;
275
309
  documents: Readonly<Record<string, string>>;
310
+ facts: Readonly<Record<string, SavedFacts>>;
276
311
  revisions: Readonly<Record<string, string>>;
312
+ fileIds?: Readonly<Record<string, string>>;
313
+ created?: Readonly<Record<string, string>>;
277
314
  changes: Readonly<Record<string, HeadChange>>;
278
315
  binaryFiles: Readonly<Record<string, BinaryFile>>;
316
+ folders?: readonly string[];
279
317
  pageToken?: PageToken;
318
+ parts?: readonly BootstrapPart[];
319
+ bytes?: number;
280
320
  };
281
- export type BootstrapResult = BootstrapPage | AdapterFailure;
321
+ export type NotReady = {
322
+ kind: 'not-ready';
323
+ };
324
+ export type BootstrapResult = BootstrapPage | {
325
+ kind: 'beyond-horizon';
326
+ } | NotReady | AdapterFailure;
282
327
  export type RefreshRequest = {
283
328
  locator: string;
284
329
  selection: string;
@@ -290,10 +335,15 @@ export type RefreshPage = {
290
335
  roomVersion: string;
291
336
  models?: RoomModels;
292
337
  documents: Readonly<Record<string, string>>;
338
+ facts: Readonly<Record<string, SavedFacts>>;
293
339
  revisions: Readonly<Record<string, string>>;
340
+ fileIds?: Readonly<Record<string, string>>;
341
+ created?: Readonly<Record<string, string>>;
294
342
  changes: Readonly<Record<string, HeadChange>>;
295
343
  binaryFiles: Readonly<Record<string, BinaryFile>>;
296
344
  removals: readonly string[];
345
+ folders?: readonly string[];
346
+ folderRemovals?: readonly string[];
297
347
  pageToken?: PageToken;
298
348
  };
299
349
  export type RefreshResult = {
@@ -304,6 +354,7 @@ export type RefreshResult = {
304
354
  export type MutationRequest = {
305
355
  locator: string;
306
356
  changeBatch: ChangeBatch;
357
+ file(localId: string): Promise<Blob>;
307
358
  upload?: unknown;
308
359
  };
309
360
  export type RetryableRefusal = ProviderRefusal & {
@@ -314,17 +365,21 @@ export type ServiceMode = Open<'open' | 'write-halted'>;
314
365
  export type ServiceModeSignal = {
315
366
  observe(notify: (mode: ServiceMode) => void): () => void;
316
367
  };
317
- export type MutationResult = {
318
- kind: 'accepted';
368
+ export type AcceptedRoom = {
319
369
  roomVersion: string;
320
370
  documents: Readonly<Record<string, string>>;
321
371
  revisions: Readonly<Record<string, string>>;
372
+ fileIds?: Readonly<Record<string, string>>;
322
373
  changes: Readonly<Record<string, HeadChange>>;
323
374
  removals: readonly string[];
324
375
  binaryFiles?: Readonly<Record<string, BinaryFile>>;
376
+ };
377
+ export type MutationResult = (AcceptedRoom & {
378
+ kind: 'accepted';
325
379
  author?: string;
326
380
  time?: string;
327
- } | (ProviderRefusal & {
381
+ destination?: AcceptedRoom;
382
+ }) | (ProviderRefusal & {
328
383
  kind: 'conflicted';
329
384
  roomVersion?: string;
330
385
  affected: Readonly<Record<string, string>>;
@@ -333,14 +388,9 @@ export type MutationResult = {
333
388
  affected: Readonly<Record<string, string>>;
334
389
  }) | RetryableRefusal | {
335
390
  kind: 'write-halted';
336
- } | {
337
- kind: 'expired';
338
391
  } | AdapterFailure;
339
392
  export type HistoryAuthor = {
340
- kind: 'user';
341
- id: string;
342
- } | {
343
- kind: 'site';
393
+ kind: 'user' | 'site' | 'inbox' | 'app';
344
394
  id: string;
345
395
  name: string;
346
396
  };
@@ -372,22 +422,35 @@ export type BinaryRequest = {
372
422
  locator: string;
373
423
  path: string;
374
424
  revision: string;
375
- fileRef?: string;
376
- } | {
377
- kind: 'reference';
378
- fileRef: string;
379
- referrer: unknown;
380
- };
381
- export type ReferrerScope = {
382
- kind: 'room';
383
- locator: string;
384
- path?: string;
385
- } | {
386
- kind: 'conversations';
387
425
  };
388
426
  export type BinaryResult = {
389
427
  kind: 'binary';
428
+ body: ReadableStream<Uint8Array>;
429
+ mediaType: string;
430
+ sha256?: string;
431
+ } | (ProviderRefusal & {
432
+ kind: 'rejected';
433
+ }) | AdapterFailure;
434
+ export type BinaryLinkResult = {
435
+ kind: 'link';
436
+ url: string;
437
+ name: string;
438
+ mediaType?: string;
439
+ } | (ProviderRefusal & {
440
+ kind: 'rejected';
441
+ }) | AdapterFailure;
442
+ export type AttachRequest = {
443
+ locator: string;
444
+ name: string;
445
+ mediaType: string;
446
+ byteLength: number;
447
+ sha256: string;
390
448
  blob: Blob;
449
+ };
450
+ export type AttachResult = {
451
+ kind: 'attached';
452
+ path: string;
453
+ revision: string;
391
454
  } | (ProviderRefusal & {
392
455
  kind: 'rejected';
393
456
  }) | AdapterFailure;
@@ -406,47 +469,79 @@ export type ActionResult = {
406
469
  } | (ProviderRefusal & {
407
470
  kind: 'rejected';
408
471
  }) | AdapterFailure;
472
+ export type SearchHit = {
473
+ room: string;
474
+ path: string;
475
+ line?: number;
476
+ snippet?: string;
477
+ };
478
+ export type SearchAsk = {
479
+ text: string;
480
+ rooms: readonly string[] | null;
481
+ };
482
+ export type SearchAnswer = {
483
+ kind: 'found';
484
+ documents: readonly SearchHit[];
485
+ } | (ProviderRefusal & {
486
+ kind: 'rejected';
487
+ }) | AdapterFailure;
409
488
  export type HeldRoom = {
410
489
  locator: string;
490
+ roomVersion: string | null;
491
+ };
492
+ export type RoomChange = {
493
+ kind: 'room-change';
494
+ locator: string;
495
+ from: string | null;
411
496
  roomVersion: string;
412
- documents: Readonly<Record<string, string>>;
413
- revisions: Readonly<Record<string, string>>;
497
+ read(): Promise<RefreshPage>;
498
+ };
499
+ export type AuthorityChange = {
500
+ kind: 'authority-changed';
501
+ rooms: readonly DiscoveredRoom[];
502
+ left: readonly string[];
503
+ member?: Member;
414
504
  };
415
505
  export type RoomStreamEvent = {
416
506
  kind: 'opened';
507
+ } | {
508
+ kind: 'discovered';
509
+ discovery: Discovery;
417
510
  } | {
418
511
  kind: 'closed';
419
512
  revoked: boolean;
513
+ lost: boolean;
514
+ authorityChanged: boolean;
420
515
  } | {
421
- kind: 'opening';
516
+ kind: 'caught-up';
422
517
  expired: readonly string[];
423
- } | {
424
- kind: 'room-version';
425
- locator: string;
426
- roomVersion: string;
427
- };
518
+ } | AuthorityChange | RoomChange;
428
519
  export type RoomStream = {
429
520
  hold(rooms: readonly HeldRoom[]): void;
430
- reopen(): void;
431
521
  observe(notify: (event: RoomStreamEvent) => void): () => void;
432
522
  };
433
523
  export type Adapter = {
434
524
  readonly localSaves?: true;
435
- readonly exhaustiveDiscovery?: true;
525
+ readonly roomTypes?: string;
526
+ readonly nameableRoomTypes?: readonly string[];
527
+ readonly typedPaths?: readonly TypedPath[];
528
+ readonly unkeptReads?: readonly string[];
529
+ readonly leadingReads?: readonly string[];
436
530
  authorize(): Promise<Authorization>;
437
- discover(authorization: Authorization): Promise<DiscoverResult>;
531
+ discover?(authorization: Authorization): Promise<DiscoverResult>;
438
532
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
439
- refresh(authorization: Authorization, request: RefreshRequest): Promise<RefreshResult>;
533
+ refresh?(authorization: Authorization, request: RefreshRequest): Promise<RefreshResult>;
440
534
  mutate(authorization: Authorization, request: MutationRequest, keep: (upload: unknown) => Promise<void>): Promise<MutationResult>;
441
535
  history(authorization: Authorization, request: HistoryRequest): Promise<HistoryResult>;
442
536
  binary(authorization: Authorization, request: BinaryRequest): Promise<BinaryResult>;
443
- referrerScope(referrer: unknown): ReferrerScope | null;
537
+ link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
538
+ attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
444
539
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
540
+ search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
445
541
  reached(locator: string, roomVersion: string, target: string): boolean;
446
542
  follows(locator: string, roomVersion: string, next: string): boolean;
447
543
  roomStream?: RoomStream;
448
544
  conversations?: ConversationStream;
449
545
  serviceMode?: ServiceModeSignal;
450
546
  };
451
- export {};
452
547
  //# sourceMappingURL=adapter.d.ts.map