@agentshouse/mdruntime 0.1.0-ce296e553e84b → 0.1.0-ce2a9e406a539

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 (319) 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 +88 -79
  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 -85
  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 +5 -0
  28. package/dist/change.d.ts.map +1 -1
  29. package/dist/change.js +7 -2
  30. package/dist/chat-types.d.ts +3 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +11 -0
  33. package/dist/client.d.ts +29 -22
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +37 -20
  36. package/dist/collection.d.ts +26 -4
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +19 -2
  39. package/dist/compile.d.ts +9 -7
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +257 -321
  42. package/dist/connection.d.ts +5 -142
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +111 -5228
  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 +150 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +259 -0
  51. package/dist/conversation-row.d.ts +35 -0
  52. package/dist/conversation-row.d.ts.map +1 -0
  53. package/dist/conversation-row.js +55 -0
  54. package/dist/conversation.d.ts +63 -45
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +1001 -910
  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 +150 -0
  63. package/dist/durability.d.ts +19 -0
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/durability.js +4 -0
  66. package/dist/entry.d.ts +2 -2
  67. package/dist/entry.d.ts.map +1 -1
  68. package/dist/entry.js +18 -9
  69. package/dist/expectation.d.ts +26 -13
  70. package/dist/expectation.d.ts.map +1 -1
  71. package/dist/expectation.js +72 -19
  72. package/dist/failure.d.ts +3 -0
  73. package/dist/failure.d.ts.map +1 -1
  74. package/dist/failure.js +6 -0
  75. package/dist/figures.d.ts +49 -0
  76. package/dist/figures.d.ts.map +1 -0
  77. package/dist/figures.js +199 -0
  78. package/dist/file.d.ts.map +1 -1
  79. package/dist/file.js +2 -1
  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 +21 -6
  84. package/dist/host.d.ts.map +1 -1
  85. package/dist/host.js +77 -36
  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 +35 -13
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +16 -5
  92. package/dist/install.d.ts +60 -0
  93. package/dist/install.d.ts.map +1 -0
  94. package/dist/install.js +537 -0
  95. package/dist/lifecycle.d.ts +7 -0
  96. package/dist/lifecycle.d.ts.map +1 -0
  97. package/dist/lifecycle.js +278 -0
  98. package/dist/listing.d.ts +52 -0
  99. package/dist/listing.d.ts.map +1 -0
  100. package/dist/listing.js +152 -0
  101. package/dist/live.d.ts +9 -6
  102. package/dist/live.d.ts.map +1 -1
  103. package/dist/live.js +118 -35
  104. package/dist/loaded.d.ts +5 -0
  105. package/dist/loaded.d.ts.map +1 -0
  106. package/dist/loaded.js +40 -0
  107. package/dist/locks.d.ts +7 -0
  108. package/dist/locks.d.ts.map +1 -0
  109. package/dist/locks.js +32 -0
  110. package/dist/lost.d.ts +5 -0
  111. package/dist/lost.d.ts.map +1 -0
  112. package/dist/lost.js +49 -0
  113. package/dist/media.d.ts +6 -1
  114. package/dist/media.d.ts.map +1 -1
  115. package/dist/media.js +68 -17
  116. package/dist/memory.d.ts +11 -3
  117. package/dist/memory.d.ts.map +1 -1
  118. package/dist/memory.js +102 -32
  119. package/dist/messages.d.ts +35 -5
  120. package/dist/messages.d.ts.map +1 -1
  121. package/dist/messages.js +108 -36
  122. package/dist/model.d.ts +2 -10
  123. package/dist/model.d.ts.map +1 -1
  124. package/dist/model.js +0 -14
  125. package/dist/models.d.ts +10 -0
  126. package/dist/models.d.ts.map +1 -0
  127. package/dist/models.js +153 -0
  128. package/dist/observation.d.ts +28 -13
  129. package/dist/observation.d.ts.map +1 -1
  130. package/dist/observation.js +185 -81
  131. package/dist/opened.d.ts +1 -1
  132. package/dist/opened.d.ts.map +1 -1
  133. package/dist/opened.js +5 -5
  134. package/dist/opening.d.ts +4 -0
  135. package/dist/opening.d.ts.map +1 -0
  136. package/dist/opening.js +53 -0
  137. package/dist/outcome.d.ts +11 -1
  138. package/dist/outcome.d.ts.map +1 -1
  139. package/dist/outcome.js +26 -2
  140. package/dist/overlay.d.ts +7 -2
  141. package/dist/overlay.d.ts.map +1 -1
  142. package/dist/overlay.js +48 -24
  143. package/dist/page-metadata.d.ts +8 -0
  144. package/dist/page-metadata.d.ts.map +1 -0
  145. package/dist/page-metadata.js +19 -0
  146. package/dist/parts.d.ts +4 -0
  147. package/dist/parts.d.ts.map +1 -0
  148. package/dist/parts.js +13 -0
  149. package/dist/paths.d.ts +1 -0
  150. package/dist/paths.d.ts.map +1 -1
  151. package/dist/paths.js +22 -0
  152. package/dist/preparation.d.ts +41 -0
  153. package/dist/preparation.d.ts.map +1 -0
  154. package/dist/preparation.js +314 -0
  155. package/dist/presence.d.ts +58 -0
  156. package/dist/presence.d.ts.map +1 -0
  157. package/dist/presence.js +231 -0
  158. package/dist/queries.d.ts +16 -0
  159. package/dist/queries.d.ts.map +1 -0
  160. package/dist/queries.js +308 -0
  161. package/dist/query.d.ts +13 -211
  162. package/dist/query.d.ts.map +1 -1
  163. package/dist/query.js +3 -508
  164. package/dist/questions.d.ts +29 -0
  165. package/dist/questions.d.ts.map +1 -0
  166. package/dist/questions.js +115 -0
  167. package/dist/queue.d.ts +40 -0
  168. package/dist/queue.d.ts.map +1 -0
  169. package/dist/queue.js +480 -0
  170. package/dist/reach.d.ts +15 -14
  171. package/dist/reach.d.ts.map +1 -1
  172. package/dist/reach.js +232 -124
  173. package/dist/react.d.ts +16 -3
  174. package/dist/react.d.ts.map +1 -1
  175. package/dist/react.js +33 -1
  176. package/dist/read.d.ts +7 -0
  177. package/dist/read.d.ts.map +1 -0
  178. package/dist/read.js +17 -0
  179. package/dist/readiness.d.ts +9 -6
  180. package/dist/readiness.d.ts.map +1 -1
  181. package/dist/readiness.js +3 -5
  182. package/dist/reads.d.ts +39 -0
  183. package/dist/reads.d.ts.map +1 -0
  184. package/dist/reads.js +178 -0
  185. package/dist/recovery.d.ts +3 -1
  186. package/dist/recovery.d.ts.map +1 -1
  187. package/dist/recovery.js +38 -8
  188. package/dist/refresh.d.ts +1 -1
  189. package/dist/refresh.d.ts.map +1 -1
  190. package/dist/refresh.js +10 -22
  191. package/dist/refusal.d.ts +5 -0
  192. package/dist/refusal.d.ts.map +1 -0
  193. package/dist/refusal.js +55 -0
  194. package/dist/replica.d.ts +11 -16
  195. package/dist/replica.d.ts.map +1 -1
  196. package/dist/replica.js +66 -35
  197. package/dist/retried.d.ts +30 -0
  198. package/dist/retried.d.ts.map +1 -0
  199. package/dist/retried.js +72 -0
  200. package/dist/room-draft.d.ts +33 -9
  201. package/dist/room-draft.d.ts.map +1 -1
  202. package/dist/room-draft.js +276 -69
  203. package/dist/room-drafts.d.ts +24 -0
  204. package/dist/room-drafts.d.ts.map +1 -0
  205. package/dist/room-drafts.js +220 -0
  206. package/dist/rows.d.ts +16 -23
  207. package/dist/rows.d.ts.map +1 -1
  208. package/dist/rows.js +49 -191
  209. package/dist/runtime.d.ts +34 -0
  210. package/dist/runtime.d.ts.map +1 -0
  211. package/dist/runtime.js +1 -0
  212. package/dist/save.d.ts +42 -86
  213. package/dist/save.d.ts.map +1 -1
  214. package/dist/save.js +332 -228
  215. package/dist/saves.d.ts +32 -0
  216. package/dist/saves.d.ts.map +1 -0
  217. package/dist/saves.js +426 -0
  218. package/dist/search.d.ts +12 -63
  219. package/dist/search.d.ts.map +1 -1
  220. package/dist/search.js +9 -52
  221. package/dist/seed.d.ts +11 -2
  222. package/dist/seed.d.ts.map +1 -1
  223. package/dist/seed.js +71 -1
  224. package/dist/shared.d.ts +1 -6
  225. package/dist/shared.d.ts.map +1 -1
  226. package/dist/shared.js +13 -95
  227. package/dist/shown.d.ts +33 -0
  228. package/dist/shown.d.ts.map +1 -0
  229. package/dist/shown.js +309 -0
  230. package/dist/socket/admission.d.ts +7 -0
  231. package/dist/socket/admission.d.ts.map +1 -0
  232. package/dist/socket/admission.js +39 -0
  233. package/dist/socket/answers.d.ts +6 -0
  234. package/dist/socket/answers.d.ts.map +1 -0
  235. package/dist/socket/answers.js +20 -0
  236. package/dist/socket/lanes.d.ts +28 -0
  237. package/dist/socket/lanes.d.ts.map +1 -0
  238. package/dist/socket/lanes.js +103 -0
  239. package/dist/socket/reads.d.ts +10 -0
  240. package/dist/socket/reads.d.ts.map +1 -0
  241. package/dist/socket/reads.js +31 -0
  242. package/dist/socket/session.d.ts +38 -0
  243. package/dist/socket/session.d.ts.map +1 -0
  244. package/dist/socket/session.js +23 -0
  245. package/dist/socket.d.ts +67 -0
  246. package/dist/socket.d.ts.map +1 -0
  247. package/dist/socket.js +164 -0
  248. package/dist/source.d.ts +54 -0
  249. package/dist/source.d.ts.map +1 -0
  250. package/dist/source.js +82 -0
  251. package/dist/status.d.ts +0 -2
  252. package/dist/status.d.ts.map +1 -1
  253. package/dist/status.js +0 -6
  254. package/dist/store/installs.d.ts +30 -0
  255. package/dist/store/installs.d.ts.map +1 -0
  256. package/dist/store/installs.js +40 -0
  257. package/dist/store/readiness.d.ts +11 -0
  258. package/dist/store/readiness.d.ts.map +1 -0
  259. package/dist/store/readiness.js +68 -0
  260. package/dist/store/records.d.ts +217 -0
  261. package/dist/store/records.d.ts.map +1 -0
  262. package/dist/store/records.js +464 -0
  263. package/dist/store/room-held.d.ts +8 -0
  264. package/dist/store/room-held.d.ts.map +1 -0
  265. package/dist/store/room-held.js +17 -0
  266. package/dist/store/rooms-shown.d.ts +8 -0
  267. package/dist/store/rooms-shown.d.ts.map +1 -0
  268. package/dist/store/rooms-shown.js +13 -0
  269. package/dist/store/space.d.ts +11 -0
  270. package/dist/store/space.d.ts.map +1 -0
  271. package/dist/store/space.js +41 -0
  272. package/dist/store/watchers.d.ts +17 -0
  273. package/dist/store/watchers.d.ts.map +1 -0
  274. package/dist/store/watchers.js +56 -0
  275. package/dist/store/writes.d.ts +24 -0
  276. package/dist/store/writes.d.ts.map +1 -0
  277. package/dist/store/writes.js +125 -0
  278. package/dist/store.d.ts +115 -154
  279. package/dist/store.d.ts.map +1 -1
  280. package/dist/store.js +171 -398
  281. package/dist/stored.d.ts +72 -68
  282. package/dist/stored.d.ts.map +1 -1
  283. package/dist/stored.js +340 -253
  284. package/dist/surface.d.ts +89 -0
  285. package/dist/surface.d.ts.map +1 -0
  286. package/dist/surface.js +222 -0
  287. package/dist/sync.d.ts +19 -0
  288. package/dist/sync.d.ts.map +1 -0
  289. package/dist/sync.js +535 -0
  290. package/dist/tables.d.ts +124 -56
  291. package/dist/tables.d.ts.map +1 -1
  292. package/dist/tables.js +242 -74
  293. package/dist/tallies.d.ts +18 -0
  294. package/dist/tallies.d.ts.map +1 -0
  295. package/dist/tallies.js +128 -0
  296. package/dist/validation.d.ts.map +1 -1
  297. package/dist/validation.js +9 -12
  298. package/dist/windows.d.ts +1 -12
  299. package/dist/windows.d.ts.map +1 -1
  300. package/dist/windows.js +2 -75
  301. package/dist/wire.d.ts +59 -7
  302. package/dist/wire.d.ts.map +1 -1
  303. package/dist/wire.js +20 -4
  304. package/package.json +3 -2
  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 -370
  314. package/dist/log.d.ts +0 -5
  315. package/dist/log.d.ts.map +0 -1
  316. package/dist/log.js +0 -14
  317. package/dist/words.d.ts +0 -19
  318. package/dist/words.d.ts.map +0 -1
  319. package/dist/words.js +0 -156
@@ -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 { Outline } 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 { Outline };
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,16 +42,16 @@ 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;
46
48
  outcome: string | null;
47
49
  waiting: boolean;
48
50
  newest: string | null;
51
+ processEnded: string | null;
52
+ subject: string | null;
49
53
  };
50
- 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';
51
55
  export type ConversationMessage = {
52
56
  identity: string;
53
57
  turn: string;
@@ -56,6 +60,7 @@ export type ConversationMessage = {
56
60
  };
57
61
  export type AcceptedMessage = ConversationMessage & {
58
62
  position: string;
63
+ change: string;
59
64
  };
60
65
  export type ConversationHistoryRequest = {
61
66
  conversations: readonly {
@@ -71,37 +76,10 @@ export type ConversationHistoryPage = {
71
76
  export type ConversationHistories = {
72
77
  histories: readonly ConversationHistoryPage[];
73
78
  };
74
- export type TurnContext = {
75
- used: number;
76
- window: number;
77
- };
78
79
  export type TurnOperation = {
79
80
  op: 'begin';
80
81
  at: string;
81
- } | {
82
- op: 'start';
83
- index: number;
84
- part: unknown;
85
- } | {
86
- op: 'append';
87
- index: number;
88
- text: string;
89
- } | {
90
- op: 'status';
91
- index: number;
92
- status: string;
93
- result: unknown;
94
- } | {
95
- op: 'count';
96
- index: number;
97
- count: number;
98
- } | {
99
- op: 'plan';
100
- index: number;
101
- entries: readonly unknown[];
102
- } | ({
103
- op: 'context';
104
- } & TurnContext);
82
+ } | Operation;
105
83
  export type ProcessCommand = {
106
84
  [field: string]: unknown;
107
85
  name: string;
@@ -138,10 +116,6 @@ export type SessionOption = (SessionOptionNaming & {
138
116
  type: 'boolean';
139
117
  currentValue: boolean;
140
118
  });
141
- export type RunningSubagent = {
142
- description: string;
143
- activity: string | null;
144
- };
145
119
  export type ConversationEvent = {
146
120
  kind: 'turn';
147
121
  conversation: string;
@@ -168,9 +142,9 @@ export type ConversationEvent = {
168
142
  conversation: string;
169
143
  step: string | null;
170
144
  } | {
171
- kind: 'subagents';
145
+ kind: 'state';
172
146
  conversation: string;
173
- subagents: readonly RunningSubagent[];
147
+ state: SessionState | null;
174
148
  } | {
175
149
  kind: 'link';
176
150
  conversation: string;
@@ -178,6 +152,7 @@ export type ConversationEvent = {
178
152
  } | {
179
153
  kind: 'deliveries';
180
154
  conversation: string;
155
+ waiting: readonly string[];
181
156
  unknown: readonly string[];
182
157
  } | {
183
158
  kind: 'accepted-message';
@@ -188,6 +163,7 @@ export type ConversationEvent = {
188
163
  conversation: string;
189
164
  } | {
190
165
  kind: 'list';
166
+ agents: readonly ListedAgent[];
191
167
  entries: readonly ListedConversation[];
192
168
  whole: boolean;
193
169
  more: boolean;
@@ -195,20 +171,39 @@ export type ConversationEvent = {
195
171
  } | {
196
172
  kind: 'listed';
197
173
  entry: ListedConversation;
174
+ } | {
175
+ kind: 'agent';
176
+ agent: ListedAgent;
198
177
  } | {
199
178
  kind: 'unlisted';
200
179
  conversation: string;
201
180
  };
181
+ export type AgentEnvironment = {
182
+ identity: string;
183
+ name: string;
184
+ state: 'online' | 'offline';
185
+ };
202
186
  export type ListedAgent = {
203
- agent: string;
187
+ id: string;
204
188
  name: string;
205
- 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;
206
202
  };
207
203
  export type ConversationStream = {
208
204
  replicate(conversations: readonly string[]): void;
209
205
  hold(cursor: string | null): void;
210
206
  observe(notify: (event: ConversationEvent) => void): () => void;
211
- agents?(): Promise<readonly ListedAgent[] | null>;
212
207
  history?(request: ConversationHistoryRequest): Promise<ActionResult>;
213
208
  };
214
209
  export type ActionDeclaration = {
@@ -229,7 +224,6 @@ export type HistoryRetention = {
229
224
  };
230
225
  export type Retention = {
231
226
  history: HistoryRetention;
232
- outcome: number;
233
227
  refreshHorizon: number;
234
228
  };
235
229
  export type Discovery = {
@@ -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,26 +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
- path?: string;
303
286
  pageToken?: PageToken;
304
- held?: HeldContent;
305
287
  arriving?: (bytes: number) => void;
306
288
  signal?: AbortSignal;
307
289
  };
290
+ export type BootstrapPart = {
291
+ readonly id: string;
292
+ readonly bytes: number;
293
+ };
308
294
  export type BootstrapInventory = {
309
295
  readonly bytes: number;
310
296
  };
@@ -316,18 +302,23 @@ export type BootstrapPage = {
316
302
  roomVersion: string;
317
303
  models?: RoomModels;
318
304
  documents: Readonly<Record<string, string>>;
319
- outlines?: Readonly<Record<string, Outline>>;
305
+ facts: Readonly<Record<string, SavedFacts>>;
320
306
  revisions: Readonly<Record<string, string>>;
321
307
  fileIds?: Readonly<Record<string, string>>;
308
+ created?: Readonly<Record<string, string>>;
322
309
  changes: Readonly<Record<string, HeadChange>>;
323
310
  binaryFiles: Readonly<Record<string, BinaryFile>>;
324
311
  folders?: readonly string[];
325
312
  pageToken?: PageToken;
313
+ parts?: readonly BootstrapPart[];
326
314
  bytes?: number;
327
315
  };
316
+ export type NotReady = {
317
+ kind: 'not-ready';
318
+ };
328
319
  export type BootstrapResult = BootstrapPage | {
329
320
  kind: 'beyond-horizon';
330
- } | AdapterFailure;
321
+ } | NotReady | AdapterFailure;
331
322
  export type RefreshRequest = {
332
323
  locator: string;
333
324
  selection: string;
@@ -339,9 +330,10 @@ export type RefreshPage = {
339
330
  roomVersion: string;
340
331
  models?: RoomModels;
341
332
  documents: Readonly<Record<string, string>>;
342
- outlines?: Readonly<Record<string, Outline>>;
333
+ facts: Readonly<Record<string, SavedFacts>>;
343
334
  revisions: Readonly<Record<string, string>>;
344
335
  fileIds?: Readonly<Record<string, string>>;
336
+ created?: Readonly<Record<string, string>>;
345
337
  changes: Readonly<Record<string, HeadChange>>;
346
338
  binaryFiles: Readonly<Record<string, BinaryFile>>;
347
339
  removals: readonly string[];
@@ -379,21 +371,15 @@ export type AcceptedRoom = {
379
371
  };
380
372
  export type MutationResult = (AcceptedRoom & {
381
373
  kind: 'accepted';
382
- author?: string;
383
- time?: string;
384
374
  destination?: AcceptedRoom;
385
375
  }) | (ProviderRefusal & {
386
376
  kind: 'conflicted';
387
- roomVersion?: string;
388
377
  affected: Readonly<Record<string, string>>;
389
378
  }) | (ProviderRefusal & {
390
379
  kind: 'rejected';
391
380
  affected: Readonly<Record<string, string>>;
392
381
  }) | RetryableRefusal | {
393
382
  kind: 'write-halted';
394
- } | {
395
- kind: 'expired';
396
- restored?: true;
397
383
  } | AdapterFailure;
398
384
  export type HistoryAuthor = {
399
385
  kind: 'user' | 'site' | 'inbox' | 'app';
@@ -472,17 +458,34 @@ export type ActionResult = {
472
458
  kind: 'action';
473
459
  result: unknown;
474
460
  at?: RoomVersionAt;
461
+ } | (ProviderRefusal & {
462
+ kind: 'rejected';
463
+ reset?: string;
464
+ }) | AdapterFailure;
465
+ export type SearchHit = {
466
+ room: string;
467
+ path: string;
468
+ line?: number;
469
+ snippet?: string;
470
+ };
471
+ export type SearchAsk = {
472
+ text: string;
473
+ rooms: readonly string[] | null;
474
+ };
475
+ export type SearchAnswer = {
476
+ kind: 'found';
477
+ documents: readonly SearchHit[];
475
478
  } | (ProviderRefusal & {
476
479
  kind: 'rejected';
477
480
  }) | AdapterFailure;
478
481
  export type HeldRoom = {
479
482
  locator: string;
480
- roomVersion: string;
483
+ roomVersion: string | null;
481
484
  };
482
485
  export type RoomChange = {
483
486
  kind: 'room-change';
484
487
  locator: string;
485
- from: string;
488
+ from: string | null;
486
489
  roomVersion: string;
487
490
  read(): Promise<RefreshPage>;
488
491
  };
@@ -501,6 +504,7 @@ export type RoomStreamEvent = {
501
504
  kind: 'closed';
502
505
  revoked: boolean;
503
506
  lost: boolean;
507
+ authorityChanged: boolean;
504
508
  } | {
505
509
  kind: 'caught-up';
506
510
  expired: readonly string[];
@@ -509,10 +513,14 @@ export type RoomStream = {
509
513
  hold(rooms: readonly HeldRoom[]): void;
510
514
  observe(notify: (event: RoomStreamEvent) => void): () => void;
511
515
  };
516
+ export type PathRule = (path: string) => boolean;
512
517
  export type Adapter = {
513
518
  readonly localSaves?: true;
514
- readonly roomTypes?: string;
515
- readonly nameableRoomTypes?: readonly string[];
519
+ readonly roomTypes?: VerifiedModel;
520
+ readonly typedPaths?: readonly TypedPath[];
521
+ readonly pathRule?: PathRule;
522
+ readonly unkeptReads?: readonly string[];
523
+ readonly leadingReads?: readonly string[];
516
524
  authorize(): Promise<Authorization>;
517
525
  discover?(authorization: Authorization): Promise<DiscoverResult>;
518
526
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
@@ -523,6 +531,7 @@ export type Adapter = {
523
531
  link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
524
532
  attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
525
533
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
534
+ search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
526
535
  reached(locator: string, roomVersion: string, target: string): boolean;
527
536
  follows(locator: string, roomVersion: string, next: string): boolean;
528
537
  roomStream?: RoomStream;