@agentshouse/mdruntime 0.1.0-c95464765b116 → 0.1.0-c95f0f04f2113

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