@agentshouse/mdruntime 0.1.0-cf28918c2bf91 → 0.1.0-cf53a3b60b194

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 (186) hide show
  1. package/README.md +24 -11
  2. package/dist/adapter.d.ts +188 -48
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js +1 -9
  5. package/dist/attached-model.d.ts +15 -0
  6. package/dist/attached-model.d.ts.map +1 -0
  7. package/dist/attached-model.js +64 -0
  8. package/dist/attempt.d.ts +16 -0
  9. package/dist/attempt.d.ts.map +1 -0
  10. package/dist/attempt.js +70 -0
  11. package/dist/binary.d.ts +18 -0
  12. package/dist/binary.d.ts.map +1 -0
  13. package/dist/binary.js +8 -0
  14. package/dist/bootstrap.d.ts +44 -7
  15. package/dist/bootstrap.d.ts.map +1 -1
  16. package/dist/bootstrap.js +224 -45
  17. package/dist/chain.d.ts +11 -0
  18. package/dist/chain.d.ts.map +1 -0
  19. package/dist/chain.js +64 -0
  20. package/dist/change-set.d.ts +9 -14
  21. package/dist/change-set.d.ts.map +1 -1
  22. package/dist/change-set.js +11 -56
  23. package/dist/change.d.ts +45 -0
  24. package/dist/change.d.ts.map +1 -1
  25. package/dist/change.js +34 -0
  26. package/dist/client.d.ts +37 -15
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +159 -29
  29. package/dist/collection.d.ts +14 -13
  30. package/dist/collection.d.ts.map +1 -1
  31. package/dist/collection.js +66 -54
  32. package/dist/compile.d.ts +16 -0
  33. package/dist/compile.d.ts.map +1 -0
  34. package/dist/compile.js +765 -0
  35. package/dist/connection.d.ts +68 -28
  36. package/dist/connection.d.ts.map +1 -1
  37. package/dist/connection.js +4091 -978
  38. package/dist/conversation.d.ts +57 -16
  39. package/dist/conversation.d.ts.map +1 -1
  40. package/dist/conversation.js +789 -243
  41. package/dist/digest.d.ts +7 -0
  42. package/dist/digest.d.ts.map +1 -0
  43. package/dist/digest.js +113 -0
  44. package/dist/durability.d.ts +5 -1
  45. package/dist/durability.d.ts.map +1 -1
  46. package/dist/durability.js +5 -0
  47. package/dist/entry.d.ts +19 -0
  48. package/dist/entry.d.ts.map +1 -0
  49. package/dist/entry.js +151 -0
  50. package/dist/expectation.d.ts +21 -0
  51. package/dist/expectation.d.ts.map +1 -0
  52. package/dist/expectation.js +70 -0
  53. package/dist/failure.d.ts +13 -0
  54. package/dist/failure.d.ts.map +1 -0
  55. package/dist/failure.js +19 -0
  56. package/dist/fence.d.ts +6 -0
  57. package/dist/fence.d.ts.map +1 -0
  58. package/dist/fence.js +10 -0
  59. package/dist/file.d.ts +2 -19
  60. package/dist/file.d.ts.map +1 -1
  61. package/dist/file.js +7 -122
  62. package/dist/fulltext.d.ts +27 -0
  63. package/dist/fulltext.d.ts.map +1 -0
  64. package/dist/fulltext.js +368 -0
  65. package/dist/host.d.ts +21 -2
  66. package/dist/host.d.ts.map +1 -1
  67. package/dist/host.js +163 -47
  68. package/dist/identity.d.ts +4 -0
  69. package/dist/identity.d.ts.map +1 -1
  70. package/dist/identity.js +16 -1
  71. package/dist/index.d.ts +19 -9
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +8 -0
  74. package/dist/live.d.ts +22 -0
  75. package/dist/live.d.ts.map +1 -0
  76. package/dist/live.js +124 -0
  77. package/dist/media.d.ts +8 -0
  78. package/dist/media.d.ts.map +1 -0
  79. package/dist/media.js +208 -0
  80. package/dist/memory.d.ts +22 -8
  81. package/dist/memory.d.ts.map +1 -1
  82. package/dist/memory.js +207 -47
  83. package/dist/messages.d.ts +28 -0
  84. package/dist/messages.d.ts.map +1 -0
  85. package/dist/messages.js +90 -0
  86. package/dist/model.d.ts +23 -14
  87. package/dist/model.d.ts.map +1 -1
  88. package/dist/model.js +22 -4
  89. package/dist/name.d.ts +4 -0
  90. package/dist/name.d.ts.map +1 -0
  91. package/dist/name.js +122 -0
  92. package/dist/observation.d.ts +21 -1
  93. package/dist/observation.d.ts.map +1 -1
  94. package/dist/observation.js +128 -17
  95. package/dist/open.d.ts +2 -0
  96. package/dist/open.d.ts.map +1 -0
  97. package/dist/open.js +1 -0
  98. package/dist/opened.d.ts +22 -0
  99. package/dist/opened.d.ts.map +1 -0
  100. package/dist/opened.js +107 -0
  101. package/dist/outcome.d.ts +73 -3
  102. package/dist/outcome.d.ts.map +1 -1
  103. package/dist/outcome.js +81 -1
  104. package/dist/overlay.d.ts +15 -5
  105. package/dist/overlay.d.ts.map +1 -1
  106. package/dist/overlay.js +136 -180
  107. package/dist/paths.d.ts +1 -1
  108. package/dist/paths.d.ts.map +1 -1
  109. package/dist/paths.js +4 -16
  110. package/dist/query.d.ts +78 -7
  111. package/dist/query.d.ts.map +1 -1
  112. package/dist/query.js +126 -43
  113. package/dist/reach.d.ts +54 -0
  114. package/dist/reach.d.ts.map +1 -0
  115. package/dist/reach.js +448 -0
  116. package/dist/react.d.ts +43 -0
  117. package/dist/react.d.ts.map +1 -0
  118. package/dist/react.js +54 -0
  119. package/dist/readiness.d.ts +64 -0
  120. package/dist/readiness.d.ts.map +1 -0
  121. package/dist/readiness.js +33 -0
  122. package/dist/reads.d.ts +11 -0
  123. package/dist/reads.d.ts.map +1 -0
  124. package/dist/reads.js +100 -0
  125. package/dist/recovery.d.ts +25 -0
  126. package/dist/recovery.d.ts.map +1 -0
  127. package/dist/recovery.js +198 -0
  128. package/dist/refresh.d.ts +19 -7
  129. package/dist/refresh.d.ts.map +1 -1
  130. package/dist/refresh.js +125 -53
  131. package/dist/replica.d.ts +59 -33
  132. package/dist/replica.d.ts.map +1 -1
  133. package/dist/replica.js +322 -156
  134. package/dist/room-draft.d.ts +44 -9
  135. package/dist/room-draft.d.ts.map +1 -1
  136. package/dist/room-draft.js +191 -40
  137. package/dist/rows.d.ts +39 -34
  138. package/dist/rows.d.ts.map +1 -1
  139. package/dist/rows.js +195 -81
  140. package/dist/save.d.ts +74 -6
  141. package/dist/save.d.ts.map +1 -1
  142. package/dist/save.js +898 -181
  143. package/dist/search.d.ts +41 -29
  144. package/dist/search.d.ts.map +1 -1
  145. package/dist/search.js +37 -105
  146. package/dist/seed.d.ts +16 -0
  147. package/dist/seed.d.ts.map +1 -0
  148. package/dist/seed.js +75 -0
  149. package/dist/shared.d.ts +16 -0
  150. package/dist/shared.d.ts.map +1 -0
  151. package/dist/shared.js +431 -0
  152. package/dist/status.d.ts +11 -2
  153. package/dist/status.d.ts.map +1 -1
  154. package/dist/status.js +3 -9
  155. package/dist/store.d.ts +132 -59
  156. package/dist/store.d.ts.map +1 -1
  157. package/dist/store.js +379 -344
  158. package/dist/stored.d.ts +154 -0
  159. package/dist/stored.d.ts.map +1 -0
  160. package/dist/stored.js +578 -0
  161. package/dist/tables.d.ts +362 -0
  162. package/dist/tables.d.ts.map +1 -0
  163. package/dist/tables.js +627 -0
  164. package/dist/turn.d.ts +9 -0
  165. package/dist/turn.d.ts.map +1 -0
  166. package/dist/turn.js +75 -0
  167. package/dist/validation.d.ts +30 -0
  168. package/dist/validation.d.ts.map +1 -0
  169. package/dist/validation.js +162 -0
  170. package/dist/windows.d.ts +22 -0
  171. package/dist/windows.d.ts.map +1 -0
  172. package/dist/windows.js +89 -0
  173. package/dist/wire.d.ts +194 -19
  174. package/dist/wire.d.ts.map +1 -1
  175. package/dist/wire.js +90 -61
  176. package/dist/words.d.ts +19 -0
  177. package/dist/words.d.ts.map +1 -0
  178. package/dist/words.js +156 -0
  179. package/package.json +33 -10
  180. package/AGENTS.md +0 -207
  181. package/dist/attachment.d.ts +0 -3
  182. package/dist/attachment.d.ts.map +0 -1
  183. package/dist/attachment.js +0 -8
  184. package/dist/read-side.d.ts +0 -14
  185. package/dist/read-side.d.ts.map +0 -1
  186. package/dist/read-side.js +0 -371
package/dist/host.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { composeRuntime, } from './connection.js';
2
- import { removeRuntimeStore } from './store.js';
3
- import { AUTHORIZATION_ENDED, carried, envelope, PROTOCOL_MISMATCH, request, } from './wire.js';
2
+ import { queryKey } from './query.js';
3
+ import { described } from './failure.js';
4
+ import { AUTHORIZATION_ENDED, request, WIRE, } from './wire.js';
5
+ const NARROWED = new Set(['within', 'whole']);
4
6
  function answered(md, app, writtenBy, member, input) {
5
7
  switch (member) {
6
8
  case 'rooms':
@@ -13,16 +15,34 @@ function answered(md, app, writtenBy, member, input) {
13
15
  return md.types(input[0]);
14
16
  case 'save':
15
17
  return md.save(input[0], input[1], writtenBy);
18
+ case 'saveParts':
19
+ return md.saveParts(input[0], input[1], writtenBy);
16
20
  case 'history':
17
21
  return md.history(input[0], input[1], input[2]);
22
+ case 'resolve':
23
+ return md.resolve(input[0], input[1], input[2]);
24
+ case 'binaryFile.read':
25
+ return md.binaryFile.read(input[0], input[1], input[2]);
26
+ case 'binaryFile.link':
27
+ return md.binaryFile.link(input[0], input[1], input[2]);
28
+ case 'binaryFile.show':
29
+ return md.binaryFile.show(input[0], input[1], input[2]);
30
+ case 'binaryFile.attach':
31
+ return md.binaryFile.attach(input[0], input[1]);
32
+ case 'binaryFile.part':
33
+ return md.binaryFile.part(input[0], input[1]);
18
34
  case 'call':
19
35
  return md.call(input[0], input[1]);
20
36
  case 'reached':
21
37
  return md.reached(input[0], input[1], input[2]);
22
38
  case 'log':
23
39
  return md.log();
40
+ case 'cleanUp':
41
+ return md.cleanUp();
24
42
  case 'persistence':
25
43
  return md.persistence();
44
+ case 'retry':
45
+ return md.retry();
26
46
  case 'reauthorize':
27
47
  return md.reauthorize();
28
48
  case 'roomDraft.list':
@@ -30,13 +50,15 @@ function answered(md, app, writtenBy, member, input) {
30
50
  case 'roomDraft.read':
31
51
  return md.roomDraft.read(input[0], input[1]);
32
52
  case 'roomDraft.write':
33
- return md.roomDraft.write(input[0], input[1], input[2], input[3]);
53
+ return md.roomDraft.write(input[0], input[1], input[2], input[3], input[4]);
34
54
  case 'roomDraft.discard':
35
55
  return md.roomDraft.discard(input[0], input[1], input[2]);
36
56
  case 'presentation.read':
37
57
  return md.presentation.read(app);
38
58
  case 'presentation.write':
39
59
  return md.presentation.write(app, input[0]);
60
+ case 'presentation.edit':
61
+ return md.presentation.edit(app, input[0]);
40
62
  case 'conversation.list':
41
63
  return md.conversation.list();
42
64
  case 'conversation.read':
@@ -44,7 +66,7 @@ function answered(md, app, writtenBy, member, input) {
44
66
  case 'conversation.create':
45
67
  return md.conversation.create(input[0]);
46
68
  case 'conversation.send':
47
- return md.conversation.send(input[0]);
69
+ return md.conversation.send(input[0], input[1], input[2]);
48
70
  case 'conversation.answer':
49
71
  return md.conversation.answer(input[0], input[1]);
50
72
  case 'conversation.interrupt':
@@ -56,11 +78,29 @@ function answered(md, app, writtenBy, member, input) {
56
78
  case 'conversation.delete':
57
79
  return md.conversation.delete(input[0]);
58
80
  case 'chatDraft.write':
59
- return md.chatDraft.write(input[0], input[1]);
81
+ return md.chatDraft.write(input[0], input[1], input[2]);
82
+ case 'chatDraft.prepend':
83
+ return md.chatDraft.prepend(input[0], input[1]);
60
84
  case 'chatDraft.discard':
61
85
  return md.chatDraft.discard(input[0]);
62
86
  }
63
87
  }
88
+ function attempted(work) {
89
+ try {
90
+ return Promise.resolve(work());
91
+ }
92
+ catch (error) {
93
+ return Promise.reject(error);
94
+ }
95
+ }
96
+ function answeredResult(value) {
97
+ return typeof value === 'object' && value !== null && !('pending' in value);
98
+ }
99
+ function answeredMessage(value) {
100
+ if (typeof value !== 'object' || value === null)
101
+ return false;
102
+ return !('result' in value) || answeredResult(value.result);
103
+ }
64
104
  export function serveMdRuntime(options) {
65
105
  const deploymentFacts = structuredClone(options.deploymentFacts);
66
106
  const closing = new AbortController();
@@ -71,82 +111,104 @@ export function serveMdRuntime(options) {
71
111
  if (options.signal?.aborted === true)
72
112
  close();
73
113
  const runtime = composeRuntime({ ...options, signal: closing.signal });
74
- const { md, watch } = runtime;
114
+ const { md } = runtime;
75
115
  const attachments = new Map();
76
116
  let authorized = true;
77
117
  const watchFacts = (deliver) => {
78
118
  deliver(structuredClone(deploymentFacts));
79
119
  return () => { };
80
120
  };
81
- function attach(port, app, release) {
121
+ function attach(port, app, release, reach, code = 'stored', search = 'unused') {
82
122
  if (!authorized)
83
123
  throw new Error(AUTHORIZATION_ENDED);
84
124
  const writtenBy = release === undefined ? undefined : { app, release };
85
- const subscriptions = new Map();
125
+ let facts = { target: app, code, space: null, search };
126
+ const view = runtime.within(reach ?? null, facts);
127
+ const observations = new Map();
128
+ const followed = new Set();
129
+ const answeredKeys = new Set();
130
+ let awaited = null;
86
131
  let serving = true;
132
+ const answeredQuery = (query) => {
133
+ answeredKeys.add(queryKey(query));
134
+ if (awaited === null || !awaited.keys.every((key) => answeredKeys.has(key)))
135
+ return;
136
+ const { done } = awaited;
137
+ awaited = null;
138
+ done();
139
+ };
87
140
  const send = (message) => {
88
- port.postMessage(envelope(message));
141
+ port.postMessage(message);
89
142
  };
90
143
  const detach = () => {
91
144
  if (!serving)
92
145
  return;
93
146
  serving = false;
94
- for (const end of subscriptions.values())
147
+ for (const end of observations.values())
148
+ end();
149
+ observations.clear();
150
+ for (const end of [...followed])
95
151
  end();
96
- subscriptions.clear();
97
152
  attachments.delete(detach);
98
153
  };
154
+ const observe = (id, topic, input) => {
155
+ let resolved = false;
156
+ const deliver = (value) => {
157
+ if (!serving)
158
+ return;
159
+ send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });
160
+ resolved = true;
161
+ if (topic === 'query' && answeredMessage(value))
162
+ answeredQuery(input[0]);
163
+ };
164
+ observations.set(id, topic === 'deployment-facts'
165
+ ? watchFacts(deliver)
166
+ : (NARROWED.has(WIRE.topics[topic]) ? view : runtime).watch(topic, topic === 'presentation' ? [app] : input, deliver));
167
+ };
168
+ const reply = async (id, query, pending) => {
169
+ try {
170
+ const value = await pending;
171
+ if (!serving)
172
+ return;
173
+ send({ kind: 'result', id, value });
174
+ if (query !== undefined && answeredResult(value))
175
+ answeredQuery(query);
176
+ }
177
+ catch (error) {
178
+ if (serving)
179
+ send({ kind: 'failure', id, ...described(error) });
180
+ }
181
+ };
99
182
  const serve = async (message) => {
100
183
  if (message.kind === 'hello')
101
184
  return;
102
185
  if (message.kind === 'stop') {
103
- subscriptions.get(message.id)?.();
104
- subscriptions.delete(message.id);
186
+ observations.get(message.id)?.();
187
+ observations.delete(message.id);
105
188
  return;
106
189
  }
107
190
  try {
108
191
  if (message.kind !== 'observe' || message.topic !== 'room-drafts')
109
192
  await md.loaded();
110
193
  if (message.kind === 'observe') {
111
- const { id, topic } = message;
112
- let resolved = false;
113
- const deliver = (value) => {
114
- if (!serving)
115
- return;
116
- send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });
117
- resolved = true;
118
- };
119
- subscriptions.set(id, topic === 'deployment-facts'
120
- ? watchFacts(deliver)
121
- : watch(topic, topic === 'presentation' ? [app] : message.input, deliver));
194
+ if (serving)
195
+ observe(message.id, message.topic, message.input);
122
196
  return;
123
197
  }
124
- const value = await answered(md, app, writtenBy, message.member, message.input);
125
- if (serving)
126
- send({ kind: 'result', id: message.id, value });
127
198
  }
128
199
  catch (error) {
129
- if (serving) {
130
- send({
131
- kind: 'failure',
132
- id: message.id,
133
- message: error instanceof Error ? error.message : String(error),
134
- });
135
- }
200
+ if (serving)
201
+ send({ kind: 'failure', id: message.id, ...described(error) });
202
+ return;
136
203
  }
204
+ const { id, member, input } = message;
205
+ const pending = attempted(() => answered(NARROWED.has(WIRE.members[member].reach) ? view.md : md, app, writtenBy, member, input));
206
+ return reply(id, member === 'query' ? input[0] : undefined, pending);
137
207
  };
138
208
  port.addEventListener('message', (event) => {
139
209
  if (!serving)
140
210
  return;
141
- const wire = carried(event.data);
142
- if (wire === null)
143
- return;
144
- if (!wire.matching) {
145
- send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });
146
- detach();
147
- return;
148
- }
149
- const message = request(wire.message);
211
+ const message = request(event.data);
150
212
  if (message === null)
151
213
  return;
152
214
  void serve(message);
@@ -154,22 +216,76 @@ export function serveMdRuntime(options) {
154
216
  port.addEventListener('close', detach);
155
217
  port.start();
156
218
  attachments.set(detach, send);
157
- return detach;
219
+ return {
220
+ detach,
221
+ narrow(next) {
222
+ if (serving)
223
+ view.narrow(next);
224
+ },
225
+ code(next, space) {
226
+ if (!serving)
227
+ return;
228
+ facts = { ...facts, code: next, space };
229
+ view.facts(facts);
230
+ },
231
+ search(next) {
232
+ if (!serving)
233
+ return;
234
+ facts = { ...facts, search: next };
235
+ view.facts(facts);
236
+ },
237
+ answered(queries, done) {
238
+ const keys = queries.map(queryKey);
239
+ if (keys.every((key) => answeredKeys.has(key)))
240
+ done();
241
+ else
242
+ awaited = { keys, done };
243
+ },
244
+ readiness(deliver) {
245
+ if (!serving)
246
+ return () => { };
247
+ const stop = view.watch('readiness', [], (value) => {
248
+ if (serving)
249
+ deliver(value);
250
+ });
251
+ const end = () => {
252
+ followed.delete(end);
253
+ stop();
254
+ };
255
+ followed.add(end);
256
+ return end;
257
+ },
258
+ };
158
259
  }
159
260
  return {
160
261
  attach,
161
- async endAuthorization() {
262
+ seed(entry) {
263
+ runtime.seed(entry);
264
+ },
265
+ persisted(answer) {
266
+ runtime.persisted(answer);
267
+ },
268
+ shown(onScreen) {
269
+ runtime.shown(onScreen);
270
+ },
271
+ async endAuthorization(holder) {
162
272
  authorized = false;
163
273
  for (const [detach, send] of [...attachments]) {
164
274
  send({ kind: 'ended' });
165
275
  detach();
166
276
  }
167
277
  close();
168
- await removeRuntimeStore();
169
- await options.shell.dropGeneration();
278
+ if (!(await options.database.ask({ kind: 'authored.end', holder: holder ?? null }))) {
279
+ await options.shell.dropGeneration();
280
+ }
281
+ },
282
+ lose(locators) {
283
+ return runtime.lose(locators);
170
284
  },
171
285
  stop() {
172
286
  return runtime.stop();
173
287
  },
174
288
  };
175
289
  }
290
+ export { entrySeedOf } from './seed.js';
291
+ export { createRecovery, retryDelay, } from './recovery.js';
@@ -1,3 +1,7 @@
1
1
  export declare function changeBatchIdentity(at?: number): string;
2
+ export declare function identityTime(identity: string): number;
2
3
  export declare function roomDraftRevision(): string;
4
+ export declare function chatDraftRevision(): string;
5
+ export declare function transferIdentity(): string;
6
+ export declare function binaryLocalId(): string;
3
7
  //# sourceMappingURL=identity.d.ts.map
@@ -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,iBAAiB,IAAI,MAAM,CAI1C"}
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"}
package/dist/identity.js CHANGED
@@ -10,8 +10,23 @@ 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 roomDraftRevision() {
13
+ export function identityTime(identity) {
14
+ return Number.parseInt(identity.replaceAll('-', '').slice(0, 12), 16);
15
+ }
16
+ function randomIdentity() {
14
17
  const bytes = new Uint8Array(16);
15
18
  crypto.getRandomValues(bytes);
16
19
  return [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');
17
20
  }
21
+ export function roomDraftRevision() {
22
+ return randomIdentity();
23
+ }
24
+ export function chatDraftRevision() {
25
+ return randomIdentity();
26
+ }
27
+ export function transferIdentity() {
28
+ return randomIdentity();
29
+ }
30
+ export function binaryLocalId() {
31
+ return randomIdentity();
32
+ }
package/dist/index.d.ts CHANGED
@@ -1,17 +1,27 @@
1
- export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistories, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomAttachment, RoomNotReadable, RoomVersionAt, RoomVersionNotification, SelectedRooms, ServiceMode, ServiceModeSignal, TransportUncertainty, TurnContext, TurnOperation, TypedSelection, } from './adapter.js';
2
- export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
3
- export type { ChatDraft, ChatDraftSurface, ConversationEntry, ConversationOptions, ConversationSurface, ConversationView, RunningTurn, } from './conversation.js';
4
- export type { ChatDraftFile, FileDeclaration } from './file.js';
5
- export type { AppRoom, AppTypedSelection, ConnectionRefusal, ConnectionRefusalReason, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomTypes, SavedRoomDraft, SaveResult, } from './connection.js';
1
+ export type { AcceptedMessage, AcceptedRoom, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, AttachRequest, AttachResult, Authorization, BinaryFile, BinaryLinkResult, BinaryRequest, BinaryResult, BootstrapInventory, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationAgents, ConversationEvent, ConversationHistories, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, DiscoveryScope, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, HeldContent, HeldFile, HeldRevisions, HeldRoom, KeptReceipt, ListedConversation, MdModelIdentity, Member, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomModels, RoomNotReadable, RoomStream, RoomStreamEvent, RoomVersionAt, ServiceMode, ServiceModeSignal, StreamReceipts, TransportUncertainty, TurnContext, TurnOperation, TypedSelection, } from './adapter.js';
2
+ export type { Change, ChangeBatch, Precondition, RoomMove, WrittenBy } from './change.js';
3
+ export type { ChatDraft, ChatDraftSurface, ConversationAgent, ConversationEntry, ConversationOptions, ConversationState, ConversationSurface, ConversationView, RunningTurn, } from './conversation.js';
4
+ export type { AppRoom, AppTypedSelection, BinaryFileSurface, ConnectionRefusal, ConnectionRefusalCode, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomSchemas, SavedParts, SavedRoomDraft, SaveResult, } from './connection.js';
6
5
  export type { Observation } from './observation.js';
7
- export type { CallResult, QueueEntry, Submission } from './outcome.js';
8
- export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, } from './room-draft.js';
6
+ export type { AttachAnswer, BinaryAnswer, BinaryLinkAnswer, CallResult, DownloadAnswer, Failure, HistoryAnswer, Offline, QueueEntry, Resolution, Submission, } from './outcome.js';
7
+ export type { BinaryFileRecord } from './binary.js';
8
+ export type { RuntimeError } from './failure.js';
9
+ export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, TextParts, } from './room-draft.js';
9
10
  export type { SaveRefusal } from './save.js';
10
- export type { DocumentHit, DocumentPart, MessageHit, SearchRequest, SearchResult, } from './search.js';
11
+ export type { DocumentHit, DocumentPart, MessageHit, MessagePart, SearchCoverage, SearchHits, SearchPending, SearchRequest, SearchResult, SearchUndeclared, Snippet, } from './search.js';
12
+ export { departure } from './change.js';
13
+ export { partsAfter } from './room-draft.js';
14
+ export { cutName, nameFrom, transliterated } from './name.js';
15
+ export { HISTORY_CONVERSATIONS, SESSION_STARTED } from './conversation.js';
11
16
  export { changeBatchIdentity } from './identity.js';
17
+ export { paced, ROW_WEIGHT, stepped } from './turn.js';
18
+ export { entriesIn, patching, sortedKeys } from './shared.js';
19
+ export { attempts, identities, intentOf, type Answered, type Attempt, type Attempts, type Identities, } from './attempt.js';
20
+ export { expectedList, expecting, type ExpectedOf, type Expecting } from './expectation.js';
12
21
  export type { RuntimeShell } from './durability.js';
22
+ export type { CodeAvailability, ConnectionAvailability, ConversationCoverage, Durability, HouseOutcome, Installation, InstallationAmount, InstallationPause, InstallationStep, Persistence, Readiness, ReadinessStatus, RefusedRoom, RoomCoverage, RoomPreparation, SearchObligation, Space, TargetCoverage, } from './readiness.js';
13
23
  export type { AttentionEntry, SyncStatus } from './status.js';
14
- export type { Backlink, Direction, DocumentQuery, DocumentResult, Filter, GroupQuery, GroupResult, Key, LocalQuery, OrderOptions, Predicate, QueryDocument, QueryGroup, QueryResult, Related, Select, Value, Where, } from './query.js';
24
+ export type { Awaits, Backlink, CoveredRoom, Direction, DocumentQuery, DocumentResult, Filter, GroupQuery, GroupResult, Key, LocalQuery, OrderOptions, PendingResult, PendingRoom, Predicate, QueryCoverage, QueryDocument, QueryGroup, QueryResult, QueryRows, Related, Select, Value, Where, } from './query.js';
15
25
  export type { MdType, ModelIdentity, ModelSnapshot, ModelState, ModelResult, TypesResult, ValidationReceipt, } from './model.js';
16
26
  export type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';
17
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EACV,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1 +1,9 @@
1
+ export { departure } from './change.js';
2
+ export { partsAfter } from './room-draft.js';
3
+ export { cutName, nameFrom, transliterated } from './name.js';
4
+ export { HISTORY_CONVERSATIONS, SESSION_STARTED } from './conversation.js';
1
5
  export { changeBatchIdentity } from './identity.js';
6
+ export { paced, ROW_WEIGHT, stepped } from './turn.js';
7
+ export { entriesIn, patching, sortedKeys } from './shared.js';
8
+ export { attempts, identities, intentOf, } from './attempt.js';
9
+ export { expectedList, expecting } from './expectation.js';
package/dist/live.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { ChangeSet } from './change-set.js';
2
+ import { type KeyedResult, type QueryMessage } from './observation.js';
3
+ import type { PendingResult, Plan, QueryCoverage } from './query.js';
4
+ import type { QueryRoom } from './tables.js';
5
+ export type Cover = {
6
+ coverage: QueryCoverage;
7
+ rooms: readonly QueryRoom[];
8
+ } | PendingResult;
9
+ export type Ran = KeyedResult & {
10
+ readonly current: () => boolean;
11
+ };
12
+ export type Run = (plan: Plan, cover: () => Cover) => Promise<Ran>;
13
+ type Listener = (message: QueryMessage) => void;
14
+ export type LiveQueries = {
15
+ touched(set: ChangeSet): void;
16
+ recover(): void;
17
+ watch(plan: Plan, identity: string, cover: () => Cover, deliver: Listener): () => void;
18
+ close(): void;
19
+ };
20
+ export declare function createLiveQueries(run: Run): LiveQueries;
21
+ export {};
22
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC;AAE7F,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEnE,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAchD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;IACvF,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAoCF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAuFvD"}
package/dist/live.js ADDED
@@ -0,0 +1,124 @@
1
+ import { changeOf, digestOf, } from './observation.js';
2
+ import { roomOfKey } from './rows.js';
3
+ function narrowed(plan) {
4
+ return (plan.paths !== null &&
5
+ plan.hop === null &&
6
+ plan.backlinks === null &&
7
+ !(plan.shape.kind === 'documents' && plan.shape.backlinks));
8
+ }
9
+ function reads(plan, locator) {
10
+ if (plan.locked.includes(locator))
11
+ return false;
12
+ if (plan.rooms !== null && !plan.rooms.includes(locator))
13
+ return false;
14
+ if (plan.reach === null)
15
+ return true;
16
+ return (plan.reach.rooms.includes(locator) ||
17
+ plan.reach.documents.some((document) => roomOfKey(document) === locator) ||
18
+ plan.reach.areas.some((area) => area.room === locator && area.types.length > 0));
19
+ }
20
+ function affected(plan, set) {
21
+ if (set.rooms.some((locator) => reads(plan, locator)))
22
+ return true;
23
+ const paths = narrowed(plan) ? new Set(plan.paths) : null;
24
+ return set.documents.some(({ locator, path }) => reads(plan, locator) && (paths === null || path === null || paths.has(path)));
25
+ }
26
+ function shown(entry) {
27
+ const cover = entry.cover();
28
+ return JSON.stringify('pending' in cover ? cover : cover.coverage);
29
+ }
30
+ export function createLiveQueries(run) {
31
+ const entries = new Map();
32
+ let closed = false;
33
+ function deliver(entry, next) {
34
+ const previous = entry.digest;
35
+ entry.digest = digestOf(next);
36
+ entry.covered = JSON.stringify('pending' in next.result ? next.result : next.result.coverage);
37
+ const change = previous === undefined ? null : changeOf(previous, next);
38
+ if (change !== null) {
39
+ for (const listener of entry.ready)
40
+ listener(change);
41
+ }
42
+ for (const listener of entry.fresh) {
43
+ entry.ready.add(listener);
44
+ listener(next);
45
+ }
46
+ entry.fresh.clear();
47
+ }
48
+ function schedule(entry) {
49
+ if (closed || entry.listeners.size === 0)
50
+ return;
51
+ if (entry.running) {
52
+ entry.dirty = true;
53
+ return;
54
+ }
55
+ entry.running = true;
56
+ void (async () => {
57
+ try {
58
+ for (;;) {
59
+ entry.dirty = false;
60
+ const { current, ...next } = await run(entry.plan, entry.cover);
61
+ if (closed || entry.listeners.size === 0)
62
+ return;
63
+ deliver(entry, next);
64
+ if (!(entry.dirty && !current()) && shown(entry) === entry.covered)
65
+ break;
66
+ }
67
+ }
68
+ catch {
69
+ entry.dirty = false;
70
+ }
71
+ finally {
72
+ entry.running = false;
73
+ }
74
+ })();
75
+ }
76
+ return {
77
+ touched(set) {
78
+ for (const entry of entries.values()) {
79
+ if (affected(entry.plan, set))
80
+ schedule(entry);
81
+ }
82
+ },
83
+ recover() {
84
+ for (const entry of entries.values()) {
85
+ if (entry.running)
86
+ continue;
87
+ if (entry.digest === undefined || shown(entry) !== entry.covered)
88
+ schedule(entry);
89
+ }
90
+ },
91
+ watch(plan, identity, cover, listener) {
92
+ let entry = entries.get(identity);
93
+ if (entry === undefined) {
94
+ entry = {
95
+ plan,
96
+ cover,
97
+ listeners: new Set(),
98
+ fresh: new Set(),
99
+ ready: new Set(),
100
+ digest: undefined,
101
+ covered: '',
102
+ dirty: false,
103
+ running: false,
104
+ };
105
+ entries.set(identity, entry);
106
+ }
107
+ const held = entry;
108
+ held.listeners.add(listener);
109
+ held.fresh.add(listener);
110
+ schedule(held);
111
+ return () => {
112
+ held.listeners.delete(listener);
113
+ held.fresh.delete(listener);
114
+ held.ready.delete(listener);
115
+ if (held.listeners.size === 0 && entries.get(identity) === held)
116
+ entries.delete(identity);
117
+ };
118
+ },
119
+ close() {
120
+ closed = true;
121
+ entries.clear();
122
+ },
123
+ };
124
+ }
@@ -0,0 +1,8 @@
1
+ import type { MdRuntimeClient } from './client.js';
2
+ import type { ShownAnswer } from './outcome.js';
3
+ export declare const ROOM_MEDIA = "room-media";
4
+ type Show = (room: string, path: string, revision?: string) => Promise<ShownAnswer>;
5
+ export declare function shownBy(show: Show, client: MdRuntimeClient): MdRuntimeClient;
6
+ export declare function defineRoomMedia(client: Promise<MdRuntimeClient> | MdRuntimeClient, registry?: CustomElementRegistry): void;
7
+ export {};
8
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,UAAU,eAAe,CAAC;AAwBvC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,EAClD,QAAQ,GAAE,qBAAsC,GAC/C,IAAI,CAkLN"}