@agentshouse/mdruntime 0.1.0-c37ed9e81aef7 → 0.1.0-c382b65c660e7

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 (315) 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 +99 -57
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +0 -1
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +0 -5
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +1 -1
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +6 -18
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/change-set.d.ts +4 -0
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +6 -0
  28. package/dist/change.d.ts +5 -0
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +7 -2
  31. package/dist/chat-types.d.ts +3 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +11 -0
  34. package/dist/client.d.ts +26 -21
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +40 -55
  37. package/dist/collection.d.ts +25 -4
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +19 -2
  40. package/dist/column.d.ts +5 -0
  41. package/dist/column.d.ts.map +1 -0
  42. package/dist/column.js +9 -0
  43. package/dist/compile.d.ts +7 -0
  44. package/dist/compile.d.ts.map +1 -1
  45. package/dist/compile.js +215 -78
  46. package/dist/connection.d.ts +5 -143
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +111 -5122
  49. package/dist/context.d.ts.map +1 -1
  50. package/dist/context.js +1 -1
  51. package/dist/conversation-live.d.ts +150 -0
  52. package/dist/conversation-live.d.ts.map +1 -0
  53. package/dist/conversation-live.js +259 -0
  54. package/dist/conversation-row.d.ts +40 -0
  55. package/dist/conversation-row.d.ts.map +1 -0
  56. package/dist/conversation-row.js +66 -0
  57. package/dist/conversation.d.ts +62 -42
  58. package/dist/conversation.d.ts.map +1 -1
  59. package/dist/conversation.js +985 -882
  60. package/dist/declaration.d.ts +10 -0
  61. package/dist/declaration.d.ts.map +1 -0
  62. package/dist/declaration.js +24 -0
  63. package/dist/discovery.d.ts +11 -0
  64. package/dist/discovery.d.ts.map +1 -0
  65. package/dist/discovery.js +157 -0
  66. package/dist/download.d.ts +6 -0
  67. package/dist/download.d.ts.map +1 -0
  68. package/dist/download.js +42 -0
  69. package/dist/durability.d.ts +13 -0
  70. package/dist/durability.d.ts.map +1 -1
  71. package/dist/durability.js +4 -0
  72. package/dist/entry.d.ts.map +1 -1
  73. package/dist/entry.js +2 -1
  74. package/dist/expectation.d.ts +26 -13
  75. package/dist/expectation.d.ts.map +1 -1
  76. package/dist/expectation.js +72 -19
  77. package/dist/failure.d.ts +3 -0
  78. package/dist/failure.d.ts.map +1 -1
  79. package/dist/failure.js +6 -0
  80. package/dist/figures.d.ts +49 -0
  81. package/dist/figures.d.ts.map +1 -0
  82. package/dist/figures.js +199 -0
  83. package/dist/file.d.ts +1 -1
  84. package/dist/file.d.ts.map +1 -1
  85. package/dist/file.js +3 -2
  86. package/dist/holdings.d.ts +29 -0
  87. package/dist/holdings.d.ts.map +1 -0
  88. package/dist/holdings.js +95 -0
  89. package/dist/host.d.ts +19 -2
  90. package/dist/host.d.ts.map +1 -1
  91. package/dist/host.js +66 -19
  92. package/dist/index.d.ts +32 -13
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +14 -5
  95. package/dist/install.d.ts +60 -0
  96. package/dist/install.d.ts.map +1 -0
  97. package/dist/install.js +537 -0
  98. package/dist/lifecycle.d.ts +7 -0
  99. package/dist/lifecycle.d.ts.map +1 -0
  100. package/dist/lifecycle.js +282 -0
  101. package/dist/listing.d.ts +52 -0
  102. package/dist/listing.d.ts.map +1 -0
  103. package/dist/listing.js +152 -0
  104. package/dist/live.d.ts +8 -6
  105. package/dist/live.d.ts.map +1 -1
  106. package/dist/live.js +110 -31
  107. package/dist/loaded.d.ts +5 -0
  108. package/dist/loaded.d.ts.map +1 -0
  109. package/dist/loaded.js +40 -0
  110. package/dist/locks.d.ts +7 -0
  111. package/dist/locks.d.ts.map +1 -0
  112. package/dist/locks.js +32 -0
  113. package/dist/lost.d.ts +5 -0
  114. package/dist/lost.d.ts.map +1 -0
  115. package/dist/lost.js +49 -0
  116. package/dist/media.d.ts +19 -2
  117. package/dist/media.d.ts.map +1 -1
  118. package/dist/media.js +105 -27
  119. package/dist/memory.d.ts +10 -3
  120. package/dist/memory.d.ts.map +1 -1
  121. package/dist/memory.js +101 -32
  122. package/dist/messages.d.ts +33 -3
  123. package/dist/messages.d.ts.map +1 -1
  124. package/dist/messages.js +96 -25
  125. package/dist/model.d.ts +0 -3
  126. package/dist/model.d.ts.map +1 -1
  127. package/dist/model.js +0 -11
  128. package/dist/models.d.ts +10 -0
  129. package/dist/models.d.ts.map +1 -0
  130. package/dist/models.js +153 -0
  131. package/dist/observation.d.ts +27 -12
  132. package/dist/observation.d.ts.map +1 -1
  133. package/dist/observation.js +184 -85
  134. package/dist/opened.d.ts +1 -1
  135. package/dist/opened.d.ts.map +1 -1
  136. package/dist/opened.js +5 -5
  137. package/dist/opening.d.ts +4 -0
  138. package/dist/opening.d.ts.map +1 -0
  139. package/dist/opening.js +53 -0
  140. package/dist/outcome.d.ts +17 -2
  141. package/dist/outcome.d.ts.map +1 -1
  142. package/dist/outcome.js +35 -2
  143. package/dist/overlay.d.ts +7 -2
  144. package/dist/overlay.d.ts.map +1 -1
  145. package/dist/overlay.js +48 -24
  146. package/dist/page-metadata.d.ts +8 -0
  147. package/dist/page-metadata.d.ts.map +1 -0
  148. package/dist/page-metadata.js +19 -0
  149. package/dist/parts.d.ts +4 -0
  150. package/dist/parts.d.ts.map +1 -0
  151. package/dist/parts.js +13 -0
  152. package/dist/paths.d.ts +1 -0
  153. package/dist/paths.d.ts.map +1 -1
  154. package/dist/paths.js +22 -0
  155. package/dist/preparation.d.ts +41 -0
  156. package/dist/preparation.d.ts.map +1 -0
  157. package/dist/preparation.js +314 -0
  158. package/dist/presence.d.ts +58 -0
  159. package/dist/presence.d.ts.map +1 -0
  160. package/dist/presence.js +231 -0
  161. package/dist/queries.d.ts +16 -0
  162. package/dist/queries.d.ts.map +1 -0
  163. package/dist/queries.js +308 -0
  164. package/dist/query.d.ts +10 -1
  165. package/dist/query.d.ts.map +1 -1
  166. package/dist/questions.d.ts +30 -0
  167. package/dist/questions.d.ts.map +1 -0
  168. package/dist/questions.js +116 -0
  169. package/dist/queue.d.ts +40 -0
  170. package/dist/queue.d.ts.map +1 -0
  171. package/dist/queue.js +480 -0
  172. package/dist/reach.d.ts +9 -8
  173. package/dist/reach.d.ts.map +1 -1
  174. package/dist/reach.js +231 -112
  175. package/dist/react.d.ts +16 -2
  176. package/dist/react.d.ts.map +1 -1
  177. package/dist/react.js +33 -1
  178. package/dist/read.d.ts +7 -0
  179. package/dist/read.d.ts.map +1 -0
  180. package/dist/read.js +17 -0
  181. package/dist/readiness.d.ts +9 -4
  182. package/dist/readiness.d.ts.map +1 -1
  183. package/dist/readiness.js +3 -5
  184. package/dist/reads.d.ts +39 -0
  185. package/dist/reads.d.ts.map +1 -0
  186. package/dist/reads.js +178 -0
  187. package/dist/recovery.d.ts +3 -1
  188. package/dist/recovery.d.ts.map +1 -1
  189. package/dist/recovery.js +38 -8
  190. package/dist/refresh.d.ts +1 -1
  191. package/dist/refresh.d.ts.map +1 -1
  192. package/dist/refresh.js +6 -2
  193. package/dist/refusal.d.ts +5 -0
  194. package/dist/refusal.d.ts.map +1 -0
  195. package/dist/refusal.js +55 -0
  196. package/dist/replica.d.ts +5 -13
  197. package/dist/replica.d.ts.map +1 -1
  198. package/dist/replica.js +40 -24
  199. package/dist/retried.d.ts +30 -0
  200. package/dist/retried.d.ts.map +1 -0
  201. package/dist/retried.js +72 -0
  202. package/dist/room-draft.d.ts +31 -8
  203. package/dist/room-draft.d.ts.map +1 -1
  204. package/dist/room-draft.js +273 -66
  205. package/dist/room-drafts.d.ts +24 -0
  206. package/dist/room-drafts.d.ts.map +1 -0
  207. package/dist/room-drafts.js +220 -0
  208. package/dist/room-list.d.ts +10 -0
  209. package/dist/room-list.d.ts.map +1 -0
  210. package/dist/room-list.js +45 -0
  211. package/dist/rows.d.ts +2 -1
  212. package/dist/rows.d.ts.map +1 -1
  213. package/dist/rows.js +9 -10
  214. package/dist/runtime.d.ts +34 -0
  215. package/dist/runtime.d.ts.map +1 -0
  216. package/dist/runtime.js +1 -0
  217. package/dist/save.d.ts +42 -86
  218. package/dist/save.d.ts.map +1 -1
  219. package/dist/save.js +328 -226
  220. package/dist/saves.d.ts +34 -0
  221. package/dist/saves.d.ts.map +1 -0
  222. package/dist/saves.js +437 -0
  223. package/dist/seed.d.ts +11 -2
  224. package/dist/seed.d.ts.map +1 -1
  225. package/dist/seed.js +71 -1
  226. package/dist/shared.d.ts +1 -6
  227. package/dist/shared.d.ts.map +1 -1
  228. package/dist/shared.js +13 -95
  229. package/dist/shown.d.ts +35 -0
  230. package/dist/shown.d.ts.map +1 -0
  231. package/dist/shown.js +313 -0
  232. package/dist/socket/admission.d.ts +7 -0
  233. package/dist/socket/admission.d.ts.map +1 -0
  234. package/dist/socket/admission.js +39 -0
  235. package/dist/socket/answers.d.ts +6 -0
  236. package/dist/socket/answers.d.ts.map +1 -0
  237. package/dist/socket/answers.js +20 -0
  238. package/dist/socket/lanes.d.ts +28 -0
  239. package/dist/socket/lanes.d.ts.map +1 -0
  240. package/dist/socket/lanes.js +103 -0
  241. package/dist/socket/reads.d.ts +10 -0
  242. package/dist/socket/reads.d.ts.map +1 -0
  243. package/dist/socket/reads.js +31 -0
  244. package/dist/socket/session.d.ts +38 -0
  245. package/dist/socket/session.d.ts.map +1 -0
  246. package/dist/socket/session.js +23 -0
  247. package/dist/socket.d.ts +67 -0
  248. package/dist/socket.d.ts.map +1 -0
  249. package/dist/socket.js +164 -0
  250. package/dist/source.d.ts +59 -0
  251. package/dist/source.d.ts.map +1 -0
  252. package/dist/source.js +93 -0
  253. package/dist/status.d.ts +0 -2
  254. package/dist/status.d.ts.map +1 -1
  255. package/dist/status.js +0 -6
  256. package/dist/store/installs.d.ts +30 -0
  257. package/dist/store/installs.d.ts.map +1 -0
  258. package/dist/store/installs.js +40 -0
  259. package/dist/store/readiness.d.ts +11 -0
  260. package/dist/store/readiness.d.ts.map +1 -0
  261. package/dist/store/readiness.js +68 -0
  262. package/dist/store/records.d.ts +224 -0
  263. package/dist/store/records.d.ts.map +1 -0
  264. package/dist/store/records.js +466 -0
  265. package/dist/store/room-held.d.ts +8 -0
  266. package/dist/store/room-held.d.ts.map +1 -0
  267. package/dist/store/room-held.js +17 -0
  268. package/dist/store/rooms-shown.d.ts +8 -0
  269. package/dist/store/rooms-shown.d.ts.map +1 -0
  270. package/dist/store/rooms-shown.js +13 -0
  271. package/dist/store/space.d.ts +11 -0
  272. package/dist/store/space.d.ts.map +1 -0
  273. package/dist/store/space.js +41 -0
  274. package/dist/store/watchers.d.ts +17 -0
  275. package/dist/store/watchers.d.ts.map +1 -0
  276. package/dist/store/watchers.js +56 -0
  277. package/dist/store/writes.d.ts +24 -0
  278. package/dist/store/writes.d.ts.map +1 -0
  279. package/dist/store/writes.js +125 -0
  280. package/dist/store.d.ts +124 -154
  281. package/dist/store.d.ts.map +1 -1
  282. package/dist/store.js +171 -379
  283. package/dist/stored.d.ts +56 -27
  284. package/dist/stored.d.ts.map +1 -1
  285. package/dist/stored.js +192 -68
  286. package/dist/surface.d.ts +91 -0
  287. package/dist/surface.d.ts.map +1 -0
  288. package/dist/surface.js +227 -0
  289. package/dist/sync.d.ts +19 -0
  290. package/dist/sync.d.ts.map +1 -0
  291. package/dist/sync.js +538 -0
  292. package/dist/tables.d.ts +102 -52
  293. package/dist/tables.d.ts.map +1 -1
  294. package/dist/tables.js +184 -272
  295. package/dist/tallies.d.ts +18 -0
  296. package/dist/tallies.d.ts.map +1 -0
  297. package/dist/tallies.js +128 -0
  298. package/dist/validation.d.ts.map +1 -1
  299. package/dist/validation.js +4 -10
  300. package/dist/wire.d.ts +62 -8
  301. package/dist/wire.d.ts.map +1 -1
  302. package/dist/wire.js +22 -4
  303. package/package.json +3 -2
  304. package/dist/attempt.d.ts +0 -16
  305. package/dist/attempt.d.ts.map +0 -1
  306. package/dist/attempt.js +0 -70
  307. package/dist/fence.d.ts +0 -6
  308. package/dist/fence.d.ts.map +0 -1
  309. package/dist/fence.js +0 -10
  310. package/dist/job.d.ts +0 -14
  311. package/dist/job.d.ts.map +0 -1
  312. package/dist/job.js +0 -28
  313. package/dist/log.d.ts +0 -5
  314. package/dist/log.d.ts.map +0 -1
  315. package/dist/log.js +0 -14
@@ -0,0 +1,302 @@
1
+ import { roomTarget, target } from '@agentshouse/mdmodel';
2
+ import { CATCHING_UP, holdsSubmission, resendConversations } from './conversation.js';
3
+ import { listingNow } from './listing.js';
4
+ import { locked, lockedRooms } from './locks.js';
5
+ import { scoped } from './models.js';
6
+ import { ABSENT_TARGET, failure, historyAnswer, LOCKED_UNREADABLE, lockedRoom, handedOutcome, UNANSWERED, undeclared, UNCERTAIN, UNREADABLE, } from './outcome.js';
7
+ import { refuse } from './refusal.js';
8
+ function operationOf(input) {
9
+ const operation = input?.operation_id;
10
+ return typeof operation === 'string' ? operation : null;
11
+ }
12
+ export async function readHistory(runtime, locator, path, query = {}) {
13
+ const { store, socket, presence } = runtime;
14
+ const { session } = socket;
15
+ if (socket.closed() || session.now().refusal !== null)
16
+ return UNCERTAIN;
17
+ await socket.firstDiscovery;
18
+ if (!session.now().roomsNamed)
19
+ return UNCERTAIN;
20
+ try {
21
+ await socket.authorize();
22
+ }
23
+ catch {
24
+ return UNCERTAIN;
25
+ }
26
+ const { closed, authorization, refusal } = session.now();
27
+ if (closed || authorization === undefined || refusal !== null)
28
+ return UNCERTAIN;
29
+ const since = presence.losses();
30
+ try {
31
+ const result = await socket.history(authorization, {
32
+ locator,
33
+ path,
34
+ ...(query.revision === undefined ? {} : { revision: query.revision }),
35
+ ...(query.pageToken === undefined ? {} : { pageToken: query.pageToken }),
36
+ });
37
+ if (presence.lostSince(locator, since))
38
+ return failure({ kind: 'room-not-readable', locator });
39
+ if (result.kind === 'scoped-refusal') {
40
+ const room = await store.record(result.locator);
41
+ if (room !== undefined)
42
+ await scoped(runtime, result, room.locator, room.declaration);
43
+ }
44
+ if (result.kind === 'revoked-authorization')
45
+ await refuse(runtime, 'revoked-authorization');
46
+ return historyAnswer(result);
47
+ }
48
+ catch {
49
+ return UNCERTAIN;
50
+ }
51
+ }
52
+ export async function located(runtime, room, path, destination) {
53
+ const crossing = roomTarget(destination);
54
+ const listing = await listingNow(runtime);
55
+ if (crossing === null) {
56
+ const named = target(path, destination);
57
+ return named === null || !listing.has(room) ? null : { room, path: named };
58
+ }
59
+ const held = [...listing.values()].find((listed) => listed.handle === crossing.handle);
60
+ return held === undefined ? null : { room: held.locator, path: crossing.path };
61
+ }
62
+ export async function resolveReference(runtime, room, path, destination) {
63
+ const { store } = runtime;
64
+ if (roomTarget(destination) === null && target(path, destination) === null) {
65
+ return ABSENT_TARGET;
66
+ }
67
+ const at = await located(runtime, room, path, destination);
68
+ if (at === null)
69
+ return UNREADABLE;
70
+ if (await locked(runtime, at.room))
71
+ return LOCKED_UNREADABLE;
72
+ const held = await store.record(at.room);
73
+ if (held !== undefined &&
74
+ (await (await store.open()).entries(held.key, 'visible', [at.path])).length > 0) {
75
+ return { kind: 'document', ...at };
76
+ }
77
+ const history = await readHistory(runtime, at.room, at.path);
78
+ if (history.kind === 'no-history' || history.kind === 'revision')
79
+ return ABSENT_TARGET;
80
+ if (history.kind !== 'history')
81
+ return history;
82
+ const [last] = history.revisions;
83
+ if (last === undefined)
84
+ return ABSENT_TARGET;
85
+ return history.deleted === true
86
+ ? { kind: 'deleted', ...at, revision: last }
87
+ : { kind: 'document', ...at };
88
+ }
89
+ async function declaredAction({ store }, name) {
90
+ for (const capability of (await (await store.open()).facts()).capabilities) {
91
+ for (const action of capability.actions ?? []) {
92
+ if (action.name === name)
93
+ return action;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ async function calledRooms(runtime, name, input) {
99
+ const member = (await declaredAction(runtime, name))?.room;
100
+ if (member === undefined || input === null || typeof input !== 'object')
101
+ return [];
102
+ const named = input[member];
103
+ return (Array.isArray(named) ? named : [named]).filter((room) => typeof room === 'string');
104
+ }
105
+ export async function invokeAction(runtime, name, input, { dispatching, attempt } = {}) {
106
+ const { store, socket, retries } = runtime;
107
+ const { session } = socket;
108
+ await socket.ready;
109
+ if (socket.closed() || session.now().refusal !== null) {
110
+ return handedOutcome(retries, attempt, UNANSWERED);
111
+ }
112
+ if ((await declaredAction(runtime, name)) === undefined)
113
+ return undeclared(name);
114
+ try {
115
+ await socket.authorize();
116
+ }
117
+ catch {
118
+ return handedOutcome(retries, attempt, UNANSWERED);
119
+ }
120
+ const { closed, authorization, refusal } = session.now();
121
+ if (closed || authorization === undefined || refusal !== null) {
122
+ return handedOutcome(retries, attempt, UNANSWERED);
123
+ }
124
+ await dispatching?.();
125
+ try {
126
+ const result = await socket.action(authorization, { name, input });
127
+ if (result.kind === 'scoped-refusal') {
128
+ const room = await store.record(result.locator);
129
+ if (room !== undefined)
130
+ await scoped(runtime, result, room.locator, room.declaration);
131
+ }
132
+ if (result.kind === 'revoked-authorization')
133
+ await refuse(runtime, 'revoked-authorization');
134
+ return handedOutcome(retries, attempt, result);
135
+ }
136
+ catch (error) {
137
+ return handedOutcome(retries, attempt, { kind: 'transport-uncertainty', failure: error });
138
+ }
139
+ }
140
+ export async function readConversationHistory(runtime, request) {
141
+ const { socket, retries } = runtime;
142
+ const caught = { step: 'conversations', instance: CATCHING_UP };
143
+ await socket.ready;
144
+ const stream = socket.conversations();
145
+ if (socket.closed() || socket.session.now().refusal !== null || stream?.history === undefined) {
146
+ return handedOutcome(retries, caught, UNANSWERED);
147
+ }
148
+ try {
149
+ const result = await stream.history(request);
150
+ if (result.kind === 'revoked-authorization')
151
+ await refuse(runtime, 'revoked-authorization');
152
+ return handedOutcome(retries, caught, result);
153
+ }
154
+ catch (error) {
155
+ return handedOutcome(retries, caught, { kind: 'transport-uncertainty', failure: error });
156
+ }
157
+ }
158
+ function unsettled(result) {
159
+ if (result.kind === 'action')
160
+ return false;
161
+ return result.retryable && (result.kind !== 'rejected' || result.reset === undefined);
162
+ }
163
+ function numberedCall(runtime, name, input, operation, dispatching) {
164
+ return invokeAction(runtime, name, input, {
165
+ dispatching,
166
+ attempt: { step: 'sending', instance: `action ${operation}` },
167
+ });
168
+ }
169
+ function keptSender(runtime, name, input, operation, resent = false) {
170
+ const { store, socket } = runtime;
171
+ const { lanes } = socket;
172
+ const dispatching = async () => (await store.open()).keepCall({ operation, name, input });
173
+ let waiting = [];
174
+ let last = UNCERTAIN;
175
+ let lost = resent;
176
+ const tell = (result) => {
177
+ last = result;
178
+ const told = waiting;
179
+ waiting = [];
180
+ for (const answer of told)
181
+ answer(result);
182
+ };
183
+ const sender = {
184
+ next: () => new Promise((answer) => waiting.push(answer)),
185
+ async send() {
186
+ let result;
187
+ try {
188
+ result = await numberedCall(runtime, name, input, operation, dispatching);
189
+ }
190
+ catch (error) {
191
+ tell(last);
192
+ throw error;
193
+ }
194
+ if (unsettled(result))
195
+ lost = true;
196
+ else {
197
+ await (await store.open()).dropCall(operation);
198
+ lanes.settle(operation, lost);
199
+ }
200
+ tell(result);
201
+ return result;
202
+ },
203
+ release() {
204
+ lanes.sent(operation, sender);
205
+ tell(last);
206
+ },
207
+ };
208
+ lanes.sending(operation, sender);
209
+ return sender;
210
+ }
211
+ async function recoveredAction(runtime, name, input, attempt) {
212
+ const { socket, recovery } = runtime;
213
+ const operation = operationOf(input);
214
+ if (operation === null)
215
+ return invokeAction(runtime, name, input, { attempt });
216
+ const held = socket.lanes.sender(operation);
217
+ if (held !== undefined)
218
+ return held.next();
219
+ const sender = keptSender(runtime, name, input, operation);
220
+ let first;
221
+ try {
222
+ first = await sender.send();
223
+ }
224
+ catch (error) {
225
+ sender.release();
226
+ throw error;
227
+ }
228
+ if (!unsettled(first)) {
229
+ sender.release();
230
+ return first;
231
+ }
232
+ void recovery
233
+ .attempt(`action ${operation}`, async () => {
234
+ if (socket.closed() || socket.session.now().refusal !== null)
235
+ return 'done';
236
+ if (!socket.isOpen())
237
+ return 'again';
238
+ return unsettled(await sender.send()) ? 'again' : 'done';
239
+ }, { again: true })
240
+ .finally(() => sender.release());
241
+ return first;
242
+ }
243
+ export async function called(runtime, name, input, attempt) {
244
+ await runtime.socket.ready;
245
+ const lockedNow = await lockedRooms(runtime);
246
+ const room = (await calledRooms(runtime, name, input)).find((one) => lockedNow.includes(one));
247
+ return room === undefined ? recoveredAction(runtime, name, input, attempt) : lockedRoom(room);
248
+ }
249
+ export async function answeredCall(runtime, operation) {
250
+ const { store, socket } = runtime;
251
+ const { lanes } = socket;
252
+ const held = () => lanes.sender(operation) !== undefined || lanes.unclaimed(operation);
253
+ if (!held()) {
254
+ const calls = await (await store.open()).calls();
255
+ const kept = calls.some((one) => one.operation === operation) ||
256
+ (await holdsSubmission(runtime.conversations, operation));
257
+ if (!held() && !kept)
258
+ return false;
259
+ }
260
+ await lanes.settled(operation);
261
+ return true;
262
+ }
263
+ export async function resendCalls(runtime, signal) {
264
+ const { store, socket } = runtime;
265
+ if (!socket.isOpen() || socket.closed() || socket.stopping())
266
+ return 'done';
267
+ const local = await store.open();
268
+ for (const held of await local.calls()) {
269
+ if (socket.lanes.sender(held.operation) !== undefined)
270
+ continue;
271
+ if (socket.closed() || signal.aborted)
272
+ return 'done';
273
+ const sender = keptSender(runtime, held.name, held.input, held.operation, true);
274
+ try {
275
+ if (unsettled(await sender.send()))
276
+ return 'again';
277
+ }
278
+ finally {
279
+ sender.release();
280
+ }
281
+ }
282
+ return 'done';
283
+ }
284
+ async function resendPass({ socket, conversations }, signal) {
285
+ if (!socket.continuing() || !socket.isOpen() || socket.stopping())
286
+ return 'done';
287
+ const reading = { complete: true, reachable: true };
288
+ try {
289
+ await resendConversations(conversations, reading);
290
+ }
291
+ catch {
292
+ reading.reachable = false;
293
+ }
294
+ if (signal.aborted)
295
+ return 'done';
296
+ return reading.reachable && reading.complete ? 'done' : 'again';
297
+ }
298
+ export function resendLater(runtime) {
299
+ if (!runtime.socket.isOpen())
300
+ return;
301
+ void runtime.recovery.attempt('resend', (signal) => resendPass(runtime, signal), { again: true });
302
+ }
package/dist/adapter.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { SavedFacts, TypedPath } from '@agentshouse/mdmodel';
1
+ import type { SavedFacts, TypedPath, VerifiedModel } from '@agentshouse/mdmodel';
2
+ import type { Operation, SessionState } from '@agentshouse/session-content';
2
3
  import type { ModelResult } from './model.js';
3
4
  export type { SavedFacts, TypedPath };
4
5
  import type { Open } from './open.js';
@@ -20,15 +21,18 @@ export type ReplicaAdmission = {
20
21
  admission: Open<'admitted' | 'unavailable'>;
21
22
  offline: Open<'locked' | 'open'>;
22
23
  };
23
- export type DiscoveredRoom = {
24
- name: string;
25
- locator: string;
26
- handle: string;
27
- roomVersion: string;
28
- operations: OperationScopes;
29
- replica: ReplicaAdmission;
30
- typedSelection?: TypedSelection;
31
- providerOwnedPaths: readonly string[];
24
+ export type RoomDeclaration = {
25
+ readonly name: string;
26
+ readonly handle: string;
27
+ readonly operations: OperationScopes;
28
+ readonly replica: ReplicaAdmission;
29
+ readonly typedSelection: TypedSelection | null;
30
+ readonly providerOwnedPaths: readonly string[];
31
+ readonly authoredPaths: readonly string[];
32
+ };
33
+ export type DiscoveredRoom = RoomDeclaration & {
34
+ readonly locator: string;
35
+ readonly roomVersion: string;
32
36
  };
33
37
  export type Capability = {
34
38
  name: string;
@@ -38,8 +42,6 @@ export type Capability = {
38
42
  export type ListedConversation = {
39
43
  conversation: string;
40
44
  agent: string;
41
- agentName: string;
42
- agentRetired: boolean;
43
45
  name: string;
44
46
  created: string;
45
47
  finished: string | null;
@@ -47,8 +49,9 @@ export type ListedConversation = {
47
49
  waiting: boolean;
48
50
  newest: string | null;
49
51
  processEnded: string | null;
52
+ subject: string | null;
50
53
  };
51
- export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete';
54
+ export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete' | 'conversations/take-out' | 'conversations/rename' | 'conversations/option/set' | 'conversations/retry' | 'agent-functions/decide';
52
55
  export type ConversationMessage = {
53
56
  identity: string;
54
57
  turn: string;
@@ -57,6 +60,7 @@ export type ConversationMessage = {
57
60
  };
58
61
  export type AcceptedMessage = ConversationMessage & {
59
62
  position: string;
63
+ change: string;
60
64
  };
61
65
  export type ConversationHistoryRequest = {
62
66
  conversations: readonly {
@@ -72,37 +76,10 @@ export type ConversationHistoryPage = {
72
76
  export type ConversationHistories = {
73
77
  histories: readonly ConversationHistoryPage[];
74
78
  };
75
- export type TurnContext = {
76
- used: number;
77
- window: number;
78
- };
79
79
  export type TurnOperation = {
80
80
  op: 'begin';
81
81
  at: string;
82
- } | {
83
- op: 'start';
84
- index: number;
85
- part: unknown;
86
- } | {
87
- op: 'append';
88
- index: number;
89
- text: string;
90
- } | {
91
- op: 'status';
92
- index: number;
93
- status: string;
94
- result: unknown;
95
- } | {
96
- op: 'count';
97
- index: number;
98
- count: number;
99
- } | {
100
- op: 'plan';
101
- index: number;
102
- entries: readonly unknown[];
103
- } | ({
104
- op: 'context';
105
- } & TurnContext);
82
+ } | Operation;
106
83
  export type ProcessCommand = {
107
84
  [field: string]: unknown;
108
85
  name: string;
@@ -139,10 +116,6 @@ export type SessionOption = (SessionOptionNaming & {
139
116
  type: 'boolean';
140
117
  currentValue: boolean;
141
118
  });
142
- export type RunningSubagent = {
143
- description: string;
144
- activity: string | null;
145
- };
146
119
  export type ConversationEvent = {
147
120
  kind: 'turn';
148
121
  conversation: string;
@@ -169,9 +142,9 @@ export type ConversationEvent = {
169
142
  conversation: string;
170
143
  step: string | null;
171
144
  } | {
172
- kind: 'subagents';
145
+ kind: 'state';
173
146
  conversation: string;
174
- subagents: readonly RunningSubagent[];
147
+ state: SessionState | null;
175
148
  } | {
176
149
  kind: 'link';
177
150
  conversation: string;
@@ -179,6 +152,7 @@ export type ConversationEvent = {
179
152
  } | {
180
153
  kind: 'deliveries';
181
154
  conversation: string;
155
+ waiting: readonly string[];
182
156
  unknown: readonly string[];
183
157
  } | {
184
158
  kind: 'accepted-message';
@@ -189,6 +163,7 @@ export type ConversationEvent = {
189
163
  conversation: string;
190
164
  } | {
191
165
  kind: 'list';
166
+ agents: readonly ListedAgent[];
192
167
  entries: readonly ListedConversation[];
193
168
  whole: boolean;
194
169
  more: boolean;
@@ -196,20 +171,68 @@ export type ConversationEvent = {
196
171
  } | {
197
172
  kind: 'listed';
198
173
  entry: ListedConversation;
174
+ } | {
175
+ kind: 'agent';
176
+ agent: ListedAgent;
199
177
  } | {
200
178
  kind: 'unlisted';
201
179
  conversation: string;
202
180
  };
181
+ export type AgentEnvironment = {
182
+ identity: string;
183
+ name: string;
184
+ state: 'online' | 'offline';
185
+ };
186
+ export type ListedOwner = {
187
+ readonly user: string;
188
+ readonly name: string;
189
+ };
190
+ export type ListedSpaceRef = {
191
+ readonly space_ref: string;
192
+ readonly name: string;
193
+ };
194
+ export type RoomListEntry = {
195
+ readonly room_ref: string;
196
+ readonly room_handle: string;
197
+ readonly name: string;
198
+ readonly level: 'search' | 'open' | 'keep';
199
+ readonly access: 'owner' | 'manage' | 'write' | 'read' | 'public';
200
+ readonly owner: ListedOwner;
201
+ readonly created: string;
202
+ readonly archived?: string;
203
+ readonly exportable?: true;
204
+ readonly space?: ListedSpaceRef;
205
+ };
206
+ export type SpaceListEntry = ListedSpaceRef & {
207
+ readonly owner: ListedOwner;
208
+ readonly created: string;
209
+ readonly manages?: true;
210
+ };
211
+ export type RoomList = {
212
+ readonly rooms: readonly RoomListEntry[];
213
+ readonly spaces: readonly SpaceListEntry[];
214
+ };
203
215
  export type ListedAgent = {
204
- agent: string;
216
+ id: string;
205
217
  name: string;
206
- retired: boolean;
218
+ revision: number;
219
+ environment: string;
220
+ environment_name: string;
221
+ environment_connected: boolean;
222
+ launch_directory: string;
223
+ cli: string;
224
+ model: string | null;
225
+ effort: string | null;
226
+ mode: string | null;
227
+ base_instructions: string;
228
+ in_telegram: boolean;
229
+ created: string;
230
+ retired_at: string | null;
207
231
  };
208
232
  export type ConversationStream = {
209
233
  replicate(conversations: readonly string[]): void;
210
234
  hold(cursor: string | null): void;
211
235
  observe(notify: (event: ConversationEvent) => void): () => void;
212
- agents?(): Promise<readonly ListedAgent[] | null>;
213
236
  history?(request: ConversationHistoryRequest): Promise<ActionResult>;
214
237
  };
215
238
  export type ActionDeclaration = {
@@ -239,9 +262,12 @@ export type Discovery = {
239
262
  providerLimits: readonly ProviderLimit[];
240
263
  retention: Retention;
241
264
  member?: Member;
265
+ timeZone?: string | null;
266
+ roomList?: RoomList;
242
267
  };
243
268
  export type TransportUncertainty = {
244
269
  kind: 'transport-uncertainty';
270
+ failure?: unknown;
245
271
  };
246
272
  export type RoomNotReadable = {
247
273
  kind: 'room-not-readable';
@@ -310,6 +336,7 @@ export type BootstrapPage = {
310
336
  facts: Readonly<Record<string, SavedFacts>>;
311
337
  revisions: Readonly<Record<string, string>>;
312
338
  fileIds?: Readonly<Record<string, string>>;
339
+ created?: Readonly<Record<string, string>>;
313
340
  changes: Readonly<Record<string, HeadChange>>;
314
341
  binaryFiles: Readonly<Record<string, BinaryFile>>;
315
342
  folders?: readonly string[];
@@ -337,6 +364,7 @@ export type RefreshPage = {
337
364
  facts: Readonly<Record<string, SavedFacts>>;
338
365
  revisions: Readonly<Record<string, string>>;
339
366
  fileIds?: Readonly<Record<string, string>>;
367
+ created?: Readonly<Record<string, string>>;
340
368
  changes: Readonly<Record<string, HeadChange>>;
341
369
  binaryFiles: Readonly<Record<string, BinaryFile>>;
342
370
  removals: readonly string[];
@@ -374,12 +402,9 @@ export type AcceptedRoom = {
374
402
  };
375
403
  export type MutationResult = (AcceptedRoom & {
376
404
  kind: 'accepted';
377
- author?: string;
378
- time?: string;
379
405
  destination?: AcceptedRoom;
380
406
  }) | (ProviderRefusal & {
381
407
  kind: 'conflicted';
382
- roomVersion?: string;
383
408
  affected: Readonly<Record<string, string>>;
384
409
  }) | (ProviderRefusal & {
385
410
  kind: 'rejected';
@@ -421,6 +446,10 @@ export type BinaryRequest = {
421
446
  path: string;
422
447
  revision: string;
423
448
  };
449
+ export type KeyedRequest = {
450
+ kind: 'key';
451
+ link: string;
452
+ };
424
453
  export type BinaryResult = {
425
454
  kind: 'binary';
426
455
  body: ReadableStream<Uint8Array>;
@@ -438,7 +467,7 @@ export type BinaryLinkResult = {
438
467
  kind: 'rejected';
439
468
  }) | AdapterFailure;
440
469
  export type AttachRequest = {
441
- locator: string;
470
+ locator?: string;
442
471
  name: string;
443
472
  mediaType: string;
444
473
  byteLength: number;
@@ -449,6 +478,9 @@ export type AttachResult = {
449
478
  kind: 'attached';
450
479
  path: string;
451
480
  revision: string;
481
+ } | {
482
+ kind: 'linked';
483
+ link: string;
452
484
  } | (ProviderRefusal & {
453
485
  kind: 'rejected';
454
486
  }) | AdapterFailure;
@@ -466,6 +498,7 @@ export type ActionResult = {
466
498
  at?: RoomVersionAt;
467
499
  } | (ProviderRefusal & {
468
500
  kind: 'rejected';
501
+ reset?: string;
469
502
  }) | AdapterFailure;
470
503
  export type SearchHit = {
471
504
  room: string;
@@ -499,6 +532,10 @@ export type AuthorityChange = {
499
532
  rooms: readonly DiscoveredRoom[];
500
533
  left: readonly string[];
501
534
  member?: Member;
535
+ timeZone?: string | null;
536
+ roomList?: RoomList & {
537
+ readonly left: readonly string[];
538
+ };
502
539
  };
503
540
  export type RoomStreamEvent = {
504
541
  kind: 'opened';
@@ -513,16 +550,21 @@ export type RoomStreamEvent = {
513
550
  } | {
514
551
  kind: 'caught-up';
515
552
  expired: readonly string[];
553
+ } | {
554
+ kind: 'reported';
516
555
  } | AuthorityChange | RoomChange;
517
556
  export type RoomStream = {
518
557
  hold(rooms: readonly HeldRoom[]): void;
519
558
  observe(notify: (event: RoomStreamEvent) => void): () => void;
520
559
  };
560
+ export type PathRule = (path: string) => boolean;
521
561
  export type Adapter = {
522
562
  readonly localSaves?: true;
523
- readonly roomTypes?: string;
524
- readonly nameableRoomTypes?: readonly string[];
563
+ readonly roomTypes?: VerifiedModel;
525
564
  readonly typedPaths?: readonly TypedPath[];
565
+ readonly pathRule?: PathRule;
566
+ readonly unkeptReads?: readonly string[];
567
+ readonly leadingReads?: readonly string[];
526
568
  authorize(): Promise<Authorization>;
527
569
  discover?(authorization: Authorization): Promise<DiscoverResult>;
528
570
  bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
@@ -530,7 +572,7 @@ export type Adapter = {
530
572
  mutate(authorization: Authorization, request: MutationRequest, keep: (upload: unknown) => Promise<void>): Promise<MutationResult>;
531
573
  history(authorization: Authorization, request: HistoryRequest): Promise<HistoryResult>;
532
574
  binary(authorization: Authorization, request: BinaryRequest): Promise<BinaryResult>;
533
- link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
575
+ link(authorization: Authorization, request: BinaryRequest | KeyedRequest): Promise<BinaryLinkResult>;
534
576
  attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
535
577
  action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
536
578
  search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;