@agentshouse/mdruntime 0.1.0-cb2e390ee7b89 → 0.1.0-cb3bb3b233fa1

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 (407) hide show
  1. package/README.md +24 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +214 -123
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +6 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +35 -41
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/binary.d.ts +0 -5
  20. package/dist/binary.d.ts.map +1 -1
  21. package/dist/binary.js +1 -1
  22. package/dist/bootstrap.d.ts +30 -11
  23. package/dist/bootstrap.d.ts.map +1 -1
  24. package/dist/bootstrap.js +309 -113
  25. package/dist/cell.d.ts +6 -0
  26. package/dist/cell.d.ts.map +1 -0
  27. package/dist/cell.js +9 -0
  28. package/dist/chain.d.ts +12 -0
  29. package/dist/chain.d.ts.map +1 -0
  30. package/dist/chain.js +64 -0
  31. package/dist/change-set.d.ts +13 -16
  32. package/dist/change-set.d.ts.map +1 -1
  33. package/dist/change-set.js +17 -89
  34. package/dist/change.d.ts +36 -1
  35. package/dist/change.d.ts.map +1 -1
  36. package/dist/change.js +17 -3
  37. package/dist/chat-types.d.ts +3 -0
  38. package/dist/chat-types.d.ts.map +1 -0
  39. package/dist/chat-types.js +11 -0
  40. package/dist/client.d.ts +39 -25
  41. package/dist/client.d.ts.map +1 -1
  42. package/dist/client.js +117 -23
  43. package/dist/collection.d.ts +32 -21
  44. package/dist/collection.d.ts.map +1 -1
  45. package/dist/collection.js +53 -288
  46. package/dist/column.d.ts +5 -0
  47. package/dist/column.d.ts.map +1 -0
  48. package/dist/column.js +9 -0
  49. package/dist/compile.d.ts +18 -0
  50. package/dist/compile.d.ts.map +1 -0
  51. package/dist/compile.js +723 -0
  52. package/dist/connection.d.ts +7 -134
  53. package/dist/connection.d.ts.map +1 -1
  54. package/dist/connection.js +109 -3606
  55. package/dist/context.d.ts +2 -0
  56. package/dist/context.d.ts.map +1 -0
  57. package/dist/{chat/context.js → context.js} +2 -5
  58. package/dist/conversation-live.d.ts +150 -0
  59. package/dist/conversation-live.d.ts.map +1 -0
  60. package/dist/conversation-live.js +259 -0
  61. package/dist/conversation-row.d.ts +40 -0
  62. package/dist/conversation-row.d.ts.map +1 -0
  63. package/dist/conversation-row.js +66 -0
  64. package/dist/conversation.d.ts +80 -50
  65. package/dist/conversation.d.ts.map +1 -1
  66. package/dist/conversation.js +1037 -793
  67. package/dist/declaration.d.ts +10 -0
  68. package/dist/declaration.d.ts.map +1 -0
  69. package/dist/declaration.js +24 -0
  70. package/dist/digest.d.ts +7 -0
  71. package/dist/digest.d.ts.map +1 -0
  72. package/dist/digest.js +113 -0
  73. package/dist/discovery.d.ts +10 -0
  74. package/dist/discovery.d.ts.map +1 -0
  75. package/dist/discovery.js +150 -0
  76. package/dist/durability.d.ts +20 -4
  77. package/dist/durability.d.ts.map +1 -1
  78. package/dist/durability.js +9 -0
  79. package/dist/entry.d.ts +5 -2
  80. package/dist/entry.d.ts.map +1 -1
  81. package/dist/entry.js +33 -28
  82. package/dist/expectation.d.ts +26 -13
  83. package/dist/expectation.d.ts.map +1 -1
  84. package/dist/expectation.js +72 -19
  85. package/dist/failure.d.ts +3 -0
  86. package/dist/failure.d.ts.map +1 -1
  87. package/dist/failure.js +6 -0
  88. package/dist/figures.d.ts +49 -0
  89. package/dist/figures.d.ts.map +1 -0
  90. package/dist/figures.js +199 -0
  91. package/dist/file.d.ts +2 -19
  92. package/dist/file.d.ts.map +1 -1
  93. package/dist/file.js +8 -122
  94. package/dist/holdings.d.ts +29 -0
  95. package/dist/holdings.d.ts.map +1 -0
  96. package/dist/holdings.js +95 -0
  97. package/dist/host.d.ts +21 -11
  98. package/dist/host.d.ts.map +1 -1
  99. package/dist/host.js +126 -53
  100. package/dist/identity.d.ts +0 -2
  101. package/dist/identity.d.ts.map +1 -1
  102. package/dist/identity.js +0 -6
  103. package/dist/index.d.ts +41 -16
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +19 -4
  106. package/dist/install.d.ts +60 -0
  107. package/dist/install.d.ts.map +1 -0
  108. package/dist/install.js +537 -0
  109. package/dist/lifecycle.d.ts +7 -0
  110. package/dist/lifecycle.d.ts.map +1 -0
  111. package/dist/lifecycle.js +282 -0
  112. package/dist/listing.d.ts +52 -0
  113. package/dist/listing.d.ts.map +1 -0
  114. package/dist/listing.js +152 -0
  115. package/dist/live.d.ts +25 -0
  116. package/dist/live.d.ts.map +1 -0
  117. package/dist/live.js +206 -0
  118. package/dist/loaded.d.ts +5 -0
  119. package/dist/loaded.d.ts.map +1 -0
  120. package/dist/loaded.js +40 -0
  121. package/dist/locks.d.ts +7 -0
  122. package/dist/locks.d.ts.map +1 -0
  123. package/dist/locks.js +32 -0
  124. package/dist/lost.d.ts +5 -0
  125. package/dist/lost.d.ts.map +1 -0
  126. package/dist/lost.js +49 -0
  127. package/dist/media.d.ts +13 -0
  128. package/dist/media.d.ts.map +1 -0
  129. package/dist/media.js +269 -0
  130. package/dist/memory.d.ts +20 -8
  131. package/dist/memory.d.ts.map +1 -1
  132. package/dist/memory.js +311 -121
  133. package/dist/messages.d.ts +58 -0
  134. package/dist/messages.d.ts.map +1 -0
  135. package/dist/messages.js +160 -0
  136. package/dist/model.d.ts +8 -11
  137. package/dist/model.d.ts.map +1 -1
  138. package/dist/model.js +6 -23
  139. package/dist/models.d.ts +10 -0
  140. package/dist/models.d.ts.map +1 -0
  141. package/dist/models.js +153 -0
  142. package/dist/name.d.ts +4 -0
  143. package/dist/name.d.ts.map +1 -0
  144. package/dist/name.js +122 -0
  145. package/dist/observation.d.ts +38 -10
  146. package/dist/observation.d.ts.map +1 -1
  147. package/dist/observation.js +232 -44
  148. package/dist/opened.d.ts +22 -0
  149. package/dist/opened.d.ts.map +1 -0
  150. package/dist/opened.js +107 -0
  151. package/dist/opening.d.ts +4 -0
  152. package/dist/opening.d.ts.map +1 -0
  153. package/dist/opening.js +53 -0
  154. package/dist/outcome.d.ts +57 -10
  155. package/dist/outcome.d.ts.map +1 -1
  156. package/dist/outcome.js +71 -2
  157. package/dist/overlay.d.ts +8 -6
  158. package/dist/overlay.d.ts.map +1 -1
  159. package/dist/overlay.js +121 -182
  160. package/dist/page-metadata.d.ts +8 -0
  161. package/dist/page-metadata.d.ts.map +1 -0
  162. package/dist/page-metadata.js +19 -0
  163. package/dist/parts.d.ts +4 -0
  164. package/dist/parts.d.ts.map +1 -0
  165. package/dist/parts.js +13 -0
  166. package/dist/paths.d.ts +2 -0
  167. package/dist/paths.d.ts.map +1 -1
  168. package/dist/paths.js +26 -0
  169. package/dist/preparation.d.ts +41 -0
  170. package/dist/preparation.d.ts.map +1 -0
  171. package/dist/preparation.js +314 -0
  172. package/dist/presence.d.ts +58 -0
  173. package/dist/presence.d.ts.map +1 -0
  174. package/dist/presence.js +231 -0
  175. package/dist/queries.d.ts +16 -0
  176. package/dist/queries.d.ts.map +1 -0
  177. package/dist/queries.js +308 -0
  178. package/dist/query.d.ts +21 -203
  179. package/dist/query.d.ts.map +1 -1
  180. package/dist/query.js +3 -491
  181. package/dist/{chat/questions.d.ts → questions.d.ts} +6 -7
  182. package/dist/questions.d.ts.map +1 -0
  183. package/dist/{chat/questions.js → questions.js} +12 -7
  184. package/dist/queue.d.ts +40 -0
  185. package/dist/queue.d.ts.map +1 -0
  186. package/dist/queue.js +480 -0
  187. package/dist/reach.d.ts +21 -11
  188. package/dist/reach.d.ts.map +1 -1
  189. package/dist/reach.js +358 -111
  190. package/dist/react.d.ts +19 -5
  191. package/dist/react.d.ts.map +1 -1
  192. package/dist/react.js +35 -15
  193. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  194. package/dist/read.d.ts.map +1 -0
  195. package/dist/{chat/read.js → read.js} +4 -0
  196. package/dist/readiness.d.ts +22 -20
  197. package/dist/readiness.d.ts.map +1 -1
  198. package/dist/readiness.js +5 -13
  199. package/dist/reads.d.ts +38 -10
  200. package/dist/reads.d.ts.map +1 -1
  201. package/dist/reads.js +163 -83
  202. package/dist/recovery.d.ts +5 -2
  203. package/dist/recovery.d.ts.map +1 -1
  204. package/dist/recovery.js +65 -8
  205. package/dist/refresh.d.ts +18 -15
  206. package/dist/refresh.d.ts.map +1 -1
  207. package/dist/refresh.js +145 -60
  208. package/dist/refusal.d.ts +5 -0
  209. package/dist/refusal.d.ts.map +1 -0
  210. package/dist/refusal.js +55 -0
  211. package/dist/replica.d.ts +49 -36
  212. package/dist/replica.d.ts.map +1 -1
  213. package/dist/replica.js +322 -198
  214. package/dist/retried.d.ts +30 -0
  215. package/dist/retried.d.ts.map +1 -0
  216. package/dist/retried.js +72 -0
  217. package/dist/room-draft.d.ts +55 -13
  218. package/dist/room-draft.d.ts.map +1 -1
  219. package/dist/room-draft.js +416 -122
  220. package/dist/room-drafts.d.ts +24 -0
  221. package/dist/room-drafts.d.ts.map +1 -0
  222. package/dist/room-drafts.js +220 -0
  223. package/dist/room-list.d.ts +10 -0
  224. package/dist/room-list.d.ts.map +1 -0
  225. package/dist/room-list.js +45 -0
  226. package/dist/rows.d.ts +32 -30
  227. package/dist/rows.d.ts.map +1 -1
  228. package/dist/rows.js +60 -120
  229. package/dist/runtime.d.ts +34 -0
  230. package/dist/runtime.d.ts.map +1 -0
  231. package/dist/runtime.js +1 -0
  232. package/dist/save.d.ts +43 -49
  233. package/dist/save.d.ts.map +1 -1
  234. package/dist/save.js +736 -304
  235. package/dist/saves.d.ts +34 -0
  236. package/dist/saves.d.ts.map +1 -0
  237. package/dist/saves.js +437 -0
  238. package/dist/search.d.ts +12 -95
  239. package/dist/search.d.ts.map +1 -1
  240. package/dist/search.js +10 -266
  241. package/dist/seed.d.ts +11 -2
  242. package/dist/seed.d.ts.map +1 -1
  243. package/dist/seed.js +71 -1
  244. package/dist/shared.d.ts +6 -7
  245. package/dist/shared.d.ts.map +1 -1
  246. package/dist/shared.js +75 -104
  247. package/dist/shown.d.ts +33 -0
  248. package/dist/shown.d.ts.map +1 -0
  249. package/dist/shown.js +309 -0
  250. package/dist/socket/admission.d.ts +7 -0
  251. package/dist/socket/admission.d.ts.map +1 -0
  252. package/dist/socket/admission.js +39 -0
  253. package/dist/socket/answers.d.ts +6 -0
  254. package/dist/socket/answers.d.ts.map +1 -0
  255. package/dist/socket/answers.js +20 -0
  256. package/dist/socket/lanes.d.ts +28 -0
  257. package/dist/socket/lanes.d.ts.map +1 -0
  258. package/dist/socket/lanes.js +103 -0
  259. package/dist/socket/reads.d.ts +10 -0
  260. package/dist/socket/reads.d.ts.map +1 -0
  261. package/dist/socket/reads.js +31 -0
  262. package/dist/socket/session.d.ts +38 -0
  263. package/dist/socket/session.d.ts.map +1 -0
  264. package/dist/socket/session.js +23 -0
  265. package/dist/socket.d.ts +67 -0
  266. package/dist/socket.d.ts.map +1 -0
  267. package/dist/socket.js +164 -0
  268. package/dist/source.d.ts +59 -0
  269. package/dist/source.d.ts.map +1 -0
  270. package/dist/source.js +93 -0
  271. package/dist/status.d.ts +4 -5
  272. package/dist/status.d.ts.map +1 -1
  273. package/dist/status.js +3 -7
  274. package/dist/store/installs.d.ts +30 -0
  275. package/dist/store/installs.d.ts.map +1 -0
  276. package/dist/store/installs.js +40 -0
  277. package/dist/store/readiness.d.ts +11 -0
  278. package/dist/store/readiness.d.ts.map +1 -0
  279. package/dist/store/readiness.js +68 -0
  280. package/dist/store/records.d.ts +223 -0
  281. package/dist/store/records.d.ts.map +1 -0
  282. package/dist/store/records.js +465 -0
  283. package/dist/store/room-held.d.ts +8 -0
  284. package/dist/store/room-held.d.ts.map +1 -0
  285. package/dist/store/room-held.js +17 -0
  286. package/dist/store/rooms-shown.d.ts +8 -0
  287. package/dist/store/rooms-shown.d.ts.map +1 -0
  288. package/dist/store/rooms-shown.js +13 -0
  289. package/dist/store/space.d.ts +11 -0
  290. package/dist/store/space.d.ts.map +1 -0
  291. package/dist/store/space.js +41 -0
  292. package/dist/store/watchers.d.ts +17 -0
  293. package/dist/store/watchers.d.ts.map +1 -0
  294. package/dist/store/watchers.js +56 -0
  295. package/dist/store/writes.d.ts +24 -0
  296. package/dist/store/writes.d.ts.map +1 -0
  297. package/dist/store/writes.js +125 -0
  298. package/dist/store.d.ts +114 -163
  299. package/dist/store.d.ts.map +1 -1
  300. package/dist/store.js +163 -754
  301. package/dist/stored.d.ts +167 -0
  302. package/dist/stored.d.ts.map +1 -0
  303. package/dist/stored.js +700 -0
  304. package/dist/surface.d.ts +90 -0
  305. package/dist/surface.d.ts.map +1 -0
  306. package/dist/surface.js +225 -0
  307. package/dist/sync.d.ts +19 -0
  308. package/dist/sync.d.ts.map +1 -0
  309. package/dist/sync.js +536 -0
  310. package/dist/tables.d.ts +376 -0
  311. package/dist/tables.d.ts.map +1 -0
  312. package/dist/tables.js +499 -0
  313. package/dist/tallies.d.ts +18 -0
  314. package/dist/tallies.d.ts.map +1 -0
  315. package/dist/tallies.js +128 -0
  316. package/dist/transfer.d.ts +0 -5
  317. package/dist/transfer.d.ts.map +1 -1
  318. package/dist/turn.d.ts +5 -3
  319. package/dist/turn.d.ts.map +1 -1
  320. package/dist/turn.js +51 -21
  321. package/dist/validation.d.ts +29 -0
  322. package/dist/validation.d.ts.map +1 -0
  323. package/dist/validation.js +98 -0
  324. package/dist/windows.d.ts +9 -16
  325. package/dist/windows.d.ts.map +1 -1
  326. package/dist/windows.js +11 -75
  327. package/dist/wire.d.ts +91 -9
  328. package/dist/wire.d.ts.map +1 -1
  329. package/dist/wire.js +31 -6
  330. package/package.json +19 -19
  331. package/AGENTS.md +0 -299
  332. package/dist/acquisition.d.ts +0 -14
  333. package/dist/acquisition.d.ts.map +0 -1
  334. package/dist/acquisition.js +0 -24
  335. package/dist/attempt.d.ts +0 -16
  336. package/dist/attempt.d.ts.map +0 -1
  337. package/dist/attempt.js +0 -70
  338. package/dist/chat/acts.d.ts +0 -33
  339. package/dist/chat/acts.d.ts.map +0 -1
  340. package/dist/chat/acts.js +0 -36
  341. package/dist/chat/context.d.ts +0 -3
  342. package/dist/chat/context.d.ts.map +0 -1
  343. package/dist/chat/earlier.d.ts +0 -10
  344. package/dist/chat/earlier.d.ts.map +0 -1
  345. package/dist/chat/earlier.js +0 -54
  346. package/dist/chat/input.d.ts +0 -9
  347. package/dist/chat/input.d.ts.map +0 -1
  348. package/dist/chat/input.js +0 -99
  349. package/dist/chat/kit.d.ts +0 -61
  350. package/dist/chat/kit.d.ts.map +0 -1
  351. package/dist/chat/kit.js +0 -123
  352. package/dist/chat/lasting.d.ts +0 -6
  353. package/dist/chat/lasting.d.ts.map +0 -1
  354. package/dist/chat/lasting.js +0 -19
  355. package/dist/chat/list.d.ts +0 -27
  356. package/dist/chat/list.d.ts.map +0 -1
  357. package/dist/chat/list.js +0 -99
  358. package/dist/chat/markdown.d.ts +0 -20
  359. package/dist/chat/markdown.d.ts.map +0 -1
  360. package/dist/chat/markdown.js +0 -188
  361. package/dist/chat/message.d.ts +0 -6
  362. package/dist/chat/message.d.ts.map +0 -1
  363. package/dist/chat/message.js +0 -192
  364. package/dist/chat/messages.d.ts +0 -22
  365. package/dist/chat/messages.d.ts.map +0 -1
  366. package/dist/chat/messages.js +0 -155
  367. package/dist/chat/name.d.ts +0 -6
  368. package/dist/chat/name.d.ts.map +0 -1
  369. package/dist/chat/name.js +0 -37
  370. package/dist/chat/opened.d.ts +0 -11
  371. package/dist/chat/opened.d.ts.map +0 -1
  372. package/dist/chat/opened.js +0 -17
  373. package/dist/chat/overlay.d.ts +0 -31
  374. package/dist/chat/overlay.d.ts.map +0 -1
  375. package/dist/chat/overlay.js +0 -97
  376. package/dist/chat/parts.d.ts +0 -57
  377. package/dist/chat/parts.d.ts.map +0 -1
  378. package/dist/chat/parts.js +0 -119
  379. package/dist/chat/process.d.ts +0 -20
  380. package/dist/chat/process.d.ts.map +0 -1
  381. package/dist/chat/process.js +0 -32
  382. package/dist/chat/provider.d.ts +0 -63
  383. package/dist/chat/provider.d.ts.map +0 -1
  384. package/dist/chat/provider.js +0 -635
  385. package/dist/chat/question.d.ts +0 -9
  386. package/dist/chat/question.d.ts.map +0 -1
  387. package/dist/chat/question.js +0 -69
  388. package/dist/chat/questions.d.ts.map +0 -1
  389. package/dist/chat/read.d.ts.map +0 -1
  390. package/dist/chat/ready.d.ts +0 -34
  391. package/dist/chat/ready.d.ts.map +0 -1
  392. package/dist/chat/ready.js +0 -91
  393. package/dist/chat/style.d.ts +0 -4
  394. package/dist/chat/style.d.ts.map +0 -1
  395. package/dist/chat/style.js +0 -302
  396. package/dist/chat.d.ts +0 -14
  397. package/dist/chat.d.ts.map +0 -1
  398. package/dist/chat.js +0 -8
  399. package/dist/fence.d.ts +0 -6
  400. package/dist/fence.d.ts.map +0 -1
  401. package/dist/fence.js +0 -10
  402. package/dist/log.d.ts +0 -5
  403. package/dist/log.d.ts.map +0 -1
  404. package/dist/log.js +0 -14
  405. package/dist/read-side.d.ts +0 -25
  406. package/dist/read-side.d.ts.map +0 -1
  407. package/dist/read-side.js +0 -761
package/dist/memory.js CHANGED
@@ -1,7 +1,20 @@
1
+ import { definitionAt, documentFacts, keyedDestination, keyedLink, parse, } from '@agentshouse/mdmodel';
2
+ import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
3
+ import { selected } from './collection.js';
4
+ import { declaredType } from './outcome.js';
1
5
  import { sameChange } from './overlay.js';
6
+ const ATTACHMENTS = 'attachments';
7
+ const UNFOUND = {
8
+ kind: 'rejected',
9
+ code: 'not_found',
10
+ fields: {},
11
+ retryable: false,
12
+ };
13
+ function lastName(path) {
14
+ return path.slice(path.lastIndexOf('/') + 1);
15
+ }
2
16
  const FIXTURE_RETENTION = {
3
17
  history: { kind: 'duration', seconds: 1 },
4
- outcome: 604_800,
5
18
  refreshHorizon: 1,
6
19
  };
7
20
  function declaredRetention(value) {
@@ -15,12 +28,7 @@ function declaredRetention(value) {
15
28
  }
16
29
  const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
17
30
  function modelsOf(room) {
18
- return {
19
- collection: room.model ?? MODEL_ABSENT,
20
- ...(room.typedSelection === undefined
21
- ? {}
22
- : { selection: room.selectionModel ?? MODEL_ABSENT }),
23
- };
31
+ return { collection: room.model ?? MODEL_ABSENT };
24
32
  }
25
33
  function changedModels(room, from) {
26
34
  const now = modelsOf(room);
@@ -53,14 +61,18 @@ export function createMemoryAdapter(options = {}) {
53
61
  const listeners = new Set();
54
62
  const modeObservers = new Set();
55
63
  const scripted = new Map();
56
- const unsealed = new Map();
57
- const sealed = new Set();
58
- const sentTurns = new Map();
64
+ const repeats = new Map();
59
65
  const historyPageSize = options.historyPageSize;
60
- let held = [];
61
- let heldDemand = null;
66
+ const attached = new Map();
67
+ const keyed = new Map();
68
+ const linked = new WeakMap();
69
+ const carried = new Map();
62
70
  let expiring = [];
71
+ let openings = 0;
72
+ const declaredRooms = new Set();
63
73
  let replicated = [];
74
+ let heldCursor = null;
75
+ let agents = structuredClone(options.agents ?? []);
64
76
  let issued = 0;
65
77
  function scriptConversations(entries) {
66
78
  scripted.clear();
@@ -88,8 +100,72 @@ export function createMemoryAdapter(options = {}) {
88
100
  const wanted = ordinals.get(`${locator}\u0000${target}`);
89
101
  return held !== undefined && wanted !== undefined && held >= wanted;
90
102
  }
103
+ function heldBlob(room, path) {
104
+ return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
105
+ }
106
+ function linkTo(room, path) {
107
+ const blob = room === undefined ? undefined : heldBlob(room, path);
108
+ if (blob === undefined)
109
+ return UNFOUND;
110
+ const url = linked.get(blob) ?? URL.createObjectURL(blob);
111
+ linked.set(blob, url);
112
+ return { kind: 'link', url, name: lastName(path), mediaType: declaredType(blob) };
113
+ }
114
+ function attachedKeyed(request) {
115
+ const room = rooms.find((entry) => entry.locator === options.privateRoom);
116
+ if (room === undefined) {
117
+ return { kind: 'rejected', code: 'room_not_found', fields: {}, retryable: false };
118
+ }
119
+ const path = freePath(room, request.name);
120
+ attached.set(`${room.locator}\u0000${path}`, request.blob);
121
+ const key = `memory-${keyed.size + 1}`;
122
+ keyed.set(key, { locator: room.locator, path });
123
+ return { kind: 'linked', link: keyedDestination(`/rooms/${room.handle}/${path}`, key) };
124
+ }
125
+ function freePath(room, name) {
126
+ const dot = name.lastIndexOf('.');
127
+ const stem = dot > 0 ? name.slice(0, dot) : name;
128
+ const extension = dot > 0 ? name.slice(dot) : '';
129
+ for (let count = 1;; count += 1) {
130
+ const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
131
+ if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
132
+ return path;
133
+ }
134
+ }
135
+ const saved = new WeakMap();
136
+ const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
137
+ function factsAt(room, path, content) {
138
+ const types = selected({ selection: room.typedSelection ?? null }, path)
139
+ ? roomTypes.types
140
+ : schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, roomTypes);
141
+ let held = saved.get(types);
142
+ if (held === undefined) {
143
+ held = new Map();
144
+ saved.set(types, held);
145
+ }
146
+ const key = `${path}\u0000${content}`;
147
+ if (!held.has(key)) {
148
+ const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
149
+ types,
150
+ });
151
+ held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
152
+ }
153
+ return held.get(key);
154
+ }
155
+ function factsIn(room, paths) {
156
+ const facts = {};
157
+ for (const path of paths) {
158
+ const content = room.documents?.[path];
159
+ const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
160
+ if (held !== null)
161
+ facts[path] = held;
162
+ }
163
+ return facts;
164
+ }
91
165
  function retain(entries) {
92
166
  for (const room of entries) {
167
+ for (const [path, content] of Object.entries(room.documents ?? {}))
168
+ factsAt(room, path, content);
93
169
  note(room.locator, room);
94
170
  const versions = served.get(room.locator) ?? new Map();
95
171
  versions.set(room.roomVersion, room);
@@ -105,8 +181,9 @@ export function createMemoryAdapter(options = {}) {
105
181
  roomVersion: room.roomVersion,
106
182
  operations: room.operations,
107
183
  replica: room.replica,
108
- ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
184
+ typedSelection: room.typedSelection ?? null,
109
185
  providerOwnedPaths: room.providerOwnedPaths,
186
+ authoredPaths: room.authoredPaths ?? ['**'],
110
187
  };
111
188
  }
112
189
  function page(room, after) {
@@ -122,27 +199,43 @@ export function createMemoryAdapter(options = {}) {
122
199
  roomVersion: room.roomVersion,
123
200
  ...(opening ? { models: modelsOf(room) } : {}),
124
201
  documents: named(room.documents ?? {}, taken),
202
+ facts: factsIn(room, taken),
125
203
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
126
204
  ...(room.fileIds === undefined
127
205
  ? {}
128
206
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
207
+ ...(room.created === undefined
208
+ ? {}
209
+ : { created: named(room.created, [...taken, ...targets]) }),
129
210
  changes: named(room.changes ?? {}, [...taken, ...targets]),
130
211
  binaryFiles: named(room.binaryFiles ?? {}, targets),
212
+ ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
131
213
  ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
132
214
  };
133
215
  }
134
- function advancement(room, from, at) {
216
+ function foldersMoved(room, from) {
217
+ const now = new Set(room.folders ?? []);
218
+ const before = new Set(from.folders ?? []);
219
+ const folders = [...now].filter((folder) => !before.has(folder)).sort();
220
+ const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
221
+ return {
222
+ ...(folders.length === 0 ? {} : { folders }),
223
+ ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
224
+ };
225
+ }
226
+ function advancement(room, from, at, whole = false) {
135
227
  const current = room.documents ?? {};
136
228
  const previous = from.documents ?? {};
137
229
  const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
138
230
  const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
139
231
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
140
232
  room.fileIds?.[path] !== from.fileIds?.[path] ||
233
+ room.created?.[path] !== from.created?.[path] ||
141
234
  !sameChange(room.changes?.[path], from.changes?.[path]);
142
235
  const changed = Object.keys(current)
143
236
  .filter((path) => current[path] !== previous[path] || headMoved(path))
144
237
  .sort();
145
- const size = pageSize ?? changed.length;
238
+ const size = whole ? changed.length : (pageSize ?? changed.length);
146
239
  const taken = changed.slice(at, at + size);
147
240
  const next = at + taken.length;
148
241
  const opening = at === 0;
@@ -158,12 +251,17 @@ export function createMemoryAdapter(options = {}) {
158
251
  roomVersion: room.roomVersion,
159
252
  ...(models === undefined ? {} : { models }),
160
253
  documents: named(current, taken),
254
+ facts: factsIn(room, taken),
161
255
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
162
256
  ...(room.fileIds === undefined
163
257
  ? {}
164
258
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
259
+ ...(room.created === undefined
260
+ ? {}
261
+ : { created: named(room.created, [...taken, ...targets]) }),
165
262
  changes: named(room.changes ?? {}, [...taken, ...targets]),
166
263
  binaryFiles: named(room.binaryFiles ?? {}, targets),
264
+ ...(opening ? foldersMoved(room, from) : {}),
167
265
  removals: opening
168
266
  ? [
169
267
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
@@ -173,30 +271,45 @@ export function createMemoryAdapter(options = {}) {
173
271
  ...(pageToken === undefined ? {} : { pageToken }),
174
272
  };
175
273
  }
274
+ function carry(locator) {
275
+ const at = carried.get(locator);
276
+ const current = rooms.find((entry) => entry.locator === locator);
277
+ if (at === undefined || current === undefined || current.roomVersion === at)
278
+ return;
279
+ const from = served.get(locator)?.get(at);
280
+ carried.set(locator, current.roomVersion);
281
+ if (from === undefined)
282
+ return;
283
+ const page = advancement(current, from, 0, true);
284
+ for (const observer of observers) {
285
+ observer({
286
+ kind: 'room-change',
287
+ locator,
288
+ from: at,
289
+ roomVersion: current.roomVersion,
290
+ read: async () => page,
291
+ });
292
+ }
293
+ }
176
294
  function pageOf(conversation, after) {
177
295
  const messages = conversation.messages ?? [];
178
- const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
296
+ const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
179
297
  const from = first === -1 ? messages.length : first;
180
298
  const page = messages.slice(from, from + (historyPageSize ?? messages.length));
181
299
  const last = page.at(-1);
182
300
  return {
183
301
  conversation: conversation.conversation,
184
302
  messages: page,
185
- ...(last !== undefined && from + page.length < messages.length
186
- ? { next: last.position }
187
- : {}),
303
+ ...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
188
304
  };
189
305
  }
190
- function historiesOf(input) {
191
- const asked = input?.conversations;
192
- if (!Array.isArray(asked))
193
- return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
306
+ function historiesOf(request) {
194
307
  const histories = [];
195
- for (const entry of asked) {
196
- const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
308
+ for (const entry of request.conversations) {
309
+ const conversation = scripted.get(entry.conversation);
197
310
  if (conversation === undefined)
198
311
  continue;
199
- const outcome = conversation.outcomes?.['conversation.history'];
312
+ const outcome = conversation.outcomes?.history;
200
313
  if (outcome !== undefined)
201
314
  return outcome;
202
315
  histories.push(pageOf(conversation, entry.after));
@@ -207,15 +320,22 @@ export function createMemoryAdapter(options = {}) {
207
320
  function conversationAction(request) {
208
321
  const name = request.name;
209
322
  const input = (request.input ?? {});
210
- if (name === 'conversation.history')
211
- return historiesOf(request.input);
212
- if (name === 'conversation.create') {
323
+ const operation = typeof input.operation_id === 'string' ? `${name}\u0000${input.operation_id}` : null;
324
+ const first = (answer) => {
325
+ if (operation !== null)
326
+ repeats.set(operation, answer);
327
+ return answer;
328
+ };
329
+ const repeated = operation === null ? undefined : repeats.get(operation);
330
+ if (name === 'conversations/create') {
331
+ if (repeated !== undefined)
332
+ return repeated;
213
333
  issued += 1;
214
334
  const conversation = `conversation-${issued}`;
215
335
  scripted.set(conversation, { conversation });
216
- return { kind: 'action', result: { conversation } };
336
+ return first({ kind: 'action', result: { conversation_id: conversation } });
217
337
  }
218
- const named = typeof input.conversation === 'string' ? input.conversation : '';
338
+ const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
219
339
  const conversation = scripted.get(named);
220
340
  if (conversation === undefined) {
221
341
  return {
@@ -228,34 +348,41 @@ export function createMemoryAdapter(options = {}) {
228
348
  const outcome = conversation.outcomes?.[name];
229
349
  if (outcome !== undefined)
230
350
  return outcome;
231
- if (name === 'conversation.send') {
232
- const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
233
- const answered = operation === null ? undefined : sentTurns.get(operation);
234
- if (answered !== undefined)
235
- return { kind: 'action', result: { turn: answered } };
351
+ if (name === 'conversations/send') {
352
+ if (repeated !== undefined)
353
+ return repeated;
236
354
  issued += 1;
237
- const turn = `turn-${issued}`;
238
- unsealed.set(turn, named);
239
- if (operation !== null)
240
- sentTurns.set(operation, turn);
241
- return { kind: 'action', result: { turn } };
242
- }
243
- if (name === 'conversation.cancel') {
244
- const turn = typeof input.turn === 'string' ? input.turn : '';
245
- if (sealed.has(turn) || !unsealed.has(turn)) {
246
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
247
- }
248
- unsealed.delete(turn);
249
- return { kind: 'action', result: { turn, cancelled: true } };
355
+ return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
250
356
  }
251
- if (name === 'conversation.delete')
357
+ if (name === 'conversations/delete')
252
358
  scripted.delete(named);
253
- return { kind: 'action', result: { conversation: named } };
359
+ return { kind: 'action', result: { conversation_id: named } };
360
+ }
361
+ function decided(request) {
362
+ const { request: asked, message, decision, } = (request.input ?? {});
363
+ return {
364
+ kind: 'action',
365
+ result: {
366
+ request: asked,
367
+ ...(message === undefined ? {} : { message }),
368
+ state: decision === 'approve' ? 'started' : 'declined',
369
+ },
370
+ };
254
371
  }
255
372
  function announceList() {
256
- const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
257
- for (const listener of listeners)
258
- listener({ kind: 'list', entries });
373
+ const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
374
+ ? []
375
+ : [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
376
+ for (const listener of listeners) {
377
+ listener({
378
+ kind: 'list',
379
+ agents: structuredClone(agents),
380
+ entries,
381
+ whole: true,
382
+ more: false,
383
+ cursor: null,
384
+ });
385
+ }
259
386
  }
260
387
  function discovery() {
261
388
  return {
@@ -267,8 +394,42 @@ export function createMemoryAdapter(options = {}) {
267
394
  ...(options.member === undefined ? {} : { member: options.member }),
268
395
  };
269
396
  }
397
+ function discovered() {
398
+ return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
399
+ if (answer.kind === 'discovery')
400
+ for (const room of answer.rooms)
401
+ note(room.locator, room);
402
+ return answer;
403
+ });
404
+ }
405
+ function opened(notify) {
406
+ const opening = ++openings;
407
+ notify({ kind: 'opened' });
408
+ void discovered()
409
+ .catch(() => ({ kind: 'transport-uncertainty' }))
410
+ .then((answer) => {
411
+ if (opening !== openings)
412
+ return;
413
+ if (answer.kind !== 'discovery') {
414
+ openings += 1;
415
+ carried.clear();
416
+ const revoked = answer.kind === 'revoked-authorization';
417
+ notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
418
+ return;
419
+ }
420
+ declaredRooms.clear();
421
+ for (const room of answer.rooms)
422
+ declaredRooms.add(room.locator);
423
+ notify({ kind: 'discovered', discovery: answer });
424
+ });
425
+ }
426
+ function emitAll(event) {
427
+ for (const observer of observers)
428
+ observer(event);
429
+ }
270
430
  return {
271
- ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
431
+ ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
432
+ ...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
272
433
  setRooms(next) {
273
434
  rooms = [...next];
274
435
  retain(rooms);
@@ -276,31 +437,41 @@ export function createMemoryAdapter(options = {}) {
276
437
  setConversations(next) {
277
438
  scriptConversations(next);
278
439
  },
440
+ setAgents(next) {
441
+ agents = structuredClone(next);
442
+ },
279
443
  open() {
444
+ carried.clear();
280
445
  announceList();
281
- for (const observer of observers)
282
- observer({ kind: 'opened' });
446
+ opened(emitAll);
283
447
  },
284
- close({ revoked = false, lost = !revoked } = {}) {
285
- for (const observer of observers)
286
- observer({ kind: 'closed', revoked, lost });
448
+ close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
449
+ openings += 1;
450
+ carried.clear();
451
+ emitAll({ kind: 'closed', revoked, lost, authorityChanged });
287
452
  },
288
453
  expire(locators) {
289
454
  expiring = [...locators];
290
455
  },
291
- notifyRoomVersion({ locator, roomVersion }) {
292
- for (const observer of observers)
293
- observer({ kind: 'room-version', locator, roomVersion });
456
+ notifyRoomVersion({ locator }) {
457
+ carry(locator);
294
458
  },
295
- notifyAuthorityChanged() {
296
- for (const observer of observers)
297
- observer({ kind: 'authority-changed' });
459
+ notifyAuthorityChanged(locators) {
460
+ const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
461
+ const listed = rooms.filter((room) => named.has(room.locator));
462
+ const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
463
+ for (const room of listed)
464
+ declaredRooms.add(room.locator);
465
+ for (const locator of left)
466
+ declaredRooms.delete(locator);
467
+ emitAll({
468
+ kind: 'authority-changed',
469
+ rooms: listed.map(declared),
470
+ left,
471
+ ...(options.member === undefined ? {} : { member: options.member }),
472
+ });
298
473
  },
299
474
  notifyConversation(event) {
300
- if (event.kind === 'accepted-message') {
301
- sealed.add(event.message.turn);
302
- unsealed.delete(event.message.turn);
303
- }
304
475
  for (const listener of listeners)
305
476
  listener(event);
306
477
  },
@@ -309,24 +480,28 @@ export function createMemoryAdapter(options = {}) {
309
480
  observer(mode);
310
481
  },
311
482
  heldRooms() {
312
- return held;
313
- },
314
- heldDemand() {
315
- return heldDemand;
483
+ return [...carried.keys()].sort();
316
484
  },
317
485
  replicatedConversations() {
318
486
  return replicated;
319
487
  },
488
+ heldConversationCursor() {
489
+ return heldCursor;
490
+ },
320
491
  conversations: {
321
492
  replicate(next) {
322
493
  replicated = [...next];
323
494
  },
495
+ hold(cursor) {
496
+ heldCursor = cursor;
497
+ },
324
498
  observe(notify) {
325
499
  listeners.add(notify);
326
500
  return () => {
327
501
  listeners.delete(notify);
328
502
  };
329
503
  },
504
+ history: (request) => Promise.resolve(historiesOf(request)),
330
505
  },
331
506
  serviceMode: {
332
507
  observe(notify) {
@@ -337,46 +512,47 @@ export function createMemoryAdapter(options = {}) {
337
512
  },
338
513
  },
339
514
  roomStream: {
340
- hold(asked, demand) {
341
- held = asked.map((room) => room.locator);
342
- heldDemand = demand;
343
- const expired = expiring.filter((locator) => held.includes(locator));
344
- expiring = [];
345
- const moved = asked.flatMap((room) => {
515
+ hold(asked) {
516
+ const named = asked.map((room) => room.locator);
517
+ const unknown = asked.flatMap((room) => {
346
518
  const current = rooms.find((entry) => entry.locator === room.locator);
519
+ const version = room.roomVersion;
347
520
  return current === undefined ||
348
- expired.includes(room.locator) ||
349
- current.roomVersion === room.roomVersion
521
+ (version !== null &&
522
+ (current.roomVersion === version || served.get(room.locator)?.has(version) === true))
350
523
  ? []
351
- : [{ locator: room.locator, roomVersion: current.roomVersion }];
524
+ : [room.locator];
352
525
  });
526
+ const expired = [
527
+ ...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
528
+ ];
529
+ expiring = expiring.filter((locator) => !named.includes(locator));
353
530
  queueMicrotask(() => {
354
- for (const observer of observers) {
355
- for (const room of moved)
356
- observer({ kind: 'room-version', ...room });
357
- observer({ kind: 'opening', expired });
358
- }
359
- });
360
- },
361
- reopen() {
362
- queueMicrotask(() => {
363
- for (const observer of observers) {
364
- observer({ kind: 'closed', revoked: false, lost: false });
531
+ for (const room of asked) {
532
+ if (expired.includes(room.locator) || room.roomVersion === null)
533
+ carried.delete(room.locator);
534
+ else {
535
+ carried.set(room.locator, room.roomVersion);
536
+ carry(room.locator);
537
+ }
365
538
  }
539
+ emitAll({ kind: 'caught-up', expired });
366
540
  });
367
541
  },
368
- published() { },
369
542
  observe(notify) {
370
543
  observers.add(notify);
371
544
  queueMicrotask(() => {
372
545
  if (!observers.has(notify))
373
546
  return;
374
547
  if (options.unopened === true) {
375
- notify({ kind: 'closed', revoked: false, lost: true });
548
+ notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
376
549
  return;
377
550
  }
378
551
  announceList();
379
- notify({ kind: 'opened' });
552
+ opened((event) => {
553
+ if (observers.has(notify))
554
+ notify(event);
555
+ });
380
556
  });
381
557
  return () => {
382
558
  observers.delete(notify);
@@ -393,12 +569,7 @@ export function createMemoryAdapter(options = {}) {
393
569
  return resolveScript(scripts.authorize, () => ({}), undefined);
394
570
  },
395
571
  async discover(_authorization) {
396
- return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
397
- if (answer.kind === 'discovery')
398
- for (const room of answer.rooms)
399
- note(room.locator, room);
400
- return answer;
401
- });
572
+ return discovered();
402
573
  },
403
574
  reached,
404
575
  follows(locator, roomVersion, next) {
@@ -455,7 +626,13 @@ export function createMemoryAdapter(options = {}) {
455
626
  retryable: false,
456
627
  affected: {},
457
628
  };
458
- }, request).then((answer) => note(request.locator, answer));
629
+ }, request).then((answer) => {
630
+ const destination = request.changeBatch.between?.destination.room;
631
+ if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
632
+ note(destination, answer.destination);
633
+ }
634
+ return note(request.locator, answer);
635
+ });
459
636
  },
460
637
  async history(_authorization, request) {
461
638
  return resolveScript(scripts.history, () => {
@@ -471,35 +648,48 @@ export function createMemoryAdapter(options = {}) {
471
648
  },
472
649
  async binary(_authorization, request) {
473
650
  return resolveScript(scripts.binary, () => {
474
- if (request.kind === 'reference') {
475
- return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
476
- }
477
651
  const room = rooms.find((entry) => entry.locator === request.locator);
478
652
  if (room === undefined)
479
653
  return { kind: 'room-not-readable', locator: request.locator };
480
- const blob = room.blobs?.[request.path];
654
+ const blob = heldBlob(room, request.path);
481
655
  return blob === undefined
482
- ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
483
- : { kind: 'binary', blob };
656
+ ? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
657
+ : { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
484
658
  }, request);
485
659
  },
486
660
  async link(_authorization, request) {
487
- return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
661
+ return resolveScript(scripts.link, () => {
662
+ if (request.kind === 'key') {
663
+ const key = keyedLink(request.link)?.key;
664
+ const named = key === undefined ? undefined : keyed.get(key);
665
+ if (named === undefined)
666
+ return UNFOUND;
667
+ return linkTo(rooms.find((entry) => entry.locator === named.locator), named.path);
668
+ }
669
+ const room = rooms.find((entry) => entry.locator === request.locator);
670
+ if (room === undefined)
671
+ return { kind: 'room-not-readable', locator: request.locator };
672
+ return linkTo(room, request.path);
673
+ }, request);
488
674
  },
489
- referrerScope(referrer) {
490
- if (typeof referrer !== 'object' || referrer === null)
491
- return null;
492
- const { room, path, message } = referrer;
493
- if (typeof message === 'string')
494
- return { kind: 'conversations' };
495
- if (typeof room !== 'string')
496
- return null;
497
- return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
675
+ async attach(_authorization, request) {
676
+ return resolveScript(scripts.attach, () => {
677
+ if (request.locator === undefined)
678
+ return attachedKeyed(request);
679
+ const room = rooms.find((entry) => entry.locator === request.locator);
680
+ if (room === undefined)
681
+ return { kind: 'room-not-readable', locator: request.locator };
682
+ const path = freePath(room, request.name);
683
+ attached.set(`${room.locator}\u0000${path}`, request.blob);
684
+ return { kind: 'attached', path, revision: `attached-${attached.size}` };
685
+ }, request);
498
686
  },
499
687
  async action(_authorization, request) {
500
688
  return resolveScript(scripts.action, () => {
501
- if (request.name.startsWith('conversation.'))
689
+ if (request.name.startsWith('conversations/'))
502
690
  return conversationAction(request);
691
+ if (request.name === 'agent-functions/decide')
692
+ return decided(request);
503
693
  return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
504
694
  }, request).then((answer) => {
505
695
  if (answer.kind === 'action' && answer.at !== undefined)