@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6dd3e87e3f5e
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 +18 -15
- package/dist/adapter.d.ts +125 -50
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +38 -4
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +27 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +184 -85
- 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 -63
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/client.d.ts +25 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +97 -11
- package/dist/collection.d.ts +10 -7
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +38 -79
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +786 -0
- package/dist/connection.d.ts +44 -17
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3496 -976
- package/dist/conversation.d.ts +33 -14
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +571 -242
- 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 +6 -3
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -23
- 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 +12 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +125 -19
- package/dist/identity.d.ts +1 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +3 -0
- package/dist/index.d.ts +16 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +123 -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 +14 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +198 -94
- 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 +9 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +8 -2
- 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 +20 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +113 -12
- 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 +45 -7
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +39 -0
- package/dist/overlay.d.ts +3 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +100 -182
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/query.d.ts +66 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +48 -7
- package/dist/reach.d.ts +18 -6
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +220 -73
- package/dist/react.d.ts +8 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- 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 +16 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +115 -51
- package/dist/replica.d.ts +55 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +297 -154
- package/dist/room-draft.d.ts +34 -4
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +105 -31
- package/dist/rows.d.ts +37 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +173 -104
- package/dist/save.d.ts +53 -9
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +537 -170
- package/dist/search.d.ts +39 -28
- 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 +5 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -1
- package/dist/store.d.ts +96 -80
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +306 -523
- 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 +164 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +55 -31
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +156 -0
- package/package.json +18 -19
- package/AGENTS.md +0 -299
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/context.js +0 -10
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -620
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -33
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -440
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { sameChange } from './overlay.js';
|
|
2
|
+
const ATTACHMENTS = 'attachments';
|
|
3
|
+
function lastName(path) {
|
|
4
|
+
return path.slice(path.lastIndexOf('/') + 1);
|
|
5
|
+
}
|
|
2
6
|
const FIXTURE_RETENTION = {
|
|
3
7
|
history: { kind: 'duration', seconds: 1 },
|
|
4
|
-
outcome:
|
|
8
|
+
outcome: 604_800,
|
|
5
9
|
refreshHorizon: 1,
|
|
6
10
|
};
|
|
7
11
|
function declaredRetention(value) {
|
|
@@ -15,12 +19,7 @@ function declaredRetention(value) {
|
|
|
15
19
|
}
|
|
16
20
|
const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
|
|
17
21
|
function modelsOf(room) {
|
|
18
|
-
return {
|
|
19
|
-
collection: room.model ?? MODEL_ABSENT,
|
|
20
|
-
...(room.typedSelection === undefined
|
|
21
|
-
? {}
|
|
22
|
-
: { selection: room.selectionModel ?? MODEL_ABSENT }),
|
|
23
|
-
};
|
|
22
|
+
return { collection: room.model ?? MODEL_ABSENT };
|
|
24
23
|
}
|
|
25
24
|
function changedModels(room, from) {
|
|
26
25
|
const now = modelsOf(room);
|
|
@@ -53,12 +52,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
53
52
|
const listeners = new Set();
|
|
54
53
|
const modeObservers = new Set();
|
|
55
54
|
const scripted = new Map();
|
|
56
|
-
const unsealed = new Map();
|
|
57
|
-
const sealed = new Set();
|
|
58
55
|
const sentTurns = new Map();
|
|
59
56
|
const historyPageSize = options.historyPageSize;
|
|
60
|
-
|
|
57
|
+
const attached = new Map();
|
|
58
|
+
const linked = new WeakMap();
|
|
59
|
+
const carried = new Map();
|
|
61
60
|
let expiring = [];
|
|
61
|
+
let openings = 0;
|
|
62
|
+
const declaredRooms = new Set();
|
|
62
63
|
let replicated = [];
|
|
63
64
|
let issued = 0;
|
|
64
65
|
function scriptConversations(entries) {
|
|
@@ -87,6 +88,19 @@ export function createMemoryAdapter(options = {}) {
|
|
|
87
88
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
88
89
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
89
90
|
}
|
|
91
|
+
function heldBlob(room, path) {
|
|
92
|
+
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
93
|
+
}
|
|
94
|
+
function freePath(room, name) {
|
|
95
|
+
const dot = name.lastIndexOf('.');
|
|
96
|
+
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
97
|
+
const extension = dot > 0 ? name.slice(dot) : '';
|
|
98
|
+
for (let count = 1;; count += 1) {
|
|
99
|
+
const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
|
|
100
|
+
if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
|
|
101
|
+
return path;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
90
104
|
function retain(entries) {
|
|
91
105
|
for (const room of entries) {
|
|
92
106
|
note(room.locator, room);
|
|
@@ -122,22 +136,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
122
136
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
123
137
|
documents: named(room.documents ?? {}, taken),
|
|
124
138
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
139
|
+
...(room.fileIds === undefined
|
|
140
|
+
? {}
|
|
141
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
125
142
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
126
143
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
144
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
127
145
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
128
146
|
};
|
|
129
147
|
}
|
|
130
|
-
function
|
|
148
|
+
function foldersMoved(room, from) {
|
|
149
|
+
const now = new Set(room.folders ?? []);
|
|
150
|
+
const before = new Set(from.folders ?? []);
|
|
151
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
152
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
153
|
+
return {
|
|
154
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
155
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function advancement(room, from, at, whole = false) {
|
|
131
159
|
const current = room.documents ?? {};
|
|
132
160
|
const previous = from.documents ?? {};
|
|
133
161
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
134
162
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
135
163
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
164
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
136
165
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
137
166
|
const changed = Object.keys(current)
|
|
138
167
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
139
168
|
.sort();
|
|
140
|
-
const size = pageSize ?? changed.length;
|
|
169
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
141
170
|
const taken = changed.slice(at, at + size);
|
|
142
171
|
const next = at + taken.length;
|
|
143
172
|
const opening = at === 0;
|
|
@@ -154,8 +183,12 @@ export function createMemoryAdapter(options = {}) {
|
|
|
154
183
|
...(models === undefined ? {} : { models }),
|
|
155
184
|
documents: named(current, taken),
|
|
156
185
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
186
|
+
...(room.fileIds === undefined
|
|
187
|
+
? {}
|
|
188
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
157
189
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
158
190
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
191
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
159
192
|
removals: opening
|
|
160
193
|
? [
|
|
161
194
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -165,6 +198,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
165
198
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
166
199
|
};
|
|
167
200
|
}
|
|
201
|
+
function carry(locator) {
|
|
202
|
+
const at = carried.get(locator);
|
|
203
|
+
const current = rooms.find((entry) => entry.locator === locator);
|
|
204
|
+
if (at === undefined || current === undefined || current.roomVersion === at)
|
|
205
|
+
return;
|
|
206
|
+
const from = served.get(locator)?.get(at);
|
|
207
|
+
carried.set(locator, current.roomVersion);
|
|
208
|
+
if (from === undefined)
|
|
209
|
+
return;
|
|
210
|
+
const page = advancement(current, from, 0, true);
|
|
211
|
+
for (const observer of observers) {
|
|
212
|
+
observer({
|
|
213
|
+
kind: 'room-change',
|
|
214
|
+
locator,
|
|
215
|
+
from: at,
|
|
216
|
+
roomVersion: current.roomVersion,
|
|
217
|
+
read: async () => page,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
168
221
|
function pageOf(conversation, after) {
|
|
169
222
|
const messages = conversation.messages ?? [];
|
|
170
223
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -179,16 +232,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
179
232
|
: {}),
|
|
180
233
|
};
|
|
181
234
|
}
|
|
182
|
-
function historiesOf(
|
|
183
|
-
const asked = input?.conversations;
|
|
184
|
-
if (!Array.isArray(asked))
|
|
185
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
235
|
+
function historiesOf(request) {
|
|
186
236
|
const histories = [];
|
|
187
|
-
for (const entry of
|
|
188
|
-
const conversation =
|
|
237
|
+
for (const entry of request.conversations) {
|
|
238
|
+
const conversation = scripted.get(entry.conversation);
|
|
189
239
|
if (conversation === undefined)
|
|
190
240
|
continue;
|
|
191
|
-
const outcome = conversation.outcomes?.
|
|
241
|
+
const outcome = conversation.outcomes?.history;
|
|
192
242
|
if (outcome !== undefined)
|
|
193
243
|
return outcome;
|
|
194
244
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -199,15 +249,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
199
249
|
function conversationAction(request) {
|
|
200
250
|
const name = request.name;
|
|
201
251
|
const input = (request.input ?? {});
|
|
202
|
-
if (name === '
|
|
203
|
-
return historiesOf(request.input);
|
|
204
|
-
if (name === 'conversation.create') {
|
|
252
|
+
if (name === 'conversations/create') {
|
|
205
253
|
issued += 1;
|
|
206
254
|
const conversation = `conversation-${issued}`;
|
|
207
255
|
scripted.set(conversation, { conversation });
|
|
208
|
-
return { kind: 'action', result: { conversation } };
|
|
256
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
209
257
|
}
|
|
210
|
-
const named = typeof input.
|
|
258
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
211
259
|
const conversation = scripted.get(named);
|
|
212
260
|
if (conversation === undefined) {
|
|
213
261
|
return {
|
|
@@ -220,32 +268,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
220
268
|
const outcome = conversation.outcomes?.[name];
|
|
221
269
|
if (outcome !== undefined)
|
|
222
270
|
return outcome;
|
|
223
|
-
if (name === '
|
|
271
|
+
if (name === 'conversations/send') {
|
|
224
272
|
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
225
273
|
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
226
274
|
if (answered !== undefined)
|
|
227
|
-
return { kind: 'action', result: {
|
|
275
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
228
276
|
issued += 1;
|
|
229
277
|
const turn = `turn-${issued}`;
|
|
230
|
-
unsealed.set(turn, named);
|
|
231
278
|
if (operation !== null)
|
|
232
279
|
sentTurns.set(operation, turn);
|
|
233
|
-
return { kind: 'action', result: { turn } };
|
|
234
|
-
}
|
|
235
|
-
if (name === 'conversation.cancel') {
|
|
236
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
237
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
238
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
239
|
-
}
|
|
240
|
-
unsealed.delete(turn);
|
|
241
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
280
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
242
281
|
}
|
|
243
|
-
if (name === '
|
|
282
|
+
if (name === 'conversations/delete')
|
|
244
283
|
scripted.delete(named);
|
|
245
|
-
return { kind: 'action', result: {
|
|
284
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
246
285
|
}
|
|
247
286
|
function announceList() {
|
|
248
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
287
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
288
|
+
? []
|
|
289
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
|
|
249
290
|
for (const listener of listeners)
|
|
250
291
|
listener({ kind: 'list', entries });
|
|
251
292
|
}
|
|
@@ -259,8 +300,41 @@ export function createMemoryAdapter(options = {}) {
|
|
|
259
300
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
260
301
|
};
|
|
261
302
|
}
|
|
303
|
+
function discovered() {
|
|
304
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
305
|
+
if (answer.kind === 'discovery')
|
|
306
|
+
for (const room of answer.rooms)
|
|
307
|
+
note(room.locator, room);
|
|
308
|
+
return answer;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
function opened(notify) {
|
|
312
|
+
const opening = ++openings;
|
|
313
|
+
notify({ kind: 'opened' });
|
|
314
|
+
void discovered()
|
|
315
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
316
|
+
.then((answer) => {
|
|
317
|
+
if (opening !== openings)
|
|
318
|
+
return;
|
|
319
|
+
if (answer.kind !== 'discovery') {
|
|
320
|
+
openings += 1;
|
|
321
|
+
carried.clear();
|
|
322
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
323
|
+
notify({ kind: 'closed', revoked, lost: !revoked });
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
declaredRooms.clear();
|
|
327
|
+
for (const room of answer.rooms)
|
|
328
|
+
declaredRooms.add(room.locator);
|
|
329
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
function emitAll(event) {
|
|
333
|
+
for (const observer of observers)
|
|
334
|
+
observer(event);
|
|
335
|
+
}
|
|
262
336
|
return {
|
|
263
|
-
...(options.
|
|
337
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
264
338
|
setRooms(next) {
|
|
265
339
|
rooms = [...next];
|
|
266
340
|
retain(rooms);
|
|
@@ -269,26 +343,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
269
343
|
scriptConversations(next);
|
|
270
344
|
},
|
|
271
345
|
open() {
|
|
346
|
+
carried.clear();
|
|
272
347
|
announceList();
|
|
273
|
-
|
|
274
|
-
observer({ kind: 'opened' });
|
|
348
|
+
opened(emitAll);
|
|
275
349
|
},
|
|
276
|
-
close(revoked = false) {
|
|
277
|
-
|
|
278
|
-
|
|
350
|
+
close({ revoked = false, lost = !revoked } = {}) {
|
|
351
|
+
openings += 1;
|
|
352
|
+
carried.clear();
|
|
353
|
+
emitAll({ kind: 'closed', revoked, lost });
|
|
279
354
|
},
|
|
280
355
|
expire(locators) {
|
|
281
356
|
expiring = [...locators];
|
|
282
357
|
},
|
|
283
|
-
notifyRoomVersion({ locator
|
|
284
|
-
|
|
285
|
-
|
|
358
|
+
notifyRoomVersion({ locator }) {
|
|
359
|
+
carry(locator);
|
|
360
|
+
},
|
|
361
|
+
notifyAuthorityChanged(locators) {
|
|
362
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
363
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
364
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
365
|
+
for (const room of listed)
|
|
366
|
+
declaredRooms.add(room.locator);
|
|
367
|
+
for (const locator of left)
|
|
368
|
+
declaredRooms.delete(locator);
|
|
369
|
+
emitAll({
|
|
370
|
+
kind: 'authority-changed',
|
|
371
|
+
rooms: listed.map(declared),
|
|
372
|
+
left,
|
|
373
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
374
|
+
});
|
|
286
375
|
},
|
|
287
376
|
notifyConversation(event) {
|
|
288
|
-
if (event.kind === 'accepted-message') {
|
|
289
|
-
sealed.add(event.message.turn);
|
|
290
|
-
unsealed.delete(event.message.turn);
|
|
291
|
-
}
|
|
292
377
|
for (const listener of listeners)
|
|
293
378
|
listener(event);
|
|
294
379
|
},
|
|
@@ -297,7 +382,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
297
382
|
observer(mode);
|
|
298
383
|
},
|
|
299
384
|
heldRooms() {
|
|
300
|
-
return
|
|
385
|
+
return [...carried.keys()].sort();
|
|
301
386
|
},
|
|
302
387
|
replicatedConversations() {
|
|
303
388
|
return replicated;
|
|
@@ -312,6 +397,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
312
397
|
listeners.delete(notify);
|
|
313
398
|
};
|
|
314
399
|
},
|
|
400
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
401
|
+
...(options.agents === undefined
|
|
402
|
+
? {}
|
|
403
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
315
404
|
},
|
|
316
405
|
serviceMode: {
|
|
317
406
|
observe(notify) {
|
|
@@ -323,29 +412,29 @@ export function createMemoryAdapter(options = {}) {
|
|
|
323
412
|
},
|
|
324
413
|
roomStream: {
|
|
325
414
|
hold(asked) {
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
expiring = [];
|
|
329
|
-
const moved = asked.flatMap((room) => {
|
|
415
|
+
const named = asked.map((room) => room.locator);
|
|
416
|
+
const unknown = asked.flatMap((room) => {
|
|
330
417
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
331
418
|
return current === undefined ||
|
|
332
|
-
|
|
333
|
-
|
|
419
|
+
current.roomVersion === room.roomVersion ||
|
|
420
|
+
served.get(room.locator)?.has(room.roomVersion) === true
|
|
334
421
|
? []
|
|
335
|
-
: [
|
|
422
|
+
: [room.locator];
|
|
336
423
|
});
|
|
424
|
+
const expired = [
|
|
425
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
426
|
+
];
|
|
427
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
337
428
|
queueMicrotask(() => {
|
|
338
|
-
for (const
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
429
|
+
for (const room of asked) {
|
|
430
|
+
if (expired.includes(room.locator))
|
|
431
|
+
carried.delete(room.locator);
|
|
432
|
+
else {
|
|
433
|
+
carried.set(room.locator, room.roomVersion);
|
|
434
|
+
carry(room.locator);
|
|
435
|
+
}
|
|
342
436
|
}
|
|
343
|
-
|
|
344
|
-
},
|
|
345
|
-
reopen() {
|
|
346
|
-
queueMicrotask(() => {
|
|
347
|
-
for (const observer of observers)
|
|
348
|
-
observer({ kind: 'closed', revoked: false });
|
|
437
|
+
emitAll({ kind: 'caught-up', expired });
|
|
349
438
|
});
|
|
350
439
|
},
|
|
351
440
|
observe(notify) {
|
|
@@ -354,11 +443,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
354
443
|
if (!observers.has(notify))
|
|
355
444
|
return;
|
|
356
445
|
if (options.unopened === true) {
|
|
357
|
-
notify({ kind: 'closed', revoked: false });
|
|
446
|
+
notify({ kind: 'closed', revoked: false, lost: true });
|
|
358
447
|
return;
|
|
359
448
|
}
|
|
360
449
|
announceList();
|
|
361
|
-
|
|
450
|
+
opened((event) => {
|
|
451
|
+
if (observers.has(notify))
|
|
452
|
+
notify(event);
|
|
453
|
+
});
|
|
362
454
|
});
|
|
363
455
|
return () => {
|
|
364
456
|
observers.delete(notify);
|
|
@@ -375,12 +467,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
375
467
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
376
468
|
},
|
|
377
469
|
async discover(_authorization) {
|
|
378
|
-
return
|
|
379
|
-
if (answer.kind === 'discovery')
|
|
380
|
-
for (const room of answer.rooms)
|
|
381
|
-
note(room.locator, room);
|
|
382
|
-
return answer;
|
|
383
|
-
});
|
|
470
|
+
return discovered();
|
|
384
471
|
},
|
|
385
472
|
reached,
|
|
386
473
|
follows(locator, roomVersion, next) {
|
|
@@ -437,7 +524,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
437
524
|
retryable: false,
|
|
438
525
|
affected: {},
|
|
439
526
|
};
|
|
440
|
-
}, request).then((answer) =>
|
|
527
|
+
}, request).then((answer) => {
|
|
528
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
529
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
530
|
+
note(destination, answer.destination);
|
|
531
|
+
}
|
|
532
|
+
return note(request.locator, answer);
|
|
533
|
+
});
|
|
441
534
|
},
|
|
442
535
|
async history(_authorization, request) {
|
|
443
536
|
return resolveScript(scripts.history, () => {
|
|
@@ -453,31 +546,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
453
546
|
},
|
|
454
547
|
async binary(_authorization, request) {
|
|
455
548
|
return resolveScript(scripts.binary, () => {
|
|
456
|
-
if (request.kind === 'reference') {
|
|
457
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
458
|
-
}
|
|
459
549
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
460
550
|
if (room === undefined)
|
|
461
551
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
462
|
-
const blob = room
|
|
552
|
+
const blob = heldBlob(room, request.path);
|
|
463
553
|
return blob === undefined
|
|
464
554
|
? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
|
|
465
|
-
: { kind: 'binary', blob };
|
|
555
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
466
556
|
}, request);
|
|
467
557
|
},
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
558
|
+
async link(_authorization, request) {
|
|
559
|
+
return resolveScript(scripts.link, () => {
|
|
560
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
561
|
+
if (room === undefined)
|
|
562
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
563
|
+
const blob = heldBlob(room, request.path);
|
|
564
|
+
if (blob === undefined) {
|
|
565
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
566
|
+
}
|
|
567
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
568
|
+
linked.set(blob, url);
|
|
569
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
570
|
+
}, request);
|
|
571
|
+
},
|
|
572
|
+
async attach(_authorization, request) {
|
|
573
|
+
return resolveScript(scripts.attach, () => {
|
|
574
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
575
|
+
if (room === undefined)
|
|
576
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
577
|
+
const path = freePath(room, request.name);
|
|
578
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
579
|
+
return { kind: 'attached', path, revision: `attached-${attached.size}` };
|
|
580
|
+
}, request);
|
|
477
581
|
},
|
|
478
582
|
async action(_authorization, request) {
|
|
479
583
|
return resolveScript(scripts.action, () => {
|
|
480
|
-
if (request.name.startsWith('
|
|
584
|
+
if (request.name.startsWith('conversations/'))
|
|
481
585
|
return conversationAction(request);
|
|
482
586
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
483
587
|
}, request).then((answer) => {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { Connection } from './tables.js';
|
|
3
|
+
export declare const MESSAGE_TABLES: readonly string[];
|
|
4
|
+
export type HeldConversation = {
|
|
5
|
+
readonly conversation: string;
|
|
6
|
+
readonly read: string | null | undefined;
|
|
7
|
+
readonly partial: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type MessageWindow = {
|
|
10
|
+
readonly messages: AcceptedMessage[];
|
|
11
|
+
readonly more: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ConversationWrite = {
|
|
14
|
+
readonly conversation: string;
|
|
15
|
+
readonly messages: readonly AcceptedMessage[];
|
|
16
|
+
readonly read?: {
|
|
17
|
+
readonly at: string | null;
|
|
18
|
+
readonly partial: boolean;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function heldConversations(connection: Connection): HeldConversation[];
|
|
22
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
23
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null): MessageWindow;
|
|
24
|
+
export declare function messageCount(connection: Connection, conversation: string): number;
|
|
25
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
26
|
+
export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
|
|
27
|
+
export declare function forgottenMessages(connection: Connection): void;
|
|
28
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3E,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAmB5E;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAClD,IAAI,CAoCN;AAYD,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GACvC,aAAa,CAUf;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAW9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { indexMessage, unindexMessages } from './fulltext.js';
|
|
2
|
+
export const MESSAGE_TABLES = [
|
|
3
|
+
'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
|
|
4
|
+
'CREATE TABLE conversation_messages (id INTEGER PRIMARY KEY, conversation TEXT NOT NULL, identity TEXT NOT NULL, turn TEXT NOT NULL, position TEXT NOT NULL, message TEXT NOT NULL, text TEXT NOT NULL)',
|
|
5
|
+
'CREATE UNIQUE INDEX conversation_messages_identity ON conversation_messages (conversation, identity)',
|
|
6
|
+
'CREATE INDEX conversation_messages_position ON conversation_messages (conversation, position, identity)',
|
|
7
|
+
'CREATE INDEX conversation_messages_turn ON conversation_messages (conversation, turn)',
|
|
8
|
+
];
|
|
9
|
+
function text(value) {
|
|
10
|
+
return typeof value === 'string' ? value : String(value);
|
|
11
|
+
}
|
|
12
|
+
export function heldConversations(connection) {
|
|
13
|
+
const held = new Map();
|
|
14
|
+
for (const row of connection.rows('SELECT conversation, read, partial FROM conversation_reads')) {
|
|
15
|
+
held.set(text(row.conversation), {
|
|
16
|
+
conversation: text(row.conversation),
|
|
17
|
+
read: row.read === null ? null : text(row.read),
|
|
18
|
+
partial: Number(row.partial) === 1,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
for (const row of connection.rows('SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)')) {
|
|
22
|
+
held.set(text(row.conversation), {
|
|
23
|
+
conversation: text(row.conversation),
|
|
24
|
+
read: undefined,
|
|
25
|
+
partial: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return [...held.values()];
|
|
29
|
+
}
|
|
30
|
+
export function keptMessages(connection, { conversation, messages, read }) {
|
|
31
|
+
for (const message of messages) {
|
|
32
|
+
const [held] = connection.rows('SELECT id FROM conversation_messages WHERE conversation = ? AND identity = ?', [conversation, message.identity]);
|
|
33
|
+
const record = [
|
|
34
|
+
message.turn,
|
|
35
|
+
message.position,
|
|
36
|
+
JSON.stringify(message.message ?? null),
|
|
37
|
+
message.text,
|
|
38
|
+
];
|
|
39
|
+
let id;
|
|
40
|
+
if (held === undefined) {
|
|
41
|
+
connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
|
|
42
|
+
id = Number(connection.rows('SELECT last_insert_rowid() AS id')[0].id);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
id = Number(held.id);
|
|
46
|
+
unindexMessages(connection, [id]);
|
|
47
|
+
connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, id]);
|
|
48
|
+
}
|
|
49
|
+
indexMessage(connection, id, message.text);
|
|
50
|
+
}
|
|
51
|
+
if (read !== undefined) {
|
|
52
|
+
connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function accepted(row) {
|
|
57
|
+
return {
|
|
58
|
+
identity: text(row.identity),
|
|
59
|
+
turn: text(row.turn),
|
|
60
|
+
position: text(row.position),
|
|
61
|
+
text: text(row.text),
|
|
62
|
+
message: JSON.parse(text(row.message)),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function messageWindow(connection, conversation, limit, before) {
|
|
66
|
+
const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
|
|
67
|
+
? [conversation, limit + 1]
|
|
68
|
+
: [conversation, before[0], before[0], before[1], limit + 1]);
|
|
69
|
+
return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
|
|
70
|
+
}
|
|
71
|
+
export function messageCount(connection, conversation) {
|
|
72
|
+
const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
|
|
73
|
+
return Number(counted?.held ?? 0);
|
|
74
|
+
}
|
|
75
|
+
export function turnArrived(connection, conversation, turn) {
|
|
76
|
+
return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
|
|
77
|
+
}
|
|
78
|
+
export function droppedMessages(connection, conversations) {
|
|
79
|
+
for (const conversation of conversations) {
|
|
80
|
+
unindexMessages(connection, connection
|
|
81
|
+
.rows('SELECT id FROM conversation_messages WHERE conversation = ?', [conversation])
|
|
82
|
+
.map((row) => Number(row.id)));
|
|
83
|
+
connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
|
|
84
|
+
connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function forgottenMessages(connection) {
|
|
88
|
+
connection.run('DELETE FROM conversation_messages');
|
|
89
|
+
connection.run('DELETE FROM conversation_reads');
|
|
90
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -28,13 +28,19 @@ export type ModelState = {
|
|
|
28
28
|
verifiedWith: ModelIdentity;
|
|
29
29
|
types: VerifiedModel['types'];
|
|
30
30
|
};
|
|
31
|
-
export type
|
|
31
|
+
export type StoredModel = Extract<ModelState, {
|
|
32
32
|
status: 'unavailable';
|
|
33
|
+
}> | Omit<Extract<ModelState, {
|
|
34
|
+
status: 'current' | 'cached';
|
|
35
|
+
}>, 'types'>;
|
|
36
|
+
export type TypesResult = {
|
|
37
|
+
status: Open<'unavailable'>;
|
|
33
38
|
reason: ModelUnavailableReason;
|
|
39
|
+
types: null;
|
|
34
40
|
schema?: string | null;
|
|
35
41
|
revision?: string | null;
|
|
36
42
|
} | {
|
|
37
|
-
status: 'current' | 'cached'
|
|
43
|
+
status: Open<'current' | 'cached'>;
|
|
38
44
|
identity: string;
|
|
39
45
|
version: string;
|
|
40
46
|
verifiedWith: ModelIdentity;
|
|
@@ -50,6 +56,7 @@ export type ValidationReceipt = {
|
|
|
50
56
|
export declare const NO_MODEL: ModelState;
|
|
51
57
|
export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
|
|
52
58
|
export declare function modelTypes(state: ModelState): TypesResult;
|
|
59
|
+
export declare function storedModel(state: ModelState): StoredModel;
|
|
53
60
|
export declare function cached(state: ModelState): ModelState;
|
|
54
61
|
export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
|
|
55
62
|
export declare function referenceField(facts: ValueFacts | undefined): boolean;
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AACnG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IACE,MAAM,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|