@agentshouse/mdruntime 0.1.0-ce531b51ff088 → 0.1.0-ce5c5bb29be5a
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.
- package/README.md +24 -11
- package/dist/adapter.d.ts +172 -48
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- package/dist/attached-model.d.ts +15 -0
- package/dist/attached-model.d.ts.map +1 -0
- package/dist/attached-model.js +81 -0
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +18 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +36 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +199 -48
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -56
- package/dist/change.d.ts +45 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +34 -0
- package/dist/client.d.ts +37 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +159 -29
- package/dist/collection.d.ts +12 -14
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +52 -56
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +773 -0
- package/dist/connection.d.ts +67 -28
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3911 -1044
- package/dist/conversation.d.ts +59 -18
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +849 -248
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +4 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +151 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +370 -0
- package/dist/host.d.ts +20 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +166 -48
- package/dist/identity.d.ts +4 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +16 -1
- package/dist/index.d.ts +20 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +124 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +22 -8
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +208 -47
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts +22 -14
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +13 -4
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +21 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +128 -17
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +72 -5
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +81 -1
- package/dist/overlay.d.ts +15 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -180
- package/dist/paths.d.ts +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -16
- package/dist/query.d.ts +78 -7
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +126 -43
- package/dist/reach.d.ts +54 -0
- package/dist/reach.d.ts.map +1 -0
- package/dist/reach.js +448 -0
- package/dist/react.d.ts +43 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +54 -0
- package/dist/readiness.d.ts +52 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/recovery.d.ts +26 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +224 -0
- package/dist/refresh.d.ts +19 -7
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +125 -53
- package/dist/replica.d.ts +58 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +320 -158
- package/dist/room-draft.d.ts +60 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +227 -42
- package/dist/rows.d.ts +39 -34
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +195 -81
- package/dist/save.d.ts +74 -6
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +898 -181
- package/dist/search.d.ts +41 -29
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +37 -105
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +421 -0
- package/dist/status.d.ts +7 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -9
- package/dist/store.d.ts +109 -59
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +323 -344
- package/dist/stored.d.ts +130 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +560 -0
- package/dist/tables.d.ts +325 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +578 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +101 -0
- package/dist/windows.d.ts +22 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +89 -0
- package/dist/wire.d.ts +194 -19
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +90 -61
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +156 -0
- package/package.json +33 -10
- package/AGENTS.md +0 -207
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
- package/dist/read-side.d.ts +0 -14
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -371
package/dist/host.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { composeRuntime, } from './connection.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { queryKey } from './query.js';
|
|
3
|
+
import { untilAnswered } from './recovery.js';
|
|
4
|
+
import { described } from './failure.js';
|
|
5
|
+
import { AUTHORIZATION_ENDED, request, WIRE, } from './wire.js';
|
|
6
|
+
const NARROWED = new Set(['within', 'whole']);
|
|
4
7
|
function answered(md, app, writtenBy, member, input) {
|
|
5
8
|
switch (member) {
|
|
6
9
|
case 'rooms':
|
|
@@ -13,16 +16,34 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
13
16
|
return md.types(input[0]);
|
|
14
17
|
case 'save':
|
|
15
18
|
return md.save(input[0], input[1], writtenBy);
|
|
19
|
+
case 'saveParts':
|
|
20
|
+
return md.saveParts(input[0], input[1], writtenBy);
|
|
16
21
|
case 'history':
|
|
17
22
|
return md.history(input[0], input[1], input[2]);
|
|
23
|
+
case 'resolve':
|
|
24
|
+
return md.resolve(input[0], input[1], input[2]);
|
|
25
|
+
case 'binaryFile.read':
|
|
26
|
+
return md.binaryFile.read(input[0], input[1], input[2]);
|
|
27
|
+
case 'binaryFile.link':
|
|
28
|
+
return md.binaryFile.link(input[0], input[1], input[2]);
|
|
29
|
+
case 'binaryFile.show':
|
|
30
|
+
return md.binaryFile.show(input[0], input[1], input[2]);
|
|
31
|
+
case 'binaryFile.attach':
|
|
32
|
+
return md.binaryFile.attach(input[0], input[1]);
|
|
33
|
+
case 'binaryFile.part':
|
|
34
|
+
return md.binaryFile.part(input[0], input[1]);
|
|
18
35
|
case 'call':
|
|
19
36
|
return md.call(input[0], input[1]);
|
|
20
37
|
case 'reached':
|
|
21
38
|
return md.reached(input[0], input[1], input[2]);
|
|
22
39
|
case 'log':
|
|
23
40
|
return md.log();
|
|
41
|
+
case 'cleanUp':
|
|
42
|
+
return md.cleanUp();
|
|
24
43
|
case 'persistence':
|
|
25
44
|
return md.persistence();
|
|
45
|
+
case 'retry':
|
|
46
|
+
return md.retry();
|
|
26
47
|
case 'reauthorize':
|
|
27
48
|
return md.reauthorize();
|
|
28
49
|
case 'roomDraft.list':
|
|
@@ -30,13 +51,15 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
30
51
|
case 'roomDraft.read':
|
|
31
52
|
return md.roomDraft.read(input[0], input[1]);
|
|
32
53
|
case 'roomDraft.write':
|
|
33
|
-
return md.roomDraft.write(input[0], input[1], input[2], input[3]);
|
|
54
|
+
return md.roomDraft.write(input[0], input[1], input[2], input[3], input[4]);
|
|
34
55
|
case 'roomDraft.discard':
|
|
35
56
|
return md.roomDraft.discard(input[0], input[1], input[2]);
|
|
36
57
|
case 'presentation.read':
|
|
37
58
|
return md.presentation.read(app);
|
|
38
59
|
case 'presentation.write':
|
|
39
60
|
return md.presentation.write(app, input[0]);
|
|
61
|
+
case 'presentation.edit':
|
|
62
|
+
return md.presentation.edit(app, input[0]);
|
|
40
63
|
case 'conversation.list':
|
|
41
64
|
return md.conversation.list();
|
|
42
65
|
case 'conversation.read':
|
|
@@ -44,7 +67,7 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
44
67
|
case 'conversation.create':
|
|
45
68
|
return md.conversation.create(input[0]);
|
|
46
69
|
case 'conversation.send':
|
|
47
|
-
return md.conversation.send(input[0]);
|
|
70
|
+
return md.conversation.send(input[0], input[1], input[2]);
|
|
48
71
|
case 'conversation.answer':
|
|
49
72
|
return md.conversation.answer(input[0], input[1]);
|
|
50
73
|
case 'conversation.interrupt':
|
|
@@ -56,11 +79,29 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
56
79
|
case 'conversation.delete':
|
|
57
80
|
return md.conversation.delete(input[0]);
|
|
58
81
|
case 'chatDraft.write':
|
|
59
|
-
return md.chatDraft.write(input[0], input[1]);
|
|
82
|
+
return md.chatDraft.write(input[0], input[1], input[2]);
|
|
83
|
+
case 'chatDraft.prepend':
|
|
84
|
+
return md.chatDraft.prepend(input[0], input[1]);
|
|
60
85
|
case 'chatDraft.discard':
|
|
61
86
|
return md.chatDraft.discard(input[0]);
|
|
62
87
|
}
|
|
63
88
|
}
|
|
89
|
+
function attempted(work) {
|
|
90
|
+
try {
|
|
91
|
+
return Promise.resolve(work());
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return Promise.reject(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function answeredResult(value) {
|
|
98
|
+
return typeof value === 'object' && value !== null && !('pending' in value);
|
|
99
|
+
}
|
|
100
|
+
function answeredMessage(value) {
|
|
101
|
+
if (typeof value !== 'object' || value === null)
|
|
102
|
+
return false;
|
|
103
|
+
return !('result' in value) || answeredResult(value.result);
|
|
104
|
+
}
|
|
64
105
|
export function serveMdRuntime(options) {
|
|
65
106
|
const deploymentFacts = structuredClone(options.deploymentFacts);
|
|
66
107
|
const closing = new AbortController();
|
|
@@ -71,82 +112,108 @@ export function serveMdRuntime(options) {
|
|
|
71
112
|
if (options.signal?.aborted === true)
|
|
72
113
|
close();
|
|
73
114
|
const runtime = composeRuntime({ ...options, signal: closing.signal });
|
|
74
|
-
const { md
|
|
115
|
+
const { md } = runtime;
|
|
75
116
|
const attachments = new Map();
|
|
76
117
|
let authorized = true;
|
|
118
|
+
let opening = null;
|
|
119
|
+
const opened = () => (opening ??= untilAnswered(() => md.loaded(), closing.signal));
|
|
77
120
|
const watchFacts = (deliver) => {
|
|
78
121
|
deliver(structuredClone(deploymentFacts));
|
|
79
122
|
return () => { };
|
|
80
123
|
};
|
|
81
|
-
function attach(port, app, release) {
|
|
124
|
+
function attach(port, app, release, reach, code = 'stored', search = 'unused') {
|
|
82
125
|
if (!authorized)
|
|
83
126
|
throw new Error(AUTHORIZATION_ENDED);
|
|
84
127
|
const writtenBy = release === undefined ? undefined : { app, release };
|
|
85
|
-
|
|
128
|
+
let facts = { target: app, code, space: null, search };
|
|
129
|
+
const view = runtime.within(reach ?? null, facts);
|
|
130
|
+
const observations = new Map();
|
|
131
|
+
const followed = new Set();
|
|
132
|
+
const answeredKeys = new Set();
|
|
133
|
+
let awaited = null;
|
|
86
134
|
let serving = true;
|
|
135
|
+
const answeredQuery = (query) => {
|
|
136
|
+
answeredKeys.add(queryKey(query));
|
|
137
|
+
if (awaited === null || !awaited.keys.every((key) => answeredKeys.has(key)))
|
|
138
|
+
return;
|
|
139
|
+
const { done } = awaited;
|
|
140
|
+
awaited = null;
|
|
141
|
+
done();
|
|
142
|
+
};
|
|
87
143
|
const send = (message) => {
|
|
88
|
-
port.postMessage(
|
|
144
|
+
port.postMessage(message);
|
|
89
145
|
};
|
|
90
146
|
const detach = () => {
|
|
91
147
|
if (!serving)
|
|
92
148
|
return;
|
|
93
149
|
serving = false;
|
|
94
|
-
for (const end of
|
|
150
|
+
for (const end of observations.values())
|
|
151
|
+
end();
|
|
152
|
+
observations.clear();
|
|
153
|
+
for (const end of [...followed])
|
|
95
154
|
end();
|
|
96
|
-
subscriptions.clear();
|
|
97
155
|
attachments.delete(detach);
|
|
98
156
|
};
|
|
157
|
+
const observe = (id, topic, input) => {
|
|
158
|
+
let resolved = false;
|
|
159
|
+
const deliver = (value) => {
|
|
160
|
+
if (!serving)
|
|
161
|
+
return;
|
|
162
|
+
send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });
|
|
163
|
+
resolved = true;
|
|
164
|
+
if (topic === 'query' && answeredMessage(value))
|
|
165
|
+
answeredQuery(input[0]);
|
|
166
|
+
};
|
|
167
|
+
observations.set(id, topic === 'deployment-facts'
|
|
168
|
+
? watchFacts(deliver)
|
|
169
|
+
: (NARROWED.has(WIRE.topics[topic]) ? view : runtime).watch(topic, topic === 'presentation' ? [app] : input, deliver));
|
|
170
|
+
};
|
|
171
|
+
const reply = async (id, query, pending) => {
|
|
172
|
+
try {
|
|
173
|
+
const value = await pending;
|
|
174
|
+
if (!serving)
|
|
175
|
+
return;
|
|
176
|
+
send({ kind: 'result', id, value });
|
|
177
|
+
if (query !== undefined && answeredResult(value))
|
|
178
|
+
answeredQuery(query);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (serving)
|
|
182
|
+
send({ kind: 'failure', id, ...described(error) });
|
|
183
|
+
}
|
|
184
|
+
};
|
|
99
185
|
const serve = async (message) => {
|
|
100
186
|
if (message.kind === 'hello')
|
|
101
187
|
return;
|
|
102
188
|
if (message.kind === 'stop') {
|
|
103
|
-
|
|
104
|
-
|
|
189
|
+
observations.get(message.id)?.();
|
|
190
|
+
observations.delete(message.id);
|
|
105
191
|
return;
|
|
106
192
|
}
|
|
107
193
|
try {
|
|
108
|
-
if (message.kind !== 'observe'
|
|
194
|
+
if (message.kind !== 'observe')
|
|
109
195
|
await md.loaded();
|
|
196
|
+
else if (message.topic !== 'room-drafts')
|
|
197
|
+
await opened();
|
|
110
198
|
if (message.kind === 'observe') {
|
|
111
|
-
|
|
112
|
-
|
|
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));
|
|
199
|
+
if (serving)
|
|
200
|
+
observe(message.id, message.topic, message.input);
|
|
122
201
|
return;
|
|
123
202
|
}
|
|
124
|
-
const value = await answered(md, app, writtenBy, message.member, message.input);
|
|
125
|
-
if (serving)
|
|
126
|
-
send({ kind: 'result', id: message.id, value });
|
|
127
203
|
}
|
|
128
204
|
catch (error) {
|
|
129
|
-
if (serving)
|
|
130
|
-
send({
|
|
131
|
-
|
|
132
|
-
id: message.id,
|
|
133
|
-
message: error instanceof Error ? error.message : String(error),
|
|
134
|
-
});
|
|
135
|
-
}
|
|
205
|
+
if (serving)
|
|
206
|
+
send({ kind: 'failure', id: message.id, ...described(error) });
|
|
207
|
+
return;
|
|
136
208
|
}
|
|
209
|
+
const { id, member, input } = message;
|
|
210
|
+
const pending = attempted(() => answered(NARROWED.has(WIRE.members[member].reach) ? view.md : md, app, writtenBy, member, input));
|
|
211
|
+
return reply(id, member === 'query' ? input[0] : undefined, pending);
|
|
137
212
|
};
|
|
138
213
|
port.addEventListener('message', (event) => {
|
|
139
214
|
if (!serving)
|
|
140
215
|
return;
|
|
141
|
-
const
|
|
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);
|
|
216
|
+
const message = request(event.data);
|
|
150
217
|
if (message === null)
|
|
151
218
|
return;
|
|
152
219
|
void serve(message);
|
|
@@ -154,22 +221,73 @@ export function serveMdRuntime(options) {
|
|
|
154
221
|
port.addEventListener('close', detach);
|
|
155
222
|
port.start();
|
|
156
223
|
attachments.set(detach, send);
|
|
157
|
-
return
|
|
224
|
+
return {
|
|
225
|
+
detach,
|
|
226
|
+
narrow(next) {
|
|
227
|
+
if (serving)
|
|
228
|
+
view.narrow(next);
|
|
229
|
+
},
|
|
230
|
+
code(next, space) {
|
|
231
|
+
if (!serving)
|
|
232
|
+
return;
|
|
233
|
+
facts = { ...facts, code: next, space };
|
|
234
|
+
view.facts(facts);
|
|
235
|
+
},
|
|
236
|
+
search(next) {
|
|
237
|
+
if (!serving)
|
|
238
|
+
return;
|
|
239
|
+
facts = { ...facts, search: next };
|
|
240
|
+
view.facts(facts);
|
|
241
|
+
},
|
|
242
|
+
answered(queries, done) {
|
|
243
|
+
const keys = queries.map(queryKey);
|
|
244
|
+
if (keys.every((key) => answeredKeys.has(key)))
|
|
245
|
+
done();
|
|
246
|
+
else
|
|
247
|
+
awaited = { keys, done };
|
|
248
|
+
},
|
|
249
|
+
readiness(deliver) {
|
|
250
|
+
if (!serving)
|
|
251
|
+
return () => { };
|
|
252
|
+
const stop = view.watch('readiness', [], (value) => {
|
|
253
|
+
if (serving)
|
|
254
|
+
deliver(value);
|
|
255
|
+
});
|
|
256
|
+
const end = () => {
|
|
257
|
+
followed.delete(end);
|
|
258
|
+
stop();
|
|
259
|
+
};
|
|
260
|
+
followed.add(end);
|
|
261
|
+
return end;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
158
264
|
}
|
|
159
265
|
return {
|
|
160
266
|
attach,
|
|
161
|
-
|
|
267
|
+
seed(entry) {
|
|
268
|
+
runtime.seed(entry);
|
|
269
|
+
},
|
|
270
|
+
persisted(answer) {
|
|
271
|
+
runtime.persisted(answer);
|
|
272
|
+
},
|
|
273
|
+
async endAuthorization(holder) {
|
|
162
274
|
authorized = false;
|
|
163
275
|
for (const [detach, send] of [...attachments]) {
|
|
164
276
|
send({ kind: 'ended' });
|
|
165
277
|
detach();
|
|
166
278
|
}
|
|
167
279
|
close();
|
|
168
|
-
await
|
|
169
|
-
|
|
280
|
+
if (!(await options.database.ask({ kind: 'authored.end', holder: holder ?? null }))) {
|
|
281
|
+
await options.shell.dropGeneration();
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
lose(locators) {
|
|
285
|
+
return runtime.lose(locators);
|
|
170
286
|
},
|
|
171
287
|
stop() {
|
|
172
288
|
return runtime.stop();
|
|
173
289
|
},
|
|
174
290
|
};
|
|
175
291
|
}
|
|
292
|
+
export { entrySeedOf } from './seed.js';
|
|
293
|
+
export { createRecovery, retryDelay, } from './recovery.js';
|
package/dist/identity.d.ts
CHANGED
|
@@ -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
|
package/dist/identity.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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,28 @@
|
|
|
1
|
-
export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction,
|
|
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 {
|
|
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, 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, HeldRoom, ListedConversation, MdModelIdentity, Member, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomModels, RoomNotReadable, RoomStream, RoomStreamEvent, RoomVersionAt, ServiceMode, ServiceModeSignal, 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 {
|
|
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, partsChanges } 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 { untilAnswered } from './recovery.js';
|
|
19
|
+
export { entriesIn, patching, sortedKeys } from './shared.js';
|
|
20
|
+
export { attempts, identities, intentOf, type Answered, type Attempt, type Attempts, type Identities, } from './attempt.js';
|
|
21
|
+
export { expectedList, expecting, type ExpectedOf, type Expecting } from './expectation.js';
|
|
12
22
|
export type { RuntimeShell } from './durability.js';
|
|
23
|
+
export type { CodeAvailability, ConnectionAvailability, ConversationCoverage, Durability, HouseOutcome, Installation, InstallationAmount, InstallationStep, Persistence, Readiness, ReadinessStatus, RoomCoverage, RoomPreparation, SearchObligation, Space, TargetCoverage, } from './readiness.js';
|
|
13
24
|
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';
|
|
25
|
+
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
26
|
export type { MdType, ModelIdentity, ModelSnapshot, ModelState, ModelResult, TypesResult, ValidationReceipt, } from './model.js';
|
|
16
27
|
export type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';
|
|
17
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,10 @@
|
|
|
1
|
+
export { departure } from './change.js';
|
|
2
|
+
export { partsAfter, partsChanges } 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 { untilAnswered } from './recovery.js';
|
|
8
|
+
export { entriesIn, patching, sortedKeys } from './shared.js';
|
|
9
|
+
export { attempts, identities, intentOf, } from './attempt.js';
|
|
10
|
+
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
|
+
}
|
package/dist/media.d.ts
ADDED
|
@@ -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,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,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,CA0LN"}
|