@agentshouse/mdruntime 0.1.0-c069136dcb4e8 → 0.1.0-c076b00ebf42a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/README.md +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 +108 -85
  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 +29 -22
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +36 -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 +286 -336
  42. package/dist/connection.d.ts +5 -142
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +110 -4970
  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 +65 -44
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +999 -881
  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 -7
  84. package/dist/host.d.ts.map +1 -1
  85. package/dist/host.js +77 -41
  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 -36
  104. package/dist/locks.d.ts +7 -0
  105. package/dist/locks.d.ts.map +1 -0
  106. package/dist/locks.js +32 -0
  107. package/dist/lost.d.ts +5 -0
  108. package/dist/lost.d.ts.map +1 -0
  109. package/dist/lost.js +49 -0
  110. package/dist/media.d.ts +1 -1
  111. package/dist/media.d.ts.map +1 -1
  112. package/dist/media.js +10 -13
  113. package/dist/memory.d.ts +15 -6
  114. package/dist/memory.d.ts.map +1 -1
  115. package/dist/memory.js +178 -89
  116. package/dist/messages.d.ts +35 -5
  117. package/dist/messages.d.ts.map +1 -1
  118. package/dist/messages.js +108 -36
  119. package/dist/model.d.ts +2 -10
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +0 -14
  122. package/dist/models.d.ts +10 -0
  123. package/dist/models.d.ts.map +1 -0
  124. package/dist/models.js +153 -0
  125. package/dist/observation.d.ts +28 -13
  126. package/dist/observation.d.ts.map +1 -1
  127. package/dist/observation.js +185 -81
  128. package/dist/opened.d.ts +1 -1
  129. package/dist/opened.d.ts.map +1 -1
  130. package/dist/opened.js +5 -5
  131. package/dist/opening.d.ts +4 -0
  132. package/dist/opening.d.ts.map +1 -0
  133. package/dist/opening.js +53 -0
  134. package/dist/outcome.d.ts +11 -1
  135. package/dist/outcome.d.ts.map +1 -1
  136. package/dist/outcome.js +26 -2
  137. package/dist/overlay.d.ts +6 -1
  138. package/dist/overlay.d.ts.map +1 -1
  139. package/dist/overlay.js +47 -21
  140. package/dist/page-metadata.d.ts +8 -0
  141. package/dist/page-metadata.d.ts.map +1 -0
  142. package/dist/page-metadata.js +19 -0
  143. package/dist/parts.d.ts +4 -0
  144. package/dist/parts.d.ts.map +1 -0
  145. package/dist/parts.js +13 -0
  146. package/dist/paths.d.ts +1 -0
  147. package/dist/paths.d.ts.map +1 -1
  148. package/dist/paths.js +22 -0
  149. package/dist/preparation.d.ts +41 -0
  150. package/dist/preparation.d.ts.map +1 -0
  151. package/dist/preparation.js +314 -0
  152. package/dist/presence.d.ts +58 -0
  153. package/dist/presence.d.ts.map +1 -0
  154. package/dist/presence.js +233 -0
  155. package/dist/queries.d.ts +16 -0
  156. package/dist/queries.d.ts.map +1 -0
  157. package/dist/queries.js +308 -0
  158. package/dist/query.d.ts +14 -210
  159. package/dist/query.d.ts.map +1 -1
  160. package/dist/query.js +3 -505
  161. package/dist/questions.d.ts +29 -0
  162. package/dist/questions.d.ts.map +1 -0
  163. package/dist/questions.js +115 -0
  164. package/dist/queue.d.ts +40 -0
  165. package/dist/queue.d.ts.map +1 -0
  166. package/dist/queue.js +450 -0
  167. package/dist/reach.d.ts +16 -15
  168. package/dist/reach.d.ts.map +1 -1
  169. package/dist/reach.js +248 -147
  170. package/dist/react.d.ts +17 -3
  171. package/dist/react.d.ts.map +1 -1
  172. package/dist/react.js +33 -1
  173. package/dist/read.d.ts +7 -0
  174. package/dist/read.d.ts.map +1 -0
  175. package/dist/read.js +17 -0
  176. package/dist/readiness.d.ts +9 -6
  177. package/dist/readiness.d.ts.map +1 -1
  178. package/dist/readiness.js +3 -5
  179. package/dist/reads.d.ts +39 -0
  180. package/dist/reads.d.ts.map +1 -0
  181. package/dist/reads.js +178 -0
  182. package/dist/recovery.d.ts +3 -1
  183. package/dist/recovery.d.ts.map +1 -1
  184. package/dist/recovery.js +38 -8
  185. package/dist/refresh.d.ts +2 -1
  186. package/dist/refresh.d.ts.map +1 -1
  187. package/dist/refresh.js +31 -3
  188. package/dist/refusal.d.ts +5 -0
  189. package/dist/refusal.d.ts.map +1 -0
  190. package/dist/refusal.js +55 -0
  191. package/dist/replica.d.ts +11 -16
  192. package/dist/replica.d.ts.map +1 -1
  193. package/dist/replica.js +64 -30
  194. package/dist/retried.d.ts +30 -0
  195. package/dist/retried.d.ts.map +1 -0
  196. package/dist/retried.js +72 -0
  197. package/dist/room-draft.d.ts +7 -8
  198. package/dist/room-draft.d.ts.map +1 -1
  199. package/dist/room-draft.js +113 -111
  200. package/dist/room-drafts.d.ts +24 -0
  201. package/dist/room-drafts.d.ts.map +1 -0
  202. package/dist/room-drafts.js +217 -0
  203. package/dist/rows.d.ts +16 -22
  204. package/dist/rows.d.ts.map +1 -1
  205. package/dist/rows.js +49 -186
  206. package/dist/runtime.d.ts +34 -0
  207. package/dist/runtime.d.ts.map +1 -0
  208. package/dist/runtime.js +1 -0
  209. package/dist/save.d.ts +42 -86
  210. package/dist/save.d.ts.map +1 -1
  211. package/dist/save.js +344 -174
  212. package/dist/saves.d.ts +32 -0
  213. package/dist/saves.d.ts.map +1 -0
  214. package/dist/saves.js +409 -0
  215. package/dist/search.d.ts +12 -63
  216. package/dist/search.d.ts.map +1 -1
  217. package/dist/search.js +9 -52
  218. package/dist/seed.d.ts +11 -2
  219. package/dist/seed.d.ts.map +1 -1
  220. package/dist/seed.js +71 -1
  221. package/dist/shared.d.ts +1 -6
  222. package/dist/shared.d.ts.map +1 -1
  223. package/dist/shared.js +13 -95
  224. package/dist/shown.d.ts +33 -0
  225. package/dist/shown.d.ts.map +1 -0
  226. package/dist/shown.js +309 -0
  227. package/dist/socket/admission.d.ts +7 -0
  228. package/dist/socket/admission.d.ts.map +1 -0
  229. package/dist/socket/admission.js +39 -0
  230. package/dist/socket/answers.d.ts +6 -0
  231. package/dist/socket/answers.d.ts.map +1 -0
  232. package/dist/socket/answers.js +20 -0
  233. package/dist/socket/lanes.d.ts +28 -0
  234. package/dist/socket/lanes.d.ts.map +1 -0
  235. package/dist/socket/lanes.js +103 -0
  236. package/dist/socket/reads.d.ts +10 -0
  237. package/dist/socket/reads.d.ts.map +1 -0
  238. package/dist/socket/reads.js +31 -0
  239. package/dist/socket/session.d.ts +38 -0
  240. package/dist/socket/session.d.ts.map +1 -0
  241. package/dist/socket/session.js +23 -0
  242. package/dist/socket.d.ts +67 -0
  243. package/dist/socket.d.ts.map +1 -0
  244. package/dist/socket.js +164 -0
  245. package/dist/source.d.ts +54 -0
  246. package/dist/source.d.ts.map +1 -0
  247. package/dist/source.js +82 -0
  248. package/dist/status.d.ts +0 -2
  249. package/dist/status.d.ts.map +1 -1
  250. package/dist/status.js +0 -6
  251. package/dist/store/installs.d.ts +30 -0
  252. package/dist/store/installs.d.ts.map +1 -0
  253. package/dist/store/installs.js +40 -0
  254. package/dist/store/readiness.d.ts +11 -0
  255. package/dist/store/readiness.d.ts.map +1 -0
  256. package/dist/store/readiness.js +68 -0
  257. package/dist/store/records.d.ts +217 -0
  258. package/dist/store/records.d.ts.map +1 -0
  259. package/dist/store/records.js +464 -0
  260. package/dist/store/room-held.d.ts +8 -0
  261. package/dist/store/room-held.d.ts.map +1 -0
  262. package/dist/store/room-held.js +17 -0
  263. package/dist/store/rooms-shown.d.ts +8 -0
  264. package/dist/store/rooms-shown.d.ts.map +1 -0
  265. package/dist/store/rooms-shown.js +13 -0
  266. package/dist/store/space.d.ts +11 -0
  267. package/dist/store/space.d.ts.map +1 -0
  268. package/dist/store/space.js +41 -0
  269. package/dist/store/watchers.d.ts +17 -0
  270. package/dist/store/watchers.d.ts.map +1 -0
  271. package/dist/store/watchers.js +56 -0
  272. package/dist/store/writes.d.ts +24 -0
  273. package/dist/store/writes.d.ts.map +1 -0
  274. package/dist/store/writes.js +125 -0
  275. package/dist/store.d.ts +113 -144
  276. package/dist/store.d.ts.map +1 -1
  277. package/dist/store.js +171 -364
  278. package/dist/stored.d.ts +72 -35
  279. package/dist/stored.d.ts.map +1 -1
  280. package/dist/stored.js +340 -197
  281. package/dist/surface.d.ts +89 -0
  282. package/dist/surface.d.ts.map +1 -0
  283. package/dist/surface.js +222 -0
  284. package/dist/sync.d.ts +19 -0
  285. package/dist/sync.d.ts.map +1 -0
  286. package/dist/sync.js +535 -0
  287. package/dist/tables.d.ts +124 -30
  288. package/dist/tables.d.ts.map +1 -1
  289. package/dist/tables.js +242 -62
  290. package/dist/tallies.d.ts +18 -0
  291. package/dist/tallies.d.ts.map +1 -0
  292. package/dist/tallies.js +128 -0
  293. package/dist/validation.d.ts.map +1 -1
  294. package/dist/validation.js +9 -12
  295. package/dist/windows.d.ts +1 -12
  296. package/dist/windows.d.ts.map +1 -1
  297. package/dist/windows.js +2 -75
  298. package/dist/wire.d.ts +58 -9
  299. package/dist/wire.d.ts.map +1 -1
  300. package/dist/wire.js +21 -5
  301. package/package.json +3 -2
  302. package/dist/attempt.d.ts +0 -16
  303. package/dist/attempt.d.ts.map +0 -1
  304. package/dist/attempt.js +0 -70
  305. package/dist/fence.d.ts +0 -6
  306. package/dist/fence.d.ts.map +0 -1
  307. package/dist/fence.js +0 -10
  308. package/dist/fulltext.d.ts +0 -27
  309. package/dist/fulltext.d.ts.map +0 -1
  310. package/dist/fulltext.js +0 -370
  311. package/dist/log.d.ts +0 -5
  312. package/dist/log.d.ts.map +0 -1
  313. package/dist/log.js +0 -14
  314. package/dist/words.d.ts +0 -19
  315. package/dist/words.d.ts.map +0 -1
  316. 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 = 'conversation.create' | 'conversation.send' | 'conversation.answer' | 'conversation.interrupt' | 'conversation.kill' | 'conversation.cancel' | 'conversation.delete' | 'conversation.history';
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;
@@ -161,6 +141,10 @@ export type ConversationEvent = {
161
141
  kind: 'starting';
162
142
  conversation: string;
163
143
  step: string | null;
144
+ } | {
145
+ kind: 'state';
146
+ conversation: string;
147
+ state: SessionState | null;
164
148
  } | {
165
149
  kind: 'link';
166
150
  conversation: string;
@@ -168,6 +152,7 @@ export type ConversationEvent = {
168
152
  } | {
169
153
  kind: 'deliveries';
170
154
  conversation: string;
155
+ waiting: readonly string[];
171
156
  unknown: readonly string[];
172
157
  } | {
173
158
  kind: 'accepted-message';
@@ -178,23 +163,48 @@ export type ConversationEvent = {
178
163
  conversation: string;
179
164
  } | {
180
165
  kind: 'list';
166
+ agents: readonly ListedAgent[];
181
167
  entries: readonly ListedConversation[];
168
+ whole: boolean;
169
+ more: boolean;
170
+ cursor: string | null;
182
171
  } | {
183
172
  kind: 'listed';
184
173
  entry: ListedConversation;
174
+ } | {
175
+ kind: 'agent';
176
+ agent: ListedAgent;
185
177
  } | {
186
178
  kind: 'unlisted';
187
179
  conversation: string;
188
180
  };
181
+ export type AgentEnvironment = {
182
+ identity: string;
183
+ name: string;
184
+ state: 'online' | 'offline';
185
+ };
189
186
  export type ListedAgent = {
190
- agent: string;
187
+ id: string;
191
188
  name: string;
192
- 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;
193
202
  };
194
203
  export type ConversationStream = {
195
204
  replicate(conversations: readonly string[]): void;
205
+ hold(cursor: string | null): void;
196
206
  observe(notify: (event: ConversationEvent) => void): () => void;
197
- agents?(): Promise<readonly ListedAgent[] | null>;
207
+ history?(request: ConversationHistoryRequest): Promise<ActionResult>;
198
208
  };
199
209
  export type ActionDeclaration = {
200
210
  name: string;
@@ -214,7 +224,6 @@ export type HistoryRetention = {
214
224
  };
215
225
  export type Retention = {
216
226
  history: HistoryRetention;
217
- outcome: number;
218
227
  refreshHorizon: number;
219
228
  };
220
229
  export type Discovery = {
@@ -224,13 +233,10 @@ export type Discovery = {
224
233
  providerLimits: readonly ProviderLimit[];
225
234
  retention: Retention;
226
235
  member?: Member;
227
- covered?: readonly string[];
228
- };
229
- export type DiscoveryScope = {
230
- readonly authorities: readonly string[];
231
236
  };
232
237
  export type TransportUncertainty = {
233
238
  kind: 'transport-uncertainty';
239
+ failure?: unknown;
234
240
  };
235
241
  export type RoomNotReadable = {
236
242
  kind: 'room-not-readable';
@@ -274,25 +280,17 @@ export type BinaryFile = {
274
280
  mediaType: string;
275
281
  sha256: string;
276
282
  };
277
- export type HeldFile = {
278
- readonly path: string;
279
- readonly revision: string;
280
- };
281
- export type HeldContent = {
282
- files(after: string | null, limit: number): Promise<readonly HeldFile[]>;
283
- contents(paths: readonly string[]): Promise<ReadonlyMap<string, {
284
- readonly content: string;
285
- readonly revision: string;
286
- }>>;
287
- };
288
283
  export type BootstrapRequest = {
289
284
  locator: string;
290
285
  selection: string;
291
286
  pageToken?: PageToken;
292
- held?: HeldContent;
293
287
  arriving?: (bytes: number) => void;
294
288
  signal?: AbortSignal;
295
289
  };
290
+ export type BootstrapPart = {
291
+ readonly id: string;
292
+ readonly bytes: number;
293
+ };
296
294
  export type BootstrapInventory = {
297
295
  readonly bytes: number;
298
296
  };
@@ -304,17 +302,23 @@ export type BootstrapPage = {
304
302
  roomVersion: string;
305
303
  models?: RoomModels;
306
304
  documents: Readonly<Record<string, string>>;
305
+ facts: Readonly<Record<string, SavedFacts>>;
307
306
  revisions: Readonly<Record<string, string>>;
308
307
  fileIds?: Readonly<Record<string, string>>;
308
+ created?: Readonly<Record<string, string>>;
309
309
  changes: Readonly<Record<string, HeadChange>>;
310
310
  binaryFiles: Readonly<Record<string, BinaryFile>>;
311
311
  folders?: readonly string[];
312
312
  pageToken?: PageToken;
313
+ parts?: readonly BootstrapPart[];
313
314
  bytes?: number;
314
315
  };
316
+ export type NotReady = {
317
+ kind: 'not-ready';
318
+ };
315
319
  export type BootstrapResult = BootstrapPage | {
316
320
  kind: 'beyond-horizon';
317
- } | AdapterFailure;
321
+ } | NotReady | AdapterFailure;
318
322
  export type RefreshRequest = {
319
323
  locator: string;
320
324
  selection: string;
@@ -326,8 +330,10 @@ export type RefreshPage = {
326
330
  roomVersion: string;
327
331
  models?: RoomModels;
328
332
  documents: Readonly<Record<string, string>>;
333
+ facts: Readonly<Record<string, SavedFacts>>;
329
334
  revisions: Readonly<Record<string, string>>;
330
335
  fileIds?: Readonly<Record<string, string>>;
336
+ created?: Readonly<Record<string, string>>;
331
337
  changes: Readonly<Record<string, HeadChange>>;
332
338
  binaryFiles: Readonly<Record<string, BinaryFile>>;
333
339
  removals: readonly string[];
@@ -365,27 +371,18 @@ export type AcceptedRoom = {
365
371
  };
366
372
  export type MutationResult = (AcceptedRoom & {
367
373
  kind: 'accepted';
368
- author?: string;
369
- time?: string;
370
374
  destination?: AcceptedRoom;
371
375
  }) | (ProviderRefusal & {
372
376
  kind: 'conflicted';
373
- roomVersion?: string;
374
377
  affected: Readonly<Record<string, string>>;
375
378
  }) | (ProviderRefusal & {
376
379
  kind: 'rejected';
377
380
  affected: Readonly<Record<string, string>>;
378
381
  }) | RetryableRefusal | {
379
382
  kind: 'write-halted';
380
- } | {
381
- kind: 'expired';
382
- restored?: true;
383
383
  } | AdapterFailure;
384
384
  export type HistoryAuthor = {
385
- kind: 'user';
386
- id: string;
387
- } | {
388
- kind: 'site' | 'inbox' | 'app';
385
+ kind: 'user' | 'site' | 'inbox' | 'app';
389
386
  id: string;
390
387
  name: string;
391
388
  };
@@ -461,45 +458,71 @@ export type ActionResult = {
461
458
  kind: 'action';
462
459
  result: unknown;
463
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[];
464
478
  } | (ProviderRefusal & {
465
479
  kind: 'rejected';
466
480
  }) | AdapterFailure;
467
481
  export type HeldRoom = {
468
482
  locator: string;
469
- roomVersion: string;
483
+ roomVersion: string | null;
470
484
  };
471
485
  export type RoomChange = {
472
486
  kind: 'room-change';
473
487
  locator: string;
474
- from: string;
488
+ from: string | null;
475
489
  roomVersion: string;
476
490
  read(): Promise<RefreshPage>;
477
491
  };
492
+ export type AuthorityChange = {
493
+ kind: 'authority-changed';
494
+ rooms: readonly DiscoveredRoom[];
495
+ left: readonly string[];
496
+ member?: Member;
497
+ };
478
498
  export type RoomStreamEvent = {
479
499
  kind: 'opened';
500
+ } | {
501
+ kind: 'discovered';
502
+ discovery: Discovery;
480
503
  } | {
481
504
  kind: 'closed';
482
505
  revoked: boolean;
483
506
  lost: boolean;
507
+ authorityChanged: boolean;
484
508
  } | {
485
- kind: 'opening';
509
+ kind: 'caught-up';
486
510
  expired: readonly string[];
487
- } | {
488
- kind: 'authority-changed';
489
- scope?: DiscoveryScope;
490
- } | RoomChange;
511
+ } | AuthorityChange | RoomChange;
491
512
  export type RoomStream = {
492
513
  hold(rooms: readonly HeldRoom[]): void;
493
- reopen(): void;
494
514
  observe(notify: (event: RoomStreamEvent) => void): () => void;
495
515
  };
516
+ export type PathRule = (path: string) => boolean;
496
517
  export type Adapter = {
497
518
  readonly localSaves?: true;
498
- readonly exhaustiveDiscovery?: true;
499
- readonly roomTypes?: string;
500
- 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[];
501
524
  authorize(): Promise<Authorization>;
502
- discover(authorization: Authorization, scope?: DiscoveryScope): Promise<DiscoverResult>;
525
+ discover?(authorization: Authorization): Promise<DiscoverResult>;
503
526
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
504
527
  refresh?(authorization: Authorization, request: RefreshRequest): Promise<RefreshResult>;
505
528
  mutate(authorization: Authorization, request: MutationRequest, keep: (upload: unknown) => Promise<void>): Promise<MutationResult>;
@@ -508,11 +531,11 @@ export type Adapter = {
508
531
  link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
509
532
  attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
510
533
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
534
+ search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
511
535
  reached(locator: string, roomVersion: string, target: string): boolean;
512
536
  follows(locator: string, roomVersion: string, next: string): boolean;
513
537
  roomStream?: RoomStream;
514
538
  conversations?: ConversationStream;
515
539
  serviceMode?: ServiceModeSignal;
516
540
  };
517
- export {};
518
541
  //# sourceMappingURL=adapter.d.ts.map