@agentshouse/mdruntime 0.1.0-c31fdf9e58db7 → 0.1.0-c33f874b1f932

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 +89 -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 +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 +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 +30 -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 +8 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +255 -318
  42. package/dist/connection.d.ts +5 -141
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +111 -5061
  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 +61 -45
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +999 -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 -8
  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 +34 -12
  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 +6 -1
  141. package/dist/overlay.d.ts.map +1 -1
  142. package/dist/overlay.js +47 -21
  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 -209
  162. package/dist/query.d.ts.map +1 -1
  163. package/dist/query.js +3 -505
  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 +450 -0
  170. package/dist/reach.d.ts +15 -14
  171. package/dist/reach.d.ts.map +1 -1
  172. package/dist/reach.js +233 -125
  173. package/dist/react.d.ts +17 -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 +9 -2
  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 +64 -30
  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 +7 -8
  201. package/dist/room-draft.d.ts.map +1 -1
  202. package/dist/room-draft.js +113 -111
  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 +217 -0
  206. package/dist/rows.d.ts +16 -22
  207. package/dist/rows.d.ts.map +1 -1
  208. package/dist/rows.js +49 -186
  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 +344 -174
  215. package/dist/saves.d.ts +32 -0
  216. package/dist/saves.d.ts.map +1 -0
  217. package/dist/saves.js +409 -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 +113 -145
  279. package/dist/store.d.ts.map +1 -1
  280. package/dist/store.js +171 -365
  281. package/dist/stored.d.ts +72 -35
  282. package/dist/stored.d.ts.map +1 -1
  283. package/dist/stored.js +340 -197
  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 -30
  291. package/dist/tables.d.ts.map +1 -1
  292. package/dist/tables.js +242 -62
  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 +60 -7
  302. package/dist/wire.d.ts.map +1 -1
  303. package/dist/wire.js +21 -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,4 +1,7 @@
1
+ import type { SavedFacts, TypedPath, VerifiedModel } 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,22 +14,25 @@ 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;
@@ -36,16 +42,16 @@ export type Capability = {
36
42
  export type ListedConversation = {
37
43
  conversation: string;
38
44
  agent: string;
39
- agentName: string;
40
- agentRetired: boolean;
41
45
  name: string;
42
46
  created: string;
43
47
  finished: string | null;
44
48
  outcome: string | null;
45
49
  waiting: boolean;
46
50
  newest: string | null;
51
+ processEnded: string | null;
52
+ subject: string | null;
47
53
  };
48
- 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';
49
55
  export type ConversationMessage = {
50
56
  identity: string;
51
57
  turn: string;
@@ -54,6 +60,7 @@ export type ConversationMessage = {
54
60
  };
55
61
  export type AcceptedMessage = ConversationMessage & {
56
62
  position: string;
63
+ change: string;
57
64
  };
58
65
  export type ConversationHistoryRequest = {
59
66
  conversations: readonly {
@@ -69,37 +76,10 @@ export type ConversationHistoryPage = {
69
76
  export type ConversationHistories = {
70
77
  histories: readonly ConversationHistoryPage[];
71
78
  };
72
- export type TurnContext = {
73
- used: number;
74
- window: number;
75
- };
76
79
  export type TurnOperation = {
77
80
  op: 'begin';
78
81
  at: string;
79
- } | {
80
- op: 'start';
81
- index: number;
82
- part: unknown;
83
- } | {
84
- op: 'append';
85
- index: number;
86
- text: string;
87
- } | {
88
- op: 'status';
89
- index: number;
90
- status: string;
91
- result: unknown;
92
- } | {
93
- op: 'count';
94
- index: number;
95
- count: number;
96
- } | {
97
- op: 'plan';
98
- index: number;
99
- entries: readonly unknown[];
100
- } | ({
101
- op: 'context';
102
- } & TurnContext);
82
+ } | Operation;
103
83
  export type ProcessCommand = {
104
84
  [field: string]: unknown;
105
85
  name: string;
@@ -136,10 +116,6 @@ export type SessionOption = (SessionOptionNaming & {
136
116
  type: 'boolean';
137
117
  currentValue: boolean;
138
118
  });
139
- export type RunningSubagent = {
140
- description: string;
141
- activity: string | null;
142
- };
143
119
  export type ConversationEvent = {
144
120
  kind: 'turn';
145
121
  conversation: string;
@@ -166,9 +142,9 @@ export type ConversationEvent = {
166
142
  conversation: string;
167
143
  step: string | null;
168
144
  } | {
169
- kind: 'subagents';
145
+ kind: 'state';
170
146
  conversation: string;
171
- subagents: readonly RunningSubagent[];
147
+ state: SessionState | null;
172
148
  } | {
173
149
  kind: 'link';
174
150
  conversation: string;
@@ -176,6 +152,7 @@ export type ConversationEvent = {
176
152
  } | {
177
153
  kind: 'deliveries';
178
154
  conversation: string;
155
+ waiting: readonly string[];
179
156
  unknown: readonly string[];
180
157
  } | {
181
158
  kind: 'accepted-message';
@@ -186,6 +163,7 @@ export type ConversationEvent = {
186
163
  conversation: string;
187
164
  } | {
188
165
  kind: 'list';
166
+ agents: readonly ListedAgent[];
189
167
  entries: readonly ListedConversation[];
190
168
  whole: boolean;
191
169
  more: boolean;
@@ -193,20 +171,39 @@ export type ConversationEvent = {
193
171
  } | {
194
172
  kind: 'listed';
195
173
  entry: ListedConversation;
174
+ } | {
175
+ kind: 'agent';
176
+ agent: ListedAgent;
196
177
  } | {
197
178
  kind: 'unlisted';
198
179
  conversation: string;
199
180
  };
181
+ export type AgentEnvironment = {
182
+ identity: string;
183
+ name: string;
184
+ state: 'online' | 'offline';
185
+ };
200
186
  export type ListedAgent = {
201
- agent: string;
187
+ id: string;
202
188
  name: string;
203
- 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;
204
202
  };
205
203
  export type ConversationStream = {
206
204
  replicate(conversations: readonly string[]): void;
207
205
  hold(cursor: string | null): void;
208
206
  observe(notify: (event: ConversationEvent) => void): () => void;
209
- agents?(): Promise<readonly ListedAgent[] | null>;
210
207
  history?(request: ConversationHistoryRequest): Promise<ActionResult>;
211
208
  };
212
209
  export type ActionDeclaration = {
@@ -227,7 +224,6 @@ export type HistoryRetention = {
227
224
  };
228
225
  export type Retention = {
229
226
  history: HistoryRetention;
230
- outcome: number;
231
227
  refreshHorizon: number;
232
228
  };
233
229
  export type Discovery = {
@@ -240,6 +236,7 @@ export type Discovery = {
240
236
  };
241
237
  export type TransportUncertainty = {
242
238
  kind: 'transport-uncertainty';
239
+ failure?: unknown;
243
240
  };
244
241
  export type RoomNotReadable = {
245
242
  kind: 'room-not-readable';
@@ -283,25 +280,17 @@ export type BinaryFile = {
283
280
  mediaType: string;
284
281
  sha256: string;
285
282
  };
286
- export type HeldFile = {
287
- readonly path: string;
288
- readonly revision: string;
289
- };
290
- export type HeldContent = {
291
- files(after: string | null, limit: number): Promise<readonly HeldFile[]>;
292
- contents(paths: readonly string[]): Promise<ReadonlyMap<string, {
293
- readonly content: string;
294
- readonly revision: string;
295
- }>>;
296
- };
297
283
  export type BootstrapRequest = {
298
284
  locator: string;
299
285
  selection: string;
300
286
  pageToken?: PageToken;
301
- held?: HeldContent;
302
287
  arriving?: (bytes: number) => void;
303
288
  signal?: AbortSignal;
304
289
  };
290
+ export type BootstrapPart = {
291
+ readonly id: string;
292
+ readonly bytes: number;
293
+ };
305
294
  export type BootstrapInventory = {
306
295
  readonly bytes: number;
307
296
  };
@@ -313,17 +302,23 @@ export type BootstrapPage = {
313
302
  roomVersion: string;
314
303
  models?: RoomModels;
315
304
  documents: Readonly<Record<string, string>>;
305
+ facts: Readonly<Record<string, SavedFacts>>;
316
306
  revisions: Readonly<Record<string, string>>;
317
307
  fileIds?: Readonly<Record<string, string>>;
308
+ created?: Readonly<Record<string, string>>;
318
309
  changes: Readonly<Record<string, HeadChange>>;
319
310
  binaryFiles: Readonly<Record<string, BinaryFile>>;
320
311
  folders?: readonly string[];
321
312
  pageToken?: PageToken;
313
+ parts?: readonly BootstrapPart[];
322
314
  bytes?: number;
323
315
  };
316
+ export type NotReady = {
317
+ kind: 'not-ready';
318
+ };
324
319
  export type BootstrapResult = BootstrapPage | {
325
320
  kind: 'beyond-horizon';
326
- } | AdapterFailure;
321
+ } | NotReady | AdapterFailure;
327
322
  export type RefreshRequest = {
328
323
  locator: string;
329
324
  selection: string;
@@ -335,8 +330,10 @@ export type RefreshPage = {
335
330
  roomVersion: string;
336
331
  models?: RoomModels;
337
332
  documents: Readonly<Record<string, string>>;
333
+ facts: Readonly<Record<string, SavedFacts>>;
338
334
  revisions: Readonly<Record<string, string>>;
339
335
  fileIds?: Readonly<Record<string, string>>;
336
+ created?: Readonly<Record<string, string>>;
340
337
  changes: Readonly<Record<string, HeadChange>>;
341
338
  binaryFiles: Readonly<Record<string, BinaryFile>>;
342
339
  removals: readonly string[];
@@ -374,27 +371,18 @@ export type AcceptedRoom = {
374
371
  };
375
372
  export type MutationResult = (AcceptedRoom & {
376
373
  kind: 'accepted';
377
- author?: string;
378
- time?: string;
379
374
  destination?: AcceptedRoom;
380
375
  }) | (ProviderRefusal & {
381
376
  kind: 'conflicted';
382
- roomVersion?: string;
383
377
  affected: Readonly<Record<string, string>>;
384
378
  }) | (ProviderRefusal & {
385
379
  kind: 'rejected';
386
380
  affected: Readonly<Record<string, string>>;
387
381
  }) | RetryableRefusal | {
388
382
  kind: 'write-halted';
389
- } | {
390
- kind: 'expired';
391
- restored?: true;
392
383
  } | AdapterFailure;
393
384
  export type HistoryAuthor = {
394
- kind: 'user';
395
- id: string;
396
- } | {
397
- kind: 'site' | 'inbox' | 'app';
385
+ kind: 'user' | 'site' | 'inbox' | 'app';
398
386
  id: string;
399
387
  name: string;
400
388
  };
@@ -470,17 +458,34 @@ export type ActionResult = {
470
458
  kind: 'action';
471
459
  result: unknown;
472
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[];
473
478
  } | (ProviderRefusal & {
474
479
  kind: 'rejected';
475
480
  }) | AdapterFailure;
476
481
  export type HeldRoom = {
477
482
  locator: string;
478
- roomVersion: string;
483
+ roomVersion: string | null;
479
484
  };
480
485
  export type RoomChange = {
481
486
  kind: 'room-change';
482
487
  locator: string;
483
- from: string;
488
+ from: string | null;
484
489
  roomVersion: string;
485
490
  read(): Promise<RefreshPage>;
486
491
  };
@@ -499,6 +504,7 @@ export type RoomStreamEvent = {
499
504
  kind: 'closed';
500
505
  revoked: boolean;
501
506
  lost: boolean;
507
+ authorityChanged: boolean;
502
508
  } | {
503
509
  kind: 'caught-up';
504
510
  expired: readonly string[];
@@ -507,10 +513,14 @@ export type RoomStream = {
507
513
  hold(rooms: readonly HeldRoom[]): void;
508
514
  observe(notify: (event: RoomStreamEvent) => void): () => void;
509
515
  };
516
+ export type PathRule = (path: string) => boolean;
510
517
  export type Adapter = {
511
518
  readonly localSaves?: true;
512
- readonly roomTypes?: string;
513
- 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[];
514
524
  authorize(): Promise<Authorization>;
515
525
  discover?(authorization: Authorization): Promise<DiscoverResult>;
516
526
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
@@ -521,11 +531,11 @@ export type Adapter = {
521
531
  link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
522
532
  attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
523
533
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
534
+ search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
524
535
  reached(locator: string, roomVersion: string, target: string): boolean;
525
536
  follows(locator: string, roomVersion: string, next: string): boolean;
526
537
  roomStream?: RoomStream;
527
538
  conversations?: ConversationStream;
528
539
  serviceMode?: ServiceModeSignal;
529
540
  };
530
- export {};
531
541
  //# sourceMappingURL=adapter.d.ts.map