@agentshouse/mdruntime 0.1.0-ca68e8b4bbebc → 0.1.0-ca69b8fe1fa9f
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 +19 -16
- package/dist/adapter.d.ts +142 -70
- 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 +26 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +181 -103
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -89
- 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 +19 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +86 -9
- package/dist/collection.d.ts +11 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +39 -291
- package/dist/compile.d.ts +11 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +589 -0
- package/dist/connection.d.ts +28 -17
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3147 -1396
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- package/dist/conversation.d.ts +29 -14
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +423 -198
- 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 +2 -5
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +31 -27
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/host.d.ts +3 -10
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +65 -39
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/job.d.ts +14 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +28 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +127 -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 +12 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +202 -103
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +89 -0
- package/dist/model.d.ts +7 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -13
- 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 +17 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +100 -5
- 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 +2 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +87 -172
- 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 +16 -190
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -470
- package/dist/reach.d.ts +17 -8
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +219 -90
- package/dist/react.d.ts +4 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +2 -14
- package/dist/readiness.d.ts +14 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/recovery.d.ts +3 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +34 -7
- package/dist/refresh.d.ts +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +155 -58
- package/dist/replica.d.ts +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +301 -191
- package/dist/room-draft.d.ts +23 -4
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +158 -71
- package/dist/rows.d.ts +22 -30
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +63 -114
- package/dist/save.d.ts +53 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +529 -185
- package/dist/search.d.ts +12 -82
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -207
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +18 -4
- package/dist/shared.d.ts +7 -3
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +119 -66
- package/dist/status.d.ts +4 -3
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -1
- package/dist/store.d.ts +92 -98
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +330 -675
- package/dist/stored.d.ts +162 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +543 -0
- package/dist/tables.d.ts +353 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +588 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +34 -5
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +10 -2
- package/package.json +18 -19
- package/AGENTS.md +0 -299
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -24
- 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/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 -61
- 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 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -63
- 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 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -155
- 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 -629
- 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 -34
- 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 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -642
- package/dist/reads.d.ts +0 -11
- package/dist/reads.d.ts.map +0 -1
- package/dist/reads.js +0 -98
package/dist/memory.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
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
8
|
outcome: 604_800,
|
|
@@ -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,14 +52,16 @@ 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
|
-
|
|
61
|
-
|
|
57
|
+
const attached = new Map();
|
|
58
|
+
const linked = new WeakMap();
|
|
59
|
+
const carried = new Map();
|
|
62
60
|
let expiring = [];
|
|
61
|
+
let openings = 0;
|
|
62
|
+
const declaredRooms = new Set();
|
|
63
63
|
let replicated = [];
|
|
64
|
+
let heldCursor = null;
|
|
64
65
|
let issued = 0;
|
|
65
66
|
function scriptConversations(entries) {
|
|
66
67
|
scripted.clear();
|
|
@@ -88,6 +89,19 @@ export function createMemoryAdapter(options = {}) {
|
|
|
88
89
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
89
90
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
90
91
|
}
|
|
92
|
+
function heldBlob(room, path) {
|
|
93
|
+
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
94
|
+
}
|
|
95
|
+
function freePath(room, name) {
|
|
96
|
+
const dot = name.lastIndexOf('.');
|
|
97
|
+
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
98
|
+
const extension = dot > 0 ? name.slice(dot) : '';
|
|
99
|
+
for (let count = 1;; count += 1) {
|
|
100
|
+
const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
|
|
101
|
+
if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
|
|
102
|
+
return path;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
91
105
|
function retain(entries) {
|
|
92
106
|
for (const room of entries) {
|
|
93
107
|
note(room.locator, room);
|
|
@@ -128,10 +142,21 @@ export function createMemoryAdapter(options = {}) {
|
|
|
128
142
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
129
143
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
130
144
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
145
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
131
146
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
132
147
|
};
|
|
133
148
|
}
|
|
134
|
-
function
|
|
149
|
+
function foldersMoved(room, from) {
|
|
150
|
+
const now = new Set(room.folders ?? []);
|
|
151
|
+
const before = new Set(from.folders ?? []);
|
|
152
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
153
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
154
|
+
return {
|
|
155
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
156
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function advancement(room, from, at, whole = false) {
|
|
135
160
|
const current = room.documents ?? {};
|
|
136
161
|
const previous = from.documents ?? {};
|
|
137
162
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
@@ -142,7 +167,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
142
167
|
const changed = Object.keys(current)
|
|
143
168
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
144
169
|
.sort();
|
|
145
|
-
const size = pageSize ?? changed.length;
|
|
170
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
146
171
|
const taken = changed.slice(at, at + size);
|
|
147
172
|
const next = at + taken.length;
|
|
148
173
|
const opening = at === 0;
|
|
@@ -164,6 +189,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
164
189
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
165
190
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
166
191
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
192
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
167
193
|
removals: opening
|
|
168
194
|
? [
|
|
169
195
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -173,6 +199,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
173
199
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
174
200
|
};
|
|
175
201
|
}
|
|
202
|
+
function carry(locator) {
|
|
203
|
+
const at = carried.get(locator);
|
|
204
|
+
const current = rooms.find((entry) => entry.locator === locator);
|
|
205
|
+
if (at === undefined || current === undefined || current.roomVersion === at)
|
|
206
|
+
return;
|
|
207
|
+
const from = served.get(locator)?.get(at);
|
|
208
|
+
carried.set(locator, current.roomVersion);
|
|
209
|
+
if (from === undefined)
|
|
210
|
+
return;
|
|
211
|
+
const page = advancement(current, from, 0, true);
|
|
212
|
+
for (const observer of observers) {
|
|
213
|
+
observer({
|
|
214
|
+
kind: 'room-change',
|
|
215
|
+
locator,
|
|
216
|
+
from: at,
|
|
217
|
+
roomVersion: current.roomVersion,
|
|
218
|
+
read: async () => page,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
176
222
|
function pageOf(conversation, after) {
|
|
177
223
|
const messages = conversation.messages ?? [];
|
|
178
224
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -187,16 +233,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
187
233
|
: {}),
|
|
188
234
|
};
|
|
189
235
|
}
|
|
190
|
-
function historiesOf(
|
|
191
|
-
const asked = input?.conversations;
|
|
192
|
-
if (!Array.isArray(asked))
|
|
193
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
236
|
+
function historiesOf(request) {
|
|
194
237
|
const histories = [];
|
|
195
|
-
for (const entry of
|
|
196
|
-
const conversation =
|
|
238
|
+
for (const entry of request.conversations) {
|
|
239
|
+
const conversation = scripted.get(entry.conversation);
|
|
197
240
|
if (conversation === undefined)
|
|
198
241
|
continue;
|
|
199
|
-
const outcome = conversation.outcomes?.
|
|
242
|
+
const outcome = conversation.outcomes?.history;
|
|
200
243
|
if (outcome !== undefined)
|
|
201
244
|
return outcome;
|
|
202
245
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -207,15 +250,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
207
250
|
function conversationAction(request) {
|
|
208
251
|
const name = request.name;
|
|
209
252
|
const input = (request.input ?? {});
|
|
210
|
-
if (name === '
|
|
211
|
-
return historiesOf(request.input);
|
|
212
|
-
if (name === 'conversation.create') {
|
|
253
|
+
if (name === 'conversations/create') {
|
|
213
254
|
issued += 1;
|
|
214
255
|
const conversation = `conversation-${issued}`;
|
|
215
256
|
scripted.set(conversation, { conversation });
|
|
216
|
-
return { kind: 'action', result: { conversation } };
|
|
257
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
217
258
|
}
|
|
218
|
-
const named = typeof input.
|
|
259
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
219
260
|
const conversation = scripted.get(named);
|
|
220
261
|
if (conversation === undefined) {
|
|
221
262
|
return {
|
|
@@ -228,34 +269,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
228
269
|
const outcome = conversation.outcomes?.[name];
|
|
229
270
|
if (outcome !== undefined)
|
|
230
271
|
return outcome;
|
|
231
|
-
if (name === '
|
|
272
|
+
if (name === 'conversations/send') {
|
|
232
273
|
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
233
274
|
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
234
275
|
if (answered !== undefined)
|
|
235
|
-
return { kind: 'action', result: {
|
|
276
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
236
277
|
issued += 1;
|
|
237
278
|
const turn = `turn-${issued}`;
|
|
238
|
-
unsealed.set(turn, named);
|
|
239
279
|
if (operation !== null)
|
|
240
280
|
sentTurns.set(operation, turn);
|
|
241
|
-
return { kind: 'action', result: { turn } };
|
|
281
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
242
282
|
}
|
|
243
|
-
if (name === '
|
|
244
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
245
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
246
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
247
|
-
}
|
|
248
|
-
unsealed.delete(turn);
|
|
249
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
250
|
-
}
|
|
251
|
-
if (name === 'conversation.delete')
|
|
283
|
+
if (name === 'conversations/delete')
|
|
252
284
|
scripted.delete(named);
|
|
253
|
-
return { kind: 'action', result: {
|
|
285
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
254
286
|
}
|
|
255
287
|
function announceList() {
|
|
256
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
257
|
-
|
|
258
|
-
|
|
288
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
289
|
+
? []
|
|
290
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
|
|
291
|
+
for (const listener of listeners) {
|
|
292
|
+
listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
|
|
293
|
+
}
|
|
259
294
|
}
|
|
260
295
|
function discovery() {
|
|
261
296
|
return {
|
|
@@ -267,8 +302,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
267
302
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
268
303
|
};
|
|
269
304
|
}
|
|
305
|
+
function discovered() {
|
|
306
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
307
|
+
if (answer.kind === 'discovery')
|
|
308
|
+
for (const room of answer.rooms)
|
|
309
|
+
note(room.locator, room);
|
|
310
|
+
return answer;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
function opened(notify) {
|
|
314
|
+
const opening = ++openings;
|
|
315
|
+
notify({ kind: 'opened' });
|
|
316
|
+
void discovered()
|
|
317
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
318
|
+
.then((answer) => {
|
|
319
|
+
if (opening !== openings)
|
|
320
|
+
return;
|
|
321
|
+
if (answer.kind !== 'discovery') {
|
|
322
|
+
openings += 1;
|
|
323
|
+
carried.clear();
|
|
324
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
325
|
+
notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
declaredRooms.clear();
|
|
329
|
+
for (const room of answer.rooms)
|
|
330
|
+
declaredRooms.add(room.locator);
|
|
331
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
function emitAll(event) {
|
|
335
|
+
for (const observer of observers)
|
|
336
|
+
observer(event);
|
|
337
|
+
}
|
|
270
338
|
return {
|
|
271
|
-
...(options.
|
|
339
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
340
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
272
341
|
setRooms(next) {
|
|
273
342
|
rooms = [...next];
|
|
274
343
|
retain(rooms);
|
|
@@ -277,26 +346,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
277
346
|
scriptConversations(next);
|
|
278
347
|
},
|
|
279
348
|
open() {
|
|
349
|
+
carried.clear();
|
|
280
350
|
announceList();
|
|
281
|
-
|
|
282
|
-
observer({ kind: 'opened' });
|
|
351
|
+
opened(emitAll);
|
|
283
352
|
},
|
|
284
|
-
close({ revoked = false, lost = !revoked } = {}) {
|
|
285
|
-
|
|
286
|
-
|
|
353
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
354
|
+
openings += 1;
|
|
355
|
+
carried.clear();
|
|
356
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
287
357
|
},
|
|
288
358
|
expire(locators) {
|
|
289
359
|
expiring = [...locators];
|
|
290
360
|
},
|
|
291
|
-
notifyRoomVersion({ locator
|
|
292
|
-
|
|
293
|
-
|
|
361
|
+
notifyRoomVersion({ locator }) {
|
|
362
|
+
carry(locator);
|
|
363
|
+
},
|
|
364
|
+
notifyAuthorityChanged(locators) {
|
|
365
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
366
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
367
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
368
|
+
for (const room of listed)
|
|
369
|
+
declaredRooms.add(room.locator);
|
|
370
|
+
for (const locator of left)
|
|
371
|
+
declaredRooms.delete(locator);
|
|
372
|
+
emitAll({
|
|
373
|
+
kind: 'authority-changed',
|
|
374
|
+
rooms: listed.map(declared),
|
|
375
|
+
left,
|
|
376
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
377
|
+
});
|
|
294
378
|
},
|
|
295
379
|
notifyConversation(event) {
|
|
296
|
-
if (event.kind === 'accepted-message') {
|
|
297
|
-
sealed.add(event.message.turn);
|
|
298
|
-
unsealed.delete(event.message.turn);
|
|
299
|
-
}
|
|
300
380
|
for (const listener of listeners)
|
|
301
381
|
listener(event);
|
|
302
382
|
},
|
|
@@ -305,24 +385,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
305
385
|
observer(mode);
|
|
306
386
|
},
|
|
307
387
|
heldRooms() {
|
|
308
|
-
return
|
|
309
|
-
},
|
|
310
|
-
heldDemand() {
|
|
311
|
-
return heldDemand;
|
|
388
|
+
return [...carried.keys()].sort();
|
|
312
389
|
},
|
|
313
390
|
replicatedConversations() {
|
|
314
391
|
return replicated;
|
|
315
392
|
},
|
|
393
|
+
heldConversationCursor() {
|
|
394
|
+
return heldCursor;
|
|
395
|
+
},
|
|
316
396
|
conversations: {
|
|
317
397
|
replicate(next) {
|
|
318
398
|
replicated = [...next];
|
|
319
399
|
},
|
|
400
|
+
hold(cursor) {
|
|
401
|
+
heldCursor = cursor;
|
|
402
|
+
},
|
|
320
403
|
observe(notify) {
|
|
321
404
|
listeners.add(notify);
|
|
322
405
|
return () => {
|
|
323
406
|
listeners.delete(notify);
|
|
324
407
|
};
|
|
325
408
|
},
|
|
409
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
410
|
+
...(options.agents === undefined
|
|
411
|
+
? {}
|
|
412
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
326
413
|
},
|
|
327
414
|
serviceMode: {
|
|
328
415
|
observe(notify) {
|
|
@@ -333,46 +420,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
333
420
|
},
|
|
334
421
|
},
|
|
335
422
|
roomStream: {
|
|
336
|
-
hold(asked
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const expired = expiring.filter((locator) => held.includes(locator));
|
|
340
|
-
expiring = [];
|
|
341
|
-
const moved = asked.flatMap((room) => {
|
|
423
|
+
hold(asked) {
|
|
424
|
+
const named = asked.map((room) => room.locator);
|
|
425
|
+
const unknown = asked.flatMap((room) => {
|
|
342
426
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
343
427
|
return current === undefined ||
|
|
344
|
-
|
|
345
|
-
|
|
428
|
+
current.roomVersion === room.roomVersion ||
|
|
429
|
+
served.get(room.locator)?.has(room.roomVersion) === true
|
|
346
430
|
? []
|
|
347
|
-
: [
|
|
348
|
-
});
|
|
349
|
-
queueMicrotask(() => {
|
|
350
|
-
for (const observer of observers) {
|
|
351
|
-
for (const room of moved)
|
|
352
|
-
observer({ kind: 'room-version', ...room });
|
|
353
|
-
observer({ kind: 'opening', expired });
|
|
354
|
-
}
|
|
431
|
+
: [room.locator];
|
|
355
432
|
});
|
|
356
|
-
|
|
357
|
-
|
|
433
|
+
const expired = [
|
|
434
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
435
|
+
];
|
|
436
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
358
437
|
queueMicrotask(() => {
|
|
359
|
-
for (const
|
|
360
|
-
|
|
438
|
+
for (const room of asked) {
|
|
439
|
+
if (expired.includes(room.locator))
|
|
440
|
+
carried.delete(room.locator);
|
|
441
|
+
else {
|
|
442
|
+
carried.set(room.locator, room.roomVersion);
|
|
443
|
+
carry(room.locator);
|
|
444
|
+
}
|
|
361
445
|
}
|
|
446
|
+
emitAll({ kind: 'caught-up', expired });
|
|
362
447
|
});
|
|
363
448
|
},
|
|
364
|
-
published() { },
|
|
365
449
|
observe(notify) {
|
|
366
450
|
observers.add(notify);
|
|
367
451
|
queueMicrotask(() => {
|
|
368
452
|
if (!observers.has(notify))
|
|
369
453
|
return;
|
|
370
454
|
if (options.unopened === true) {
|
|
371
|
-
notify({ kind: 'closed', revoked: false, lost: true });
|
|
455
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
372
456
|
return;
|
|
373
457
|
}
|
|
374
458
|
announceList();
|
|
375
|
-
|
|
459
|
+
opened((event) => {
|
|
460
|
+
if (observers.has(notify))
|
|
461
|
+
notify(event);
|
|
462
|
+
});
|
|
376
463
|
});
|
|
377
464
|
return () => {
|
|
378
465
|
observers.delete(notify);
|
|
@@ -389,12 +476,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
389
476
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
390
477
|
},
|
|
391
478
|
async discover(_authorization) {
|
|
392
|
-
return
|
|
393
|
-
if (answer.kind === 'discovery')
|
|
394
|
-
for (const room of answer.rooms)
|
|
395
|
-
note(room.locator, room);
|
|
396
|
-
return answer;
|
|
397
|
-
});
|
|
479
|
+
return discovered();
|
|
398
480
|
},
|
|
399
481
|
reached,
|
|
400
482
|
follows(locator, roomVersion, next) {
|
|
@@ -451,7 +533,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
451
533
|
retryable: false,
|
|
452
534
|
affected: {},
|
|
453
535
|
};
|
|
454
|
-
}, request).then((answer) =>
|
|
536
|
+
}, request).then((answer) => {
|
|
537
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
538
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
539
|
+
note(destination, answer.destination);
|
|
540
|
+
}
|
|
541
|
+
return note(request.locator, answer);
|
|
542
|
+
});
|
|
455
543
|
},
|
|
456
544
|
async history(_authorization, request) {
|
|
457
545
|
return resolveScript(scripts.history, () => {
|
|
@@ -467,31 +555,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
467
555
|
},
|
|
468
556
|
async binary(_authorization, request) {
|
|
469
557
|
return resolveScript(scripts.binary, () => {
|
|
470
|
-
if (request.kind === 'reference') {
|
|
471
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
472
|
-
}
|
|
473
558
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
474
559
|
if (room === undefined)
|
|
475
560
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
476
|
-
const blob = room
|
|
561
|
+
const blob = heldBlob(room, request.path);
|
|
477
562
|
return blob === undefined
|
|
478
563
|
? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
|
|
479
|
-
: { kind: 'binary', blob };
|
|
564
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
480
565
|
}, request);
|
|
481
566
|
},
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
567
|
+
async link(_authorization, request) {
|
|
568
|
+
return resolveScript(scripts.link, () => {
|
|
569
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
570
|
+
if (room === undefined)
|
|
571
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
572
|
+
const blob = heldBlob(room, request.path);
|
|
573
|
+
if (blob === undefined) {
|
|
574
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
575
|
+
}
|
|
576
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
577
|
+
linked.set(blob, url);
|
|
578
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
579
|
+
}, request);
|
|
580
|
+
},
|
|
581
|
+
async attach(_authorization, request) {
|
|
582
|
+
return resolveScript(scripts.attach, () => {
|
|
583
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
584
|
+
if (room === undefined)
|
|
585
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
586
|
+
const path = freePath(room, request.name);
|
|
587
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
588
|
+
return { kind: 'attached', path, revision: `attached-${attached.size}` };
|
|
589
|
+
}, request);
|
|
491
590
|
},
|
|
492
591
|
async action(_authorization, request) {
|
|
493
592
|
return resolveScript(scripts.action, () => {
|
|
494
|
-
if (request.name.startsWith('
|
|
593
|
+
if (request.name.startsWith('conversations/'))
|
|
495
594
|
return conversationAction(request);
|
|
496
595
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
497
596
|
}, 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, phrase: string | null): MessageWindow;
|
|
24
|
+
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): 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":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,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,CA+BN;AAkBD,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,EACxC,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,aAAa,CAWf;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAOR;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,CAK9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { sql } from '@agentshouse/mdmodel';
|
|
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
|
+
if (held === undefined) {
|
|
40
|
+
connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, held.id]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (read !== undefined) {
|
|
47
|
+
connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function accepted(row) {
|
|
52
|
+
return {
|
|
53
|
+
identity: text(row.identity),
|
|
54
|
+
turn: text(row.turn),
|
|
55
|
+
position: text(row.position),
|
|
56
|
+
text: text(row.text),
|
|
57
|
+
message: JSON.parse(text(row.message)),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function holding(phrase) {
|
|
61
|
+
return phrase === null
|
|
62
|
+
? { sql: '', bind: [] }
|
|
63
|
+
: { sql: ` AND ${sql.HOLDS_PHRASE}(text, ?)`, bind: [phrase.toLowerCase()] };
|
|
64
|
+
}
|
|
65
|
+
export function messageWindow(connection, conversation, limit, before, phrase) {
|
|
66
|
+
const held = holding(phrase);
|
|
67
|
+
const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${held.sql}${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
|
|
68
|
+
? [conversation, ...held.bind, limit + 1]
|
|
69
|
+
: [conversation, ...held.bind, before[0], before[0], before[1], limit + 1]);
|
|
70
|
+
return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
|
|
71
|
+
}
|
|
72
|
+
export function messageCount(connection, conversation, phrase) {
|
|
73
|
+
const held = holding(phrase);
|
|
74
|
+
const [counted] = connection.rows(`SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?${held.sql}`, [conversation, ...held.bind]);
|
|
75
|
+
return Number(counted?.held ?? 0);
|
|
76
|
+
}
|
|
77
|
+
export function turnArrived(connection, conversation, turn) {
|
|
78
|
+
return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
|
|
79
|
+
}
|
|
80
|
+
export function droppedMessages(connection, conversations) {
|
|
81
|
+
for (const conversation of conversations) {
|
|
82
|
+
connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
|
|
83
|
+
connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function forgottenMessages(connection) {
|
|
87
|
+
connection.run('DELETE FROM conversation_messages');
|
|
88
|
+
connection.run('DELETE FROM conversation_reads');
|
|
89
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Definition,
|
|
1
|
+
import type { Definition, VerifiedModel } from '@agentshouse/mdmodel';
|
|
2
2
|
import type { Open } from './open.js';
|
|
3
3
|
export type ModelIdentity = {
|
|
4
4
|
identity: string;
|
|
@@ -28,6 +28,11 @@ export type ModelState = {
|
|
|
28
28
|
verifiedWith: ModelIdentity;
|
|
29
29
|
types: VerifiedModel['types'];
|
|
30
30
|
};
|
|
31
|
+
export type StoredModel = Extract<ModelState, {
|
|
32
|
+
status: 'unavailable';
|
|
33
|
+
}> | Omit<Extract<ModelState, {
|
|
34
|
+
status: 'current' | 'cached';
|
|
35
|
+
}>, 'types'>;
|
|
31
36
|
export type TypesResult = {
|
|
32
37
|
status: Open<'unavailable'>;
|
|
33
38
|
reason: ModelUnavailableReason;
|
|
@@ -51,8 +56,7 @@ export type ValidationReceipt = {
|
|
|
51
56
|
export declare const NO_MODEL: ModelState;
|
|
52
57
|
export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
|
|
53
58
|
export declare function modelTypes(state: ModelState): TypesResult;
|
|
59
|
+
export declare function storedModel(state: ModelState): StoredModel;
|
|
54
60
|
export declare function cached(state: ModelState): ModelState;
|
|
55
61
|
export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
|
|
56
|
-
export declare function sameTyping(left: ModelState, right: ModelState): boolean;
|
|
57
|
-
export declare function referenceField(facts: ValueFacts | undefined): boolean;
|
|
58
62
|
//# sourceMappingURL=model.d.ts.map
|
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,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|