@agentshouse/mdruntime 0.1.0-ce41fec66d91b → 0.1.0-ce46f015571d6

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 (308) hide show
  1. package/README.md +10 -10
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +318 -0
  5. package/dist/act-lanes.d.ts +29 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +177 -0
  8. package/dist/actions.d.ts +25 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +261 -0
  11. package/dist/adapter.d.ts +71 -69
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +21 -56
  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 +5 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +13 -0
  33. package/dist/client.d.ts +25 -14
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +32 -14
  36. package/dist/collection.d.ts +23 -4
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +12 -2
  39. package/dist/compile.d.ts +6 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +240 -315
  42. package/dist/connection.d.ts +5 -141
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +110 -5057
  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 +138 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +249 -0
  51. package/dist/conversation-row.d.ts +33 -0
  52. package/dist/conversation-row.d.ts.map +1 -0
  53. package/dist/conversation-row.js +53 -0
  54. package/dist/conversation.d.ts +54 -45
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +930 -899
  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 +153 -0
  63. package/dist/durability.d.ts +18 -0
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/entry.d.ts +2 -2
  66. package/dist/entry.d.ts.map +1 -1
  67. package/dist/entry.js +17 -7
  68. package/dist/expectation.d.ts +26 -13
  69. package/dist/expectation.d.ts.map +1 -1
  70. package/dist/expectation.js +72 -19
  71. package/dist/failure.d.ts +3 -0
  72. package/dist/failure.d.ts.map +1 -1
  73. package/dist/failure.js +6 -0
  74. package/dist/figures.d.ts +49 -0
  75. package/dist/figures.d.ts.map +1 -0
  76. package/dist/figures.js +197 -0
  77. package/dist/holdings.d.ts +29 -0
  78. package/dist/holdings.d.ts.map +1 -0
  79. package/dist/holdings.js +95 -0
  80. package/dist/host.d.ts +20 -6
  81. package/dist/host.d.ts.map +1 -1
  82. package/dist/host.js +61 -30
  83. package/dist/identity.d.ts +0 -1
  84. package/dist/identity.d.ts.map +1 -1
  85. package/dist/identity.js +0 -3
  86. package/dist/index.d.ts +31 -10
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +13 -3
  89. package/dist/install.d.ts +54 -0
  90. package/dist/install.d.ts.map +1 -0
  91. package/dist/install.js +539 -0
  92. package/dist/lifecycle.d.ts +7 -0
  93. package/dist/lifecycle.d.ts.map +1 -0
  94. package/dist/lifecycle.js +279 -0
  95. package/dist/listing.d.ts +48 -0
  96. package/dist/listing.d.ts.map +1 -0
  97. package/dist/listing.js +139 -0
  98. package/dist/live.d.ts +5 -4
  99. package/dist/live.d.ts.map +1 -1
  100. package/dist/live.js +63 -21
  101. package/dist/locks.d.ts +7 -0
  102. package/dist/locks.d.ts.map +1 -0
  103. package/dist/locks.js +33 -0
  104. package/dist/log.d.ts +1 -0
  105. package/dist/log.d.ts.map +1 -1
  106. package/dist/lost.d.ts +5 -0
  107. package/dist/lost.d.ts.map +1 -0
  108. package/dist/lost.js +50 -0
  109. package/dist/media.d.ts +1 -1
  110. package/dist/media.d.ts.map +1 -1
  111. package/dist/media.js +4 -4
  112. package/dist/memory.d.ts +8 -2
  113. package/dist/memory.d.ts.map +1 -1
  114. package/dist/memory.js +83 -26
  115. package/dist/messages.d.ts +24 -3
  116. package/dist/messages.d.ts.map +1 -1
  117. package/dist/messages.js +92 -32
  118. package/dist/model.d.ts +2 -10
  119. package/dist/model.d.ts.map +1 -1
  120. package/dist/model.js +0 -14
  121. package/dist/models.d.ts +10 -0
  122. package/dist/models.d.ts.map +1 -0
  123. package/dist/models.js +156 -0
  124. package/dist/observation.d.ts +2 -2
  125. package/dist/observation.d.ts.map +1 -1
  126. package/dist/observation.js +14 -14
  127. package/dist/opened.d.ts +1 -1
  128. package/dist/opened.d.ts.map +1 -1
  129. package/dist/opened.js +5 -5
  130. package/dist/opening.d.ts +4 -0
  131. package/dist/opening.d.ts.map +1 -0
  132. package/dist/opening.js +59 -0
  133. package/dist/outcome.d.ts +7 -1
  134. package/dist/outcome.d.ts.map +1 -1
  135. package/dist/outcome.js +18 -0
  136. package/dist/overlay.d.ts +3 -1
  137. package/dist/overlay.d.ts.map +1 -1
  138. package/dist/overlay.js +43 -21
  139. package/dist/page-metadata.d.ts +8 -0
  140. package/dist/page-metadata.d.ts.map +1 -0
  141. package/dist/page-metadata.js +19 -0
  142. package/dist/parts.d.ts +11 -0
  143. package/dist/parts.d.ts.map +1 -0
  144. package/dist/parts.js +21 -0
  145. package/dist/paths.d.ts +1 -0
  146. package/dist/paths.d.ts.map +1 -1
  147. package/dist/paths.js +22 -0
  148. package/dist/preparation.d.ts +20 -0
  149. package/dist/preparation.d.ts.map +1 -0
  150. package/dist/preparation.js +233 -0
  151. package/dist/presence.d.ts +52 -0
  152. package/dist/presence.d.ts.map +1 -0
  153. package/dist/presence.js +220 -0
  154. package/dist/queries.d.ts +16 -0
  155. package/dist/queries.d.ts.map +1 -0
  156. package/dist/queries.js +270 -0
  157. package/dist/query.d.ts +13 -209
  158. package/dist/query.d.ts.map +1 -1
  159. package/dist/query.js +3 -505
  160. package/dist/questions.d.ts +34 -0
  161. package/dist/questions.d.ts.map +1 -0
  162. package/dist/questions.js +122 -0
  163. package/dist/queue.d.ts +40 -0
  164. package/dist/queue.d.ts.map +1 -0
  165. package/dist/queue.js +455 -0
  166. package/dist/reach.d.ts +14 -12
  167. package/dist/reach.d.ts.map +1 -1
  168. package/dist/reach.js +193 -121
  169. package/dist/react.d.ts +15 -2
  170. package/dist/react.d.ts.map +1 -1
  171. package/dist/react.js +33 -1
  172. package/dist/read.d.ts +7 -0
  173. package/dist/read.d.ts.map +1 -0
  174. package/dist/read.js +17 -0
  175. package/dist/readiness.d.ts +0 -3
  176. package/dist/readiness.d.ts.map +1 -1
  177. package/dist/reads.d.ts +39 -0
  178. package/dist/reads.d.ts.map +1 -0
  179. package/dist/reads.js +178 -0
  180. package/dist/recovery.d.ts +3 -1
  181. package/dist/recovery.d.ts.map +1 -1
  182. package/dist/recovery.js +38 -8
  183. package/dist/refresh.d.ts +1 -1
  184. package/dist/refresh.d.ts.map +1 -1
  185. package/dist/refresh.js +9 -2
  186. package/dist/refusal.d.ts +5 -0
  187. package/dist/refusal.d.ts.map +1 -0
  188. package/dist/refusal.js +57 -0
  189. package/dist/replica.d.ts +11 -16
  190. package/dist/replica.d.ts.map +1 -1
  191. package/dist/replica.js +64 -30
  192. package/dist/retried.d.ts +30 -0
  193. package/dist/retried.d.ts.map +1 -0
  194. package/dist/retried.js +72 -0
  195. package/dist/room-draft.d.ts +7 -8
  196. package/dist/room-draft.d.ts.map +1 -1
  197. package/dist/room-draft.js +100 -103
  198. package/dist/room-drafts.d.ts +24 -0
  199. package/dist/room-drafts.d.ts.map +1 -0
  200. package/dist/room-drafts.js +217 -0
  201. package/dist/rows.d.ts +14 -21
  202. package/dist/rows.d.ts.map +1 -1
  203. package/dist/rows.js +49 -186
  204. package/dist/runtime.d.ts +36 -0
  205. package/dist/runtime.d.ts.map +1 -0
  206. package/dist/runtime.js +1 -0
  207. package/dist/save.d.ts +41 -86
  208. package/dist/save.d.ts.map +1 -1
  209. package/dist/save.js +239 -116
  210. package/dist/saves.d.ts +32 -0
  211. package/dist/saves.d.ts.map +1 -0
  212. package/dist/saves.js +413 -0
  213. package/dist/search.d.ts +12 -63
  214. package/dist/search.d.ts.map +1 -1
  215. package/dist/search.js +9 -52
  216. package/dist/seed.d.ts +11 -2
  217. package/dist/seed.d.ts.map +1 -1
  218. package/dist/seed.js +71 -1
  219. package/dist/shared.d.ts +1 -6
  220. package/dist/shared.d.ts.map +1 -1
  221. package/dist/shared.js +13 -95
  222. package/dist/shown.d.ts +32 -0
  223. package/dist/shown.d.ts.map +1 -0
  224. package/dist/shown.js +290 -0
  225. package/dist/socket/admission.d.ts +7 -0
  226. package/dist/socket/admission.d.ts.map +1 -0
  227. package/dist/socket/admission.js +39 -0
  228. package/dist/socket/answers.d.ts +6 -0
  229. package/dist/socket/answers.d.ts.map +1 -0
  230. package/dist/socket/answers.js +20 -0
  231. package/dist/socket/lanes.d.ts +21 -0
  232. package/dist/socket/lanes.d.ts.map +1 -0
  233. package/dist/socket/lanes.js +80 -0
  234. package/dist/socket/reads.d.ts +10 -0
  235. package/dist/socket/reads.d.ts.map +1 -0
  236. package/dist/socket/reads.js +31 -0
  237. package/dist/socket/session.d.ts +38 -0
  238. package/dist/socket/session.d.ts.map +1 -0
  239. package/dist/socket/session.js +23 -0
  240. package/dist/socket.d.ts +68 -0
  241. package/dist/socket.d.ts.map +1 -0
  242. package/dist/socket.js +171 -0
  243. package/dist/source.d.ts +61 -0
  244. package/dist/source.d.ts.map +1 -0
  245. package/dist/source.js +82 -0
  246. package/dist/status.d.ts +0 -2
  247. package/dist/status.d.ts.map +1 -1
  248. package/dist/status.js +0 -6
  249. package/dist/store/installs.d.ts +30 -0
  250. package/dist/store/installs.d.ts.map +1 -0
  251. package/dist/store/installs.js +34 -0
  252. package/dist/store/readiness.d.ts +10 -0
  253. package/dist/store/readiness.d.ts.map +1 -0
  254. package/dist/store/readiness.js +52 -0
  255. package/dist/store/records.d.ts +212 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +430 -0
  258. package/dist/store/room-held.d.ts +8 -0
  259. package/dist/store/room-held.d.ts.map +1 -0
  260. package/dist/store/room-held.js +17 -0
  261. package/dist/store/space.d.ts +11 -0
  262. package/dist/store/space.d.ts.map +1 -0
  263. package/dist/store/space.js +41 -0
  264. package/dist/store/watchers.d.ts +17 -0
  265. package/dist/store/watchers.d.ts.map +1 -0
  266. package/dist/store/watchers.js +56 -0
  267. package/dist/store/writes.d.ts +24 -0
  268. package/dist/store/writes.d.ts.map +1 -0
  269. package/dist/store/writes.js +125 -0
  270. package/dist/store.d.ts +112 -145
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +167 -365
  273. package/dist/stored.d.ts +59 -33
  274. package/dist/stored.d.ts.map +1 -1
  275. package/dist/stored.js +279 -190
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +223 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +540 -0
  282. package/dist/tables.d.ts +116 -29
  283. package/dist/tables.d.ts.map +1 -1
  284. package/dist/tables.js +213 -54
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +129 -0
  288. package/dist/validation.d.ts.map +1 -1
  289. package/dist/validation.js +8 -5
  290. package/dist/windows.d.ts +1 -12
  291. package/dist/windows.d.ts.map +1 -1
  292. package/dist/windows.js +2 -75
  293. package/dist/wire.d.ts +57 -5
  294. package/dist/wire.d.ts.map +1 -1
  295. package/dist/wire.js +19 -3
  296. package/package.json +3 -2
  297. package/dist/attempt.d.ts +0 -16
  298. package/dist/attempt.d.ts.map +0 -1
  299. package/dist/attempt.js +0 -70
  300. package/dist/fence.d.ts +0 -6
  301. package/dist/fence.d.ts.map +0 -1
  302. package/dist/fence.js +0 -10
  303. package/dist/fulltext.d.ts +0 -27
  304. package/dist/fulltext.d.ts.map +0 -1
  305. package/dist/fulltext.js +0 -370
  306. package/dist/words.d.ts +0 -19
  307. package/dist/words.d.ts.map +0 -1
  308. package/dist/words.js +0 -156
@@ -0,0 +1,197 @@
1
+ import { instantKey } from '@agentshouse/mdmodel';
2
+ export const HOUSE_DIRECTORY = 'house';
3
+ export const ROOM_TOTALS = {
4
+ outside: [HOUSE_DIRECTORY],
5
+ groupBy: ['room'],
6
+ select: { size: true },
7
+ };
8
+ // Today's Last 24 hours is the day that ends as the read answers.
9
+ export const FIGURES_DAY_MS = 86_400_000;
10
+ // An install or a catch-up commits many times a second, so the figures answer again once changes rest this long, never per commit.
11
+ const SETTLED_MS = 1_000;
12
+ // Changes that never rest, such as an Agent writing all afternoon, still reach the figures this long after the first of them.
13
+ const LONGEST_UNSETTLED_MS = 5_000;
14
+ function dayOf(tally, since) {
15
+ const after = (at) => at !== null && at >= since;
16
+ return {
17
+ created: tally.documentTimes.filter(([created]) => after(created)).length,
18
+ changed: tally.documentTimes.filter(([created, changed]) => !after(created) && after(changed))
19
+ .length,
20
+ chats: tally.chatTimes.filter(after).length,
21
+ messages: tally.messageTimes.filter(after).length,
22
+ };
23
+ }
24
+ function figuresOf(rooms, held, since) {
25
+ return {
26
+ rooms: rooms.map(({ locator }) => {
27
+ const tally = held.rooms.get(locator);
28
+ return {
29
+ room: locator,
30
+ day: dayOf(tally, since),
31
+ total: { documents: tally.documents, files: tally.files },
32
+ };
33
+ }),
34
+ agentMessages: [...held.said.values()].reduce((sum, said) => sum + said.filter((at) => at >= since).length, 0),
35
+ };
36
+ }
37
+ function unheld() {
38
+ return {
39
+ rooms: new Map(),
40
+ said: new Map(),
41
+ staleRooms: new Set(),
42
+ staleConversations: new Set(),
43
+ everyConversation: true,
44
+ };
45
+ }
46
+ export function createFigures(sources) {
47
+ const listeners = new Map();
48
+ const answered = new Set();
49
+ let held = unheld();
50
+ let shown = null;
51
+ let running = false;
52
+ let again = false;
53
+ let quiet = null;
54
+ let longest = null;
55
+ let closed = false;
56
+ function unscheduled() {
57
+ if (quiet !== null)
58
+ clearTimeout(quiet);
59
+ if (longest !== null)
60
+ clearTimeout(longest);
61
+ quiet = null;
62
+ longest = null;
63
+ }
64
+ function deliver(answer) {
65
+ const text = JSON.stringify(answer);
66
+ const changed = text !== shown;
67
+ shown = text;
68
+ for (const listener of listeners.keys()) {
69
+ if (changed || !answered.has(listener))
70
+ listener(structuredClone(answer));
71
+ answered.add(listener);
72
+ }
73
+ }
74
+ async function tallied(rooms, since) {
75
+ for (const locator of held.rooms.keys()) {
76
+ if (!rooms.some((room) => room.locator === locator))
77
+ held.rooms.delete(locator);
78
+ }
79
+ const asked = rooms.filter(({ locator, key }) => held.staleRooms.has(locator) || held.rooms.get(locator)?.key !== key);
80
+ for (const { locator } of asked)
81
+ held.staleRooms.delete(locator);
82
+ const every = held.everyConversation;
83
+ const conversations = every ? null : [...held.staleConversations];
84
+ held.everyConversation = false;
85
+ held.staleConversations.clear();
86
+ const kept = held;
87
+ const [roomTallies, said] = await Promise.all([
88
+ asked.length === 0 ? [] : sources.rooms(asked, since),
89
+ conversations?.length === 0 ? [] : sources.conversations(conversations, since),
90
+ ]);
91
+ if (kept !== held)
92
+ return false;
93
+ for (const tally of roomTallies) {
94
+ const room = asked.find(({ key }) => key === tally.key);
95
+ if (room !== undefined)
96
+ held.rooms.set(room.locator, tally);
97
+ }
98
+ if (every)
99
+ held.said.clear();
100
+ for (const { conversation, said: times } of said) {
101
+ if (times.length === 0)
102
+ held.said.delete(conversation);
103
+ else
104
+ held.said.set(conversation, times);
105
+ }
106
+ return true;
107
+ }
108
+ async function answer() {
109
+ const window = new Date(Date.now() - FIGURES_DAY_MS).toISOString();
110
+ const cover = await sources.cover();
111
+ if ('pending' in cover)
112
+ return cover;
113
+ if (!(await tallied(cover.rooms, window)))
114
+ return null;
115
+ return figuresOf(cover.rooms, held, instantKey(window));
116
+ }
117
+ async function run() {
118
+ if (running) {
119
+ again = true;
120
+ return;
121
+ }
122
+ running = true;
123
+ try {
124
+ do {
125
+ again = false;
126
+ const result = await answer();
127
+ if (closed || listeners.size === 0)
128
+ return;
129
+ if (result === null)
130
+ again = true;
131
+ else
132
+ deliver(result);
133
+ } while (again && !closed && listeners.size > 0);
134
+ }
135
+ catch (error) {
136
+ for (const [listener, failed] of listeners) {
137
+ if (!answered.has(listener))
138
+ failed(error);
139
+ }
140
+ }
141
+ finally {
142
+ running = false;
143
+ }
144
+ }
145
+ function stop(listener) {
146
+ return () => {
147
+ listeners.delete(listener);
148
+ answered.delete(listener);
149
+ if (listeners.size > 0)
150
+ return;
151
+ unscheduled();
152
+ held = unheld();
153
+ shown = null;
154
+ };
155
+ }
156
+ function settle() {
157
+ if (closed || listeners.size === 0)
158
+ return;
159
+ const now = () => {
160
+ unscheduled();
161
+ void run();
162
+ };
163
+ if (quiet !== null)
164
+ clearTimeout(quiet);
165
+ quiet = setTimeout(now, SETTLED_MS);
166
+ longest ??= setTimeout(now, LONGEST_UNSETTLED_MS);
167
+ }
168
+ return {
169
+ watch(listener, failed) {
170
+ listeners.set(listener, failed);
171
+ void run();
172
+ return stop(listener);
173
+ },
174
+ touched(set) {
175
+ if (listeners.size === 0)
176
+ return;
177
+ for (const { locator } of set.documents)
178
+ held.staleRooms.add(locator);
179
+ for (const locator of set.rooms)
180
+ held.staleRooms.add(locator);
181
+ for (const conversation of set.conversations)
182
+ held.staleConversations.add(conversation);
183
+ if (set.documents.length + set.rooms.length + set.conversations.length > 0)
184
+ settle();
185
+ },
186
+ recover() {
187
+ if (listeners.size > 0)
188
+ settle();
189
+ },
190
+ close() {
191
+ closed = true;
192
+ unscheduled();
193
+ listeners.clear();
194
+ answered.clear();
195
+ },
196
+ };
197
+ }
@@ -0,0 +1,29 @@
1
+ import type { AppCode } from './durability.js';
2
+ import type { GroupTotal, PendingResult } from './query.js';
3
+ import type { Deliver, Fail } from './reach.js';
4
+ import type { Runtime } from './runtime.js';
5
+ import type { OpenedRoom } from './tables.js';
6
+ export type RoomDocuments = {
7
+ readonly room: string;
8
+ readonly documents: GroupTotal;
9
+ };
10
+ export type HeldApp = ({
11
+ readonly app: string;
12
+ readonly state: 'measured';
13
+ } & AppCode) | {
14
+ readonly app: string;
15
+ readonly state: 'asking' | 'unknown';
16
+ };
17
+ export type Holdings = {
18
+ readonly rooms: readonly RoomDocuments[] | PendingResult;
19
+ readonly opened: GroupTotal & {
20
+ readonly rooms: readonly OpenedRoom[];
21
+ };
22
+ readonly apps: readonly HeldApp[];
23
+ readonly house: number | null;
24
+ readonly total: number | null;
25
+ readonly cleanUp: number | null;
26
+ };
27
+ export declare const CLEANED_TOPIC = "cleaned";
28
+ export declare function watchHoldings({ store, figures, shell }: Runtime, deliver: Deliver, fail: Fail): () => void;
29
+ //# sourceMappingURL=holdings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holdings.d.ts","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,OAAO,GACf,CAAC;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,GAChE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,CAAC;IACxE,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAIF,eAAO,MAAM,aAAa,YAAY,CAAC;AA6CvC,wBAAgB,aAAa,CAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CA4DZ"}
@@ -0,0 +1,95 @@
1
+ const NO_CODE = { house: 0, apps: [] };
2
+ export const CLEANED_TOPIC = 'cleaned';
3
+ function heldRooms(figures) {
4
+ if ('pending' in figures)
5
+ return figures;
6
+ return figures.rooms.map(({ room, total }) => ({ room, documents: total.documents }));
7
+ }
8
+ function heldApp(app, measured) {
9
+ if (!measured.has(app))
10
+ return { app, state: 'asking' };
11
+ const code = measured.get(app) ?? null;
12
+ return code === null ? { app, state: 'unknown' } : { app, state: 'measured', ...code };
13
+ }
14
+ function summed(values) {
15
+ return values.reduce((sum, value) => sum + value, 0);
16
+ }
17
+ function holdingsOf(rooms, opened, code, measured) {
18
+ const apps = code.apps.map((app) => heldApp(app, measured));
19
+ const known = apps.flatMap((app) => (app.state === 'measured' ? [app] : []));
20
+ const whole = known.length === apps.length;
21
+ const files = {
22
+ count: summed(opened.rooms.map(({ count }) => count)),
23
+ size: summed(opened.rooms.map(({ size }) => size)),
24
+ };
25
+ const documents = 'pending' in rooms ? null : summed(rooms.map(({ documents: d }) => d.size));
26
+ const older = whole ? summed(known.map((app) => app.older)) : null;
27
+ return {
28
+ rooms,
29
+ opened: { ...files, rooms: opened.rooms },
30
+ apps,
31
+ house: code.house,
32
+ total: documents === null || code.house === null || older === null
33
+ ? null
34
+ : documents + files.size + summed(known.map((app) => app.running)) + older + code.house,
35
+ cleanUp: older === null ? null : opened.cleanable + older,
36
+ };
37
+ }
38
+ export function watchHoldings({ store, figures, shell }, deliver, fail) {
39
+ let open = true;
40
+ let asked = 0;
41
+ let rooms = null;
42
+ let opened = null;
43
+ let code = null;
44
+ let measured = new Map();
45
+ function told() {
46
+ if (open && rooms !== null && opened !== null && code !== null) {
47
+ deliver(holdingsOf(rooms, opened, code, measured));
48
+ }
49
+ }
50
+ function failed(error) {
51
+ if (!open)
52
+ return;
53
+ stop();
54
+ fail(error);
55
+ }
56
+ function ask() {
57
+ asked += 1;
58
+ const at = asked;
59
+ const current = () => open && at === asked;
60
+ opened = null;
61
+ code = null;
62
+ measured = new Map();
63
+ store.ask({ kind: 'opened.held' }).then((held) => {
64
+ if (!current())
65
+ return;
66
+ opened = held;
67
+ told();
68
+ }, failed);
69
+ const answers = measured;
70
+ const measuring = shell.measure?.((app, answer) => {
71
+ if (!current())
72
+ return;
73
+ answers.set(app, answer);
74
+ told();
75
+ }) ?? Promise.resolve(NO_CODE);
76
+ measuring.then((held) => {
77
+ if (!current())
78
+ return;
79
+ code = held;
80
+ told();
81
+ }, failed);
82
+ }
83
+ const stopFigures = figures.watch((answer) => {
84
+ rooms = heldRooms(answer);
85
+ told();
86
+ }, failed);
87
+ const cleaned = store.watch(CLEANED_TOPIC, ask);
88
+ function stop() {
89
+ open = false;
90
+ stopFigures();
91
+ cleaned.stop();
92
+ }
93
+ ask();
94
+ return stop;
95
+ }
package/dist/host.d.ts CHANGED
@@ -1,21 +1,34 @@
1
1
  import { type MdRuntimeOptions } from './connection.js';
2
2
  import type { PortReach } from './reach.js';
3
- import type { CodeAvailability, Persistence, Readiness, SearchObligation, Space } from './readiness.js';
3
+ import type { CodeAvailability, Persistence, Readiness } from './readiness.js';
4
4
  import type { EntrySeed } from './seed.js';
5
+ import { type CallResult } from './outcome.js';
5
6
  import { type RuntimePort } from './wire.js';
6
7
  export type MdRuntimeHostOptions = MdRuntimeOptions & {
7
8
  deploymentFacts?: unknown;
8
9
  };
10
+ export type Admitted = {
11
+ readonly admitted: unknown;
12
+ } | {
13
+ readonly refused: CallResult;
14
+ };
15
+ export type ActionAdmission = (name: string, input: unknown) => Promise<Admitted>;
16
+ export type AttachOptions = {
17
+ readonly app: string;
18
+ readonly release?: string;
19
+ readonly reach?: PortReach;
20
+ readonly admission?: ActionAdmission;
21
+ readonly code?: CodeAvailability;
22
+ };
9
23
  export type AttachedPort = {
10
24
  detach(): void;
11
25
  narrow(reach: PortReach): void;
12
26
  readiness(deliver: (readiness: Readiness) => void): () => void;
13
27
  answered(queries: readonly unknown[], done: () => void): void;
14
- code(code: CodeAvailability, space: Space | null): void;
15
- search(search: SearchObligation): void;
16
28
  };
17
29
  export type MdRuntimeHost = {
18
- attach(port: RuntimePort, app: string, release?: string, reach?: PortReach, code?: CodeAvailability, search?: SearchObligation): AttachedPort;
30
+ attach(port: RuntimePort, options: AttachOptions): AttachedPort;
31
+ present(app: string, members: Readonly<Record<string, unknown>>): Promise<void>;
19
32
  seed(entry: EntrySeed): void;
20
33
  persisted(answer: Persistence): void;
21
34
  endAuthorization(holder?: string): Promise<void>;
@@ -24,7 +37,8 @@ export type MdRuntimeHost = {
24
37
  export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
25
38
  export { entrySeedOf, type EntrySeed } from './seed.js';
26
39
  export type { PortReach, ReachedDocument } from './reach.js';
27
- export type { CodeAvailability, Persistence, SearchObligation, Space } from './readiness.js';
40
+ export type { CodeAvailability, Persistence, Space } from './readiness.js';
28
41
  export { createRecovery, retryDelay, type Attempt, type Attempted, type AttemptOptions, type Recovery, type RecoveryOptions, } from './recovery.js';
29
- export type { RuntimePort } from './wire.js';
42
+ export { undeclared } from './outcome.js';
43
+ export { wireAnswer, wireRequest, type RuntimePort, type WireAnswer, type WireRequest, } from './wire.js';
30
44
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EAItB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACN,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAGL,KAAK,WAAW,EAOjB,MAAM,WAAW,CAAC;AAInB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACxD,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE,gBAAgB,GACxB,YAAY,CAAC;IAChB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAoIF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoL3E;AAED,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,UAAU,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
package/dist/host.js CHANGED
@@ -1,8 +1,9 @@
1
- import { composeRuntime, } from './connection.js';
2
- import { queryKey } from './query.js';
1
+ import { queryKey } from '@agentshouse/mdmodel';
2
+ import { composeRuntime } from './connection.js';
3
3
  import { untilAnswered } from './recovery.js';
4
4
  import { described } from './failure.js';
5
- import { AUTHORIZATION_ENDED, request, WIRE, } from './wire.js';
5
+ import { answeredResult } from './outcome.js';
6
+ import { AUTHORIZATION_ENDED, WIRE, wireRequest, } from './wire.js';
6
7
  const NARROWED = new Set(['within', 'whole']);
7
8
  function answered(md, app, writtenBy, member, input) {
8
9
  switch (member) {
@@ -40,6 +41,12 @@ function answered(md, app, writtenBy, member, input) {
40
41
  return md.log();
41
42
  case 'cleanUp':
42
43
  return md.cleanUp();
44
+ case 'unsent':
45
+ return md.unsent();
46
+ case 'reset':
47
+ return md.reset();
48
+ case 'readAgain':
49
+ return md.readAgain();
43
50
  case 'persistence':
44
51
  return md.persistence();
45
52
  case 'retry':
@@ -69,13 +76,31 @@ function answered(md, app, writtenBy, member, input) {
69
76
  case 'conversation.send':
70
77
  return md.conversation.send(input[0], input[1], input[2]);
71
78
  case 'conversation.answer':
72
- return md.conversation.answer(input[0], input[1]);
79
+ return md.conversation.answer(input[0], input[1], input[2]);
73
80
  case 'conversation.interrupt':
74
- return md.conversation.interrupt(input[0]);
81
+ return md.conversation.interrupt(input[0], input[1]);
75
82
  case 'conversation.kill':
76
- return md.conversation.kill(input[0]);
83
+ return md.conversation.kill(input[0], input[1]);
77
84
  case 'conversation.delete':
78
- return md.conversation.delete(input[0]);
85
+ return md.conversation.delete(input[0], input[1]);
86
+ case 'conversation.takeOut':
87
+ return md.conversation.takeOut(input[0], input[1], input[2]);
88
+ case 'conversation.decide':
89
+ return md.conversation.decide(input[0], input[1], input[2]);
90
+ case 'conversation.rename':
91
+ return md.conversation.rename(input[0], input[1], input[2]);
92
+ case 'conversation.option':
93
+ return md.conversation.option(input[0], input[1], input[2], input[3]);
94
+ case 'conversation.retry':
95
+ return md.conversation.retry(input[0], input[1], input[2]);
96
+ case 'conversation.pins':
97
+ return md.conversation.pins();
98
+ case 'conversation.pin':
99
+ return md.conversation.pin(input[0]);
100
+ case 'conversation.openedTurns':
101
+ return md.conversation.openedTurns();
102
+ case 'conversation.openTurn':
103
+ return md.conversation.openTurn(input[0], input[1]);
79
104
  case 'chatDraft.write':
80
105
  return md.chatDraft.write(input[0], input[1], input[2]);
81
106
  case 'chatDraft.prepend':
@@ -92,9 +117,6 @@ function attempted(work) {
92
117
  return Promise.reject(error);
93
118
  }
94
119
  }
95
- function answeredResult(value) {
96
- return typeof value === 'object' && value !== null && !('pending' in value);
97
- }
98
120
  function answeredMessage(value) {
99
121
  if (typeof value !== 'object' || value === null)
100
122
  return false;
@@ -114,17 +136,17 @@ export function serveMdRuntime(options) {
114
136
  const attachments = new Map();
115
137
  let authorized = true;
116
138
  let opening = null;
117
- const opened = () => (opening ??= untilAnswered(() => md.loaded(), closing.signal));
139
+ const opened = () => (opening ??= untilAnswered(() => md.loaded(), closing.signal, () => true, options.recovery));
118
140
  const watchFacts = (deliver) => {
119
141
  deliver(structuredClone(deploymentFacts));
120
142
  return () => { };
121
143
  };
122
- function attach(port, app, release, reach, code = 'stored', search = 'unused') {
144
+ function attach(port, options) {
123
145
  if (!authorized)
124
146
  throw new Error(AUTHORIZATION_ENDED);
147
+ const { app, release, reach, admission, code = 'stored' } = options;
125
148
  const writtenBy = release === undefined ? undefined : { app, release };
126
- let facts = { target: app, code, space: null, search };
127
- const view = runtime.within(reach ?? null, facts);
149
+ const view = runtime.within(reach ?? null, { target: app, code });
128
150
  const observations = new Map();
129
151
  const followed = new Set();
130
152
  const answeredKeys = new Set();
@@ -162,9 +184,16 @@ export function serveMdRuntime(options) {
162
184
  if (topic === 'query' && answeredMessage(value))
163
185
  answeredQuery(input[0]);
164
186
  };
187
+ const fail = (error) => {
188
+ if (!serving || resolved)
189
+ return;
190
+ observations.get(id)?.();
191
+ observations.delete(id);
192
+ send({ kind: 'failure', id, ...described(error) });
193
+ };
165
194
  observations.set(id, topic === 'deployment-facts'
166
195
  ? watchFacts(deliver)
167
- : (NARROWED.has(WIRE.topics[topic]) ? view : runtime).watch(topic, topic === 'presentation' ? [app] : input, deliver));
196
+ : (NARROWED.has(WIRE.topics[topic]) ? view : runtime).watch(topic, topic === 'presentation' ? [app] : input, deliver, fail));
168
197
  };
169
198
  const reply = async (id, query, pending) => {
170
199
  try {
@@ -180,6 +209,15 @@ export function serveMdRuntime(options) {
180
209
  send({ kind: 'failure', id, ...described(error) });
181
210
  }
182
211
  };
212
+ const admitted = admission === undefined
213
+ ? view.md
214
+ : {
215
+ ...view.md,
216
+ async call(name, input) {
217
+ const decided = await admission(name, input);
218
+ return 'refused' in decided ? decided.refused : view.md.call(name, decided.admitted);
219
+ },
220
+ };
183
221
  const serve = async (message) => {
184
222
  if (message.kind === 'hello')
185
223
  return;
@@ -205,13 +243,13 @@ export function serveMdRuntime(options) {
205
243
  return;
206
244
  }
207
245
  const { id, member, input } = message;
208
- const pending = attempted(() => answered(NARROWED.has(WIRE.members[member].reach) ? view.md : md, app, writtenBy, member, input));
246
+ const pending = attempted(() => answered(NARROWED.has(WIRE.members[member].reach) ? admitted : md, app, writtenBy, member, input));
209
247
  return reply(id, member === 'query' ? input[0] : undefined, pending);
210
248
  };
211
249
  port.addEventListener('message', (event) => {
212
250
  if (!serving)
213
251
  return;
214
- const message = request(event.data);
252
+ const message = wireRequest(event.data);
215
253
  if (message === null)
216
254
  return;
217
255
  void serve(message);
@@ -225,18 +263,6 @@ export function serveMdRuntime(options) {
225
263
  if (serving)
226
264
  view.narrow(next);
227
265
  },
228
- code(next, space) {
229
- if (!serving)
230
- return;
231
- facts = { ...facts, code: next, space };
232
- view.facts(facts);
233
- },
234
- search(next) {
235
- if (!serving)
236
- return;
237
- facts = { ...facts, search: next };
238
- view.facts(facts);
239
- },
240
266
  answered(queries, done) {
241
267
  const keys = queries.map(queryKey);
242
268
  if (keys.every((key) => answeredKeys.has(key)))
@@ -250,7 +276,7 @@ export function serveMdRuntime(options) {
250
276
  const stop = view.watch('readiness', [], (value) => {
251
277
  if (serving)
252
278
  deliver(value);
253
- });
279
+ }, () => { });
254
280
  const end = () => {
255
281
  followed.delete(end);
256
282
  stop();
@@ -262,6 +288,9 @@ export function serveMdRuntime(options) {
262
288
  }
263
289
  return {
264
290
  attach,
291
+ present(app, members) {
292
+ return md.presentation.edit(app, members);
293
+ },
265
294
  seed(entry) {
266
295
  runtime.seed(entry);
267
296
  },
@@ -286,3 +315,5 @@ export function serveMdRuntime(options) {
286
315
  }
287
316
  export { entrySeedOf } from './seed.js';
288
317
  export { createRecovery, retryDelay, } from './recovery.js';
318
+ export { undeclared } from './outcome.js';
319
+ export { wireAnswer, wireRequest, } from './wire.js';
@@ -1,5 +1,4 @@
1
1
  export declare function changeBatchIdentity(at?: number): string;
2
- export declare function identityTime(identity: string): number;
3
2
  export declare function roomDraftRevision(): string;
4
3
  export declare function chatDraftRevision(): string;
5
4
  export declare function transferIdentity(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAQD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE;AAQD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
package/dist/identity.js CHANGED
@@ -10,9 +10,6 @@ export function changeBatchIdentity(at = Date.now()) {
10
10
  const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');
11
11
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
12
12
  }
13
- export function identityTime(identity) {
14
- return Number.parseInt(identity.replaceAll('-', '').slice(0, 12), 16);
15
- }
16
13
  function randomIdentity() {
17
14
  const bytes = new Uint8Array(16);
18
15
  crypto.getRandomValues(bytes);