@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6b1e70f2da66

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