@agentshouse/mdruntime 0.1.0-c907ac1fbed44 → 0.1.0-c90a12b59fe09

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