@agentshouse/mdruntime 0.1.0-cff8ba8fa2542 → 0.1.0-cffcba9cd9c2f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -11
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +309 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +251 -0
- package/dist/adapter.d.ts +195 -88
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +7 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +40 -28
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +18 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +37 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +324 -51
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- 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 +13 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -56
- package/dist/change.d.ts +46 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +36 -0
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +56 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +164 -23
- package/dist/collection.d.ts +31 -14
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +61 -55
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +711 -0
- package/dist/connection.d.ts +8 -103
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +103 -2076
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +135 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +247 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +67 -44
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1010 -549
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +177 -0
- package/dist/durability.d.ts +19 -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 +161 -0
- package/dist/expectation.d.ts +23 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +92 -0
- package/dist/failure.d.ts +14 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +22 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +28 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +149 -26
- package/dist/identity.d.ts +3 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +13 -1
- package/dist/index.d.ts +39 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/install.d.ts +55 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +543 -0
- package/dist/job.d.ts +5 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +7 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +271 -0
- package/dist/listing.d.ts +52 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +168 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +165 -0
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +62 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -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 +25 -8
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +296 -93
- package/dist/messages.d.ts +49 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +148 -0
- package/dist/model.d.ts +16 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +9 -15
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +170 -0
- 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 +22 -4
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +127 -26
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +59 -0
- package/dist/outcome.d.ts +75 -5
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +84 -1
- package/dist/overlay.d.ts +17 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +168 -190
- package/dist/parts.d.ts +11 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +21 -0
- package/dist/paths.d.ts +2 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -16
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +233 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +51 -181
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -431
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/queue.d.ts +32 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +402 -0
- package/dist/reach.d.ts +21 -5
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +306 -96
- package/dist/react.d.ts +43 -19
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +22 -21
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +49 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/reads.d.ts +37 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +174 -0
- package/dist/recovery.d.ts +26 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +232 -0
- package/dist/refresh.d.ts +20 -7
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +155 -59
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +57 -0
- package/dist/replica.d.ts +53 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +361 -164
- package/dist/room-draft.d.ts +59 -12
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +299 -90
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +217 -0
- package/dist/rows.d.ts +32 -34
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +67 -87
- package/dist/runtime.d.ts +32 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +74 -5
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +914 -188
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +679 -0
- package/dist/search.d.ts +15 -54
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -121
- package/dist/seed.d.ts +25 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +145 -0
- package/dist/shared.d.ts +10 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +339 -0
- package/dist/shown.d.ts +32 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +299 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/rooms.d.ts +41 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +69 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -0
- package/dist/status.d.ts +7 -4
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -15
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +210 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +428 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +106 -92
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +142 -385
- package/dist/stored.d.ts +156 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +649 -0
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +224 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +530 -0
- package/dist/tables.d.ts +412 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +737 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -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 +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 +189 -37
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +77 -33
- package/package.json +27 -15
- package/AGENTS.md +0 -231
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -377
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
|
|
1
3
|
import { sameChange } from './overlay.js';
|
|
4
|
+
const ATTACHMENTS = 'attachments';
|
|
5
|
+
function lastName(path) {
|
|
6
|
+
return path.slice(path.lastIndexOf('/') + 1);
|
|
7
|
+
}
|
|
2
8
|
const FIXTURE_RETENTION = {
|
|
3
9
|
history: { kind: 'duration', seconds: 1 },
|
|
4
|
-
outcome: 1,
|
|
5
10
|
refreshHorizon: 1,
|
|
6
11
|
};
|
|
7
12
|
function declaredRetention(value) {
|
|
@@ -15,12 +20,7 @@ function declaredRetention(value) {
|
|
|
15
20
|
}
|
|
16
21
|
const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
|
|
17
22
|
function modelsOf(room) {
|
|
18
|
-
return {
|
|
19
|
-
collection: room.model ?? MODEL_ABSENT,
|
|
20
|
-
...(room.typedSelection === undefined
|
|
21
|
-
? {}
|
|
22
|
-
: { selection: room.selectionModel ?? MODEL_ABSENT }),
|
|
23
|
-
};
|
|
23
|
+
return { collection: room.model ?? MODEL_ABSENT };
|
|
24
24
|
}
|
|
25
25
|
function changedModels(room, from) {
|
|
26
26
|
const now = modelsOf(room);
|
|
@@ -53,12 +53,16 @@ export function createMemoryAdapter(options = {}) {
|
|
|
53
53
|
const listeners = new Set();
|
|
54
54
|
const modeObservers = new Set();
|
|
55
55
|
const scripted = new Map();
|
|
56
|
-
const
|
|
57
|
-
const sealed = new Set();
|
|
56
|
+
const sentTurns = new Map();
|
|
58
57
|
const historyPageSize = options.historyPageSize;
|
|
59
|
-
|
|
58
|
+
const attached = new Map();
|
|
59
|
+
const linked = new WeakMap();
|
|
60
|
+
const carried = new Map();
|
|
60
61
|
let expiring = [];
|
|
62
|
+
let openings = 0;
|
|
63
|
+
const declaredRooms = new Set();
|
|
61
64
|
let replicated = [];
|
|
65
|
+
let heldCursor = null;
|
|
62
66
|
let issued = 0;
|
|
63
67
|
function scriptConversations(entries) {
|
|
64
68
|
scripted.clear();
|
|
@@ -86,8 +90,50 @@ export function createMemoryAdapter(options = {}) {
|
|
|
86
90
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
87
91
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
88
92
|
}
|
|
93
|
+
function heldBlob(room, path) {
|
|
94
|
+
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
95
|
+
}
|
|
96
|
+
function freePath(room, name) {
|
|
97
|
+
const dot = name.lastIndexOf('.');
|
|
98
|
+
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
99
|
+
const extension = dot > 0 ? name.slice(dot) : '';
|
|
100
|
+
for (let count = 1;; count += 1) {
|
|
101
|
+
const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
|
|
102
|
+
if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
|
|
103
|
+
return path;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const saved = new WeakMap();
|
|
107
|
+
function factsAt(room, path, content) {
|
|
108
|
+
const types = schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, NO_ROOM_TYPES);
|
|
109
|
+
let held = saved.get(types);
|
|
110
|
+
if (held === undefined) {
|
|
111
|
+
held = new Map();
|
|
112
|
+
saved.set(types, held);
|
|
113
|
+
}
|
|
114
|
+
const key = `${path}\u0000${content}`;
|
|
115
|
+
if (!held.has(key)) {
|
|
116
|
+
const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
|
|
117
|
+
types,
|
|
118
|
+
});
|
|
119
|
+
held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
|
|
120
|
+
}
|
|
121
|
+
return held.get(key);
|
|
122
|
+
}
|
|
123
|
+
function factsIn(room, paths) {
|
|
124
|
+
const facts = {};
|
|
125
|
+
for (const path of paths) {
|
|
126
|
+
const content = room.documents?.[path];
|
|
127
|
+
const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
|
|
128
|
+
if (held !== null)
|
|
129
|
+
facts[path] = held;
|
|
130
|
+
}
|
|
131
|
+
return facts;
|
|
132
|
+
}
|
|
89
133
|
function retain(entries) {
|
|
90
134
|
for (const room of entries) {
|
|
135
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
136
|
+
factsAt(room, path, content);
|
|
91
137
|
note(room.locator, room);
|
|
92
138
|
const versions = served.get(room.locator) ?? new Map();
|
|
93
139
|
versions.set(room.roomVersion, room);
|
|
@@ -99,42 +145,65 @@ export function createMemoryAdapter(options = {}) {
|
|
|
99
145
|
return {
|
|
100
146
|
name: room.name,
|
|
101
147
|
locator: room.locator,
|
|
148
|
+
handle: room.handle,
|
|
102
149
|
roomVersion: room.roomVersion,
|
|
103
150
|
operations: room.operations,
|
|
104
151
|
replica: room.replica,
|
|
105
|
-
|
|
152
|
+
typedSelection: room.typedSelection ?? null,
|
|
106
153
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
154
|
+
authoredPaths: room.authoredPaths ?? ['**'],
|
|
107
155
|
};
|
|
108
156
|
}
|
|
109
|
-
function page(room,
|
|
157
|
+
function page(room, after) {
|
|
110
158
|
const paths = Object.keys(room.documents ?? {}).sort();
|
|
159
|
+
const opening = after === undefined;
|
|
160
|
+
const from = opening ? 0 : paths.filter((path) => path <= after).length;
|
|
111
161
|
const size = pageSize ?? paths.length;
|
|
112
162
|
const taken = paths.slice(from, from + size);
|
|
113
163
|
const next = from + taken.length;
|
|
114
|
-
const targets =
|
|
164
|
+
const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
|
|
115
165
|
return {
|
|
116
166
|
kind: 'bootstrap',
|
|
117
167
|
roomVersion: room.roomVersion,
|
|
118
|
-
...(
|
|
168
|
+
...(opening ? { models: modelsOf(room) } : {}),
|
|
119
169
|
documents: named(room.documents ?? {}, taken),
|
|
120
|
-
|
|
170
|
+
facts: factsIn(room, taken),
|
|
171
|
+
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
172
|
+
...(room.fileIds === undefined
|
|
173
|
+
? {}
|
|
174
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
175
|
+
...(room.created === undefined
|
|
176
|
+
? {}
|
|
177
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
121
178
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
122
|
-
|
|
123
|
-
...(
|
|
124
|
-
...(next < paths.length ? { pageToken:
|
|
179
|
+
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
180
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
181
|
+
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function foldersMoved(room, from) {
|
|
185
|
+
const now = new Set(room.folders ?? []);
|
|
186
|
+
const before = new Set(from.folders ?? []);
|
|
187
|
+
const folders = [...now].filter((folder) => !before.has(folder)).sort();
|
|
188
|
+
const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
|
|
189
|
+
return {
|
|
190
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
191
|
+
...(folderRemovals.length === 0 ? {} : { folderRemovals }),
|
|
125
192
|
};
|
|
126
193
|
}
|
|
127
|
-
function advancement(room, from, at) {
|
|
194
|
+
function advancement(room, from, at, whole = false) {
|
|
128
195
|
const current = room.documents ?? {};
|
|
129
196
|
const previous = from.documents ?? {};
|
|
130
|
-
const currentTargets = new Set(room.
|
|
131
|
-
const previousTargets = new Set(from.
|
|
197
|
+
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
198
|
+
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
132
199
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
200
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
201
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
133
202
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
134
203
|
const changed = Object.keys(current)
|
|
135
204
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
136
205
|
.sort();
|
|
137
|
-
const size = pageSize ?? changed.length;
|
|
206
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
138
207
|
const taken = changed.slice(at, at + size);
|
|
139
208
|
const next = at + taken.length;
|
|
140
209
|
const opening = at === 0;
|
|
@@ -144,27 +213,52 @@ export function createMemoryAdapter(options = {}) {
|
|
|
144
213
|
const targets = opening
|
|
145
214
|
? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
|
|
146
215
|
: [];
|
|
147
|
-
const attachments = room.attachments ?? [];
|
|
148
|
-
const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
|
|
149
216
|
const models = opening ? changedModels(room, from) : undefined;
|
|
150
217
|
return {
|
|
151
218
|
kind: 'net-advancement',
|
|
152
219
|
roomVersion: room.roomVersion,
|
|
153
220
|
...(models === undefined ? {} : { models }),
|
|
154
221
|
documents: named(current, taken),
|
|
155
|
-
|
|
222
|
+
facts: factsIn(room, taken),
|
|
223
|
+
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
224
|
+
...(room.fileIds === undefined
|
|
225
|
+
? {}
|
|
226
|
+
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
227
|
+
...(room.created === undefined
|
|
228
|
+
? {}
|
|
229
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
156
230
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
157
|
-
|
|
231
|
+
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
232
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
158
233
|
removals: opening
|
|
159
234
|
? [
|
|
160
235
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
161
236
|
...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
|
|
162
237
|
].sort()
|
|
163
238
|
: [],
|
|
164
|
-
...(declared ? { attachments } : {}),
|
|
165
239
|
...(pageToken === undefined ? {} : { pageToken }),
|
|
166
240
|
};
|
|
167
241
|
}
|
|
242
|
+
function carry(locator) {
|
|
243
|
+
const at = carried.get(locator);
|
|
244
|
+
const current = rooms.find((entry) => entry.locator === locator);
|
|
245
|
+
if (at === undefined || current === undefined || current.roomVersion === at)
|
|
246
|
+
return;
|
|
247
|
+
const from = served.get(locator)?.get(at);
|
|
248
|
+
carried.set(locator, current.roomVersion);
|
|
249
|
+
if (from === undefined)
|
|
250
|
+
return;
|
|
251
|
+
const page = advancement(current, from, 0, true);
|
|
252
|
+
for (const observer of observers) {
|
|
253
|
+
observer({
|
|
254
|
+
kind: 'room-change',
|
|
255
|
+
locator,
|
|
256
|
+
from: at,
|
|
257
|
+
roomVersion: current.roomVersion,
|
|
258
|
+
read: async () => page,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
168
262
|
function pageOf(conversation, after) {
|
|
169
263
|
const messages = conversation.messages ?? [];
|
|
170
264
|
const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
|
|
@@ -179,16 +273,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
179
273
|
: {}),
|
|
180
274
|
};
|
|
181
275
|
}
|
|
182
|
-
function historiesOf(
|
|
183
|
-
const asked = input?.conversations;
|
|
184
|
-
if (!Array.isArray(asked))
|
|
185
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {} };
|
|
276
|
+
function historiesOf(request) {
|
|
186
277
|
const histories = [];
|
|
187
|
-
for (const entry of
|
|
188
|
-
const conversation =
|
|
278
|
+
for (const entry of request.conversations) {
|
|
279
|
+
const conversation = scripted.get(entry.conversation);
|
|
189
280
|
if (conversation === undefined)
|
|
190
281
|
continue;
|
|
191
|
-
const outcome = conversation.outcomes?.
|
|
282
|
+
const outcome = conversation.outcomes?.history;
|
|
192
283
|
if (outcome !== undefined)
|
|
193
284
|
return outcome;
|
|
194
285
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -199,44 +290,47 @@ export function createMemoryAdapter(options = {}) {
|
|
|
199
290
|
function conversationAction(request) {
|
|
200
291
|
const name = request.name;
|
|
201
292
|
const input = (request.input ?? {});
|
|
202
|
-
if (name === '
|
|
203
|
-
return historiesOf(request.input);
|
|
204
|
-
if (name === 'conversation.create') {
|
|
293
|
+
if (name === 'conversations/create') {
|
|
205
294
|
issued += 1;
|
|
206
295
|
const conversation = `conversation-${issued}`;
|
|
207
296
|
scripted.set(conversation, { conversation });
|
|
208
|
-
return { kind: 'action', result: { conversation } };
|
|
297
|
+
return { kind: 'action', result: { conversation_id: conversation } };
|
|
209
298
|
}
|
|
210
|
-
const named = typeof input.
|
|
299
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
211
300
|
const conversation = scripted.get(named);
|
|
212
301
|
if (conversation === undefined) {
|
|
213
|
-
return {
|
|
302
|
+
return {
|
|
303
|
+
kind: 'rejected',
|
|
304
|
+
code: 'unknown-conversation',
|
|
305
|
+
fields: { conversation: named },
|
|
306
|
+
retryable: false,
|
|
307
|
+
};
|
|
214
308
|
}
|
|
215
309
|
const outcome = conversation.outcomes?.[name];
|
|
216
310
|
if (outcome !== undefined)
|
|
217
311
|
return outcome;
|
|
218
|
-
if (name === '
|
|
312
|
+
if (name === 'conversations/send') {
|
|
313
|
+
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
314
|
+
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
315
|
+
if (answered !== undefined)
|
|
316
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
219
317
|
issued += 1;
|
|
220
318
|
const turn = `turn-${issued}`;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (name === 'conversation.cancel') {
|
|
225
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
226
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
227
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };
|
|
228
|
-
}
|
|
229
|
-
unsealed.delete(turn);
|
|
230
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
319
|
+
if (operation !== null)
|
|
320
|
+
sentTurns.set(operation, turn);
|
|
321
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
231
322
|
}
|
|
232
|
-
if (name === '
|
|
323
|
+
if (name === 'conversations/delete')
|
|
233
324
|
scripted.delete(named);
|
|
234
|
-
return { kind: 'action', result: {
|
|
325
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
235
326
|
}
|
|
236
327
|
function announceList() {
|
|
237
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
238
|
-
|
|
239
|
-
|
|
328
|
+
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
329
|
+
? []
|
|
330
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
|
|
331
|
+
for (const listener of listeners) {
|
|
332
|
+
listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
|
|
333
|
+
}
|
|
240
334
|
}
|
|
241
335
|
function discovery() {
|
|
242
336
|
return {
|
|
@@ -245,9 +339,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
245
339
|
capabilities,
|
|
246
340
|
providerLimits,
|
|
247
341
|
retention,
|
|
342
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
248
343
|
};
|
|
249
344
|
}
|
|
345
|
+
function discovered() {
|
|
346
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
347
|
+
if (answer.kind === 'discovery')
|
|
348
|
+
for (const room of answer.rooms)
|
|
349
|
+
note(room.locator, room);
|
|
350
|
+
return answer;
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
function opened(notify) {
|
|
354
|
+
const opening = ++openings;
|
|
355
|
+
notify({ kind: 'opened' });
|
|
356
|
+
void discovered()
|
|
357
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
358
|
+
.then((answer) => {
|
|
359
|
+
if (opening !== openings)
|
|
360
|
+
return;
|
|
361
|
+
if (answer.kind !== 'discovery') {
|
|
362
|
+
openings += 1;
|
|
363
|
+
carried.clear();
|
|
364
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
365
|
+
notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
declaredRooms.clear();
|
|
369
|
+
for (const room of answer.rooms)
|
|
370
|
+
declaredRooms.add(room.locator);
|
|
371
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
function emitAll(event) {
|
|
375
|
+
for (const observer of observers)
|
|
376
|
+
observer(event);
|
|
377
|
+
}
|
|
250
378
|
return {
|
|
379
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
380
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
251
381
|
setRooms(next) {
|
|
252
382
|
rooms = [...next];
|
|
253
383
|
retain(rooms);
|
|
@@ -256,26 +386,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
256
386
|
scriptConversations(next);
|
|
257
387
|
},
|
|
258
388
|
open() {
|
|
389
|
+
carried.clear();
|
|
259
390
|
announceList();
|
|
260
|
-
|
|
261
|
-
observer({ kind: 'opened' });
|
|
391
|
+
opened(emitAll);
|
|
262
392
|
},
|
|
263
|
-
close(revoked = false) {
|
|
264
|
-
|
|
265
|
-
|
|
393
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
394
|
+
openings += 1;
|
|
395
|
+
carried.clear();
|
|
396
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
266
397
|
},
|
|
267
398
|
expire(locators) {
|
|
268
399
|
expiring = [...locators];
|
|
269
400
|
},
|
|
270
|
-
notifyRoomVersion({ locator
|
|
271
|
-
|
|
272
|
-
|
|
401
|
+
notifyRoomVersion({ locator }) {
|
|
402
|
+
carry(locator);
|
|
403
|
+
},
|
|
404
|
+
notifyAuthorityChanged(locators) {
|
|
405
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
406
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
407
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
408
|
+
for (const room of listed)
|
|
409
|
+
declaredRooms.add(room.locator);
|
|
410
|
+
for (const locator of left)
|
|
411
|
+
declaredRooms.delete(locator);
|
|
412
|
+
emitAll({
|
|
413
|
+
kind: 'authority-changed',
|
|
414
|
+
rooms: listed.map(declared),
|
|
415
|
+
left,
|
|
416
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
417
|
+
});
|
|
273
418
|
},
|
|
274
419
|
notifyConversation(event) {
|
|
275
|
-
if (event.kind === 'accepted-message') {
|
|
276
|
-
sealed.add(event.message.turn);
|
|
277
|
-
unsealed.delete(event.message.turn);
|
|
278
|
-
}
|
|
279
420
|
for (const listener of listeners)
|
|
280
421
|
listener(event);
|
|
281
422
|
},
|
|
@@ -284,21 +425,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
284
425
|
observer(mode);
|
|
285
426
|
},
|
|
286
427
|
heldRooms() {
|
|
287
|
-
return
|
|
428
|
+
return [...carried.keys()].sort();
|
|
288
429
|
},
|
|
289
430
|
replicatedConversations() {
|
|
290
431
|
return replicated;
|
|
291
432
|
},
|
|
433
|
+
heldConversationCursor() {
|
|
434
|
+
return heldCursor;
|
|
435
|
+
},
|
|
292
436
|
conversations: {
|
|
293
437
|
replicate(next) {
|
|
294
438
|
replicated = [...next];
|
|
295
439
|
},
|
|
440
|
+
hold(cursor) {
|
|
441
|
+
heldCursor = cursor;
|
|
442
|
+
},
|
|
296
443
|
observe(notify) {
|
|
297
444
|
listeners.add(notify);
|
|
298
445
|
return () => {
|
|
299
446
|
listeners.delete(notify);
|
|
300
447
|
};
|
|
301
448
|
},
|
|
449
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
450
|
+
...(options.agents === undefined
|
|
451
|
+
? {}
|
|
452
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
302
453
|
},
|
|
303
454
|
serviceMode: {
|
|
304
455
|
observe(notify) {
|
|
@@ -310,23 +461,30 @@ export function createMemoryAdapter(options = {}) {
|
|
|
310
461
|
},
|
|
311
462
|
roomStream: {
|
|
312
463
|
hold(asked) {
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
expiring = [];
|
|
316
|
-
const moved = asked.flatMap((room) => {
|
|
464
|
+
const named = asked.map((room) => room.locator);
|
|
465
|
+
const unknown = asked.flatMap((room) => {
|
|
317
466
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
467
|
+
const version = room.roomVersion;
|
|
318
468
|
return current === undefined ||
|
|
319
|
-
|
|
320
|
-
|
|
469
|
+
(version !== null &&
|
|
470
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
321
471
|
? []
|
|
322
|
-
: [
|
|
472
|
+
: [room.locator];
|
|
323
473
|
});
|
|
474
|
+
const expired = [
|
|
475
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
476
|
+
];
|
|
477
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
324
478
|
queueMicrotask(() => {
|
|
325
|
-
for (const
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
479
|
+
for (const room of asked) {
|
|
480
|
+
if (expired.includes(room.locator) || room.roomVersion === null)
|
|
481
|
+
carried.delete(room.locator);
|
|
482
|
+
else {
|
|
483
|
+
carried.set(room.locator, room.roomVersion);
|
|
484
|
+
carry(room.locator);
|
|
485
|
+
}
|
|
329
486
|
}
|
|
487
|
+
emitAll({ kind: 'caught-up', expired });
|
|
330
488
|
});
|
|
331
489
|
},
|
|
332
490
|
observe(notify) {
|
|
@@ -335,11 +493,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
335
493
|
if (!observers.has(notify))
|
|
336
494
|
return;
|
|
337
495
|
if (options.unopened === true) {
|
|
338
|
-
notify({ kind: 'closed', revoked: false });
|
|
496
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
339
497
|
return;
|
|
340
498
|
}
|
|
341
499
|
announceList();
|
|
342
|
-
|
|
500
|
+
opened((event) => {
|
|
501
|
+
if (observers.has(notify))
|
|
502
|
+
notify(event);
|
|
503
|
+
});
|
|
343
504
|
});
|
|
344
505
|
return () => {
|
|
345
506
|
observers.delete(notify);
|
|
@@ -356,12 +517,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
356
517
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
357
518
|
},
|
|
358
519
|
async discover(_authorization) {
|
|
359
|
-
return
|
|
360
|
-
if (answer.kind === 'discovery')
|
|
361
|
-
for (const room of answer.rooms)
|
|
362
|
-
note(room.locator, room);
|
|
363
|
-
return answer;
|
|
364
|
-
});
|
|
520
|
+
return discovered();
|
|
365
521
|
},
|
|
366
522
|
reached,
|
|
367
523
|
follows(locator, roomVersion, next) {
|
|
@@ -378,7 +534,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
378
534
|
if (room === undefined) {
|
|
379
535
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
380
536
|
}
|
|
381
|
-
return page(room, request.pageToken
|
|
537
|
+
return page(room, request.pageToken);
|
|
382
538
|
}, request).then((answer) => note(request.locator, answer));
|
|
383
539
|
},
|
|
384
540
|
async refresh(_authorization, request) {
|
|
@@ -411,8 +567,20 @@ export function createMemoryAdapter(options = {}) {
|
|
|
411
567
|
if (room === undefined) {
|
|
412
568
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
413
569
|
}
|
|
414
|
-
return {
|
|
415
|
-
|
|
570
|
+
return {
|
|
571
|
+
kind: 'rejected',
|
|
572
|
+
code: 'unscripted-mutation',
|
|
573
|
+
fields: {},
|
|
574
|
+
retryable: false,
|
|
575
|
+
affected: {},
|
|
576
|
+
};
|
|
577
|
+
}, request).then((answer) => {
|
|
578
|
+
const destination = request.changeBatch.between?.destination.room;
|
|
579
|
+
if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
|
|
580
|
+
note(destination, answer.destination);
|
|
581
|
+
}
|
|
582
|
+
return note(request.locator, answer);
|
|
583
|
+
});
|
|
416
584
|
},
|
|
417
585
|
async history(_authorization, request) {
|
|
418
586
|
return resolveScript(scripts.history, () => {
|
|
@@ -426,11 +594,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
426
594
|
};
|
|
427
595
|
}, request);
|
|
428
596
|
},
|
|
597
|
+
async binary(_authorization, request) {
|
|
598
|
+
return resolveScript(scripts.binary, () => {
|
|
599
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
600
|
+
if (room === undefined)
|
|
601
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
602
|
+
const blob = heldBlob(room, request.path);
|
|
603
|
+
return blob === undefined
|
|
604
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
605
|
+
: { kind: 'binary', body: blob.stream(), mediaType: blob.type };
|
|
606
|
+
}, request);
|
|
607
|
+
},
|
|
608
|
+
async link(_authorization, request) {
|
|
609
|
+
return resolveScript(scripts.link, () => {
|
|
610
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
611
|
+
if (room === undefined)
|
|
612
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
613
|
+
const blob = heldBlob(room, request.path);
|
|
614
|
+
if (blob === undefined) {
|
|
615
|
+
return { kind: 'rejected', code: 'not_found', fields: {}, retryable: false };
|
|
616
|
+
}
|
|
617
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
618
|
+
linked.set(blob, url);
|
|
619
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
620
|
+
}, request);
|
|
621
|
+
},
|
|
622
|
+
async attach(_authorization, request) {
|
|
623
|
+
return resolveScript(scripts.attach, () => {
|
|
624
|
+
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
625
|
+
if (room === undefined)
|
|
626
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
627
|
+
const path = freePath(room, request.name);
|
|
628
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
629
|
+
return { kind: 'attached', path, revision: `attached-${attached.size}` };
|
|
630
|
+
}, request);
|
|
631
|
+
},
|
|
429
632
|
async action(_authorization, request) {
|
|
430
633
|
return resolveScript(scripts.action, () => {
|
|
431
|
-
if (request.name.startsWith('
|
|
634
|
+
if (request.name.startsWith('conversations/'))
|
|
432
635
|
return conversationAction(request);
|
|
433
|
-
return { kind: 'rejected', code: 'unscripted-action', fields: {} };
|
|
636
|
+
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
434
637
|
}, request).then((answer) => {
|
|
435
638
|
if (answer.kind === 'action' && answer.at !== undefined)
|
|
436
639
|
note(answer.at.locator, answer.at);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
+
import type { Connection } from './tables.js';
|
|
3
|
+
export declare const MESSAGE_TABLES: readonly string[];
|
|
4
|
+
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
|
|
5
|
+
export type HeldConversation = {
|
|
6
|
+
readonly conversation: string;
|
|
7
|
+
readonly read: string | null | undefined;
|
|
8
|
+
readonly partial: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type MessageWindow = {
|
|
11
|
+
readonly messages: AcceptedMessage[];
|
|
12
|
+
readonly more: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type HeldSource = {
|
|
15
|
+
readonly source: unknown;
|
|
16
|
+
readonly sender: string | null;
|
|
17
|
+
};
|
|
18
|
+
export type HeldRow = {
|
|
19
|
+
readonly conversation: string;
|
|
20
|
+
readonly said: {
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly role: string | null;
|
|
23
|
+
readonly at: string | null;
|
|
24
|
+
} | null;
|
|
25
|
+
readonly failure: string | null;
|
|
26
|
+
readonly opened: HeldSource | null;
|
|
27
|
+
readonly asking: (HeldSource & {
|
|
28
|
+
readonly identity: string;
|
|
29
|
+
readonly text: string;
|
|
30
|
+
readonly at: string | null;
|
|
31
|
+
}) | null;
|
|
32
|
+
};
|
|
33
|
+
export type ConversationWrite = {
|
|
34
|
+
readonly conversation: string;
|
|
35
|
+
readonly messages: readonly AcceptedMessage[];
|
|
36
|
+
readonly read?: {
|
|
37
|
+
readonly at: string | null;
|
|
38
|
+
readonly partial: boolean;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
|
|
42
|
+
export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
|
|
43
|
+
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
|
|
44
|
+
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
|
|
45
|
+
export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
|
|
46
|
+
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
47
|
+
export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
|
|
48
|
+
export declare function forgottenMessages(connection: Connection): void;
|
|
49
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|