@agentshouse/mdruntime 0.1.0-cf96c797c5fa8 → 0.1.0-cf9a84afc6def
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 +117 -49
- 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/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- 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 -81
- 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 +26 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +98 -12
- 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 -16
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3561 -965
- package/dist/conversation.d.ts +36 -16
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +659 -254
- 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/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 +13 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +128 -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 -5
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +204 -92
- 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 +49 -7
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +40 -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 +221 -74
- 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 +52 -9
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +539 -171
- 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 +102 -76
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +313 -443
- 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 +27 -24
- package/AGENTS.md +0 -318
- package/dist/chat/acts.d.ts +0 -34
- 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 -20
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -59
- package/dist/chat/markdown.d.ts +0 -19
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -187
- 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 -645
- 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,11 +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
|
|
57
|
-
const sealed = new Set();
|
|
55
|
+
const sentTurns = new Map();
|
|
58
56
|
const historyPageSize = options.historyPageSize;
|
|
59
|
-
|
|
57
|
+
const attached = new Map();
|
|
58
|
+
const linked = new WeakMap();
|
|
59
|
+
const carried = new Map();
|
|
60
60
|
let expiring = [];
|
|
61
|
+
let openings = 0;
|
|
62
|
+
const declaredRooms = new Set();
|
|
61
63
|
let replicated = [];
|
|
62
64
|
let issued = 0;
|
|
63
65
|
function scriptConversations(entries) {
|
|
@@ -86,6 +88,19 @@ export function createMemoryAdapter(options = {}) {
|
|
|
86
88
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
87
89
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
88
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
|
+
}
|
|
89
104
|
function retain(entries) {
|
|
90
105
|
for (const room of entries) {
|
|
91
106
|
note(room.locator, room);
|
|
@@ -121,22 +136,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
121
136
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
122
137
|
documents: named(room.documents ?? {}, taken),
|
|
123
138
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
139
|
+
...(room.fileIds === undefined
|
|
140
|
+
? {}
|
|
141
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
124
142
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
125
143
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
144
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
126
145
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
127
146
|
};
|
|
128
147
|
}
|
|
129
|
-
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) {
|
|
130
159
|
const current = room.documents ?? {};
|
|
131
160
|
const previous = from.documents ?? {};
|
|
132
161
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
133
162
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
134
163
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
164
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
135
165
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
136
166
|
const changed = Object.keys(current)
|
|
137
167
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
138
168
|
.sort();
|
|
139
|
-
const size = pageSize ?? changed.length;
|
|
169
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
140
170
|
const taken = changed.slice(at, at + size);
|
|
141
171
|
const next = at + taken.length;
|
|
142
172
|
const opening = at === 0;
|
|
@@ -153,8 +183,12 @@ export function createMemoryAdapter(options = {}) {
|
|
|
153
183
|
...(models === undefined ? {} : { models }),
|
|
154
184
|
documents: named(current, taken),
|
|
155
185
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
186
|
+
...(room.fileIds === undefined
|
|
187
|
+
? {}
|
|
188
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
156
189
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
157
190
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
191
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
158
192
|
removals: opening
|
|
159
193
|
? [
|
|
160
194
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -164,6 +198,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
164
198
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
165
199
|
};
|
|
166
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
|
+
}
|
|
167
221
|
function pageOf(conversation, after) {
|
|
168
222
|
const messages = conversation.messages ?? [];
|
|
169
223
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -178,16 +232,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
178
232
|
: {}),
|
|
179
233
|
};
|
|
180
234
|
}
|
|
181
|
-
function historiesOf(
|
|
182
|
-
const asked = input?.conversations;
|
|
183
|
-
if (!Array.isArray(asked))
|
|
184
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
235
|
+
function historiesOf(request) {
|
|
185
236
|
const histories = [];
|
|
186
|
-
for (const entry of
|
|
187
|
-
const conversation =
|
|
237
|
+
for (const entry of request.conversations) {
|
|
238
|
+
const conversation = scripted.get(entry.conversation);
|
|
188
239
|
if (conversation === undefined)
|
|
189
240
|
continue;
|
|
190
|
-
const outcome = conversation.outcomes?.
|
|
241
|
+
const outcome = conversation.outcomes?.history;
|
|
191
242
|
if (outcome !== undefined)
|
|
192
243
|
return outcome;
|
|
193
244
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -198,15 +249,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
198
249
|
function conversationAction(request) {
|
|
199
250
|
const name = request.name;
|
|
200
251
|
const input = (request.input ?? {});
|
|
201
|
-
if (name === '
|
|
202
|
-
return historiesOf(request.input);
|
|
203
|
-
if (name === 'conversation.create') {
|
|
252
|
+
if (name === 'conversations/create') {
|
|
204
253
|
issued += 1;
|
|
205
254
|
const conversation = `conversation-${issued}`;
|
|
206
255
|
scripted.set(conversation, { conversation });
|
|
207
|
-
return { kind: 'action', result: { conversation } };
|
|
256
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
208
257
|
}
|
|
209
|
-
const named = typeof input.
|
|
258
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
210
259
|
const conversation = scripted.get(named);
|
|
211
260
|
if (conversation === undefined) {
|
|
212
261
|
return {
|
|
@@ -219,26 +268,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
219
268
|
const outcome = conversation.outcomes?.[name];
|
|
220
269
|
if (outcome !== undefined)
|
|
221
270
|
return outcome;
|
|
222
|
-
if (name === '
|
|
271
|
+
if (name === 'conversations/send') {
|
|
272
|
+
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
273
|
+
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
274
|
+
if (answered !== undefined)
|
|
275
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
223
276
|
issued += 1;
|
|
224
277
|
const turn = `turn-${issued}`;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (name === 'conversation.cancel') {
|
|
229
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
230
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
231
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
232
|
-
}
|
|
233
|
-
unsealed.delete(turn);
|
|
234
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
278
|
+
if (operation !== null)
|
|
279
|
+
sentTurns.set(operation, turn);
|
|
280
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
235
281
|
}
|
|
236
|
-
if (name === '
|
|
282
|
+
if (name === 'conversations/delete')
|
|
237
283
|
scripted.delete(named);
|
|
238
|
-
return { kind: 'action', result: {
|
|
284
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
239
285
|
}
|
|
240
286
|
function announceList() {
|
|
241
|
-
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 }]);
|
|
242
290
|
for (const listener of listeners)
|
|
243
291
|
listener({ kind: 'list', entries });
|
|
244
292
|
}
|
|
@@ -252,7 +300,41 @@ export function createMemoryAdapter(options = {}) {
|
|
|
252
300
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
253
301
|
};
|
|
254
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
|
+
}
|
|
255
336
|
return {
|
|
337
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
256
338
|
setRooms(next) {
|
|
257
339
|
rooms = [...next];
|
|
258
340
|
retain(rooms);
|
|
@@ -261,26 +343,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
261
343
|
scriptConversations(next);
|
|
262
344
|
},
|
|
263
345
|
open() {
|
|
346
|
+
carried.clear();
|
|
264
347
|
announceList();
|
|
265
|
-
|
|
266
|
-
observer({ kind: 'opened' });
|
|
348
|
+
opened(emitAll);
|
|
267
349
|
},
|
|
268
|
-
close(revoked = false) {
|
|
269
|
-
|
|
270
|
-
|
|
350
|
+
close({ revoked = false, lost = !revoked } = {}) {
|
|
351
|
+
openings += 1;
|
|
352
|
+
carried.clear();
|
|
353
|
+
emitAll({ kind: 'closed', revoked, lost });
|
|
271
354
|
},
|
|
272
355
|
expire(locators) {
|
|
273
356
|
expiring = [...locators];
|
|
274
357
|
},
|
|
275
|
-
notifyRoomVersion({ locator
|
|
276
|
-
|
|
277
|
-
|
|
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
|
+
});
|
|
278
375
|
},
|
|
279
376
|
notifyConversation(event) {
|
|
280
|
-
if (event.kind === 'accepted-message') {
|
|
281
|
-
sealed.add(event.message.turn);
|
|
282
|
-
unsealed.delete(event.message.turn);
|
|
283
|
-
}
|
|
284
377
|
for (const listener of listeners)
|
|
285
378
|
listener(event);
|
|
286
379
|
},
|
|
@@ -289,7 +382,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
289
382
|
observer(mode);
|
|
290
383
|
},
|
|
291
384
|
heldRooms() {
|
|
292
|
-
return
|
|
385
|
+
return [...carried.keys()].sort();
|
|
293
386
|
},
|
|
294
387
|
replicatedConversations() {
|
|
295
388
|
return replicated;
|
|
@@ -304,6 +397,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
304
397
|
listeners.delete(notify);
|
|
305
398
|
};
|
|
306
399
|
},
|
|
400
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
401
|
+
...(options.agents === undefined
|
|
402
|
+
? {}
|
|
403
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
307
404
|
},
|
|
308
405
|
serviceMode: {
|
|
309
406
|
observe(notify) {
|
|
@@ -315,29 +412,29 @@ export function createMemoryAdapter(options = {}) {
|
|
|
315
412
|
},
|
|
316
413
|
roomStream: {
|
|
317
414
|
hold(asked) {
|
|
318
|
-
|
|
319
|
-
const
|
|
320
|
-
expiring = [];
|
|
321
|
-
const moved = asked.flatMap((room) => {
|
|
415
|
+
const named = asked.map((room) => room.locator);
|
|
416
|
+
const unknown = asked.flatMap((room) => {
|
|
322
417
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
323
418
|
return current === undefined ||
|
|
324
|
-
|
|
325
|
-
|
|
419
|
+
current.roomVersion === room.roomVersion ||
|
|
420
|
+
served.get(room.locator)?.has(room.roomVersion) === true
|
|
326
421
|
? []
|
|
327
|
-
: [
|
|
422
|
+
: [room.locator];
|
|
328
423
|
});
|
|
424
|
+
const expired = [
|
|
425
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
426
|
+
];
|
|
427
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
329
428
|
queueMicrotask(() => {
|
|
330
|
-
for (const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
+
}
|
|
334
436
|
}
|
|
335
|
-
|
|
336
|
-
},
|
|
337
|
-
reopen() {
|
|
338
|
-
queueMicrotask(() => {
|
|
339
|
-
for (const observer of observers)
|
|
340
|
-
observer({ kind: 'closed', revoked: false });
|
|
437
|
+
emitAll({ kind: 'caught-up', expired });
|
|
341
438
|
});
|
|
342
439
|
},
|
|
343
440
|
observe(notify) {
|
|
@@ -346,11 +443,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
346
443
|
if (!observers.has(notify))
|
|
347
444
|
return;
|
|
348
445
|
if (options.unopened === true) {
|
|
349
|
-
notify({ kind: 'closed', revoked: false });
|
|
446
|
+
notify({ kind: 'closed', revoked: false, lost: true });
|
|
350
447
|
return;
|
|
351
448
|
}
|
|
352
449
|
announceList();
|
|
353
|
-
|
|
450
|
+
opened((event) => {
|
|
451
|
+
if (observers.has(notify))
|
|
452
|
+
notify(event);
|
|
453
|
+
});
|
|
354
454
|
});
|
|
355
455
|
return () => {
|
|
356
456
|
observers.delete(notify);
|
|
@@ -367,12 +467,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
367
467
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
368
468
|
},
|
|
369
469
|
async discover(_authorization) {
|
|
370
|
-
return
|
|
371
|
-
if (answer.kind === 'discovery')
|
|
372
|
-
for (const room of answer.rooms)
|
|
373
|
-
note(room.locator, room);
|
|
374
|
-
return answer;
|
|
375
|
-
});
|
|
470
|
+
return discovered();
|
|
376
471
|
},
|
|
377
472
|
reached,
|
|
378
473
|
follows(locator, roomVersion, next) {
|
|
@@ -429,7 +524,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
429
524
|
retryable: false,
|
|
430
525
|
affected: {},
|
|
431
526
|
};
|
|
432
|
-
}, 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
|
+
});
|
|
433
534
|
},
|
|
434
535
|
async history(_authorization, request) {
|
|
435
536
|
return resolveScript(scripts.history, () => {
|
|
@@ -445,31 +546,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
445
546
|
},
|
|
446
547
|
async binary(_authorization, request) {
|
|
447
548
|
return resolveScript(scripts.binary, () => {
|
|
448
|
-
if (request.kind === 'reference') {
|
|
449
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
450
|
-
}
|
|
451
549
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
452
550
|
if (room === undefined)
|
|
453
551
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
454
|
-
const blob = room
|
|
552
|
+
const blob = heldBlob(room, request.path);
|
|
455
553
|
return blob === undefined
|
|
456
554
|
? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
|
|
457
|
-
: { kind: 'binary', blob };
|
|
555
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
458
556
|
}, request);
|
|
459
557
|
},
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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);
|
|
469
581
|
},
|
|
470
582
|
async action(_authorization, request) {
|
|
471
583
|
return resolveScript(scripts.action, () => {
|
|
472
|
-
if (request.name.startsWith('
|
|
584
|
+
if (request.name.startsWith('conversations/'))
|
|
473
585
|
return conversationAction(request);
|
|
474
586
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
475
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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"}
|