@agentshouse/mdruntime 0.1.0-c97456d63baba → 0.1.0-c98426a9ee68e

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 (365) 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 +150 -79
  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 +319 -107
  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 -16
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -88
  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 +33 -10
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +98 -11
  37. package/dist/collection.d.ts +11 -21
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +39 -291
  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 +7 -129
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +97 -3344
  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 +42 -18
  53. package/dist/conversation.d.ts.map +1 -1
  54. package/dist/conversation.js +715 -312
  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 +16 -4
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +5 -0
  64. package/dist/entry.d.ts +5 -2
  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/holdings.d.ts +29 -0
  74. package/dist/holdings.d.ts.map +1 -0
  75. package/dist/holdings.js +95 -0
  76. package/dist/host.d.ts +7 -8
  77. package/dist/host.d.ts.map +1 -1
  78. package/dist/host.js +101 -24
  79. package/dist/identity.d.ts +0 -2
  80. package/dist/identity.d.ts.map +1 -1
  81. package/dist/identity.js +0 -6
  82. package/dist/index.d.ts +32 -13
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +10 -1
  85. package/dist/install.d.ts +56 -0
  86. package/dist/install.d.ts.map +1 -0
  87. package/dist/install.js +560 -0
  88. package/dist/job.d.ts +33 -0
  89. package/dist/job.d.ts.map +1 -0
  90. package/dist/job.js +54 -0
  91. package/dist/lifecycle.d.ts +7 -0
  92. package/dist/lifecycle.d.ts.map +1 -0
  93. package/dist/lifecycle.js +267 -0
  94. package/dist/listing.d.ts +53 -0
  95. package/dist/listing.d.ts.map +1 -0
  96. package/dist/listing.js +175 -0
  97. package/dist/live.d.ts +23 -0
  98. package/dist/live.d.ts.map +1 -0
  99. package/dist/live.js +165 -0
  100. package/dist/locks.d.ts +9 -0
  101. package/dist/locks.d.ts.map +1 -0
  102. package/dist/locks.js +61 -0
  103. package/dist/log.d.ts +1 -0
  104. package/dist/log.d.ts.map +1 -1
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +61 -0
  108. package/dist/media.d.ts +8 -0
  109. package/dist/media.d.ts.map +1 -0
  110. package/dist/media.js +218 -0
  111. package/dist/memory.d.ts +19 -7
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +248 -103
  114. package/dist/messages.d.ts +52 -0
  115. package/dist/messages.d.ts.map +1 -0
  116. package/dist/messages.js +168 -0
  117. package/dist/model.d.ts +8 -10
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +6 -18
  120. package/dist/models.d.ts +14 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +193 -0
  123. package/dist/name.d.ts +4 -0
  124. package/dist/name.d.ts.map +1 -0
  125. package/dist/name.js +122 -0
  126. package/dist/observation.d.ts +17 -2
  127. package/dist/observation.d.ts.map +1 -1
  128. package/dist/observation.js +100 -5
  129. package/dist/opened.d.ts +22 -0
  130. package/dist/opened.d.ts.map +1 -0
  131. package/dist/opened.js +107 -0
  132. package/dist/opening.d.ts +4 -0
  133. package/dist/opening.d.ts.map +1 -0
  134. package/dist/opening.js +56 -0
  135. package/dist/outcome.d.ts +46 -7
  136. package/dist/outcome.d.ts.map +1 -1
  137. package/dist/outcome.js +42 -0
  138. package/dist/overlay.d.ts +4 -5
  139. package/dist/overlay.d.ts.map +1 -1
  140. package/dist/overlay.js +106 -156
  141. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/{chat/parts.js → parts.js} +45 -46
  144. package/dist/paths.d.ts +1 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +4 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +226 -0
  150. package/dist/queries.d.ts +16 -0
  151. package/dist/queries.d.ts.map +1 -0
  152. package/dist/queries.js +272 -0
  153. package/dist/query.d.ts +26 -185
  154. package/dist/query.d.ts.map +1 -1
  155. package/dist/query.js +3 -464
  156. package/dist/{chat/questions.d.ts → questions.d.ts} +3 -2
  157. package/dist/questions.d.ts.map +1 -0
  158. package/dist/{chat/questions.js → questions.js} +8 -1
  159. package/dist/reach.d.ts +19 -9
  160. package/dist/reach.d.ts.map +1 -1
  161. package/dist/reach.js +287 -99
  162. package/dist/react.d.ts +8 -4
  163. package/dist/react.d.ts.map +1 -1
  164. package/dist/react.js +7 -17
  165. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  166. package/dist/read.d.ts.map +1 -0
  167. package/dist/{chat/read.js → read.js} +4 -0
  168. package/dist/readiness.d.ts +14 -17
  169. package/dist/readiness.d.ts.map +1 -1
  170. package/dist/readiness.js +2 -8
  171. package/dist/reads.d.ts +36 -0
  172. package/dist/reads.d.ts.map +1 -0
  173. package/dist/reads.js +136 -0
  174. package/dist/recovery.d.ts +3 -2
  175. package/dist/recovery.d.ts.map +1 -1
  176. package/dist/recovery.js +43 -8
  177. package/dist/refresh.d.ts +17 -14
  178. package/dist/refresh.d.ts.map +1 -1
  179. package/dist/refresh.js +143 -52
  180. package/dist/refusal.d.ts +5 -0
  181. package/dist/refusal.d.ts.map +1 -0
  182. package/dist/refusal.js +56 -0
  183. package/dist/replica.d.ts +55 -33
  184. package/dist/replica.d.ts.map +1 -1
  185. package/dist/replica.js +331 -181
  186. package/dist/room-draft.d.ts +37 -6
  187. package/dist/room-draft.d.ts.map +1 -1
  188. package/dist/room-draft.js +161 -74
  189. package/dist/room-drafts.d.ts +24 -0
  190. package/dist/room-drafts.d.ts.map +1 -0
  191. package/dist/room-drafts.js +216 -0
  192. package/dist/rows.d.ts +31 -29
  193. package/dist/rows.d.ts.map +1 -1
  194. package/dist/rows.js +59 -116
  195. package/dist/runtime.d.ts +42 -0
  196. package/dist/runtime.d.ts.map +1 -0
  197. package/dist/runtime.js +1 -0
  198. package/dist/save.d.ts +53 -14
  199. package/dist/save.d.ts.map +1 -1
  200. package/dist/save.js +534 -187
  201. package/dist/saves.d.ts +70 -0
  202. package/dist/saves.d.ts.map +1 -0
  203. package/dist/saves.js +1004 -0
  204. package/dist/search.d.ts +15 -77
  205. package/dist/search.d.ts.map +1 -1
  206. package/dist/search.js +10 -184
  207. package/dist/seed.d.ts +25 -0
  208. package/dist/seed.d.ts.map +1 -0
  209. package/dist/seed.js +146 -0
  210. package/dist/shared.d.ts +7 -3
  211. package/dist/shared.d.ts.map +1 -1
  212. package/dist/shared.js +119 -66
  213. package/dist/shown.d.ts +31 -0
  214. package/dist/shown.d.ts.map +1 -0
  215. package/dist/shown.js +294 -0
  216. package/dist/socket/admission.d.ts +7 -0
  217. package/dist/socket/admission.d.ts.map +1 -0
  218. package/dist/socket/admission.js +39 -0
  219. package/dist/socket/answers.d.ts +6 -0
  220. package/dist/socket/answers.d.ts.map +1 -0
  221. package/dist/socket/answers.js +20 -0
  222. package/dist/socket/lanes.d.ts +20 -0
  223. package/dist/socket/lanes.d.ts.map +1 -0
  224. package/dist/socket/lanes.js +77 -0
  225. package/dist/socket/reads.d.ts +10 -0
  226. package/dist/socket/reads.d.ts.map +1 -0
  227. package/dist/socket/reads.js +31 -0
  228. package/dist/socket/rooms.d.ts +43 -0
  229. package/dist/socket/rooms.d.ts.map +1 -0
  230. package/dist/socket/rooms.js +90 -0
  231. package/dist/socket/session.d.ts +39 -0
  232. package/dist/socket/session.d.ts.map +1 -0
  233. package/dist/socket/session.js +23 -0
  234. package/dist/socket.d.ts +70 -0
  235. package/dist/socket.d.ts.map +1 -0
  236. package/dist/socket.js +175 -0
  237. package/dist/source.d.ts +61 -0
  238. package/dist/source.d.ts.map +1 -0
  239. package/dist/source.js +81 -0
  240. package/dist/status.d.ts +4 -5
  241. package/dist/status.d.ts.map +1 -1
  242. package/dist/status.js +3 -7
  243. package/dist/store/fences.d.ts +16 -0
  244. package/dist/store/fences.d.ts.map +1 -0
  245. package/dist/store/fences.js +26 -0
  246. package/dist/store/installs.d.ts +30 -0
  247. package/dist/store/installs.d.ts.map +1 -0
  248. package/dist/store/installs.js +34 -0
  249. package/dist/store/readiness.d.ts +10 -0
  250. package/dist/store/readiness.d.ts.map +1 -0
  251. package/dist/store/readiness.js +52 -0
  252. package/dist/store/records.d.ts +212 -0
  253. package/dist/store/records.d.ts.map +1 -0
  254. package/dist/store/records.js +408 -0
  255. package/dist/store/room-held.d.ts +8 -0
  256. package/dist/store/room-held.d.ts.map +1 -0
  257. package/dist/store/room-held.js +17 -0
  258. package/dist/store/space.d.ts +11 -0
  259. package/dist/store/space.d.ts.map +1 -0
  260. package/dist/store/space.js +43 -0
  261. package/dist/store/watchers.d.ts +17 -0
  262. package/dist/store/watchers.d.ts.map +1 -0
  263. package/dist/store/watchers.js +57 -0
  264. package/dist/store/writes.d.ts +24 -0
  265. package/dist/store/writes.d.ts.map +1 -0
  266. package/dist/store/writes.js +125 -0
  267. package/dist/store.d.ts +106 -150
  268. package/dist/store.d.ts.map +1 -1
  269. package/dist/store.js +136 -713
  270. package/dist/stored.d.ts +156 -0
  271. package/dist/stored.d.ts.map +1 -0
  272. package/dist/stored.js +637 -0
  273. package/dist/surface.d.ts +88 -0
  274. package/dist/surface.d.ts.map +1 -0
  275. package/dist/surface.js +222 -0
  276. package/dist/sync.d.ts +20 -0
  277. package/dist/sync.d.ts.map +1 -0
  278. package/dist/sync.js +531 -0
  279. package/dist/tables.d.ts +415 -0
  280. package/dist/tables.d.ts.map +1 -0
  281. package/dist/tables.js +740 -0
  282. package/dist/tallies.d.ts +18 -0
  283. package/dist/tallies.d.ts.map +1 -0
  284. package/dist/tallies.js +129 -0
  285. package/dist/transfer.d.ts +0 -5
  286. package/dist/transfer.d.ts.map +1 -1
  287. package/dist/turn.d.ts +5 -3
  288. package/dist/turn.d.ts.map +1 -1
  289. package/dist/turn.js +51 -21
  290. package/dist/validation.d.ts +29 -0
  291. package/dist/validation.d.ts.map +1 -0
  292. package/dist/validation.js +104 -0
  293. package/dist/windows.d.ts +11 -0
  294. package/dist/windows.d.ts.map +1 -0
  295. package/dist/windows.js +16 -0
  296. package/dist/wire.d.ts +50 -6
  297. package/dist/wire.d.ts.map +1 -1
  298. package/dist/wire.js +16 -2
  299. package/package.json +18 -19
  300. package/AGENTS.md +0 -299
  301. package/dist/acquisition.d.ts +0 -14
  302. package/dist/acquisition.d.ts.map +0 -1
  303. package/dist/acquisition.js +0 -24
  304. package/dist/chat/acts.d.ts +0 -33
  305. package/dist/chat/acts.d.ts.map +0 -1
  306. package/dist/chat/acts.js +0 -36
  307. package/dist/chat/context.d.ts +0 -3
  308. package/dist/chat/context.d.ts.map +0 -1
  309. package/dist/chat/input.d.ts +0 -9
  310. package/dist/chat/input.d.ts.map +0 -1
  311. package/dist/chat/input.js +0 -99
  312. package/dist/chat/kit.d.ts +0 -61
  313. package/dist/chat/kit.d.ts.map +0 -1
  314. package/dist/chat/kit.js +0 -123
  315. package/dist/chat/lasting.d.ts +0 -6
  316. package/dist/chat/lasting.d.ts.map +0 -1
  317. package/dist/chat/lasting.js +0 -19
  318. package/dist/chat/list.d.ts +0 -27
  319. package/dist/chat/list.d.ts.map +0 -1
  320. package/dist/chat/list.js +0 -63
  321. package/dist/chat/markdown.d.ts +0 -20
  322. package/dist/chat/markdown.d.ts.map +0 -1
  323. package/dist/chat/markdown.js +0 -188
  324. package/dist/chat/message.d.ts +0 -6
  325. package/dist/chat/message.d.ts.map +0 -1
  326. package/dist/chat/message.js +0 -192
  327. package/dist/chat/messages.d.ts +0 -22
  328. package/dist/chat/messages.d.ts.map +0 -1
  329. package/dist/chat/messages.js +0 -155
  330. package/dist/chat/name.d.ts +0 -6
  331. package/dist/chat/name.d.ts.map +0 -1
  332. package/dist/chat/name.js +0 -37
  333. package/dist/chat/opened.d.ts +0 -11
  334. package/dist/chat/opened.d.ts.map +0 -1
  335. package/dist/chat/opened.js +0 -17
  336. package/dist/chat/overlay.d.ts +0 -31
  337. package/dist/chat/overlay.d.ts.map +0 -1
  338. package/dist/chat/overlay.js +0 -97
  339. package/dist/chat/parts.d.ts.map +0 -1
  340. package/dist/chat/process.d.ts +0 -20
  341. package/dist/chat/process.d.ts.map +0 -1
  342. package/dist/chat/process.js +0 -32
  343. package/dist/chat/provider.d.ts +0 -63
  344. package/dist/chat/provider.d.ts.map +0 -1
  345. package/dist/chat/provider.js +0 -629
  346. package/dist/chat/question.d.ts +0 -9
  347. package/dist/chat/question.d.ts.map +0 -1
  348. package/dist/chat/question.js +0 -80
  349. package/dist/chat/questions.d.ts.map +0 -1
  350. package/dist/chat/read.d.ts.map +0 -1
  351. package/dist/chat/ready.d.ts +0 -34
  352. package/dist/chat/ready.d.ts.map +0 -1
  353. package/dist/chat/ready.js +0 -91
  354. package/dist/chat/style.d.ts +0 -4
  355. package/dist/chat/style.d.ts.map +0 -1
  356. package/dist/chat/style.js +0 -302
  357. package/dist/chat.d.ts +0 -14
  358. package/dist/chat.d.ts.map +0 -1
  359. package/dist/chat.js +0 -8
  360. package/dist/fence.d.ts +0 -6
  361. package/dist/fence.d.ts.map +0 -1
  362. package/dist/fence.js +0 -10
  363. package/dist/read-side.d.ts +0 -25
  364. package/dist/read-side.d.ts.map +0 -1
  365. package/dist/read-side.js +0 -639
@@ -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,7 +267,7 @@ 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: Open<'user' | 'site'>;
270
+ kind: Open<'user' | 'site' | 'inbox' | 'app'>;
242
271
  id: string;
243
272
  name: string;
244
273
  };
@@ -252,38 +281,49 @@ export type HeadChange = {
252
281
  time: string;
253
282
  };
254
283
  export type BinaryFile = {
255
- fileRef: string;
256
284
  byteLength: number;
257
285
  mediaType: string;
258
286
  sha256: string;
259
287
  };
260
- export type HeldContent = {
261
- documents: Readonly<Record<string, string>>;
262
- revisions: Readonly<Record<string, string>>;
263
- };
264
288
  export type BootstrapRequest = {
265
289
  locator: string;
266
290
  selection: string;
267
291
  pageToken?: PageToken;
268
- held?: HeldContent;
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;
269
301
  };
270
302
  export type RoomModels = {
271
303
  collection?: ModelResult;
272
- selection?: ModelResult;
273
304
  };
274
305
  export type BootstrapPage = {
275
306
  kind: 'bootstrap';
276
307
  roomVersion: string;
277
308
  models?: RoomModels;
278
309
  documents: Readonly<Record<string, string>>;
310
+ facts: Readonly<Record<string, SavedFacts>>;
279
311
  revisions: Readonly<Record<string, string>>;
312
+ fileIds?: Readonly<Record<string, string>>;
313
+ created?: Readonly<Record<string, string>>;
280
314
  changes: Readonly<Record<string, HeadChange>>;
281
315
  binaryFiles: Readonly<Record<string, BinaryFile>>;
316
+ folders?: readonly string[];
282
317
  pageToken?: PageToken;
318
+ parts?: readonly BootstrapPart[];
319
+ bytes?: number;
320
+ };
321
+ export type NotReady = {
322
+ kind: 'not-ready';
283
323
  };
284
324
  export type BootstrapResult = BootstrapPage | {
285
325
  kind: 'beyond-horizon';
286
- } | AdapterFailure;
326
+ } | NotReady | AdapterFailure;
287
327
  export type RefreshRequest = {
288
328
  locator: string;
289
329
  selection: string;
@@ -295,10 +335,15 @@ export type RefreshPage = {
295
335
  roomVersion: string;
296
336
  models?: RoomModels;
297
337
  documents: Readonly<Record<string, string>>;
338
+ facts: Readonly<Record<string, SavedFacts>>;
298
339
  revisions: Readonly<Record<string, string>>;
340
+ fileIds?: Readonly<Record<string, string>>;
341
+ created?: Readonly<Record<string, string>>;
299
342
  changes: Readonly<Record<string, HeadChange>>;
300
343
  binaryFiles: Readonly<Record<string, BinaryFile>>;
301
344
  removals: readonly string[];
345
+ folders?: readonly string[];
346
+ folderRemovals?: readonly string[];
302
347
  pageToken?: PageToken;
303
348
  };
304
349
  export type RefreshResult = {
@@ -309,6 +354,7 @@ export type RefreshResult = {
309
354
  export type MutationRequest = {
310
355
  locator: string;
311
356
  changeBatch: ChangeBatch;
357
+ file(localId: string): Promise<Blob>;
312
358
  upload?: unknown;
313
359
  };
314
360
  export type RetryableRefusal = ProviderRefusal & {
@@ -319,17 +365,21 @@ export type ServiceMode = Open<'open' | 'write-halted'>;
319
365
  export type ServiceModeSignal = {
320
366
  observe(notify: (mode: ServiceMode) => void): () => void;
321
367
  };
322
- export type MutationResult = {
323
- kind: 'accepted';
368
+ export type AcceptedRoom = {
324
369
  roomVersion: string;
325
370
  documents: Readonly<Record<string, string>>;
326
371
  revisions: Readonly<Record<string, string>>;
372
+ fileIds?: Readonly<Record<string, string>>;
327
373
  changes: Readonly<Record<string, HeadChange>>;
328
374
  removals: readonly string[];
329
375
  binaryFiles?: Readonly<Record<string, BinaryFile>>;
376
+ };
377
+ export type MutationResult = (AcceptedRoom & {
378
+ kind: 'accepted';
330
379
  author?: string;
331
380
  time?: string;
332
- } | (ProviderRefusal & {
381
+ destination?: AcceptedRoom;
382
+ }) | (ProviderRefusal & {
333
383
  kind: 'conflicted';
334
384
  roomVersion?: string;
335
385
  affected: Readonly<Record<string, string>>;
@@ -338,15 +388,9 @@ export type MutationResult = {
338
388
  affected: Readonly<Record<string, string>>;
339
389
  }) | RetryableRefusal | {
340
390
  kind: 'write-halted';
341
- } | {
342
- kind: 'expired';
343
- restored?: true;
344
391
  } | AdapterFailure;
345
392
  export type HistoryAuthor = {
346
- kind: 'user';
347
- id: string;
348
- } | {
349
- kind: 'site';
393
+ kind: 'user' | 'site' | 'inbox' | 'app';
350
394
  id: string;
351
395
  name: string;
352
396
  };
@@ -378,22 +422,35 @@ export type BinaryRequest = {
378
422
  locator: string;
379
423
  path: string;
380
424
  revision: string;
381
- fileRef?: string;
382
- } | {
383
- kind: 'reference';
384
- fileRef: string;
385
- referrer: unknown;
386
- };
387
- export type ReferrerScope = {
388
- kind: 'room';
389
- locator: string;
390
- path?: string;
391
- } | {
392
- kind: 'conversations';
393
425
  };
394
426
  export type BinaryResult = {
395
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;
396
448
  blob: Blob;
449
+ };
450
+ export type AttachResult = {
451
+ kind: 'attached';
452
+ path: string;
453
+ revision: string;
397
454
  } | (ProviderRefusal & {
398
455
  kind: 'rejected';
399
456
  }) | AdapterFailure;
@@ -412,65 +469,79 @@ export type ActionResult = {
412
469
  } | (ProviderRefusal & {
413
470
  kind: 'rejected';
414
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;
415
488
  export type HeldRoom = {
416
489
  locator: string;
490
+ roomVersion: string | null;
491
+ };
492
+ export type RoomChange = {
493
+ kind: 'room-change';
494
+ locator: string;
495
+ from: string | null;
417
496
  roomVersion: string;
418
- documents: Readonly<Record<string, string>>;
419
- 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;
420
504
  };
421
505
  export type RoomStreamEvent = {
422
506
  kind: 'opened';
507
+ } | {
508
+ kind: 'discovered';
509
+ discovery: Discovery;
423
510
  } | {
424
511
  kind: 'closed';
425
512
  revoked: boolean;
513
+ lost: boolean;
514
+ authorityChanged: boolean;
426
515
  } | {
427
- kind: 'opening';
516
+ kind: 'caught-up';
428
517
  expired: readonly string[];
429
- } | {
430
- kind: 'room-version';
431
- locator: string;
432
- roomVersion: string;
433
- };
434
- export type KeptReceipt = {
435
- key: string;
436
- head: unknown;
437
- };
438
- export type StreamReceipts = {
439
- heads(): Promise<readonly KeptReceipt[]>;
440
- parts(key: string, count: number): Promise<readonly unknown[]>;
441
- keep(key: string, head: unknown, part?: {
442
- index: number;
443
- value: unknown;
444
- }): Promise<void>;
445
- drop(keys: readonly string[]): Promise<void>;
446
- };
447
- export type AcquiredDemand = {
448
- rooms: readonly string[];
449
- conversations: boolean;
450
- };
518
+ } | AuthorityChange | RoomChange;
451
519
  export type RoomStream = {
452
- hold(rooms: readonly HeldRoom[], demand: AcquiredDemand | null): void;
453
- reopen(): void;
454
- published(locator: string, roomVersion: string): void;
455
- observe(notify: (event: RoomStreamEvent) => void, receipts: StreamReceipts): () => void;
520
+ hold(rooms: readonly HeldRoom[]): void;
521
+ observe(notify: (event: RoomStreamEvent) => void): () => void;
456
522
  };
457
523
  export type Adapter = {
458
524
  readonly localSaves?: true;
459
- 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[];
460
530
  authorize(): Promise<Authorization>;
461
- discover(authorization: Authorization): Promise<DiscoverResult>;
531
+ discover?(authorization: Authorization): Promise<DiscoverResult>;
462
532
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
463
- refresh(authorization: Authorization, request: RefreshRequest): Promise<RefreshResult>;
533
+ refresh?(authorization: Authorization, request: RefreshRequest): Promise<RefreshResult>;
464
534
  mutate(authorization: Authorization, request: MutationRequest, keep: (upload: unknown) => Promise<void>): Promise<MutationResult>;
465
535
  history(authorization: Authorization, request: HistoryRequest): Promise<HistoryResult>;
466
536
  binary(authorization: Authorization, request: BinaryRequest): Promise<BinaryResult>;
467
- referrerScope(referrer: unknown): ReferrerScope | null;
537
+ link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
538
+ attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
468
539
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
540
+ search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
469
541
  reached(locator: string, roomVersion: string, target: string): boolean;
470
542
  follows(locator: string, roomVersion: string, next: string): boolean;
471
543
  roomStream?: RoomStream;
472
544
  conversations?: ConversationStream;
473
545
  serviceMode?: ServiceModeSignal;
474
546
  };
475
- export {};
476
547
  //# sourceMappingURL=adapter.d.ts.map