@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad

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