@agentshouse/mdruntime 0.1.0-cc7bd7a53214e → 0.1.0-ccbe92df1c4f6

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 (261) hide show
  1. package/AGENTS.md +302 -200
  2. package/README.md +22 -11
  3. package/dist/adapter.d.ts +172 -49
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -9
  6. package/dist/attached-model.d.ts +14 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +57 -0
  9. package/dist/attempt.d.ts +16 -0
  10. package/dist/attempt.d.ts.map +1 -0
  11. package/dist/attempt.js +70 -0
  12. package/dist/binary.d.ts +18 -0
  13. package/dist/binary.d.ts.map +1 -0
  14. package/dist/binary.js +8 -0
  15. package/dist/bootstrap.d.ts +39 -6
  16. package/dist/bootstrap.d.ts.map +1 -1
  17. package/dist/bootstrap.js +188 -45
  18. package/dist/chain.d.ts +11 -0
  19. package/dist/chain.d.ts.map +1 -0
  20. package/dist/chain.js +64 -0
  21. package/dist/change-set.d.ts +9 -14
  22. package/dist/change-set.d.ts.map +1 -1
  23. package/dist/change-set.js +11 -56
  24. package/dist/change.d.ts +45 -0
  25. package/dist/change.d.ts.map +1 -1
  26. package/dist/change.js +34 -0
  27. package/dist/chat/acts.d.ts +33 -0
  28. package/dist/chat/acts.d.ts.map +1 -0
  29. package/dist/chat/acts.js +36 -0
  30. package/dist/chat/context.d.ts +3 -0
  31. package/dist/chat/context.d.ts.map +1 -0
  32. package/dist/chat/context.js +10 -0
  33. package/dist/chat/earlier.d.ts +10 -0
  34. package/dist/chat/earlier.d.ts.map +1 -0
  35. package/dist/chat/earlier.js +54 -0
  36. package/dist/chat/house.d.ts +25 -0
  37. package/dist/chat/house.d.ts.map +1 -0
  38. package/dist/chat/house.js +38 -0
  39. package/dist/chat/input.d.ts +11 -0
  40. package/dist/chat/input.d.ts.map +1 -0
  41. package/dist/chat/input.js +92 -0
  42. package/dist/chat/kit.d.ts +61 -0
  43. package/dist/chat/kit.d.ts.map +1 -0
  44. package/dist/chat/kit.js +123 -0
  45. package/dist/chat/lasting.d.ts +6 -0
  46. package/dist/chat/lasting.d.ts.map +1 -0
  47. package/dist/chat/lasting.js +19 -0
  48. package/dist/chat/list.d.ts +28 -0
  49. package/dist/chat/list.d.ts.map +1 -0
  50. package/dist/chat/list.js +103 -0
  51. package/dist/chat/markdown.d.ts +20 -0
  52. package/dist/chat/markdown.d.ts.map +1 -0
  53. package/dist/chat/markdown.js +229 -0
  54. package/dist/chat/message.d.ts +7 -0
  55. package/dist/chat/message.d.ts.map +1 -0
  56. package/dist/chat/message.js +254 -0
  57. package/dist/chat/messages.d.ts +35 -0
  58. package/dist/chat/messages.d.ts.map +1 -0
  59. package/dist/chat/messages.js +210 -0
  60. package/dist/chat/name.d.ts +7 -0
  61. package/dist/chat/name.d.ts.map +1 -0
  62. package/dist/chat/name.js +37 -0
  63. package/dist/chat/opened.d.ts +12 -0
  64. package/dist/chat/opened.d.ts.map +1 -0
  65. package/dist/chat/opened.js +19 -0
  66. package/dist/chat/overlay.d.ts +32 -0
  67. package/dist/chat/overlay.d.ts.map +1 -0
  68. package/dist/chat/overlay.js +103 -0
  69. package/dist/chat/parts.d.ts +58 -0
  70. package/dist/chat/parts.d.ts.map +1 -0
  71. package/dist/chat/parts.js +120 -0
  72. package/dist/chat/pieces.d.ts +62 -0
  73. package/dist/chat/pieces.d.ts.map +1 -0
  74. package/dist/chat/pieces.js +1110 -0
  75. package/dist/chat/process.d.ts +20 -0
  76. package/dist/chat/process.d.ts.map +1 -0
  77. package/dist/chat/process.js +32 -0
  78. package/dist/chat/provider.d.ts +70 -0
  79. package/dist/chat/provider.d.ts.map +1 -0
  80. package/dist/chat/provider.js +635 -0
  81. package/dist/chat/question.d.ts +9 -0
  82. package/dist/chat/question.d.ts.map +1 -0
  83. package/dist/chat/question.js +69 -0
  84. package/dist/chat/questions.d.ts +31 -0
  85. package/dist/chat/questions.d.ts.map +1 -0
  86. package/dist/chat/questions.js +111 -0
  87. package/dist/chat/read.d.ts +5 -0
  88. package/dist/chat/read.d.ts.map +1 -0
  89. package/dist/chat/read.js +13 -0
  90. package/dist/chat/ready.d.ts +37 -0
  91. package/dist/chat/ready.d.ts.map +1 -0
  92. package/dist/chat/ready.js +93 -0
  93. package/dist/chat/room-file.d.ts +8 -0
  94. package/dist/chat/room-file.d.ts.map +1 -0
  95. package/dist/chat/room-file.js +72 -0
  96. package/dist/chat/steady.d.ts +3 -0
  97. package/dist/chat/steady.d.ts.map +1 -0
  98. package/dist/chat/steady.js +26 -0
  99. package/dist/chat/style.d.ts +4 -0
  100. package/dist/chat/style.d.ts.map +1 -0
  101. package/dist/chat/style.js +307 -0
  102. package/dist/chat.d.ts +15 -0
  103. package/dist/chat.d.ts.map +1 -0
  104. package/dist/chat.js +8 -0
  105. package/dist/client.d.ts +35 -14
  106. package/dist/client.d.ts.map +1 -1
  107. package/dist/client.js +108 -26
  108. package/dist/collection.d.ts +9 -13
  109. package/dist/collection.d.ts.map +1 -1
  110. package/dist/collection.js +47 -56
  111. package/dist/compile.d.ts +16 -0
  112. package/dist/compile.d.ts.map +1 -0
  113. package/dist/compile.js +721 -0
  114. package/dist/connection.d.ts +61 -24
  115. package/dist/connection.d.ts.map +1 -1
  116. package/dist/connection.js +3786 -906
  117. package/dist/conversation.d.ts +56 -16
  118. package/dist/conversation.d.ts.map +1 -1
  119. package/dist/conversation.js +736 -242
  120. package/dist/digest.d.ts +7 -0
  121. package/dist/digest.d.ts.map +1 -0
  122. package/dist/digest.js +113 -0
  123. package/dist/durability.d.ts +5 -1
  124. package/dist/durability.d.ts.map +1 -1
  125. package/dist/durability.js +5 -0
  126. package/dist/entry.d.ts +19 -0
  127. package/dist/entry.d.ts.map +1 -0
  128. package/dist/entry.js +151 -0
  129. package/dist/expectation.d.ts +21 -0
  130. package/dist/expectation.d.ts.map +1 -0
  131. package/dist/expectation.js +70 -0
  132. package/dist/failure.d.ts +13 -0
  133. package/dist/failure.d.ts.map +1 -0
  134. package/dist/failure.js +19 -0
  135. package/dist/fence.d.ts +6 -0
  136. package/dist/fence.d.ts.map +1 -0
  137. package/dist/fence.js +10 -0
  138. package/dist/file.d.ts +2 -10
  139. package/dist/file.d.ts.map +1 -1
  140. package/dist/file.js +3 -120
  141. package/dist/fulltext.d.ts +27 -0
  142. package/dist/fulltext.d.ts.map +1 -0
  143. package/dist/fulltext.js +368 -0
  144. package/dist/host.d.ts +15 -2
  145. package/dist/host.d.ts.map +1 -1
  146. package/dist/host.js +113 -30
  147. package/dist/identity.d.ts +4 -0
  148. package/dist/identity.d.ts.map +1 -1
  149. package/dist/identity.js +16 -1
  150. package/dist/index.d.ts +20 -9
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +8 -0
  153. package/dist/live.d.ts +22 -0
  154. package/dist/live.d.ts.map +1 -0
  155. package/dist/live.js +123 -0
  156. package/dist/memory.d.ts +21 -7
  157. package/dist/memory.d.ts.map +1 -1
  158. package/dist/memory.js +171 -47
  159. package/dist/messages.d.ts +28 -0
  160. package/dist/messages.d.ts.map +1 -0
  161. package/dist/messages.js +90 -0
  162. package/dist/model.d.ts +17 -14
  163. package/dist/model.d.ts.map +1 -1
  164. package/dist/model.js +16 -4
  165. package/dist/name.d.ts +4 -0
  166. package/dist/name.d.ts.map +1 -0
  167. package/dist/name.js +122 -0
  168. package/dist/observation.d.ts +19 -2
  169. package/dist/observation.d.ts.map +1 -1
  170. package/dist/observation.js +113 -12
  171. package/dist/open.d.ts +2 -0
  172. package/dist/open.d.ts.map +1 -0
  173. package/dist/open.js +1 -0
  174. package/dist/opened.d.ts +22 -0
  175. package/dist/opened.d.ts.map +1 -0
  176. package/dist/opened.js +107 -0
  177. package/dist/outcome.d.ts +62 -3
  178. package/dist/outcome.d.ts.map +1 -1
  179. package/dist/outcome.js +67 -1
  180. package/dist/overlay.d.ts +15 -5
  181. package/dist/overlay.d.ts.map +1 -1
  182. package/dist/overlay.js +136 -180
  183. package/dist/paths.d.ts +0 -1
  184. package/dist/paths.d.ts.map +1 -1
  185. package/dist/paths.js +0 -16
  186. package/dist/query.d.ts +65 -5
  187. package/dist/query.d.ts.map +1 -1
  188. package/dist/query.js +122 -40
  189. package/dist/reach.d.ts +11 -4
  190. package/dist/reach.d.ts.map +1 -1
  191. package/dist/reach.js +202 -73
  192. package/dist/react.d.ts +43 -0
  193. package/dist/react.d.ts.map +1 -0
  194. package/dist/react.js +54 -0
  195. package/dist/readiness.d.ts +63 -0
  196. package/dist/readiness.d.ts.map +1 -0
  197. package/dist/readiness.js +33 -0
  198. package/dist/reads.d.ts +11 -0
  199. package/dist/reads.d.ts.map +1 -0
  200. package/dist/reads.js +100 -0
  201. package/dist/recovery.d.ts +25 -0
  202. package/dist/recovery.d.ts.map +1 -0
  203. package/dist/recovery.js +198 -0
  204. package/dist/refresh.d.ts +19 -7
  205. package/dist/refresh.d.ts.map +1 -1
  206. package/dist/refresh.js +129 -53
  207. package/dist/replica.d.ts +60 -33
  208. package/dist/replica.d.ts.map +1 -1
  209. package/dist/replica.js +319 -154
  210. package/dist/room-draft.d.ts +40 -9
  211. package/dist/room-draft.d.ts.map +1 -1
  212. package/dist/room-draft.js +153 -37
  213. package/dist/rows.d.ts +30 -34
  214. package/dist/rows.d.ts.map +1 -1
  215. package/dist/rows.js +168 -82
  216. package/dist/save.d.ts +72 -6
  217. package/dist/save.d.ts.map +1 -1
  218. package/dist/save.js +889 -178
  219. package/dist/search.d.ts +41 -29
  220. package/dist/search.d.ts.map +1 -1
  221. package/dist/search.js +37 -105
  222. package/dist/seed.d.ts +16 -0
  223. package/dist/seed.d.ts.map +1 -0
  224. package/dist/seed.js +75 -0
  225. package/dist/shared.d.ts +16 -0
  226. package/dist/shared.d.ts.map +1 -0
  227. package/dist/shared.js +431 -0
  228. package/dist/status.d.ts +6 -2
  229. package/dist/status.d.ts.map +1 -1
  230. package/dist/status.js +0 -8
  231. package/dist/store.d.ts +124 -58
  232. package/dist/store.d.ts.map +1 -1
  233. package/dist/store.js +359 -344
  234. package/dist/stored.d.ts +145 -0
  235. package/dist/stored.d.ts.map +1 -0
  236. package/dist/stored.js +567 -0
  237. package/dist/tables.d.ts +344 -0
  238. package/dist/tables.d.ts.map +1 -0
  239. package/dist/tables.js +580 -0
  240. package/dist/turn.d.ts +9 -0
  241. package/dist/turn.d.ts.map +1 -0
  242. package/dist/turn.js +75 -0
  243. package/dist/validation.d.ts +30 -0
  244. package/dist/validation.d.ts.map +1 -0
  245. package/dist/validation.js +162 -0
  246. package/dist/windows.d.ts +22 -0
  247. package/dist/windows.d.ts.map +1 -0
  248. package/dist/windows.js +89 -0
  249. package/dist/wire.d.ts +170 -45
  250. package/dist/wire.d.ts.map +1 -1
  251. package/dist/wire.js +69 -46
  252. package/dist/words.d.ts +19 -0
  253. package/dist/words.d.ts.map +1 -0
  254. package/dist/words.js +150 -0
  255. package/package.json +39 -9
  256. package/dist/attachment.d.ts +0 -3
  257. package/dist/attachment.d.ts.map +0 -1
  258. package/dist/attachment.js +0 -8
  259. package/dist/read-side.d.ts +0 -18
  260. package/dist/read-side.d.ts.map +0 -1
  261. package/dist/read-side.js +0 -377
package/dist/client.js CHANGED
@@ -1,5 +1,11 @@
1
1
  import { observed } from './observation.js';
2
- import { answer, AUTHORIZATION_ENDED, carried, envelope, PORT_CLOSED, PROTOCOL_MISMATCH, } from './wire.js';
2
+ import { runtimeError } from './failure.js';
3
+ import { answer, AUTHORIZATION_ENDED, PORT_CLOSED, } from './wire.js';
4
+ // React renders an arrived value in a later task and opens what that render observes as it commits, so this many frames opening nothing mean the page drew what it observes.
5
+ const SETTLED_FRAMES = 2;
6
+ function refused(refusal) {
7
+ return runtimeError(refusal.code, refusal.code, refusal.retryable);
8
+ }
3
9
  export function connectMdRuntime(port) {
4
10
  let sequence = 0;
5
11
  let refusal = null;
@@ -7,8 +13,10 @@ export function connectMdRuntime(port) {
7
13
  const calls = new Map();
8
14
  const opening = new Map();
9
15
  const observations = new Map();
16
+ let drawing = null;
17
+ let settling = null;
10
18
  const send = (message) => {
11
- port.postMessage(envelope(message));
19
+ port.postMessage(message);
12
20
  };
13
21
  function begin(id, topic, first) {
14
22
  const handle = observed(first, () => {
@@ -25,7 +33,7 @@ export function connectMdRuntime(port) {
25
33
  if (topic === 'connection-refusal')
26
34
  handle.receive(reported);
27
35
  }
28
- const failure = new Error(reported.reason);
36
+ const failure = refused(reported);
29
37
  for (const [id, waiting] of opening) {
30
38
  if (waiting.topic === 'connection-refusal')
31
39
  waiting.settle(begin(id, waiting.topic, reported));
@@ -36,12 +44,12 @@ export function connectMdRuntime(port) {
36
44
  for (const waiting of calls.values())
37
45
  waiting.fail(failure);
38
46
  calls.clear();
47
+ drawing?.();
39
48
  }
40
- function end(reason) {
49
+ function end(failure) {
41
50
  if (ended !== null)
42
51
  return;
43
- ended = reason;
44
- const failure = new Error(reason);
52
+ ended = failure;
45
53
  for (const waiting of opening.values())
46
54
  waiting.fail(failure);
47
55
  opening.clear();
@@ -51,16 +59,10 @@ export function connectMdRuntime(port) {
51
59
  for (const { handle } of observations.values())
52
60
  handle.end();
53
61
  observations.clear();
62
+ drawing?.();
54
63
  }
55
64
  port.addEventListener('message', (event) => {
56
- const wire = carried(event.data);
57
- if (wire === null)
58
- return;
59
- if (!wire.matching) {
60
- refuse(PROTOCOL_MISMATCH);
61
- return;
62
- }
63
- const message = answer(wire.message);
65
+ const message = answer(event.data);
64
66
  if (message === null)
65
67
  return;
66
68
  if (message.kind === 'refusal') {
@@ -68,7 +70,11 @@ export function connectMdRuntime(port) {
68
70
  return;
69
71
  }
70
72
  if (message.kind === 'ended') {
71
- end(AUTHORIZATION_ENDED);
73
+ for (const { topic, handle } of observations.values()) {
74
+ if (topic === 'member')
75
+ handle.receive(null);
76
+ }
77
+ end(runtimeError('authorization-ended', AUTHORIZATION_ENDED));
72
78
  return;
73
79
  }
74
80
  if (message.kind === 'event') {
@@ -78,31 +84,34 @@ export function connectMdRuntime(port) {
78
84
  const waiting = opening.get(message.id);
79
85
  if (waiting !== undefined) {
80
86
  opening.delete(message.id);
81
- if (message.kind === 'failure')
82
- waiting.fail(new Error(message.message));
87
+ if (message.kind === 'failure') {
88
+ waiting.fail(runtimeError(message.code, message.message, message.retryable));
89
+ }
83
90
  else
84
91
  waiting.settle(begin(message.id, waiting.topic, message.value));
92
+ drawing?.();
85
93
  return;
86
94
  }
87
95
  const called = calls.get(message.id);
88
96
  if (called === undefined)
89
97
  return;
90
98
  calls.delete(message.id);
91
- if (message.kind === 'failure')
92
- called.fail(new Error(message.message));
99
+ if (message.kind === 'failure') {
100
+ called.fail(runtimeError(message.code, message.message, message.retryable));
101
+ }
93
102
  else
94
103
  called.settle(message.value);
95
104
  });
96
105
  port.addEventListener('close', () => {
97
- end(PORT_CLOSED);
106
+ end(runtimeError('port-closed', PORT_CLOSED));
98
107
  });
99
108
  port.start();
100
109
  send({ kind: 'hello' });
101
110
  function ask(member, input) {
102
111
  if (ended !== null)
103
- return Promise.reject(new Error(ended));
112
+ return Promise.reject(ended);
104
113
  if (refusal !== null)
105
- return Promise.reject(new Error(refusal.reason));
114
+ return Promise.reject(refused(refusal));
106
115
  const id = (sequence += 1);
107
116
  return new Promise((settle, fail) => {
108
117
  calls.set(id, { settle: settle, fail });
@@ -111,18 +120,71 @@ export function connectMdRuntime(port) {
111
120
  }
112
121
  function watch(topic, input) {
113
122
  if (ended !== null)
114
- return Promise.reject(new Error(ended));
123
+ return Promise.reject(ended);
115
124
  const id = (sequence += 1);
116
125
  if (refusal !== null) {
117
126
  return topic === 'connection-refusal'
118
127
  ? Promise.resolve(begin(id, topic, refusal))
119
- : Promise.reject(new Error(refusal.reason));
128
+ : Promise.reject(refused(refusal));
120
129
  }
121
130
  return new Promise((settle, fail) => {
122
131
  opening.set(id, { topic, settle, fail });
123
132
  send({ kind: 'observe', id, topic, input });
133
+ drawing?.();
124
134
  });
125
135
  }
136
+ function streamed(answer) {
137
+ if (answer.kind !== 'binary')
138
+ return answer;
139
+ const { file, byteLength, mediaType } = answer;
140
+ let part = 0;
141
+ let received = 0;
142
+ const stream = new ReadableStream({
143
+ async pull(controller) {
144
+ const bytes = await ask('binaryFile.part', [file, part]);
145
+ if (bytes === null) {
146
+ if (received === byteLength)
147
+ controller.close();
148
+ else
149
+ controller.error(runtimeError('binary-file-absent', 'The file ended early'));
150
+ return;
151
+ }
152
+ part += 1;
153
+ received += bytes.byteLength;
154
+ controller.enqueue(bytes);
155
+ },
156
+ }, { highWaterMark: 0 });
157
+ return { kind: 'binary', stream, byteLength, mediaType };
158
+ }
159
+ function settled() {
160
+ if (settling !== null)
161
+ return settling;
162
+ settling = new Promise((resolve) => {
163
+ let moved = 0;
164
+ const check = () => {
165
+ moved += 1;
166
+ if (opening.size > 0)
167
+ return;
168
+ const at = moved;
169
+ const waited = (frames) => {
170
+ requestAnimationFrame(() => {
171
+ if (frames < SETTLED_FRAMES) {
172
+ waited(frames + 1);
173
+ return;
174
+ }
175
+ if (moved !== at || opening.size > 0)
176
+ return;
177
+ drawing = null;
178
+ resolve();
179
+ });
180
+ };
181
+ waited(1);
182
+ };
183
+ drawing = check;
184
+ check();
185
+ });
186
+ return settling;
187
+ }
126
188
  return {
127
189
  rooms: () => ask('rooms', []),
128
190
  query: ((query) => ask('query', [query])),
@@ -135,15 +197,18 @@ export function connectMdRuntime(port) {
135
197
  discard: (room, path, revision) => ask('roomDraft.discard', [room, path, revision]),
136
198
  },
137
199
  save: (room, roomDrafts) => ask('save', [room, roomDrafts]),
200
+ saveParts: (room, parts) => ask('saveParts', [room, parts]),
138
201
  presentation: {
139
202
  read: () => ask('presentation.read', []),
140
203
  write: (value) => ask('presentation.write', [value]),
204
+ edit: (members) => ask('presentation.edit', [members]),
141
205
  },
142
206
  conversation: {
143
207
  list: () => ask('conversation.list', []),
144
208
  read: (conversation, options) => ask('conversation.read', [conversation, options]),
145
209
  create: (input) => ask('conversation.create', [input]),
146
- send: (conversation) => ask('conversation.send', [conversation]),
210
+ send: (conversation, operation, draft) => ask('conversation.send', [conversation, operation, draft]),
211
+ attach: (room, file) => ask('conversation.attach', [room, file]),
147
212
  answer: (conversation, answer) => ask('conversation.answer', [conversation, answer]),
148
213
  interrupt: (conversation) => ask('conversation.interrupt', [conversation]),
149
214
  kill: (conversation) => ask('conversation.kill', [conversation]),
@@ -151,15 +216,32 @@ export function connectMdRuntime(port) {
151
216
  delete: (conversation) => ask('conversation.delete', [conversation]),
152
217
  },
153
218
  chatDraft: {
154
- write: (conversation, draft) => ask('chatDraft.write', [conversation, draft]),
219
+ write: (conversation, draft, revision) => ask('chatDraft.write', [conversation, draft, revision]),
220
+ prepend: (conversation, draft) => ask('chatDraft.prepend', [conversation, draft]),
155
221
  discard: (conversation) => ask('chatDraft.discard', [conversation]),
156
222
  },
157
223
  history: (locator, path, query) => ask('history', [locator, path, query]),
224
+ resolve: (room, path, destination) => ask('resolve', [room, path, destination]),
225
+ binaryFile: {
226
+ read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]).then(streamed),
227
+ link: (room, path, revision) => ask('binaryFile.link', [room, path, revision]),
228
+ },
158
229
  call: (name, input) => ask('call', [name, input]),
159
230
  reached: (locator, roomVersion, path) => ask('reached', [locator, roomVersion, path]),
160
231
  log: () => ask('log', []),
161
232
  persistence: () => ask('persistence', []),
233
+ retry: () => ask('retry', []),
234
+ cleanUp: () => ask('cleanUp', []),
162
235
  observe: ((topic, ...input) => watch(topic, input)),
163
236
  reauthorize: () => ask('reauthorize', []),
237
+ settled,
164
238
  };
165
239
  }
240
+ const turns = new WeakMap();
241
+ export function inTurn(client, work) {
242
+ const turn = (turns.get(client) ?? Promise.resolve()).then(work);
243
+ turns.set(client, turn.then(() => undefined, () => undefined));
244
+ return turn;
245
+ }
246
+ export { chainedWindows } from './chain.js';
247
+ export { unanswered } from './wire.js';
@@ -1,11 +1,13 @@
1
- import { type Document, type Validation } from '@agentshouse/mdmodel';
1
+ import { type Document } from '@agentshouse/mdmodel';
2
2
  import type { ModelState } from './model.js';
3
3
  import type { MdModelIdentity } from './adapter.js';
4
+ import { type Paths } from './shared.js';
4
5
  import type { Refused } from './transfer.js';
5
6
  export declare const MD_MODEL: MdModelIdentity;
6
7
  export type Collection = {
7
- documents: Readonly<Record<string, Document>>;
8
+ text: Readonly<Record<string, string>>;
8
9
  composition: Composition;
10
+ document(path: string): Document | undefined;
9
11
  };
10
12
  export type Composition = {
11
13
  model: ModelState;
@@ -14,17 +16,11 @@ export type Composition = {
14
16
  model: ModelState;
15
17
  } | null;
16
18
  };
19
+ export declare function selected(composition: Composition, path: string): boolean;
17
20
  export declare function governing(composition: Composition, path: string): ModelState;
18
- type Previous = {
19
- text: Readonly<Record<string, string>>;
20
- collection: Collection;
21
- };
22
- export declare function parseCollection(text: Readonly<Record<string, string>>, composition: Composition, previous?: Previous): Collection;
23
- export declare function readCollection(text: Readonly<Record<string, string>>, composition: Composition, previous?: Previous): {
24
- kind: 'read';
25
- collection: Collection;
26
- } | Refused;
21
+ export declare function collectionOf(text: Readonly<Record<string, string>>, composition: Composition): Collection;
22
+ export declare function documentsOf(collection: Collection): Generator<number, Iterable<readonly [string, Document]>, void>;
23
+ export declare function unreadable(text: Paths<string>, paths?: Iterable<string> | null): Generator<number, Refused | null, void>;
27
24
  export declare function validRoot(root: unknown): root is string;
28
- export declare function validateCollection(text: Readonly<Record<string, string>>, binaryTargets: readonly string[], composition: Composition): Validation;
29
- export {};
25
+ export declare function available(composition: Composition): boolean;
30
26
  //# sourceMappingURL=collection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,UAAU,EAEhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAIhG,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AASF,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAED,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAanF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,QAAQ,GAClB,UAAU,CAOZ;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,QAAQ,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAQpD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAwBD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,WAAW,GACvB,UAAU,CA0BZ"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AAEF,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,UAAU,CAcZ;AAED,wBAAiB,WAAW,CAC1B,UAAU,EAAE,UAAU,GACrB,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAQhE;AAED,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAW,GACpC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAazC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAK3D"}
@@ -1,8 +1,9 @@
1
- import { parse, validate, VERSION, } from '@agentshouse/mdmodel';
1
+ import { parse, VERSION } from '@agentshouse/mdmodel';
2
2
  import { beneath, normalize } from './paths.js';
3
+ import { keysIn, sortedKeys } from './shared.js';
4
+ import { ROW_WEIGHT } from './turn.js';
3
5
  export const MD_MODEL = { identity: '@agentshouse/mdmodel', version: VERSION };
4
- const NO_TYPES = { types: {} };
5
- function selected(composition, path) {
6
+ export function selected(composition, path) {
6
7
  return (composition.selection !== null &&
7
8
  composition.selection.roots.some((root) => beneath(root, path)));
8
9
  }
@@ -11,62 +12,52 @@ export function governing(composition, path) {
11
12
  ? composition.selection.model
12
13
  : composition.model;
13
14
  }
14
- function parsedAt(text, path, previous) {
15
- const retained = previous?.collection.documents[path];
16
- return retained !== undefined && previous?.text[path] === text[path]
17
- ? { ok: true, document: retained }
18
- : parse(text[path], path);
19
- }
20
- export function parseCollection(text, composition, previous) {
21
- const documents = {};
22
- for (const path of Object.keys(text).sort()) {
23
- const parsed = parsedAt(text, path, previous);
24
- if (parsed.ok)
25
- documents[path] = parsed.document;
26
- }
27
- return { documents, composition };
28
- }
29
- export function readCollection(text, composition, previous) {
30
- const documents = {};
31
- for (const path of Object.keys(text).sort()) {
32
- const parsed = parsedAt(text, path, previous);
33
- if (!parsed.ok)
34
- return { kind: 'refused', refusal: parsed.refusal };
35
- documents[path] = parsed.document;
15
+ export function collectionOf(text, composition) {
16
+ const parsed = new Map();
17
+ return {
18
+ text,
19
+ composition,
20
+ document(path) {
21
+ if (parsed.has(path))
22
+ return parsed.get(path) ?? undefined;
23
+ const content = text[path];
24
+ if (content === undefined)
25
+ return undefined;
26
+ const read = parse(content, path);
27
+ parsed.set(path, read.ok ? read.document : null);
28
+ return read.ok ? read.document : undefined;
29
+ },
30
+ };
31
+ }
32
+ export function* documentsOf(collection) {
33
+ const paths = yield* sortedKeys(collection.text);
34
+ return (function* () {
35
+ for (const path of paths) {
36
+ const document = collection.document(path);
37
+ if (document !== undefined)
38
+ yield [path, document];
39
+ }
40
+ })();
41
+ }
42
+ export function* unreadable(text, paths = null) {
43
+ const named = paths ?? (yield* keysIn(text));
44
+ let least = null;
45
+ for (const path of named) {
46
+ const content = Object.hasOwn(text, path) ? text[path] : undefined;
47
+ if (content === undefined)
48
+ continue;
49
+ const read = parse(content, path);
50
+ if (!read.ok && (least === null || path < least.path)) {
51
+ least = { path, refused: { kind: 'refused', refusal: read.refusal } };
52
+ }
53
+ yield ROW_WEIGHT + content.length;
36
54
  }
37
- return { kind: 'read', collection: { documents, composition } };
55
+ return least?.refused ?? null;
38
56
  }
39
57
  export function validRoot(root) {
40
58
  return typeof root === 'string' && normalize(root) === root;
41
59
  }
42
- function validateAgainst(documents, binaryTargets, model) {
43
- if (model.status === 'unavailable') {
44
- const typed = Object.entries(documents).find(([, content]) => {
45
- const parsed = parse(content);
46
- return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
47
- });
48
- if (typed !== undefined)
49
- return { verdict: 'refuse', rule: 'model-unavailable', file: typed[0] };
50
- }
51
- return validate(documents, { binaryTargets }, model.status === 'unavailable' ? NO_TYPES : { types: model.types });
52
- }
53
- export function validateCollection(text, binaryTargets, composition) {
54
- const collection = {};
55
- const selection = {};
56
- for (const [path, content] of Object.entries(text)) {
57
- if (selected(composition, path))
58
- selection[path] = content;
59
- else
60
- collection[path] = content;
61
- }
62
- const verdicts = [
63
- validateAgainst(collection, binaryTargets.filter((path) => !selected(composition, path)), composition.model),
64
- ];
65
- if (composition.selection !== null) {
66
- verdicts.push(validateAgainst(selection, binaryTargets.filter((path) => selected(composition, path)), composition.selection.model));
67
- }
68
- const refusals = verdicts.filter((verdict) => verdict.verdict === 'refuse');
69
- if (refusals.length === 0)
70
- return verdicts[0];
71
- return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];
60
+ export function available(composition) {
61
+ return (composition.model.status !== 'unavailable' &&
62
+ (composition.selection === null || composition.selection.model.status !== 'unavailable'));
72
63
  }
@@ -0,0 +1,16 @@
1
+ import type { Plan, QueryRows } from './query.js';
2
+ import type { Connection, Value } from './tables.js';
3
+ export type QueryRoom = {
4
+ readonly locator: string;
5
+ readonly key: number;
6
+ };
7
+ export type Fragment = {
8
+ readonly sql: string;
9
+ readonly bind: readonly Value[];
10
+ };
11
+ export type QueryAnswer = QueryRows & {
12
+ readonly more?: string;
13
+ };
14
+ export declare function selected(connection: Connection, plan: Plan, rooms: readonly QueryRoom[]): Fragment;
15
+ export declare function answerQuery(connection: Connection, plan: Plan, rooms: readonly QueryRoom[], budget?: number | null): QueryAnswer;
16
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAOV,IAAI,EAGJ,SAAS,EAIV,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAU1D,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,CAAC;AA+pBjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA8SjE,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,QAAQ,CAEV;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,GAAE,MAAM,GAAG,IAAW,GAC3B,WAAW,CAUb"}