@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6b1e70f2da66
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/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +387 -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 +155 -86
- 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 -41
- 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 +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +324 -93
- 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 +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -63
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +14 -3
- 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 +45 -16
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +104 -13
- package/dist/collection.d.ts +31 -9
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +49 -80
- 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 -117
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +106 -2486
- 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-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 +55 -42
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +985 -649
- 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 +175 -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 +7 -4
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -28
- package/dist/expectation.d.ts +4 -2
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +33 -11
- package/dist/failure.d.ts +1 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +3 -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 +11 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +127 -20
- package/dist/index.d.ts +35 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +556 -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 +270 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +176 -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 +19 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +251 -97
- 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 +11 -12
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -15
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +197 -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/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 +60 -0
- package/dist/outcome.d.ts +49 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +42 -0
- package/dist/overlay.d.ts +5 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +132 -192
- 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 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -0
- 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 +49 -183
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +13 -2
- package/dist/reach.d.ts +21 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +292 -91
- package/dist/react.d.ts +20 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +17 -18
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -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 +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +143 -51
- 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 +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +338 -159
- package/dist/room-draft.d.ts +39 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +186 -86
- 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 +30 -37
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -128
- package/dist/runtime.d.ts +43 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +58 -10
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +569 -189
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1008 -0
- package/dist/search.d.ts +15 -55
- 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 +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -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 +44 -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 +70 -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 +5 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- 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 -127
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +136 -575
- 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 +532 -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 +181 -33
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +62 -31
- package/package.json +19 -19
- package/AGENTS.md +0 -299
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -620
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- 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/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- 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,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,13 +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 unsealed = new Map();
|
|
57
|
-
const sealed = new Set();
|
|
58
56
|
const sentTurns = new Map();
|
|
59
57
|
const historyPageSize = options.historyPageSize;
|
|
60
|
-
|
|
58
|
+
const attached = new Map();
|
|
59
|
+
const linked = new WeakMap();
|
|
60
|
+
const carried = new Map();
|
|
61
61
|
let expiring = [];
|
|
62
|
+
let openings = 0;
|
|
63
|
+
const declaredRooms = new Set();
|
|
62
64
|
let replicated = [];
|
|
65
|
+
let heldCursor = null;
|
|
63
66
|
let issued = 0;
|
|
64
67
|
function scriptConversations(entries) {
|
|
65
68
|
scripted.clear();
|
|
@@ -87,8 +90,50 @@ export function createMemoryAdapter(options = {}) {
|
|
|
87
90
|
const wanted = ordinals.get(`${locator}\u0000${target}`);
|
|
88
91
|
return held !== undefined && wanted !== undefined && held >= wanted;
|
|
89
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
|
+
}
|
|
90
133
|
function retain(entries) {
|
|
91
134
|
for (const room of entries) {
|
|
135
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
136
|
+
factsAt(room, path, content);
|
|
92
137
|
note(room.locator, room);
|
|
93
138
|
const versions = served.get(room.locator) ?? new Map();
|
|
94
139
|
versions.set(room.roomVersion, room);
|
|
@@ -106,6 +151,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
106
151
|
replica: room.replica,
|
|
107
152
|
...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
|
|
108
153
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
154
|
+
authoredPaths: room.authoredPaths,
|
|
109
155
|
};
|
|
110
156
|
}
|
|
111
157
|
function page(room, after) {
|
|
@@ -121,23 +167,43 @@ export function createMemoryAdapter(options = {}) {
|
|
|
121
167
|
roomVersion: room.roomVersion,
|
|
122
168
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
123
169
|
documents: named(room.documents ?? {}, taken),
|
|
170
|
+
facts: factsIn(room, taken),
|
|
124
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]) }),
|
|
125
178
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
126
179
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
180
|
+
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
127
181
|
...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
|
|
128
182
|
};
|
|
129
183
|
}
|
|
130
|
-
function
|
|
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 }),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function advancement(room, from, at, whole = false) {
|
|
131
195
|
const current = room.documents ?? {};
|
|
132
196
|
const previous = from.documents ?? {};
|
|
133
197
|
const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
|
|
134
198
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
135
199
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
200
|
+
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
201
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
136
202
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
137
203
|
const changed = Object.keys(current)
|
|
138
204
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
139
205
|
.sort();
|
|
140
|
-
const size = pageSize ?? changed.length;
|
|
206
|
+
const size = whole ? changed.length : (pageSize ?? changed.length);
|
|
141
207
|
const taken = changed.slice(at, at + size);
|
|
142
208
|
const next = at + taken.length;
|
|
143
209
|
const opening = at === 0;
|
|
@@ -153,9 +219,17 @@ export function createMemoryAdapter(options = {}) {
|
|
|
153
219
|
roomVersion: room.roomVersion,
|
|
154
220
|
...(models === undefined ? {} : { models }),
|
|
155
221
|
documents: named(current, taken),
|
|
222
|
+
facts: factsIn(room, taken),
|
|
156
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]) }),
|
|
157
230
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
158
231
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
232
|
+
...(opening ? foldersMoved(room, from) : {}),
|
|
159
233
|
removals: opening
|
|
160
234
|
? [
|
|
161
235
|
...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
|
|
@@ -165,6 +239,26 @@ export function createMemoryAdapter(options = {}) {
|
|
|
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: {}, retryable: false };
|
|
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,15 +290,13 @@ 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
302
|
return {
|
|
@@ -220,34 +309,28 @@ export function createMemoryAdapter(options = {}) {
|
|
|
220
309
|
const outcome = conversation.outcomes?.[name];
|
|
221
310
|
if (outcome !== undefined)
|
|
222
311
|
return outcome;
|
|
223
|
-
if (name === '
|
|
312
|
+
if (name === 'conversations/send') {
|
|
224
313
|
const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
|
|
225
314
|
const answered = operation === null ? undefined : sentTurns.get(operation);
|
|
226
315
|
if (answered !== undefined)
|
|
227
|
-
return { kind: 'action', result: {
|
|
316
|
+
return { kind: 'action', result: { message_id: answered } };
|
|
228
317
|
issued += 1;
|
|
229
318
|
const turn = `turn-${issued}`;
|
|
230
|
-
unsealed.set(turn, named);
|
|
231
319
|
if (operation !== null)
|
|
232
320
|
sentTurns.set(operation, turn);
|
|
233
|
-
return { kind: 'action', result: { turn } };
|
|
234
|
-
}
|
|
235
|
-
if (name === 'conversation.cancel') {
|
|
236
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
237
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
238
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
239
|
-
}
|
|
240
|
-
unsealed.delete(turn);
|
|
241
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
321
|
+
return { kind: 'action', result: { message_id: turn } };
|
|
242
322
|
}
|
|
243
|
-
if (name === '
|
|
323
|
+
if (name === 'conversations/delete')
|
|
244
324
|
scripted.delete(named);
|
|
245
|
-
return { kind: 'action', result: {
|
|
325
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
246
326
|
}
|
|
247
327
|
function announceList() {
|
|
248
|
-
const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined
|
|
249
|
-
|
|
250
|
-
|
|
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
|
+
}
|
|
251
334
|
}
|
|
252
335
|
function discovery() {
|
|
253
336
|
return {
|
|
@@ -259,8 +342,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
259
342
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
260
343
|
};
|
|
261
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
|
+
}
|
|
262
378
|
return {
|
|
263
|
-
...(options.
|
|
379
|
+
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
380
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
264
381
|
setRooms(next) {
|
|
265
382
|
rooms = [...next];
|
|
266
383
|
retain(rooms);
|
|
@@ -269,26 +386,37 @@ export function createMemoryAdapter(options = {}) {
|
|
|
269
386
|
scriptConversations(next);
|
|
270
387
|
},
|
|
271
388
|
open() {
|
|
389
|
+
carried.clear();
|
|
272
390
|
announceList();
|
|
273
|
-
|
|
274
|
-
observer({ kind: 'opened' });
|
|
391
|
+
opened(emitAll);
|
|
275
392
|
},
|
|
276
|
-
close(revoked = false) {
|
|
277
|
-
|
|
278
|
-
|
|
393
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
394
|
+
openings += 1;
|
|
395
|
+
carried.clear();
|
|
396
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
279
397
|
},
|
|
280
398
|
expire(locators) {
|
|
281
399
|
expiring = [...locators];
|
|
282
400
|
},
|
|
283
|
-
notifyRoomVersion({ locator
|
|
284
|
-
|
|
285
|
-
|
|
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
|
+
});
|
|
286
418
|
},
|
|
287
419
|
notifyConversation(event) {
|
|
288
|
-
if (event.kind === 'accepted-message') {
|
|
289
|
-
sealed.add(event.message.turn);
|
|
290
|
-
unsealed.delete(event.message.turn);
|
|
291
|
-
}
|
|
292
420
|
for (const listener of listeners)
|
|
293
421
|
listener(event);
|
|
294
422
|
},
|
|
@@ -297,21 +425,31 @@ export function createMemoryAdapter(options = {}) {
|
|
|
297
425
|
observer(mode);
|
|
298
426
|
},
|
|
299
427
|
heldRooms() {
|
|
300
|
-
return
|
|
428
|
+
return [...carried.keys()].sort();
|
|
301
429
|
},
|
|
302
430
|
replicatedConversations() {
|
|
303
431
|
return replicated;
|
|
304
432
|
},
|
|
433
|
+
heldConversationCursor() {
|
|
434
|
+
return heldCursor;
|
|
435
|
+
},
|
|
305
436
|
conversations: {
|
|
306
437
|
replicate(next) {
|
|
307
438
|
replicated = [...next];
|
|
308
439
|
},
|
|
440
|
+
hold(cursor) {
|
|
441
|
+
heldCursor = cursor;
|
|
442
|
+
},
|
|
309
443
|
observe(notify) {
|
|
310
444
|
listeners.add(notify);
|
|
311
445
|
return () => {
|
|
312
446
|
listeners.delete(notify);
|
|
313
447
|
};
|
|
314
448
|
},
|
|
449
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
450
|
+
...(options.agents === undefined
|
|
451
|
+
? {}
|
|
452
|
+
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
315
453
|
},
|
|
316
454
|
serviceMode: {
|
|
317
455
|
observe(notify) {
|
|
@@ -323,29 +461,30 @@ export function createMemoryAdapter(options = {}) {
|
|
|
323
461
|
},
|
|
324
462
|
roomStream: {
|
|
325
463
|
hold(asked) {
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
expiring = [];
|
|
329
|
-
const moved = asked.flatMap((room) => {
|
|
464
|
+
const named = asked.map((room) => room.locator);
|
|
465
|
+
const unknown = asked.flatMap((room) => {
|
|
330
466
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
467
|
+
const version = room.roomVersion;
|
|
331
468
|
return current === undefined ||
|
|
332
|
-
|
|
333
|
-
|
|
469
|
+
(version !== null &&
|
|
470
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
334
471
|
? []
|
|
335
|
-
: [
|
|
472
|
+
: [room.locator];
|
|
336
473
|
});
|
|
474
|
+
const expired = [
|
|
475
|
+
...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
|
|
476
|
+
];
|
|
477
|
+
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
337
478
|
queueMicrotask(() => {
|
|
338
|
-
for (const
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
+
}
|
|
342
486
|
}
|
|
343
|
-
|
|
344
|
-
},
|
|
345
|
-
reopen() {
|
|
346
|
-
queueMicrotask(() => {
|
|
347
|
-
for (const observer of observers)
|
|
348
|
-
observer({ kind: 'closed', revoked: false });
|
|
487
|
+
emitAll({ kind: 'caught-up', expired });
|
|
349
488
|
});
|
|
350
489
|
},
|
|
351
490
|
observe(notify) {
|
|
@@ -354,11 +493,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
354
493
|
if (!observers.has(notify))
|
|
355
494
|
return;
|
|
356
495
|
if (options.unopened === true) {
|
|
357
|
-
notify({ kind: 'closed', revoked: false });
|
|
496
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
358
497
|
return;
|
|
359
498
|
}
|
|
360
499
|
announceList();
|
|
361
|
-
|
|
500
|
+
opened((event) => {
|
|
501
|
+
if (observers.has(notify))
|
|
502
|
+
notify(event);
|
|
503
|
+
});
|
|
362
504
|
});
|
|
363
505
|
return () => {
|
|
364
506
|
observers.delete(notify);
|
|
@@ -375,12 +517,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
375
517
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
376
518
|
},
|
|
377
519
|
async discover(_authorization) {
|
|
378
|
-
return
|
|
379
|
-
if (answer.kind === 'discovery')
|
|
380
|
-
for (const room of answer.rooms)
|
|
381
|
-
note(room.locator, room);
|
|
382
|
-
return answer;
|
|
383
|
-
});
|
|
520
|
+
return discovered();
|
|
384
521
|
},
|
|
385
522
|
reached,
|
|
386
523
|
follows(locator, roomVersion, next) {
|
|
@@ -437,7 +574,13 @@ export function createMemoryAdapter(options = {}) {
|
|
|
437
574
|
retryable: false,
|
|
438
575
|
affected: {},
|
|
439
576
|
};
|
|
440
|
-
}, request).then((answer) =>
|
|
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
|
+
});
|
|
441
584
|
},
|
|
442
585
|
async history(_authorization, request) {
|
|
443
586
|
return resolveScript(scripts.history, () => {
|
|
@@ -453,31 +596,42 @@ export function createMemoryAdapter(options = {}) {
|
|
|
453
596
|
},
|
|
454
597
|
async binary(_authorization, request) {
|
|
455
598
|
return resolveScript(scripts.binary, () => {
|
|
456
|
-
if (request.kind === 'reference') {
|
|
457
|
-
return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
|
|
458
|
-
}
|
|
459
599
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
460
600
|
if (room === undefined)
|
|
461
601
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
462
|
-
const blob = room
|
|
602
|
+
const blob = heldBlob(room, request.path);
|
|
463
603
|
return blob === undefined
|
|
464
|
-
? { kind: 'rejected', code: '
|
|
465
|
-
: { kind: 'binary', blob };
|
|
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 };
|
|
466
620
|
}, request);
|
|
467
621
|
},
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
return
|
|
476
|
-
|
|
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);
|
|
477
631
|
},
|
|
478
632
|
async action(_authorization, request) {
|
|
479
633
|
return resolveScript(scripts.action, () => {
|
|
480
|
-
if (request.name.startsWith('
|
|
634
|
+
if (request.name.startsWith('conversations/'))
|
|
481
635
|
return conversationAction(request);
|
|
482
636
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
483
637
|
}, request).then((answer) => {
|
|
@@ -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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"}
|