@agentshouse/mdruntime 0.1.0-cbe358f60d1d3 → 0.1.0-cc00e9289ddf4

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 (297) hide show
  1. package/README.md +18 -16
  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 +68 -72
  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/bootstrap.d.ts +9 -5
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +204 -86
  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/change-set.d.ts +4 -0
  23. package/dist/change-set.d.ts.map +1 -1
  24. package/dist/change-set.js +6 -0
  25. package/dist/change.d.ts +1 -0
  26. package/dist/change.d.ts.map +1 -1
  27. package/dist/change.js +4 -2
  28. package/dist/chat-types.d.ts +3 -0
  29. package/dist/chat-types.d.ts.map +1 -0
  30. package/dist/chat-types.js +11 -0
  31. package/dist/client.d.ts +23 -20
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +34 -19
  34. package/dist/collection.d.ts +22 -4
  35. package/dist/collection.d.ts.map +1 -1
  36. package/dist/collection.js +12 -2
  37. package/dist/compile.d.ts +7 -0
  38. package/dist/compile.d.ts.map +1 -1
  39. package/dist/compile.js +216 -78
  40. package/dist/connection.d.ts +5 -143
  41. package/dist/connection.d.ts.map +1 -1
  42. package/dist/connection.js +110 -5026
  43. package/dist/conversation-live.d.ts +150 -0
  44. package/dist/conversation-live.d.ts.map +1 -0
  45. package/dist/conversation-live.js +259 -0
  46. package/dist/conversation-row.d.ts +35 -0
  47. package/dist/conversation-row.d.ts.map +1 -0
  48. package/dist/conversation-row.js +55 -0
  49. package/dist/conversation.d.ts +56 -41
  50. package/dist/conversation.d.ts.map +1 -1
  51. package/dist/conversation.js +981 -881
  52. package/dist/declaration.d.ts +10 -0
  53. package/dist/declaration.d.ts.map +1 -0
  54. package/dist/declaration.js +24 -0
  55. package/dist/discovery.d.ts +10 -0
  56. package/dist/discovery.d.ts.map +1 -0
  57. package/dist/discovery.js +150 -0
  58. package/dist/durability.d.ts +13 -0
  59. package/dist/durability.d.ts.map +1 -1
  60. package/dist/durability.js +4 -0
  61. package/dist/entry.d.ts.map +1 -1
  62. package/dist/entry.js +5 -3
  63. package/dist/expectation.d.ts +26 -13
  64. package/dist/expectation.d.ts.map +1 -1
  65. package/dist/expectation.js +72 -19
  66. package/dist/failure.d.ts +3 -0
  67. package/dist/failure.d.ts.map +1 -1
  68. package/dist/failure.js +6 -0
  69. package/dist/figures.d.ts +49 -0
  70. package/dist/figures.d.ts.map +1 -0
  71. package/dist/figures.js +199 -0
  72. package/dist/file.d.ts.map +1 -1
  73. package/dist/file.js +2 -1
  74. package/dist/holdings.d.ts +29 -0
  75. package/dist/holdings.d.ts.map +1 -0
  76. package/dist/holdings.js +95 -0
  77. package/dist/host.d.ts +19 -2
  78. package/dist/host.d.ts.map +1 -1
  79. package/dist/host.js +62 -19
  80. package/dist/index.d.ts +30 -11
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +14 -5
  83. package/dist/install.d.ts +60 -0
  84. package/dist/install.d.ts.map +1 -0
  85. package/dist/install.js +537 -0
  86. package/dist/lifecycle.d.ts +7 -0
  87. package/dist/lifecycle.d.ts.map +1 -0
  88. package/dist/lifecycle.js +278 -0
  89. package/dist/listing.d.ts +52 -0
  90. package/dist/listing.d.ts.map +1 -0
  91. package/dist/listing.js +152 -0
  92. package/dist/live.d.ts +8 -6
  93. package/dist/live.d.ts.map +1 -1
  94. package/dist/live.js +110 -31
  95. package/dist/locks.d.ts +7 -0
  96. package/dist/locks.d.ts.map +1 -0
  97. package/dist/locks.js +32 -0
  98. package/dist/lost.d.ts +5 -0
  99. package/dist/lost.d.ts.map +1 -0
  100. package/dist/lost.js +49 -0
  101. package/dist/media.d.ts +1 -1
  102. package/dist/media.d.ts.map +1 -1
  103. package/dist/media.js +10 -13
  104. package/dist/memory.d.ts +9 -3
  105. package/dist/memory.d.ts.map +1 -1
  106. package/dist/memory.js +97 -27
  107. package/dist/messages.d.ts +33 -3
  108. package/dist/messages.d.ts.map +1 -1
  109. package/dist/messages.js +95 -22
  110. package/dist/model.d.ts +1 -8
  111. package/dist/model.d.ts.map +1 -1
  112. package/dist/model.js +0 -11
  113. package/dist/models.d.ts +10 -0
  114. package/dist/models.d.ts.map +1 -0
  115. package/dist/models.js +153 -0
  116. package/dist/observation.d.ts +27 -12
  117. package/dist/observation.d.ts.map +1 -1
  118. package/dist/observation.js +184 -85
  119. package/dist/opened.d.ts +1 -1
  120. package/dist/opened.d.ts.map +1 -1
  121. package/dist/opened.js +5 -5
  122. package/dist/opening.d.ts +4 -0
  123. package/dist/opening.d.ts.map +1 -0
  124. package/dist/opening.js +53 -0
  125. package/dist/outcome.d.ts +11 -1
  126. package/dist/outcome.d.ts.map +1 -1
  127. package/dist/outcome.js +26 -2
  128. package/dist/overlay.d.ts +6 -1
  129. package/dist/overlay.d.ts.map +1 -1
  130. package/dist/overlay.js +47 -21
  131. package/dist/page-metadata.d.ts +8 -0
  132. package/dist/page-metadata.d.ts.map +1 -0
  133. package/dist/page-metadata.js +19 -0
  134. package/dist/parts.d.ts +4 -0
  135. package/dist/parts.d.ts.map +1 -0
  136. package/dist/parts.js +13 -0
  137. package/dist/paths.d.ts +1 -0
  138. package/dist/paths.d.ts.map +1 -1
  139. package/dist/paths.js +22 -0
  140. package/dist/preparation.d.ts +41 -0
  141. package/dist/preparation.d.ts.map +1 -0
  142. package/dist/preparation.js +314 -0
  143. package/dist/presence.d.ts +58 -0
  144. package/dist/presence.d.ts.map +1 -0
  145. package/dist/presence.js +233 -0
  146. package/dist/queries.d.ts +16 -0
  147. package/dist/queries.d.ts.map +1 -0
  148. package/dist/queries.js +308 -0
  149. package/dist/query.d.ts +10 -1
  150. package/dist/query.d.ts.map +1 -1
  151. package/dist/questions.d.ts +29 -0
  152. package/dist/questions.d.ts.map +1 -0
  153. package/dist/questions.js +115 -0
  154. package/dist/queue.d.ts +40 -0
  155. package/dist/queue.d.ts.map +1 -0
  156. package/dist/queue.js +450 -0
  157. package/dist/reach.d.ts +9 -8
  158. package/dist/reach.d.ts.map +1 -1
  159. package/dist/reach.js +223 -111
  160. package/dist/react.d.ts +14 -2
  161. package/dist/react.d.ts.map +1 -1
  162. package/dist/react.js +33 -1
  163. package/dist/read.d.ts +7 -0
  164. package/dist/read.d.ts.map +1 -0
  165. package/dist/read.js +17 -0
  166. package/dist/readiness.d.ts +9 -4
  167. package/dist/readiness.d.ts.map +1 -1
  168. package/dist/readiness.js +3 -5
  169. package/dist/reads.d.ts +39 -0
  170. package/dist/reads.d.ts.map +1 -0
  171. package/dist/reads.js +178 -0
  172. package/dist/recovery.d.ts +3 -1
  173. package/dist/recovery.d.ts.map +1 -1
  174. package/dist/recovery.js +38 -8
  175. package/dist/refresh.d.ts +1 -1
  176. package/dist/refresh.d.ts.map +1 -1
  177. package/dist/refresh.js +9 -2
  178. package/dist/refusal.d.ts +5 -0
  179. package/dist/refusal.d.ts.map +1 -0
  180. package/dist/refusal.js +55 -0
  181. package/dist/replica.d.ts +10 -16
  182. package/dist/replica.d.ts.map +1 -1
  183. package/dist/replica.js +63 -30
  184. package/dist/retried.d.ts +30 -0
  185. package/dist/retried.d.ts.map +1 -0
  186. package/dist/retried.js +72 -0
  187. package/dist/room-draft.d.ts +4 -6
  188. package/dist/room-draft.d.ts.map +1 -1
  189. package/dist/room-draft.js +48 -59
  190. package/dist/room-drafts.d.ts +24 -0
  191. package/dist/room-drafts.d.ts.map +1 -0
  192. package/dist/room-drafts.js +217 -0
  193. package/dist/rows.d.ts +15 -4
  194. package/dist/rows.d.ts.map +1 -1
  195. package/dist/rows.js +54 -55
  196. package/dist/runtime.d.ts +34 -0
  197. package/dist/runtime.d.ts.map +1 -0
  198. package/dist/runtime.js +1 -0
  199. package/dist/save.d.ts +42 -86
  200. package/dist/save.d.ts.map +1 -1
  201. package/dist/save.js +339 -166
  202. package/dist/saves.d.ts +32 -0
  203. package/dist/saves.d.ts.map +1 -0
  204. package/dist/saves.js +410 -0
  205. package/dist/seed.d.ts +11 -2
  206. package/dist/seed.d.ts.map +1 -1
  207. package/dist/seed.js +71 -1
  208. package/dist/shared.d.ts +1 -6
  209. package/dist/shared.d.ts.map +1 -1
  210. package/dist/shared.js +13 -95
  211. package/dist/shown.d.ts +33 -0
  212. package/dist/shown.d.ts.map +1 -0
  213. package/dist/shown.js +309 -0
  214. package/dist/socket/admission.d.ts +7 -0
  215. package/dist/socket/admission.d.ts.map +1 -0
  216. package/dist/socket/admission.js +39 -0
  217. package/dist/socket/answers.d.ts +6 -0
  218. package/dist/socket/answers.d.ts.map +1 -0
  219. package/dist/socket/answers.js +20 -0
  220. package/dist/socket/lanes.d.ts +28 -0
  221. package/dist/socket/lanes.d.ts.map +1 -0
  222. package/dist/socket/lanes.js +103 -0
  223. package/dist/socket/reads.d.ts +10 -0
  224. package/dist/socket/reads.d.ts.map +1 -0
  225. package/dist/socket/reads.js +31 -0
  226. package/dist/socket/session.d.ts +38 -0
  227. package/dist/socket/session.d.ts.map +1 -0
  228. package/dist/socket/session.js +23 -0
  229. package/dist/socket.d.ts +67 -0
  230. package/dist/socket.d.ts.map +1 -0
  231. package/dist/socket.js +164 -0
  232. package/dist/source.d.ts +54 -0
  233. package/dist/source.d.ts.map +1 -0
  234. package/dist/source.js +82 -0
  235. package/dist/status.d.ts +0 -2
  236. package/dist/status.d.ts.map +1 -1
  237. package/dist/status.js +0 -6
  238. package/dist/store/installs.d.ts +30 -0
  239. package/dist/store/installs.d.ts.map +1 -0
  240. package/dist/store/installs.js +40 -0
  241. package/dist/store/readiness.d.ts +11 -0
  242. package/dist/store/readiness.d.ts.map +1 -0
  243. package/dist/store/readiness.js +68 -0
  244. package/dist/store/records.d.ts +217 -0
  245. package/dist/store/records.d.ts.map +1 -0
  246. package/dist/store/records.js +464 -0
  247. package/dist/store/room-held.d.ts +8 -0
  248. package/dist/store/room-held.d.ts.map +1 -0
  249. package/dist/store/room-held.js +17 -0
  250. package/dist/store/rooms-shown.d.ts +8 -0
  251. package/dist/store/rooms-shown.d.ts.map +1 -0
  252. package/dist/store/rooms-shown.js +13 -0
  253. package/dist/store/space.d.ts +11 -0
  254. package/dist/store/space.d.ts.map +1 -0
  255. package/dist/store/space.js +41 -0
  256. package/dist/store/watchers.d.ts +17 -0
  257. package/dist/store/watchers.d.ts.map +1 -0
  258. package/dist/store/watchers.js +56 -0
  259. package/dist/store/writes.d.ts +24 -0
  260. package/dist/store/writes.d.ts.map +1 -0
  261. package/dist/store/writes.js +125 -0
  262. package/dist/store.d.ts +113 -142
  263. package/dist/store.d.ts.map +1 -1
  264. package/dist/store.js +171 -360
  265. package/dist/stored.d.ts +72 -34
  266. package/dist/stored.d.ts.map +1 -1
  267. package/dist/stored.js +316 -106
  268. package/dist/surface.d.ts +89 -0
  269. package/dist/surface.d.ts.map +1 -0
  270. package/dist/surface.js +222 -0
  271. package/dist/sync.d.ts +19 -0
  272. package/dist/sync.d.ts.map +1 -0
  273. package/dist/sync.js +535 -0
  274. package/dist/tables.d.ts +116 -25
  275. package/dist/tables.d.ts.map +1 -1
  276. package/dist/tables.js +222 -51
  277. package/dist/tallies.d.ts +18 -0
  278. package/dist/tallies.d.ts.map +1 -0
  279. package/dist/tallies.js +128 -0
  280. package/dist/validation.d.ts.map +1 -1
  281. package/dist/validation.js +5 -5
  282. package/dist/wire.d.ts +52 -8
  283. package/dist/wire.d.ts.map +1 -1
  284. package/dist/wire.js +18 -4
  285. package/package.json +3 -2
  286. package/dist/attempt.d.ts +0 -16
  287. package/dist/attempt.d.ts.map +0 -1
  288. package/dist/attempt.js +0 -70
  289. package/dist/fence.d.ts +0 -6
  290. package/dist/fence.d.ts.map +0 -1
  291. package/dist/fence.js +0 -10
  292. package/dist/job.d.ts +0 -14
  293. package/dist/job.d.ts.map +0 -1
  294. package/dist/job.js +0 -28
  295. package/dist/log.d.ts +0 -5
  296. package/dist/log.d.ts.map +0 -1
  297. package/dist/log.js +0 -14
@@ -0,0 +1,302 @@
1
+ import { roomTarget, target } from '@agentshouse/mdmodel';
2
+ import { CATCHING_UP, holdsSubmission, 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 } = 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
+ try {
31
+ const result = await socket.history(authorization, {
32
+ locator,
33
+ path,
34
+ ...(query.revision === undefined ? {} : { revision: query.revision }),
35
+ ...(query.pageToken === undefined ? {} : { pageToken: query.pageToken }),
36
+ });
37
+ if (presence.lostSince(locator, since))
38
+ return failure({ kind: 'room-not-readable', locator });
39
+ if (result.kind === 'scoped-refusal') {
40
+ const room = await store.record(result.locator);
41
+ if (room !== undefined)
42
+ await scoped(runtime, result, room.locator, room.declaration);
43
+ }
44
+ if (result.kind === 'revoked-authorization')
45
+ await refuse(runtime, 'revoked-authorization');
46
+ return historyAnswer(result);
47
+ }
48
+ catch {
49
+ return UNCERTAIN;
50
+ }
51
+ }
52
+ export async function located(runtime, room, path, destination) {
53
+ const crossing = roomTarget(destination);
54
+ const listing = await listingNow(runtime);
55
+ if (crossing === null) {
56
+ const named = target(path, destination);
57
+ return named === null || !listing.has(room) ? null : { room, path: named };
58
+ }
59
+ const held = [...listing.values()].find((listed) => listed.handle === crossing.handle);
60
+ return held === undefined ? null : { room: held.locator, path: crossing.path };
61
+ }
62
+ export async function resolveReference(runtime, room, path, destination) {
63
+ const { store } = runtime;
64
+ if (roomTarget(destination) === null && target(path, destination) === null) {
65
+ return ABSENT_TARGET;
66
+ }
67
+ const at = await located(runtime, room, path, destination);
68
+ if (at === null)
69
+ return UNREADABLE;
70
+ if (await locked(runtime, at.room))
71
+ return LOCKED_UNREADABLE;
72
+ const held = await store.record(at.room);
73
+ if (held !== undefined &&
74
+ (await (await store.open()).entries(held.key, 'visible', [at.path])).length > 0) {
75
+ return { kind: 'document', ...at };
76
+ }
77
+ const history = await readHistory(runtime, at.room, at.path);
78
+ if (history.kind === 'no-history' || history.kind === 'revision')
79
+ return ABSENT_TARGET;
80
+ if (history.kind !== 'history')
81
+ return history;
82
+ const [last] = history.revisions;
83
+ if (last === undefined)
84
+ return ABSENT_TARGET;
85
+ return history.deleted === true
86
+ ? { kind: 'deleted', ...at, revision: last }
87
+ : { kind: 'document', ...at };
88
+ }
89
+ async function declaredAction({ store }, name) {
90
+ for (const capability of (await (await store.open()).facts()).capabilities) {
91
+ for (const action of capability.actions ?? []) {
92
+ if (action.name === name)
93
+ return action;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ async function calledRooms(runtime, name, input) {
99
+ const member = (await declaredAction(runtime, name))?.room;
100
+ if (member === undefined || input === null || typeof input !== 'object')
101
+ return [];
102
+ const named = input[member];
103
+ return (Array.isArray(named) ? named : [named]).filter((room) => typeof room === 'string');
104
+ }
105
+ export async function invokeAction(runtime, name, input, { dispatching, attempt } = {}) {
106
+ const { store, socket, retries } = runtime;
107
+ const { session } = socket;
108
+ await socket.ready;
109
+ if (socket.closed() || session.now().refusal !== null) {
110
+ return handedOutcome(retries, attempt, UNANSWERED);
111
+ }
112
+ if ((await declaredAction(runtime, name)) === undefined)
113
+ return undeclared(name);
114
+ try {
115
+ await socket.authorize();
116
+ }
117
+ catch {
118
+ return handedOutcome(retries, attempt, UNANSWERED);
119
+ }
120
+ const { closed, authorization, refusal } = session.now();
121
+ if (closed || authorization === undefined || refusal !== null) {
122
+ return handedOutcome(retries, attempt, UNANSWERED);
123
+ }
124
+ await dispatching?.();
125
+ try {
126
+ const result = await socket.action(authorization, { name, input });
127
+ if (result.kind === 'scoped-refusal') {
128
+ const room = await store.record(result.locator);
129
+ if (room !== undefined)
130
+ await scoped(runtime, result, room.locator, room.declaration);
131
+ }
132
+ if (result.kind === 'revoked-authorization')
133
+ await refuse(runtime, 'revoked-authorization');
134
+ return handedOutcome(retries, attempt, result);
135
+ }
136
+ catch (error) {
137
+ return handedOutcome(retries, attempt, { kind: 'transport-uncertainty', failure: error });
138
+ }
139
+ }
140
+ export async function readConversationHistory(runtime, request) {
141
+ const { socket, retries } = runtime;
142
+ const caught = { step: 'conversations', instance: CATCHING_UP };
143
+ await socket.ready;
144
+ const stream = socket.conversations();
145
+ if (socket.closed() || socket.session.now().refusal !== null || stream?.history === undefined) {
146
+ return handedOutcome(retries, caught, UNANSWERED);
147
+ }
148
+ try {
149
+ const result = await stream.history(request);
150
+ if (result.kind === 'revoked-authorization')
151
+ await refuse(runtime, 'revoked-authorization');
152
+ return handedOutcome(retries, caught, result);
153
+ }
154
+ catch (error) {
155
+ return handedOutcome(retries, caught, { kind: 'transport-uncertainty', failure: error });
156
+ }
157
+ }
158
+ function unsettled(result) {
159
+ if (result.kind === 'action')
160
+ return false;
161
+ return result.retryable && (result.kind !== 'rejected' || result.reset === undefined);
162
+ }
163
+ function numberedCall(runtime, name, input, operation, dispatching) {
164
+ return invokeAction(runtime, name, input, {
165
+ dispatching,
166
+ attempt: { step: 'sending', instance: `action ${operation}` },
167
+ });
168
+ }
169
+ function keptSender(runtime, name, input, operation, resent = false) {
170
+ const { store, socket } = runtime;
171
+ const { lanes } = socket;
172
+ const dispatching = async () => (await store.open()).keepCall({ operation, name, input });
173
+ let waiting = [];
174
+ let last = UNCERTAIN;
175
+ let lost = resent;
176
+ const tell = (result) => {
177
+ last = result;
178
+ const told = waiting;
179
+ waiting = [];
180
+ for (const answer of told)
181
+ answer(result);
182
+ };
183
+ const sender = {
184
+ next: () => new Promise((answer) => waiting.push(answer)),
185
+ async send() {
186
+ let result;
187
+ try {
188
+ result = await numberedCall(runtime, name, input, operation, dispatching);
189
+ }
190
+ catch (error) {
191
+ tell(last);
192
+ throw error;
193
+ }
194
+ if (unsettled(result))
195
+ lost = true;
196
+ else {
197
+ await (await store.open()).dropCall(operation);
198
+ lanes.settle(operation, lost);
199
+ }
200
+ tell(result);
201
+ return result;
202
+ },
203
+ release() {
204
+ lanes.sent(operation, sender);
205
+ tell(last);
206
+ },
207
+ };
208
+ lanes.sending(operation, sender);
209
+ return sender;
210
+ }
211
+ async function recoveredAction(runtime, name, input, attempt) {
212
+ const { socket, recovery } = runtime;
213
+ const operation = operationOf(input);
214
+ if (operation === null)
215
+ return invokeAction(runtime, name, input, { attempt });
216
+ const held = socket.lanes.sender(operation);
217
+ if (held !== undefined)
218
+ return held.next();
219
+ const sender = keptSender(runtime, name, input, operation);
220
+ let first;
221
+ try {
222
+ first = await sender.send();
223
+ }
224
+ catch (error) {
225
+ sender.release();
226
+ throw error;
227
+ }
228
+ if (!unsettled(first)) {
229
+ sender.release();
230
+ return first;
231
+ }
232
+ void recovery
233
+ .attempt(`action ${operation}`, async () => {
234
+ if (socket.closed() || socket.session.now().refusal !== null)
235
+ return 'done';
236
+ if (!socket.isOpen())
237
+ return 'again';
238
+ return unsettled(await sender.send()) ? 'again' : 'done';
239
+ }, { again: true })
240
+ .finally(() => sender.release());
241
+ return first;
242
+ }
243
+ export async function called(runtime, name, input, attempt) {
244
+ await runtime.socket.ready;
245
+ const lockedNow = await lockedRooms(runtime);
246
+ const room = (await calledRooms(runtime, name, input)).find((one) => lockedNow.includes(one));
247
+ return room === undefined ? recoveredAction(runtime, name, input, attempt) : lockedRoom(room);
248
+ }
249
+ export async function answeredCall(runtime, operation) {
250
+ const { store, socket } = runtime;
251
+ const { lanes } = socket;
252
+ const held = () => lanes.sender(operation) !== undefined || lanes.unclaimed(operation);
253
+ if (!held()) {
254
+ const calls = await (await store.open()).calls();
255
+ const kept = calls.some((one) => one.operation === operation) ||
256
+ (await holdsSubmission(runtime.conversations, operation));
257
+ if (!held() && !kept)
258
+ return false;
259
+ }
260
+ await lanes.settled(operation);
261
+ return true;
262
+ }
263
+ export async function resendCalls(runtime, signal) {
264
+ const { store, socket } = runtime;
265
+ if (!socket.isOpen() || socket.closed() || socket.stopping())
266
+ return 'done';
267
+ const local = await store.open();
268
+ for (const held of await local.calls()) {
269
+ if (socket.lanes.sender(held.operation) !== undefined)
270
+ continue;
271
+ if (socket.closed() || signal.aborted)
272
+ return 'done';
273
+ const sender = keptSender(runtime, held.name, held.input, held.operation, true);
274
+ try {
275
+ if (unsettled(await sender.send()))
276
+ return 'again';
277
+ }
278
+ finally {
279
+ sender.release();
280
+ }
281
+ }
282
+ return 'done';
283
+ }
284
+ async function resendPass({ socket, conversations }, signal) {
285
+ if (!socket.continuing() || !socket.isOpen() || socket.stopping())
286
+ return 'done';
287
+ const reading = { complete: true, reachable: true };
288
+ try {
289
+ await resendConversations(conversations, reading);
290
+ }
291
+ catch {
292
+ reading.reachable = false;
293
+ }
294
+ if (signal.aborted)
295
+ return 'done';
296
+ return reading.reachable && reading.complete ? 'done' : 'again';
297
+ }
298
+ export function resendLater(runtime) {
299
+ if (!runtime.socket.isOpen())
300
+ return;
301
+ void runtime.recovery.attempt('resend', (signal) => resendPass(runtime, signal), { again: true });
302
+ }
package/dist/adapter.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import type { TypedPath } from '@agentshouse/mdmodel';
1
+ import type { SavedFacts, TypedPath, VerifiedModel } from '@agentshouse/mdmodel';
2
+ import type { Operation, SessionState } from '@agentshouse/session-content';
2
3
  import type { ModelResult } from './model.js';
3
- export type { TypedPath };
4
+ export type { SavedFacts, TypedPath };
4
5
  import type { Open } from './open.js';
5
6
  import type { ChangeBatch } from './change.js';
6
7
  export type Authorization = object;
@@ -13,22 +14,25 @@ export type TypedSelection = {
13
14
  };
14
15
  export type OperationScopes = {
15
16
  write: readonly string[];
16
- delete: readonly string[];
17
+ erase: readonly string[];
17
18
  };
18
19
  export type ReplicaAdmission = {
19
20
  selection: string;
20
21
  admission: Open<'admitted' | 'unavailable'>;
21
22
  offline: Open<'locked' | 'open'>;
22
23
  };
23
- export type DiscoveredRoom = {
24
- name: string;
25
- locator: string;
26
- handle: string;
27
- roomVersion: string;
28
- operations: OperationScopes;
29
- replica: ReplicaAdmission;
30
- typedSelection?: TypedSelection;
31
- 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;
32
36
  };
33
37
  export type Capability = {
34
38
  name: string;
@@ -38,8 +42,6 @@ export type Capability = {
38
42
  export type ListedConversation = {
39
43
  conversation: string;
40
44
  agent: string;
41
- agentName: string;
42
- agentRetired: boolean;
43
45
  name: string;
44
46
  created: string;
45
47
  finished: string | null;
@@ -47,8 +49,9 @@ export type ListedConversation = {
47
49
  waiting: boolean;
48
50
  newest: string | null;
49
51
  processEnded: string | null;
52
+ subject: string | null;
50
53
  };
51
- export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete';
54
+ 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';
52
55
  export type ConversationMessage = {
53
56
  identity: string;
54
57
  turn: string;
@@ -57,6 +60,7 @@ export type ConversationMessage = {
57
60
  };
58
61
  export type AcceptedMessage = ConversationMessage & {
59
62
  position: string;
63
+ change: string;
60
64
  };
61
65
  export type ConversationHistoryRequest = {
62
66
  conversations: readonly {
@@ -72,37 +76,10 @@ export type ConversationHistoryPage = {
72
76
  export type ConversationHistories = {
73
77
  histories: readonly ConversationHistoryPage[];
74
78
  };
75
- export type TurnContext = {
76
- used: number;
77
- window: number;
78
- };
79
79
  export type TurnOperation = {
80
80
  op: 'begin';
81
81
  at: string;
82
- } | {
83
- op: 'start';
84
- index: number;
85
- part: unknown;
86
- } | {
87
- op: 'append';
88
- index: number;
89
- text: string;
90
- } | {
91
- op: 'status';
92
- index: number;
93
- status: string;
94
- result: unknown;
95
- } | {
96
- op: 'count';
97
- index: number;
98
- count: number;
99
- } | {
100
- op: 'plan';
101
- index: number;
102
- entries: readonly unknown[];
103
- } | ({
104
- op: 'context';
105
- } & TurnContext);
82
+ } | Operation;
106
83
  export type ProcessCommand = {
107
84
  [field: string]: unknown;
108
85
  name: string;
@@ -139,10 +116,6 @@ export type SessionOption = (SessionOptionNaming & {
139
116
  type: 'boolean';
140
117
  currentValue: boolean;
141
118
  });
142
- export type RunningSubagent = {
143
- description: string;
144
- activity: string | null;
145
- };
146
119
  export type ConversationEvent = {
147
120
  kind: 'turn';
148
121
  conversation: string;
@@ -169,9 +142,9 @@ export type ConversationEvent = {
169
142
  conversation: string;
170
143
  step: string | null;
171
144
  } | {
172
- kind: 'subagents';
145
+ kind: 'state';
173
146
  conversation: string;
174
- subagents: readonly RunningSubagent[];
147
+ state: SessionState | null;
175
148
  } | {
176
149
  kind: 'link';
177
150
  conversation: string;
@@ -179,6 +152,7 @@ export type ConversationEvent = {
179
152
  } | {
180
153
  kind: 'deliveries';
181
154
  conversation: string;
155
+ waiting: readonly string[];
182
156
  unknown: readonly string[];
183
157
  } | {
184
158
  kind: 'accepted-message';
@@ -189,6 +163,7 @@ export type ConversationEvent = {
189
163
  conversation: string;
190
164
  } | {
191
165
  kind: 'list';
166
+ agents: readonly ListedAgent[];
192
167
  entries: readonly ListedConversation[];
193
168
  whole: boolean;
194
169
  more: boolean;
@@ -196,20 +171,39 @@ export type ConversationEvent = {
196
171
  } | {
197
172
  kind: 'listed';
198
173
  entry: ListedConversation;
174
+ } | {
175
+ kind: 'agent';
176
+ agent: ListedAgent;
199
177
  } | {
200
178
  kind: 'unlisted';
201
179
  conversation: string;
202
180
  };
181
+ export type AgentEnvironment = {
182
+ identity: string;
183
+ name: string;
184
+ state: 'online' | 'offline';
185
+ };
203
186
  export type ListedAgent = {
204
- agent: string;
187
+ id: string;
205
188
  name: string;
206
- retired: boolean;
189
+ revision: number;
190
+ environment: string;
191
+ environment_name: string;
192
+ environment_connected: boolean;
193
+ launch_directory: string;
194
+ cli: string;
195
+ model: string | null;
196
+ effort: string | null;
197
+ mode: string | null;
198
+ base_instructions: string;
199
+ in_telegram: boolean;
200
+ created: string;
201
+ retired_at: string | null;
207
202
  };
208
203
  export type ConversationStream = {
209
204
  replicate(conversations: readonly string[]): void;
210
205
  hold(cursor: string | null): void;
211
206
  observe(notify: (event: ConversationEvent) => void): () => void;
212
- agents?(): Promise<readonly ListedAgent[] | null>;
213
207
  history?(request: ConversationHistoryRequest): Promise<ActionResult>;
214
208
  };
215
209
  export type ActionDeclaration = {
@@ -242,6 +236,7 @@ export type Discovery = {
242
236
  };
243
237
  export type TransportUncertainty = {
244
238
  kind: 'transport-uncertainty';
239
+ failure?: unknown;
245
240
  };
246
241
  export type RoomNotReadable = {
247
242
  kind: 'room-not-readable';
@@ -285,25 +280,17 @@ export type BinaryFile = {
285
280
  mediaType: string;
286
281
  sha256: string;
287
282
  };
288
- export type HeldFile = {
289
- readonly path: string;
290
- readonly revision: string;
291
- };
292
- export type HeldContent = {
293
- files(after: string | null, limit: number): Promise<readonly HeldFile[]>;
294
- contents(paths: readonly string[]): Promise<ReadonlyMap<string, {
295
- readonly content: string;
296
- readonly revision: string;
297
- }>>;
298
- };
299
283
  export type BootstrapRequest = {
300
284
  locator: string;
301
285
  selection: string;
302
286
  pageToken?: PageToken;
303
- held?: HeldContent;
304
287
  arriving?: (bytes: number) => void;
305
288
  signal?: AbortSignal;
306
289
  };
290
+ export type BootstrapPart = {
291
+ readonly id: string;
292
+ readonly bytes: number;
293
+ };
307
294
  export type BootstrapInventory = {
308
295
  readonly bytes: number;
309
296
  };
@@ -315,17 +302,23 @@ export type BootstrapPage = {
315
302
  roomVersion: string;
316
303
  models?: RoomModels;
317
304
  documents: Readonly<Record<string, string>>;
305
+ facts: Readonly<Record<string, SavedFacts>>;
318
306
  revisions: Readonly<Record<string, string>>;
319
307
  fileIds?: Readonly<Record<string, string>>;
308
+ created?: Readonly<Record<string, string>>;
320
309
  changes: Readonly<Record<string, HeadChange>>;
321
310
  binaryFiles: Readonly<Record<string, BinaryFile>>;
322
311
  folders?: readonly string[];
323
312
  pageToken?: PageToken;
313
+ parts?: readonly BootstrapPart[];
324
314
  bytes?: number;
325
315
  };
316
+ export type NotReady = {
317
+ kind: 'not-ready';
318
+ };
326
319
  export type BootstrapResult = BootstrapPage | {
327
320
  kind: 'beyond-horizon';
328
- } | AdapterFailure;
321
+ } | NotReady | AdapterFailure;
329
322
  export type RefreshRequest = {
330
323
  locator: string;
331
324
  selection: string;
@@ -337,8 +330,10 @@ export type RefreshPage = {
337
330
  roomVersion: string;
338
331
  models?: RoomModels;
339
332
  documents: Readonly<Record<string, string>>;
333
+ facts: Readonly<Record<string, SavedFacts>>;
340
334
  revisions: Readonly<Record<string, string>>;
341
335
  fileIds?: Readonly<Record<string, string>>;
336
+ created?: Readonly<Record<string, string>>;
342
337
  changes: Readonly<Record<string, HeadChange>>;
343
338
  binaryFiles: Readonly<Record<string, BinaryFile>>;
344
339
  removals: readonly string[];
@@ -376,12 +371,9 @@ export type AcceptedRoom = {
376
371
  };
377
372
  export type MutationResult = (AcceptedRoom & {
378
373
  kind: 'accepted';
379
- author?: string;
380
- time?: string;
381
374
  destination?: AcceptedRoom;
382
375
  }) | (ProviderRefusal & {
383
376
  kind: 'conflicted';
384
- roomVersion?: string;
385
377
  affected: Readonly<Record<string, string>>;
386
378
  }) | (ProviderRefusal & {
387
379
  kind: 'rejected';
@@ -468,6 +460,7 @@ export type ActionResult = {
468
460
  at?: RoomVersionAt;
469
461
  } | (ProviderRefusal & {
470
462
  kind: 'rejected';
463
+ reset?: string;
471
464
  }) | AdapterFailure;
472
465
  export type SearchHit = {
473
466
  room: string;
@@ -487,12 +480,12 @@ export type SearchAnswer = {
487
480
  }) | AdapterFailure;
488
481
  export type HeldRoom = {
489
482
  locator: string;
490
- roomVersion: string;
483
+ roomVersion: string | null;
491
484
  };
492
485
  export type RoomChange = {
493
486
  kind: 'room-change';
494
487
  locator: string;
495
- from: string;
488
+ from: string | null;
496
489
  roomVersion: string;
497
490
  read(): Promise<RefreshPage>;
498
491
  };
@@ -520,11 +513,14 @@ export type RoomStream = {
520
513
  hold(rooms: readonly HeldRoom[]): void;
521
514
  observe(notify: (event: RoomStreamEvent) => void): () => void;
522
515
  };
516
+ export type PathRule = (path: string) => boolean;
523
517
  export type Adapter = {
524
518
  readonly localSaves?: true;
525
- readonly roomTypes?: string;
526
- readonly nameableRoomTypes?: readonly string[];
519
+ readonly roomTypes?: VerifiedModel;
527
520
  readonly typedPaths?: readonly TypedPath[];
521
+ readonly pathRule?: PathRule;
522
+ readonly unkeptReads?: readonly string[];
523
+ readonly leadingReads?: readonly string[];
528
524
  authorize(): Promise<Authorization>;
529
525
  discover?(authorization: Authorization): Promise<DiscoverResult>;
530
526
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;